我有一个由大约20K张人类标记的图像组成的数据集。标签如下:如果图像清晰且光线充足,则标签=1,并且对于那些模糊/失焦/颗粒图像,标签=0。
这些图像是身份证等文件的图像。
我想建立一个可以完成分类任务的计算机视觉模型。
我尝试使用VGG-16进行此任务的迁移学习,但没有给出好的结果(精度.65,召回率=.73(。我的感觉是VGG-16不适合此任务。它是在ImageNet上训练的,具有非常不同的低级别特征。有趣的是,这个模型不太合适。
我们还尝试了EfficientNet 7。尽管该模型能够在训练和验证方面表现良好,但测试性能仍然很差。
有人能为这项任务推荐更合适的模型吗?
我认为VGG和其他NN的问题是图像的大小调整:
VGG期望输入224x224大小的图像。我假设您的数据集具有更大的分辨率,因此在将输入图像输入到网络之前,您会显著缩小输入图像的比例。
缩小图像时,模糊/噪波会发生什么
模糊和嘈杂的图像随着分辨率的降低而变得更加清晰。因此,在你的许多训练例子中,当你给他们贴上";腐败";。这对训练不好。
一个有趣的实验是看看你的网络可以正确地分类哪些类型的降解,以及它失败了哪些类型:你报告的准确率为65%,召回率为73%。你能看一下当时的分类图像并按退化类型对它们进行分组吗
也就是说,只有模糊图像的精度/召回率是多少?什么是噪声图像?颗粒图像呢?
你能做什么
- 根本不要调整图像大小!如果网络需要固定大小的输入,则裁剪而不是调整大小
- 利用";调整大小";效果,您可以使用";鉴别器";。训练一个网络;歧视;在图像及其缩小版本之间。如果图像清晰干净,这个鉴别器将很难成功。然而,对于模糊/嘈杂的图像,任务应该相当容易
对于这个任务,我认为使用opencv就足以解决这个问题。事实上,将图像的Lablacien的方差与阈值(cv2.Laplacian(image, cv2.CV_64F).var()
(进行比较将产生图像是否为蓝红色的判定。
您可以在以下教程中找到该方法和代码的解释:使用opencv 进行检测
我认为,训练一个分类器,将其中一个神经网络模型的输出和拉普拉斯算子的方差作为特征,将提高分类结果。
我还建议使用ResNet和DenseNetExperement。
我会观察像素之间颜色的变化,然后根据像素之间的中值delta对照片进行排名。。。每个相邻像素上从RGB(0,0,0(到(255255255(的急剧变化将是最大可能的分数,模糊程度越高,分数越低。
我过去曾这样做,试图成功地估计田地的面积。