什么是照片修复呢?它由以下三个步骤组成:
我们找到所有的照片缺陷:折痕,磨损,破洞我们基于所发现的照片缺陷周围的像素值来进行图像修复我们为图像上色接下来,我将阐释照片修复的每一个步骤,并且告诉你我们如何获得数据,用哪种网络训练,取得了哪些成就,以及犯了什么错误。
寻找缺陷
我们需要在一张已经上传的照片当中找到所有与缺陷相关的像素值。首先,我们需要弄清楚人们会上传什么样的照片。我们与immortal regiment项目的创始人交流过,一个存储二战遗留照片的非商业组织,他们分享数据给我们。在此基础上进行分析,我们意识到人们上传的大部分个人或集体肖像存在中等到大量的缺陷。
接着我们必须收集一个训练集,这个训练集需要对图像进行分割,得到一张图片,和一张把所有缺陷都标注出来的黑底白纹蒙版。做这一步最简单的方法是让评估员创立分割蒙版。当然,一般人非常清楚怎样找到缺陷,但那会耗费太长时间。
标记一张照片中缺陷处的像素将会花费一个小时或一整个工作日,因此,在几周内收集一个超过100张图片的训练集是不简单的。这就是为什么我们尝试加强我们的数据,并创造我们自己的缺陷:拍一张照片,用图片上的随机纹理增加缺陷,最终得到一张显示有缺陷的图像部分的蒙版。在没有增强的情况下,我们已经获得了含有68张手动标记照片的训练集和和11张照片的验证集。
最流行的分割方法是:使用unet和预训练编码器,将BCE(binary cross-entropy)与DICE(Srensen–Dice coefficient)的和最小化。
在我们为了项目任务使用这个分割方法时,什么样的问题会出现呢?
虽然照片看起来像有许多的缺陷,非常老旧而残破,有缺陷的部分仍然远远小于没有受到损伤的部分。为了解决这个问题,我们可以增加BCE中的积极类内权重,最优权重应是清晰像素与缺陷像素的比率。
第二个问题是如果我们用可以立刻上手使用的预训练编码器和UNET,将会损失许多位置数据。第1层如果由一个核为5、步长为2的卷积组成,网络运行得更快。我们牺牲网络运行的时间来换取更好的缺陷定位。我们在第1层之后移除最大的pooling层,将卷积步长减至1,卷积核减至3。
如果我们通过压缩处理小图片,比如说到256或512像素,小瑕疵会因为内插而消失。然而,我们还需要处理大图像。在实际应用中我们一般把1024像素的照片瑕疵分割。这就是为什么我们必须将网络训练成为适于处理大图像。但这会引起在单个GPU上处理规格小批量的问题。
在训练中,我们我们可以在一个GPU上匹配20张左右的图片。因此我们最终会在BatchNorm层得到不准确的平均值和标准偏差值。我们可以通过 In-place BatchNorm来解决这个问题。一方面节省内存空间,另一方面拥有一个 Synchronized BatchNorm版本,可以同步所有GPU上的数据。这样我们计算平均值和标准偏差值就不是参照一个GPU上的20张图片,而是4个GPU上的80张图片,这改善了网络集成。
最后,基于增加bce的权重,改变体系结构和使用In-place BatchNorm,我们将分割做得更好,但为了做得更好而使用Test Time Augmentation并不会花费许多。我们可以在一张输入的图片上运行网络,获取镜像,再重新运行网络去找到所有的小缺陷。
用了四个GeForce 1080Ti显卡,花费了18个小时,相对时间较长,但这就是精益求精的代价。
图像修复
我们使用了在图像分割领域很火的Unet网络。为了做图像修复,我们需要上传原始图像和一个掩模(使用1标记了所有干净区域的像素,使用0标记了需要好修复的像素)。数据是这样被搜集的:在一些开源的图像数据集上(例如:OpenImagesV4)加入了一些在生活中会出现的照片瑕疵,然后我们训练网络去重新修复有瑕疵的这部分。
我们是如何使用在图像修复中使用Unet的呢?
我们使用了部分卷积替代了原始的那一版。当我们使用一些核去卷积一个区域时,我们没有把损坏的像素算在内。这使得图像修复更精密。从英伟达的论文来举个例子,他们使用了Unet结合默认的2维卷积的修复结果在中间这幅图,使用部分卷积的修复结果在右边这幅图。
着色
我们已经将图片有缺陷的部分分割了出来并且修复了他们;第三步——颜色复原。就像我之前说的,Immortal Regiment项目有很多个人或集体的相片。我们希望网络可以在修复这些照片上起到很好的作用。因为现有的服务不能有效且快的着色,所以我们决定提出我们自己的着色方案。我们希望我们的被着色的图片更可信。
Unet是一个非常棒的模型。在第一个分割任务中,我们在训练过程中遇到了一个问题,就是处理高分辨率的图像,这就是为什么我们使用In-Place 批归一化。在我们的第二个任务(图像修复)中,我们使用了部分卷积而不是标准卷积,这让我们得到了更好的结果。在进行着色时,我们增加了一个简单的判别器网络,它可以对生成不真实图像的生成器进行惩罚。我们还使用了感知损失。
第二个结论——评估人员是必不可少的。不仅在创建分割掩码阶段,而且在最终的结果验证阶段。最后,我们给用户提供了三张照片:一幅带有缺陷的原始照片,一幅带有缺陷的彩色照片,以及一幅简单的彩色照片,以防缺陷搜索和图像修复算法出错。