解决当前基于深度学习的目标检测器的问题,系统地来看,应该分别从数据集、网络结构、损失函数、使用策略等方面考虑。
(1)数据集平衡扩增:在训练网络之前将图像进行平衡化无疑是最为简便有效的一种方法。通常数据集中的各个类别的样本呈“长尾”分布,直接用来训练检测器容易导致对样本少的类别出现漏检。这时可以考虑对样本少的类别,进行样本扩增。扩增过程最好考虑新增样本的,若无新样本则可以使用:噪声、滤波、亮度、镜像、翻转。
这些操作较为简便同时也便于对标签文件进行变换。
(2)改进网络结构:神经网络结构设计,决定了从数据集到检测结果之间映射的假设空间。 我们可以很好地引入样本少的类别的bbox分布先验,使生成的region proposals在这些类别有较高的召回。
除此之外,由于漏检也很大程度上来自于目标尺度的巨大变化,比如自动驾驶场景中,同是Car类别的bbox样本在远处只占据极小部分pixels,而在近处甚至占据近半幅图像。经典的做法包括image/featur pyramid 如FPN等,以及Multi-scale Training/Testing策略,使用不同ratio的dilated conv分别匹配不同的感受野,达到检测不同尺度目标的目的,效果也很惊艳,应该能够很好地解决尺度变化带来的漏检问题。简单的可以使用3*3大小的卷积核替代5*5大小的卷积核。
(3)改进损失函数:前面提到的Class-balanced Focal Loss是个很好的尝试方法。除此之外,Online Hard Example Ming(OHEM)策略,如mtcnn文献loss方法,也可以尝试。
由于易漏检样本通常在训练过程中较容易产生较大的loss,那么在每次训练迭代中,将loss值较大的的样本筛选出来加入训练集进入下一次迭代,使得检测模型更多关注易漏检样本;
(4)使用策略:例如多个网络对同一目标识别,取占比大的结果作为最终结果;将差别较小的类别分配至另一个网络中进行识别
(5)其它学习算法:除了目前主流的监督学习模型,也可以考虑其它的学习算法, 目前出现了零样本学习、以及无监督学习模型。