图像上色研究进展
CIC 是一种经典的使用卷积神经网络进行图像上色的方法,它采用了一个全卷积网络。它的输入是一张 256x256x1 的单通道图像,输出是包含 a、b 通道的图像,再加上 L 通道做特征维度上的拼接,最终得到彩色图像。CIC 将上色问题视为一个分类问题,将 ab 取值进行量化,并将其划分为 313 个网格,然后将问题转化为在预测输入图像上的每个像素属于这 313 个类别中的概率分布。
CIC 提出了一种新的损失函数。由于上色任务是一个多模态问题,一个输入可能对应多种不同的解。例如,对于一辆黑白汽车,其真实颜色可能是多种颜色中的任一一种。
如果使用经典的上色损失函数,即对输出图像和真实图像进行MSE 损失计算,可能会导致模型倾向于输出中间值,从而产生灰色或欠饱和的上色效果。为了解决这个问题,CIC 提出了多项式分类的损失函数,来计算分布损失。但是,仅计算分布损失可能会存在另一个问题,即在风景图像中,蓝天可能占据整个图像的较大面积,导致蓝色出现的概率非常高,从而主导了损失计算。
因此,CIC 还引入了基于颜色的加权方法,对于稀有的颜色会分配更高的权重,从而鼓励模型预测不常见的颜色,以达到更加鲜艳的上色效果。
之前的一系列的图像上色算法都是针对整个图像进行的,这使得在图像中包含多个实例时难以实现较好的效果。InstColor 的出现解决了这个问题。它首先使用检测器对输入的图像进行目标检测,以检测出图像中的每个实例,并对它们进行分别上色;然后,对整幅图像进行上色;最后,将每个实例上色和整幅图像上色进行融合,得到令人满意的上色结果。
DeOldify 是一个非常著名的开源上色算法。该算法采用 ResNet 作为编码器,构建了 UNet 经典结构,从而实现了优异的效果。此外,DeOldify 还提出了很多不同的训练版本,包括专门用于视频上色的版本。这些不同版本在效果、效率和鲁棒性等方面均表现出良好的综合性能。
GCP 是一种基于 GAN Inversion 的上色算法。它利用预训练好的 GAN 模型中包含的自然图像生成先验,对输入的灰度图像进行 GAN Inversion,从而获得在 GAN 隐空间中的特征表示。然后,GCP 利用这些特征来指导图像上色过程,以尽可能地处理各种不同图像类型和复杂场景,并生成高质量的彩色图像。
ColTran 是一种基于 Transformer 的图像上色算法。它由三个子网络组成,分别是粗上色网络、颜色上采样网络和空间上采样网络,这三个网络协同工作。在输入灰度图像后,ColTran 先对其进行粗上色,生成低分辨率的上色图像。接下来,后两个网络会并行工作,分别完成颜色的上采样和图像的上采样,以生成高质量的彩色图像。
CT2 是一种基于 Transformer 的上色算法,其主要思路是将上色任务看作分类问题。其网络主体基于 ViT 网络,该网络在做分类时会加入 class token 用于分类。CT2 则使用了 color token,将 color token 和输入的 image token 进行共同编码,通过 Color Transformer 对两者进行特征交互,以实现彩色图像的生成。
然而,由于 color token 具有 313 个类别,因此会导致计算量较大。为了解决这个问题,CT2 提供了亮度选择模块,该模块可以根据数据集中的亮度到彩色的映射分布,对计算注意力做出约束,从而显著减少计算量。这种方法不仅可以提高模型的效率,而且还可以改善图像的上色质量。
ColorFormer 是另一个基于 Transformer的上色算法,与DeOldify类似采用了一个unet型的网络。它在编码器上提出了GLH Transformer,结合了全局和局部的信息以获得更好特征提取;在解码器一端则提出了memory decoder,通过查询语义和颜色的键值对,得到精确的上色效果。
ColorFormer 是另一个基于 Transformer 的上色算法,与 DeOldify 类似,它采用了一个 UNet 类型的网络。在编码器中,ColorFormer 提出了 GLH Transformer,这种 Transformer 结合了全局和局部的信息,以获得更好的特征提取效果。在解码器中,ColorFormer 提出了 memory decoder,通过查询语义颜色键值对,获得更为精确的上色效果。这些针对性的优化使得 ColorFormer 在图像上色任务中具有较高的实用性和效果。
DDColor 是一种最新的基于 Transformer 的上色算法,其中的 DD 代表两个 decoder,分别是图像解码器和颜色解码器。图像解码器主要负责上采样,逐步恢复输入图片的分辨率;而颜色解码器则是利用通过一组颜色查询 color query,通过使用多尺度图像特征学习,得到与语义相贴合的颜色嵌入,最终通过简单的融合模块获得最终的上色结果。
图像上色实战教学
ModelScope提供了上述两个算法,可以登录官网搜索并体验。
在 ModelScope 官网中,可以进入画质增强专题页,然后在模型应用下找到色彩增强的标签。在这里我们可以找到调色、上色相关模型,并进入模型详情页进行了解。在详情页中,可以点击右上角的 Notebook 快速开发按钮,选择 CPU 或 GPU 环境,并填写相关信息,可以新建一个 Notebook 以便进行开发和实验Notebook 环境提供了一个交互式的学习平台,可以帮助用户快速上手和实验不同的算法模型。
首先导入必要的包,在根目录下创建一个文件夹,用于存放老照片。使用glob函数获取目录下的图片文件路径并存储到列表中。
导入 ModelScope 的 pipeline,传入任务名称和模型 ID。
在for 循环中,使用 cv2.imread 读取灰色图片,再调用两个pipeline 对每一张图片做推理。最后将输入的黑白图片以及推理的两张图片结果横向拼接并保存,以更方便地对比上色效果。
执行代码,结果显示如上图。第一列是输入的黑白图像,第二列是DeOldify 模型的上色结果,第三列是 DDcolor 的上色结果。
下文将演示模型训练。进入 DDcolor 的模型库,在模型介绍下面提供了可直接使用的模型训练代码,将代码拷贝到Notebook,只需修改训练后保存模型的目录即可运行。
定义一些必要的参数例如 model_id 、数据集等,最后调用 build_trainer 方法将参数传入,获得 trainer 实例。
在训练之前,可以先调用 trainer.evaluate() 方法对模型进行验证,验证结果如上图,输出 psnr、fid 以及 colorfulness 三个指标。psnr 衡量图像间像素偏差,值越高代表图像的保真度越高;fid 用于衡量生成效果,值越低越好;colorfulness 代表的色彩鲜艳程度,在一定阈值内越高越好。
调用 trainer.train() 开始训练模型。训练结束之后会自动验证模型性能,结果如上图,psnr 有所上升,fid 有所下降,证明训练的效果。
接下来对训练后的模型进行测试,查看效果。
创建 pipeline,task 参数不变,model 参数需要改为之前训练的模型保存路径。
上图为模型保存路径的 output 内包含的文件,有配置信息、训练后的模型权重等。
最后执行代码测试训练后的模型。