底层视觉简介
底层视觉(即视觉增强)是计算机视觉中的一个分支,它专注于提高图像整体的观看体验。如果 “中高层视觉” 关注的是如何让计算机理解图像中的内容,那么底层视觉则致力于解决图像的清晰度、色彩、时序等各类画质问题。这些问题的出现与拍摄环境、设备等因素有关,而视觉增强技术则旨在修复这些问题,提供更好的视觉观看体验。
底层视觉的应用也非常广泛,涉及老照片修复、超高清增强、媒资管理、AIGC 内容生成与编辑等多个领域。接下来,我们简单介绍几个常见的底层视觉画质增强任务。
超分辨率(Super-Resolution,简称 SR)是一种图像处理技术,旨在将低分辨率图像转换为高分辨率图像。超分辨率技术在计算机视觉、医学成像、卫星图像等领域广泛应用。输入低清图片,比如64x64分辨率的图片,可以通过超分辨率算法将其变为4倍甚至16倍大小,输出非常高清的图片。
图像上色(Image Colorization)指的是将黑白或灰度图像转换为彩色图像的过程,它是一种常见的图像处理技术。图像上色在许多领域都具有重要的应用,如电影、动画、印刷、医学成像等。
图像补全(Image Inpainting)是一种图像处理技术,旨在通过填补丢失的部分来恢复图像的完整性。它可以用于修复损坏的图像、去除图像中的噪声和纹理、去除水印等。例如,有些时候照片里出现了部分不想要的内容,这时便可以将该部分进行抹除,然后利用图像补全算法自动生成被抹除的部分,达到想要的效果。
图像修复(Image Restoration)是一种图像处理技术,旨在通过去除图像中的噪声、模糊、失真等问题来恢复图像的清晰度和细节。它可以用于修复老照片、去除图像中的瑕疵、恢复图像中的细节等。
ModelScope 官网提供了大量底层视觉任务的算法体验,除了上文提到的应用,还提供了色彩增强、时域增强、画质评估等能力。
接下来,以ModelScope提供的“老照片修复”创空间为例,讲解底层视觉算法的一个简单应用。
受拍摄设备和时代因素的限制,多年前的老照片可能存在诸如黑白、噪点等画质问题,导致其表现效果不佳。不过,通过使用 ModelScope 的老照片修复应用,我们可以让这些老照片重新焕发生机,呈现出更加鲜活的色彩和清晰的画面。
进入ModelScope官网,我们通过“模型库”的“画质增强”专题,可以进入 “AI老照片修复”创空间应用。
应用整体界面如上图。
选择一张示例图片,然后点击“一键修复”,处理前后效果如图。
如果想了解该创空间应用使用到的某个具体模型的详细信息,可以点击右上角的 “关联模型”,然后选择需要了解的模型,进入该模型的页面查看。
查看空间文件,其中的app.py 文件包含了应用的核心代码。
180-210 行通过逐步定义各个组件,构建了一个Gradio 应用。209 行定义了“一键修复”按钮按下调用的函数,即inference() 函数。
Inference() 函数的定义从第20 行开始,其接收 4 个参数,分别是图片以及 3个页面上提供的处理选项。在函数内,首先对图像进行resize,然后对图像做编码获得URL。
接下来,对于每个模型,构造一个字典并调用 call_demo_service() 函数。该函数使用每个 ModelScope 模型在其模型页面右侧展示的体验功能,通过构建HTTP请求调用该能力。这样做的优势在于,可直接通过发调用的方式完成操作,不消耗本地资源。整个过程按顺序调用了 4 个模型,依次为图像去噪、图像上色、人像增强、色彩增强(顺序可调换),最后返回结果图像。
图像上色简介
经过深度学习算法的发展,图像上色技术已经可以实现和人类手工上色相媲美的结果。传统的图像上色需要艺术家进行辛勤的工作和广泛的调研,而对于黑白历史老照片,通常需要长达数月的时间才能实现较好的上色效果。相比之下,深度学习算法可以更快速、更准确地实现图像上色。
在深度学习算法中,图像上色通常使用卷积神经网络(CNN)进行实现。通过训练神经网络,可以将黑白图像中的特征映射到相应的色彩空间中,从而实现图像上色的目的。在训练过程中,算法可以学习到图像中的颜色分布和纹理信息等特征,从而实现较好的上色效果。
黑白图像在计算机中通常使用二维网格来进行存储和表示,每个像素有一个值用于表示亮度,取值范围一般为 0-255,对应黑色到白色。在图像上色时,深度学习算法需要将这些亮度值转换成相应的颜色值,从而实现对图像的上色。
常见的彩色图像通常由三个颜色通道组成,分别是红色(R)、绿色(G)和蓝色(B),即 RGB。这三个通道的取值范围为 0-255,任何一种颜色都可以由这三种基本颜色的不同强度组合而成。
在图像上色中,我们通常需要训练一个人工智能模型,学习并搜索一个能够将灰度网格转化为三通道颜色网格的函数。
除了 RGB 色彩空间外,还有一种常见的色彩空间是 Lab 色彩空间。
Lab 色彩空间中,L 代表亮度,a 和 b 分别代表从绿色到红色的分量和从蓝色到黄色的分量。L 通道的取值范围为 0-100,L 越大,亮度越高,0 代表黑色,100 代表白色。a 和 b 的取值范围一般为 - 128 到+ 127,其中 0 代表灰色。
在上图中,我们将左侧的彩色图像分解成 L、a、b 三个通道,并将其可视化。可以看到,L 通道表示图像的亮度信息,a 和 b 通道分别表示图像的颜色信息,其中 a 通道从绿色到红色变化,b 通道从蓝色到黄色变化。
相比于 RGB 色彩空间,Lab 色彩空间在图像上色任务中具有更好的表现。Lab 色彩空间能够带来几个好处:首先,可以在最终的预测中充分利用原图像的灰色通道。一个有趣的科学事实是:人类眼睛中 94% 的细胞接受亮度,剩下 6% 用于感受颜色。
因此,灰色通道对于整体视觉效果非常重要。其次,直接从灰色的单通道图像预测 RGB 的三通道彩色图像比较困难,但是如果只预测 a 和 b 两个通道,则难度会降低。最后,Lab 的颜色空间设计是基于人对颜色的感觉,它是感知均匀的,即 Lab 三个通道中的数字变化的幅度一样,则给人带来的视觉上的变化幅度也相近,更有利于模型的学习。
当前,学术界流行的几个图像上色评价指标主要包括:
FID(Fréchet Inception Distance):通过计算生成图像与真实图像之间分布的距离,来评价生成图像的质量。该指标综合考虑了图像在特征空间中的分布和结构信息,因此是一种比较全面的评价指标。
Colorfulness Score:衡量图片色彩鲜艳的程度,一般而言,色彩越鲜艳,Colorfulness Score 越高。该指标可以用来评价上色图像的颜色饱和度和鲜艳度,因此在某些应用场景下也具有重要的作用。
User Study:是人类对图片的主观评价,通常需要通过调查问卷等方式来进行。虽然该指标存在一定的主观性,但它可以为上色算法的改进提供有价值的反馈信息,因此也是一种重要的评价指标。
Transformer 是 Google 在 2017 年提出的一种知名模型,最近大火的 ChatGPT 也使用了 Transformer 模型。它的主要特点是利用了自注意力机制来实现输入序列的编码和解码,从而能够更好地处理长序列数据。
在自然语言领域,Transformer 已经被广泛应用于机器翻译、语言模型等任务,并且取得了很好的效果。近年来,Transformer 也开始在计算机视觉领域得到广泛应用,例如图像分类、目标检测等任务。由于 Transformer 模型具有高效、灵活等特点,因此成为了计算机视觉领域的一项基础技术。
图像上色研究进展
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 内包含的文件,有配置信息、训练后的模型权重等。
最后执行代码测试训练后的模型。