我使用Tensforflow使用了一堆JPG图像训练了一个图像分类器。 假设我有3个分类器:ClassifierA,ClassifierB,ClassifierC。
在测试分类器时,我用于测试的图像中有90%完全没有问题。但是在某些情况下,由于图像质量我将分类错误。
例如,以下图像是相同的,另存为BMP和JPG。由于格式质量,您几乎看不到任何差异。
当我使用tf.image.decode_bmp测试BMP版本时,我得到了错误的分类,比如说ClassifierA 70%
当我使用tf.image.decode_jpeg测试JPG版本时,我找到了正确的版本,ClassifierB 90%
当我使用tf.image.decode_jpeg和dct_method =“ INTEGER_ACCURATE”测试JPG版本时,我得到了更好的结果,ClassifierB 99%
这里可能是什么问题? BMP和JPG之间的这种区别,如果有解决方案,该如何解决?
update1:我使用不同的效果重新训练了分类器,并随机更改了保存用作数据集的图像的质量。
现在,我得到了正确的输出,但是百分比仍然发生了很大变化,例如BMP为44%,JPG为+90%
答案 0 :(得分:1)
这是一个神话般的问题,甚至是一个神话般的观察。以后我会在自己的工作中使用它!
我希望您刚刚发现了一个非常有趣的数据集问题。看来您的模型过度适合JPG压缩特定的功能。解决方案是增加数据扩充。特别是,将训练样本随机转换成各种格式。
这个问题也使我认为锐化和模糊操作将使数据具有良好的增强功能。改变图像的颜色,对比度,旋转度,比例,方向和平移以增强训练数据集是很常见的,但是我通常看不到使用模糊和锐度。我怀疑这两种数据增强技术将对解决您的问题大有帮助。
如果OP(或其他阅读此书的人)对“数据增强”不是很熟悉,我将对其进行定义。通常会以各种方式扭曲训练图像以从(否则为有限的)数据集中生成无穷无尽的图像。例如,向左/向右随机翻转图像非常简单,常见,并且可以有效地使数据集增加一倍。更改对比度和亮度设置会进一步改变您的图像。将这些以及其他数据增强转换添加到管道中,可以创建更丰富的数据集,并训练出一个对图像中这些常见变化更为健壮的网络。
重要的是,您使用的数据增强技术会产生现实的变化。例如,旋转图像是相当现实的增强技术。如果您的训练图像是水平站立的猫,那么将来的样本实际上可能是25度角的猫。