小目标检测优化方案与思路
对于这个难点我们查阅资料进行讨论,得出了以下可行性非常高的解决方案:
- 方案1
分开训练:
大目标用一个网络结构进行训练
小目标用一个网络结构进行训练
- 计划任务:22.10.21-22.11.20:都用yolo系列的网络结构,借鉴结论进行对比实验。
- 结论:4个anchor框进行:首先,在detect区,增加一个随意的小目标检测anchor会更有效的检测到小目标
- 结论:3个anchor框进行:其次,将yaml配置框架中的最大的anchor框减掉,这样就不会识别到较大的目标。
训练结果:效果不好 - 结论:2个anchor框进行:删除检测层最大的anchor和中等大小的anchor。
训练结果:小目标置信度有明显增加
- 方案2
数据集扩增:
数据集从原来的1100增加到了1675(符合要求的数据集真的很难找,建议爬虫以后再人工筛查)
- 验证集采用交叉验证的方法进行
- 验证集要符合熟练集的目标要求,但不能从训练集挑出来
- 交叉验证是为了让得到的map值更加可靠且稳定
- 交叉验证打算分4组进行 最后取平均值,暂定Stratified KFold法 (方法详解 链接: 点此)
- 数据集明确规范,哪类不标,哪类标
- 首先,明确标注规范:小船样本只标注船体
- 小船特征对比
- 大船特征对比
- 项目3
大胆创新点:最大池化的原理大家都晓得,那么如果把大目标变为小目标,就是把大像素通过处理变为小像素(反正机器学习也是按照像素再分析出0,1,0,1来)
因此结合了最大池化。举个栗子:
还是以船为栗子吧,先明确概念:
大船:比如近处的渔船。 小船:远处的渔船
以所占像素为参考进行大小之分,那么我们观察图像可以想到,一张图中有很多大船和小船(涉及到了样本不均衡问题)。那么如果把大船都变为小船的话,这样对于小目标检测来说无疑是最好的:
优点1:解决了小船的样本过少,扩大了小船的数据集
优点2:因为目前阶段只解决小船难以检测问题,大船的存在会造成小船的特征受到影响。那么同样是船,为什么会受到影响?因为小船受到光线和角度,像素影响,已经不像大船那样的特征了。更像是河道中的石头,这也就是为什么在普通网络结构训练出来的很难对于小目标有很好的效果。哪怕map再高,图中的小船也是未经识别的
链接: 样本不均衡问题
以上都有训练数据进行支持得出的结论,也有博士亲自进行指导,内容可靠。