图像分类领域大佬众多,模型和论文更新速度也很快,很多数据集也早已经刷满,但回归到图像分类任务本体,大体的结构类似,一些经验也可以套用,因此记录下来,常看常新。
一:图像分类模型选择
选对了模型就已经成功了一半,针对不同的业务场景和硬件设备,我们应当选择合适的场景。
如果在服务器端部署,则可以考虑像ResNet_vd、Res2Net_vd、DenseNet、Xception这种精度较高但要求计算性能高的模型。
如果在移动端部署,首先要求的是考虑模型的体积和模型的运算速度,对及时性要求比较高,MobileNet家族比较合适。
二:模型的参数冗余
(1) 剪枝: 相对不重要的权值剔除,然后再重新对网络进行微调
(2) 模型量化: 浮点计算转成低比特定点计算的技术,如8比特、4比特等
(3) 知识蒸馏: 使用教师模型(teacher model)去指导学生模型(student model)学习特定任务
三:训练参数初始化
当对得到的预训练模型进行初始化(目标数据集不是很大) 自己手动设计的网络:
(1) Xavier初始化,针对Sigmoid函数提出的
(2) MSRA初始化, 使用较多RELU激活函数时
四:目标检测、图像分割、关键点检测等任务中选择分类模型作为骨干网络
(1) 在不考虑速度的情况下 ResNet50_vd_ssld, Res2Net200_vd_26w_4s_ssld
(2) 对图像分辨率的要求比较高,HRNet, HRNet_W18_C_ssld、HRNet_W48_C_ssld
五:模型收敛效果很差原因
(1) 检查数据标注是否正确
(2) 调整一下学习率过大(训练震荡)或者过小(收敛太慢)
(3) 数据量太大,选择的模型太小
(4) 数据预处理的过程中是否使用了归一化,如果没有使用归一化操作,收敛速度可能会比较慢
六:优化器选择(目的是为了让损失函数尽可能的小)
(1) 推荐 SGD,初始学习率设置得当并且迭代轮数充足情况下,可以获得更高的准确率
(2) 自适应学习率的优化器如Adam、RMSProp, 收敛速度往往比较快,但是最终的收敛精度会稍差一些.
七:学习率下降策略
(1) piecewise_decay(阶梯式下降学习率)
(2) polynomial_decay(多项式下降)
(3) exponential_decay(指数下降)
(4) cosine_decay(余弦下降),无需调整超参数,鲁棒性也比较高
八:选择合适的batch size
根据实际的模型大小和显存情况,可以将学习率设置为0.1k,batch_size设置为256k
九:数据增广方法
图像变换类 AutoAugment和RandAugment
AutoAugment 是在一系列图像增广子策略的搜索空间中通过搜索算法找到的适合特定数据集的图像增广方案。
论文地址:https://arxiv.org/abs/1805.09501v1
开源代码github地址:https://github.com/DeepVoltaire/AutoAugment
AutoAugment 的搜索方法比较暴力,直接在数据集上搜索针对该数据集的最优策略,其计算量很大。在 RandAugment 文章中作者发现,一方面,针对越大的模型,越大的数据集,使用 AutoAugment 方式搜索到的增广方式产生的收益也就越小;另一方面,这种搜索出的最优策略是针对该数据集的,其迁移能力较差,并不太适合迁移到其他数据集上。
在 RandAugment 中,作者提出了一种随机增广的方式,不再像 AutoAugment 中那样使用特定的概率确定是否使用某种子策略,而是所有的子策略都会以同样的概率被选择到,论文中的实验也表明这种数据增广方式即使在大模型的训练中也具有很好的效果。
论文地址:https://arxiv.org/pdf/1909.13719.pdf
开源代码github地址:https://github.com/heartInsert/randaugment
2.图像裁剪类 CutOut、RandErasing、HideAndSeek和GridMask
图像裁剪的这些增广并非一定要放在归一化之后,也有不少实现是放在归一化之前的,也就是直接对 uint8 的图像进行操作,两种方式的差别是:如果直接对 uint8 的图像进行操作,那么再经过归一化之后被裁剪的区域将不再是纯黑或纯白(减均值除方差之后像素值不为0)。而对归一后之后的数据进行操作,裁剪的区域会是纯黑或纯白。
上述的裁剪变换思路是相同的,都是为了解决训练出的模型在有遮挡数据上泛化能力较差的问题,不同的是他们的裁剪方式、区域不太一样。
3.图像混叠类 Mixup和Cutmix
Mixup 是最先提出的图像混叠增广方案,其原理简单、方便实现,不仅在图像分类上,在目标检测上也取得了不错的效果。为了便于实现,通常只对一个 batch 内的数据进行混叠,在 Cutmix 中也是如此。
与 Mixup 直接对两幅图进行相加不一样,Cutmix 是从一幅图中随机裁剪出一个 ROI,然后覆盖当前图像中对应的区域
4.遮挡情况, CutOut、RandErasing、HideAndSeek和GridMask等
5.色彩变换情况比较复杂的情况下,考虑使用AutoAugment或者RandAugment的数据增广策略
十:图像分类如何处理【其他】类别
举例:以水果图片识别分类任务为例,可以采用图像分类算法建立多分类模型,如何处理非水果图片【其他】类别?最常规的做法是随机采集一些图片作为【其他】类别与水果图片一起训练多分类模型,但这仍旧有很大的局限性,毕竟没法穷举所有的【其他】类别图片。
思路:
1:在做任何分类前提,非常重要的一点是分类体系的完备性和系统性。尽量做到分类体系的专业性(最好能形成专家系统)。这要有一定常识和理论的支持。不能简单的说【其他】类别。你要确定好产品的输入,一旦出现这些分类的不完整性,我们应该和测试和产品和用户达成闭环,去完善这个分类体系。如果这个前提做不好,后面的工作就会有很多麻烦。比如测试。常常就会争吵说我觉得应该分到什么类别。
2:第二个问题即使是我有一个完备的分类体系也存在两个问题
1、分类体系总有边界模糊
2、算法总会有误差的
这个我觉得应该不是开发人员的问题。应该通过业务手段避免。开发人员只能尽量提高准确率。
所以一般现在的深度学习工程应用,大多都得限制场景,我们准确率召回率都得在我们已知的场景中才能适用,正因如此,深度学习之所以能落地。