
大家好,我是Mail.ru Group计算机视觉团队的研究程序员。 在今年的“胜利纪念日”中,我们决定进行一个
军事图片恢复项目 。 什么是照片恢复? 它包括三个阶段:
- 我们发现所有图像缺陷:断裂,磨损,破洞;
- 根据缺陷周围的像素值对发现的缺陷进行涂漆;
- 使图像着色。
在本文中,我将详细介绍恢复的每个阶段,并告诉您如何以及在何处获取数据,我们学到了哪些网络,我们做了什么以及我们踩踏了什么耙子。
缺陷搜索
我们要查找与上传的照片中的缺陷相关的所有像素。 首先,我们需要了解人们将上传什么样的战争年代照片。 我们转向了不朽军团项目的组织者,他们与我们共享了数据。 在对它们进行分析之后,我们注意到人们经常上传具有中等或大量缺陷的单张或多张肖像。
然后有必要收集训练样本。 分割任务的训练样本是图像和蒙版,上面标记了所有缺陷。 最简单的方法是将照片提供给标记。 当然,人们擅长发现缺陷,但是问题是标记是一个很长的过程。

标记一张照片中与缺陷有关的像素可能需要一个小时到整个工作日,因此很难在几周内收集100张以上的照片样本。 因此,我们试图以某种方式补充我们的数据并自行编写缺陷:我们拍摄了一张干净的照片,对其应用了人工缺陷,并得到了一个遮罩,向我们显示图像中哪些特定部分受到了损坏。 我们训练样本的主要部分是79张手动标记的照片,其中11张已转移到测试样本中。
分割问题的最流行方法:将Unet与预先训练的编码器配合使用,并减少数量
Bce (
二进制交叉熵 )和
骰子 (
索伦森-骰子系数 )。
这种方法在缺陷分割问题中会出现什么问题?
- 即使在我们看来,照片中有很多缺陷,非常脏,并且随着时间的流逝非常破碎,但缺陷所占的面积仍然比图像的未损坏部分小得多。 要解决此问题,您可以增加 Bce ,最佳权重将是所有纯像素数与属于缺陷的像素数之比。
- 第二个问题是,如果我们将Unet与预先训练好的编码器(例如Albunet-18)一起使用,则会丢失很多位置信息。 Albunet-18的第一层由卷积组成,卷积的核心为5,步幅等于2。 这样可以使网络快速工作。 为了更好地定位缺陷,我们牺牲了网络时间:我们在第一层之后删除了最大池,将步幅减小为1,并将卷积核减小为3。
- 如果我们处理小图像,例如将图片压缩为256 x 256或512 x 512,则小缺陷将由于插值而简单消失。 因此,您需要处理较大的图片。 现在,在生产中,我们正在分割1024 x 1024的照片中的缺陷。因此,有必要在大图像的大批量作物中训练神经网络。 因此,一张视频卡上的批量较小会出现问题。
- 在培训期间,一张卡片上放置了大约20张图片。 因此,BatchNorm层中的均值和方差的估计不准确。 就地BatchNorm帮助我们解决了这个问题,首先,它可以节省内存,其次,它具有一个版本的Synchronized BatchNorm,该版本可以在所有卡之间同步统计信息。 现在,我们考虑的平均值和方差不是在一张卡上显示20张图片,而是在4张卡上显示80张图片。 这改善了网络融合。
最后,增加体重
Bce 通过更改体系结构并使用就地BatchNorm,我们开始搜索照片中的缺陷。 但是便宜地通过添加测试时间增强,您甚至可以做得更好。 我们可以在输入映像中运行一次网络,然后对其进行镜像并再次运行网络,这可以帮助我们发现小的缺陷。

结果,我们的网络在18小时内融合了四个GeForce 1080Ti。 推理需要290毫秒。 结果已经足够长了,但这是因为我们正在寻找小的缺陷这一事实是有代价的。 验证方式
骰子 等于0.35,并且
ROCAUC -0.93。
片段还原
Unet帮助我们再次解决了这个问题。 对于输入,我们给了他原始图像和一个蒙版,在蒙版上我们用单位标记干净的空间,并用0标记要绘制的像素。 我们按以下方式收集数据:我们从Internet上获取了一个包含图片的大型数据集,例如OpenImagesV4,并人为地添加了形状类似于现实生活中的缺陷的缺陷。 之后,他们培训了网络以修复丢失的零件。
我们如何修改此任务的Unet?
您可以使用部分卷积代替常规卷积。 她的想法是,当我们使用内核折叠图片的某个区域时,我们没有考虑与缺陷相关的像素值。 这有助于使绘画更准确。
NVIDIA文章中的示例。 在中心图中,他们将Unet与通常的卷积一起使用,在右边-与Partial Convolution一起使用:

我们对网络进行了5天的培训。 在最后一天,我们冻结了BatchNorm,这有助于使图像的绘制部分的边界不那么明显。
网络在50毫秒内处理512 x 512的图片。 验证PSNR为26.4。 但是,无法无条件地信任此任务中的指标。 因此,我们首先对数据运行了几个好的模型,对结果进行匿名处理,然后投票给我们更喜欢的模型。 因此,我们选择了最终模型。
我提到过,我们人为地添加了缺陷以清洁图像。 训练时,您需要仔细监视叠加缺陷的最大大小,因为对于网络在学习过程中从未见过的非常大的缺陷,它将疯狂地幻想并给出绝对不适用的结果。 因此,如果您需要对较大的缺陷进行涂装,则在培训期间也要应用较大的缺陷。
这是算法的示例:

上色
我们将缺陷分割并上漆,第三步是颜色的重建。 让我提醒您,在“不朽军团”的照片中,有很多单身或团体肖像。 我们希望我们的网络与他们合作良好。 我们决定进行自己的着色,因为我们所知的任何服务都无法快速,良好地绘制人像。

GitHub有一个流行的用于给照片着色的
存储库 。 平均来说,他做得很好,但是他有几个问题。 例如,他喜欢将衣服涂成蓝色。 因此,我们也拒绝了。
因此,我们决定制作一个用于着色的神经网络。 最明显的想法:拍摄黑白图像并预测红色,绿色和蓝色三个通道。 但是,总的来说,我们可以简化我们的工作。 我们不能使用颜色的RGB表示,而可以使用YCbCr表示。 分量Y是亮度(亮度)。 下载的黑白图像是Y通道,我们将重用它。 仍然需要预测Cb和Cr:Cb是蓝色和亮度的差异,而Cr是红色和亮度的差异。

我们为什么选择YCbCr视图? 人眼对亮度的变化比对颜色的变化更敏感。 因此,我们重用了眼睛最初容易感觉到的Y分量(亮度),并预测了Cb和Cr,在这些分量中我们可能会犯更多的错误,因为人们注意到颜色的“假”更少。 当频道带宽不足以完全传输所有颜色时,此功能开始在彩色电视的曙光中得到积极使用。 图像被转印到YCbCr,不变地转印到Y分量,并且Cb和Cr被压缩两次。
如何组装基线
您可以再次使用带有预训练编码器的Unet,并最小化实际CbCr和预测的CbCr之间的L1损耗。 我们想给肖像上色,所以除了来自OpenImages的照片,我们还需要添加特定于我们任务的照片。
在哪里可以获得军人的彩色照片? 互联网上有些人将旧照片作为爱好或订购。 他们非常谨慎地执行此操作,试图完全遵守所有细微差别。 给制服,肩章,勋章上色,他们使用档案材料,因此他们的工作结果值得信赖。 我们总共使用了200张手绘照片。 第二个有用的数据源是
工农红军的所在地。 在伟大的卫国战争期间,几乎所有可能的军装变形都为它的一位创作者拍照。

在一些照片中,他从著名的档案照片中重复了人们的姿势。 他在白色背景上拍摄特别好,这使我们可以很好地增强数据,在背景中添加各种自然物体。 我们还使用普通的现代人物肖像,以徽章和战时服装的其他属性作为补充。
我们培训了AlbuNet-50-这是Unet,其中AlbuNet-50被用作编码器。 网络开始产生足够的效果:皮肤是粉红色的,眼睛是灰蓝色的,肩带是淡黄色的。 但是问题是她在画上画了斑点。 这是由于以下事实:从L1错误的角度来看,不做任何事情比尝试预测某种颜色有时更有利可图。
我们正在将结果与地面真相照片进行比较-昵称为Klimbim的艺术家的手动着色如何解决这个问题? 我们需要一个鉴别器:一个神经网络,我们将向该神经网络提供输入图像,并且它将说明该图像看起来有多逼真。 在下面,一张照片是手绘的,第二张是神经网络的。 您认为哪一个?

作为区分符,我们使用文章
Self-Attention GAN中的区分
符 。 这是一个小的卷积网络,在最后一层内置了所谓的“自我注意”。 它使您可以更“注意”图像细节。 我们还使用频谱归一化。 确切的解释和动机可以在文章中找到。 我们训练了一个网络,结合了L1损失和鉴别器返回的错误。 现在,网络可以更好地绘制图像的细节,并且背景更加一致。 另一个例子:左边是仅训练有L1损失的网络的结果,右边是具有L1损失和鉴别器错误的网络的结果。

在四台Geforce 1080Ti上,培训耗时两天。 在512 x 512图片中,网络在30 ms内完成工作,验证的MSE为34.4。 就像修复问题一样,指标不能完全信任。 因此,我们选择了6个具有最佳验证指标的模型,并盲目投票赞成最佳模型。
在生产中推出该模型后,我们继续进行实验,得出的结论是,最好不要将每个像素的L1损失减到最小,而将感知损失降到最低。 要进行计算,您需要通过VGG-16网络运行网络预测和源照片,获取较低层的属性映射,然后根据MSE比较它们。 这种方法可绘制更多区域,并有助于获得更彩色的图像。

结论与结论
Unet是一个很酷的模型。 在第一个分割问题中,我们在训练和使用高分辨率图像时遇到了一个问题,因此我们使用就地BatchNorm。 在第二个任务(修复)中,我们使用了部分卷积,而不是通常的卷积,这有助于获得更好的结果。 在Unet的着色问题中,我们添加了一个小型鉴别器网络,该网络对生成器进行了罚款,以使其看起来不真实,并使用了感知损失。
第二个结论是访问器很重要。 而且不仅在训练前标记图片的阶段,而且还用于验证最终结果,因为在绘画缺陷或着色方面,您仍然需要在人的帮助下验证结果。 我们为用户提供三张照片:原始照片(已删除缺陷),彩色已删除缺陷(着色)以及彩色照片(以防发现和绘制缺陷的算法错误)。
我们拍了一些
军事相册项目的照片,并用我们的神经网络对其进行了处理。 这是获得的结果:
在这里,您可以在原始分辨率和处理的每个阶段看到它们。