Samurai 2018-12-10
点击上方关注,All in AI中国
大约一年前kaggle.com举办了一场计算机视觉挑战赛——相机模型识别(https://www.kaggle.com/c/sp-society-camera-model-identification)。任务是分配用于捕获图像的摄像机类型。比赛结束后,Arthur Kuzin,Artur Fattakhov,Ilya Kibardin,Ruslan Dutov和我决定撰写一份技术报告,描述如何解决这个问题并分享我们在此过程中获得的一些见解。它被西雅图第二届网络犯罪调查大数据分析国际研讨会所接受(http://folk.ntnu.no/andriis/bdaccip2018/),我将在2018年12月10日出席。在本文,我想对所述内容进行扩展补充。
相机模型检测是图像处理领域的众多应用之一。例如,在取证学领域,了解图像是使用Google Pixel还是iPhone拍摄,来确定谁可能是嫌疑犯,或者是确定谁是知识产权的所有者。这种系统甚至可用于在诽谤或传播假新闻的情况下检测犯罪者。
计算机中的图像多存储为数字矩阵和伴随的元数据。在最简单的情况下,相机模型应存储在图像元数据中,使相机识别成为一个非常容易的问题。但是图像元数据可能不可靠,并且很容易被恶意用户轻松操纵。
还有另一种更复杂但更可靠的方法。在图像采集之后,数码相机将经历一系列后处理步骤,对图像进行优化处理。这些算法非常复杂且具有非线性。它可以去马赛克、噪声过滤、处理固定镜头失真等问题。不同的算法用于不同的相机模型,这意味着它们中的每一个都创建了模型特定的伪像,人们可以将其用作机器学习管道的特征。
当然,有很多关于这个主题的文献。其中大部分提出了使用SVM或类似分类算法在其上进行手动特征提取的步骤。例如,当我遇到这个问题时,脑海中出现的第一个想法是拍摄一张图像,减去平滑后的图像,计算这种差异的不同统计数据,如均值、中位数、标准值、不同的分位数,然后对他们进行xgboost训练。
将此方法扩展到新的相机模型也很困难。假设我们想要为一个新发布的模型进行相机检测。专家需要花多少时间来确定哪些特性有助于将其与其他型号区分开来?
深度学习方法可以解决这两个问题。可以说,深度学习就像是一种强大的“野兽”,如果你知道如何驯服它,它就可以帮助你创建高度准确的黑盒模型。
像往常一样,当你查看文献并试图了解哪种方法是"最好的"时,这是做不到的。几乎每篇论文都在告诉你,他们的方法与众不同,他们的方法是最先进的。处理它的方法是评估同一数据集上的不同方法。但这样的比较一般不会给出答案,因为我们还要考虑到具体情况。也就是说同一种算法在不同的数据集上表现是不同的,比如说最先进的架构CIFAR在ImageNet上可能表现不佳。
对于摄像机检测任务,IEEE信号处理协会组织了一项挑战,其中582个团队用两个月的实时排行榜来比较他们的方法。582是一个相对较大的数字,它确保问题将会有具有不同背景和技能组的人来解决。
组织者准备了一套训练模型,包括来自10台摄像机的2750张图像。每台相机275个。
我们需要区分的相机型号是:
组织者总共使用了20部不同的手机来收集图像。这意味着在训练期间,你的模型可能不会学习与后处理算法相关的相机模型特定功能,而是会过度拟合于特定于特定手机的工件。
测试集中的图像是使用相同的10个相机型号捕获图像,但使用的是第二个设备。例如,如果iPhone 6的训练数据中的图像是用Ben Hamner的设备(摄像机1)拍摄的,那么测试数据中的图像是用Ben Hamner的第二台设备(摄像机2)拍摄的。
此外,训练中的图像是全尺寸的,而在测试中仅使用了512x512的图像。其原因是径向畸变在图像的侧面更明显。一些论文显示出纯粹基于径向畸变特征的有希望的结果。他们可以添加多少增量值尚不清楚,但组织者防止比赛人员利用它们。
这还不是全部。在许多情况下,通常存储在计算机上的图像会受到不同变换的影响,如jpeg压缩、伽马变换、对比度、亮度、大小调整等。
类似的逻辑组织者一半的测试图像进行了如下的转换:
1. 质量因子= 70的JPEG压缩
2. 质量因子= 90的JPEG压缩
3. 调整大小(通过双三次插值)0.5倍
4. 调整大小(通过双三次插值)0.8倍
5. 调整大小(通过双三次插值)1.5倍
6. 调整大小(通过双三次插值)2.0倍
7. 使用gamma = 0.8进行伽马校正
8. 使用gamma = 1.2进行伽马校正
正如我上面提到的,在不同的图像托管中有数PB的图像,我们可以提取相机模型等等。需要补充的是,Kaggle的不同比赛对外部数据有不同的规则,但在这种情况下,它是允许的。通常,所有允许外部数据的竞赛都有一条规则,规定所有参与者也可以访问数据。在任何此类竞赛中,论坛都有一个主题,即参与者分享他们计划使用的数据和预先训练的模型。
这场比赛是一个例外。管理员忘记将有关共享数据的句子添加到规则中,这改变了游戏规则。
深度学习模型的优点在于,由于其高容量,它们通常会受益于用于训练的数据量。而且,同样重要的是,许多训练标签可能是错误的。但是只要错误标签的百分比小于15%,它就是好的。你使用的数据越多,模型就越好。
参与者可能不是法医学方面的专家,但他们肯定知道数据越多越好。这改变了竞争的动态。通常,在竞争中,你试图从给定数据集中获取最多的信息。经过一系列实验,你会选择一个表现良好的模型,探索领域知识,花时间制定一个智能的训练计划,损失函数等等。
Flickr,Yandex,Fotki,维基百科被"废弃",团队所拥有的原始图像数据总量约为500Gb。我们可以使用所有这些数据,但是为了加速训练并可能提高我们执行过滤的模型的质量。
对于训练,我们需要未经处理的数据,这意味着它不受Photoshop或LightRoom或类似图像编辑软件的影响,也就是说无需调整大小和质量。
首先,我们删除了元数据中包含Photoshop和LightRoom的图像。其次,我们删除了Jpeg质量低于95的图像。第三,我们了解不同的相机以固定一组尺寸拍摄照片。如果图像的大小与我们预期的不匹配,那么我们假设图像已调整大小。然后删除了不符合这些标准的图像。
这并不意味着我们得到的所有图像都是未经处理的,比如有人可能会使用10%质量的jpeg压缩,然后应用另一种99%质量的jpeg压缩。实际上它仍然是10%,但是对于我们的软件来说,很难找到10而不是99。
过滤后,我们有78807个报废的图像,这些图像被认为是原始的和未经处理的。阶级分布不均匀。正如人们可能预期的那样,并非所有手机型号都同样受欢迎,或者手机型号与手机用户拍摄并上传到互联网的频率之间存在相关性。因此,对于某些类,我们的图像较少。
相机模型类具有数据集的每个部分的样本数。该表显示了包含外部和组织者数据集的最终数据集。
总的来说,管道与使用ImageNet的迁移学习时的管道类似。你需要预先训练好的网络,删除预测1000个类的最后一层,并将其替换为预测你需要的类。在我们的例子中,这个数字是10。在此之后,你可以使用分类交叉熵来弥补损失并训练网络从实践的角度来看,深度学习相较于科学来说更像是炼金术。因此,一个人在不同的任务上工作时所产生的直觉是至关重要的。
一个很好的PyTorch权重网络列表是Remi Cadene的repo(https://github.com/Cadene/pretrained-models.pytorch)。可以使用类似的API访问不同的网络和预先训练的权重,从而快速进行实验。团队试验了Resnet,VGG,DPN和所有其他类型的网络。
对于这个问题,一个实证的结论是,DenseNet的工作稍微好一点。
什么是DenseNet? DenseNet是一种架构,它进一步推动了Resnet类型网络中使用的跳过连接的想法。
跳过连接
DenseNet论文的作者连接了卷积块内的所有层。跳过连接简化了梯度的流动,从而可以训练深层网络。在跳过连接成为主流之前,处理只有19层的VGG19是一件痛苦的事情,但是在引入它们之后,具有100多个层的网络可以使用非常高级的抽象功能,这不再是一个需要训练的问题。
除此之外,网络相对标准。一组具有批量范数和ReLu层的卷积块,具有着块之间的最大池。最终的全局平均汇集和密集层。值得一提的是,存在全局平均合并层的事实允许我们使用不同大小的图像作为输入。
社区中的一些人认为DenseNet总是优于Resnet,因为它后来被引入并成为2017年CVPR的最佳论文。事实并非如此。在原始论文中,DenseNet在CIFAR上显示了良好的结果,但是在更加多样化的ImageNet数据集中,更深层次的Densenet需要匹配准确性较浅的ResNet网络。
DenseNet比Resnet更好/更差吗?视情况而定。在《星球:从太空挑战中了解亚马逊》中,DenseNet为我们的团队完成了900+各项目中的第7个,在这个相机检测问题上也做得更好。但在ImageNet上它更糟糕。
我与我的合作者进行了讨论,有人提出跳过连接不仅可以平滑损耗表面,而且还可以降低模型容量。这可以解释为什么DenseNet在CIFAR等非多样化问题上表现更好,但需要增加网络深度以补偿更多样化的ImageNet数据集的容量损失。基于这种推测,人们可能会想到DenseNets运行良好的用例是当数据集不够多样化并且不需要大容量时,但是判别性特征是高级别的,这可能需要非常深的网络。
相机检测任务是否属于此类别?我不知道。但根据经验来说,是的。
将正则化添加到训练过程的标准方法是扩充。不同的问题可能会从不同的增强中受益,同样,你的直觉更重要,你可以选择更好的增强和参数。
对于这个问题我们使用:
1. 二面体组D4变换:旋转90度,180度,270度和翻转。
2. 伽马变换。我们从[80,120]范围统一选择伽马参数。
3. JPEG压缩,参数从70到90均匀采样。
4. 重新缩放转换,从[0.5,2]范围中选择比例。
在代码中,使用albumentations库可以将其描述为:
下边是我最近攀登Bishop的攀岩之旅的原始图像,它的右边是翻转,图像有点暗,这是伽玛转换的结果,还应用了Jpeg压缩,但由于这种类型的图像的质量[70:90]相对较高,因此很难得到它的效果。
组织者告诉我们,他们使用三次插值来调整大小。如果我们没有这些信息,我们可以在不同的插值之间交替使用。一般来说,ML社区经常使用这个技巧,但我还没有在文献中看到它。
无论如何,如果我们想要添加这种更改,代码会更复杂,但仍然相对透明。
原始图像具有较大的分辨率。以全分辨率重新调整它们是不明智的,因此我们有两个连续的结果。一个在调整大小之前,一个调整大小之后。
该网络使用Adam优化器训练了10万个时期,初始学习率为0.001。
为了获得更好的准确性,当学习速率在不同值之间振荡时,我们还使用循环学习速率方法。
正如你可以从这张图片中猜到的那样,学习率在第17期左右降低了。
同时存在两个连续衰减的损耗峰值。一个约42,另一个约53个时期。在训练期间,网络往往陷入局部最小值,这些振荡有助于摆脱它们。
在推理时,我们进行了测试时间增加,即对不同的480x480图像的预测进行平均。
我们可以估计不同的变换是怎样在推理时间内降低模型的准确性的。
在绿色中,我们描述了训练期间使用的参数范围。
正如在模型训练范围内所预期的那样,精度没有显著降低。这表明,使用深度学习方法并且具有足够数量的数据时,扩充应用的增强的范围可以导致更强大的模型。
我们想要回答的另一个问题是,如果我们减少在测试时输入网络的图像的输入大小,准确度如何表现?
为了使10个等级的准确率达到90%以上,人们需要拥有至少250x250的图像,这可能意味着后处理算法会在网络捕获的像素之间产生长距离相关性。
我们还想验证,当训练数据量增加时,模型的准确度会上升。正如你在图中看到的那样,这并没有发生。我想我们25k的最低数据点足以满足高质量的模型。
可能会发生这样的情况:如果我们需要检测的不是10个,而是1000个,那么作为训练数据函数的模型质量的上升会更加明显。
总结:
文中略过的内容:
所有这些都很重要,但我不认为它们具有超强的影响力,或者说我更愿意对它们进行单独的讨论。
作者——Vladimir Iglovikov