解决当前基于深度学习的目标检测器的问题,系统地来看,应该分别从数据集、网络架构、损失函数、后处理,以及学习算法等方面考虑。
(1)数据集平衡扩增:干净且均衡的数据,从来都是解决问题最有力的办法。通常数据集中的各个类别的样本呈“长尾”分布,直接用来训练检测器容易导致对样本少的类别出现漏检。这时可以考虑对样本少的类别,进行样本扩增。扩增过程最好考虑新增样本的diversity以及context,比如这篇文章就是很好的小目标检测中的数据扩增方法;
(2)改进网络结构:神经网络结构设计,决定了从数据集到检测结果之间映射的假设空间。正如 @wen Hedes 和 @chenyh 提到的Anchor的设计,可以很好地引入样本少的类别的bbox分布先验,使生成的region proposals在这些类别有较高的召回(Recall)。除此之外,由于漏检也很大程度上来自于目标尺度的巨大变化,比如自动驾驶场景中,同是Car类别的bbox样本在远处只占据极小部分pixels,而在近处甚至占据近半幅图像。经典的做法包括image/featur pyramid 如FPN等,以及Multi-scale Training/Testing策略,但最近 @NaiYan Wang 等人提出的Trident Network提出使用不同ratio的dilated conv分别匹配不同的感受野,达到检测不同尺度目标的目的,效果也很惊艳,应该能够很好地解决尺度变化带来的漏检问题;
(3)改进损失函数:前面提到的Class-balanced Focal Loss是个很好的尝试方法。除此之外,Online Hard Example Ming(OHEM)策略,如mtcnn文献loss方法,也可以尝试。由于易漏检样本通常在训练过程中较容易产生较大的loss,那么在每次训练迭代中,将loss值较大的的样本筛选出来加入训练集进入下一次迭代,使得检测模型更多关注易漏检样本;
(4)后处理:在崇尚end-to-end检测模型的今天,一般不提倡使用过多后处理设计,但实际工程应用中后处理经常起到至关重要的作用。前面已有提到改进NMS后处理算法,在目标遮挡严重的场景中效果非常明显。其中关键是如何区分目标的duplicated bbox及其周围目标的occluded bbox。解决的好得话,能够显著改善漏检问题;
(5)其它学习算法:除了目前主流的监督学习模型,也可以考虑其它的学习算法,比如我最近比较感兴趣的lifelong/continual learning。针对目标检测漏检问题,可以考虑将不同类别的检测问题,划分为不同难度的task分别训练检测器,利用lifelong learning实现一个模型解决不同类别目标的检测。不同于multi-task learning,lifelong learning无需要求在每个task的训练过程中获取全部task的数据(所有类别的样本)。以经典的Elastic Weights Consolidation (EWC)算法为例,可以根据各类样本分布,划分不同的子数据集得到不同的detection tasks,训练完一个task后,在新的task的训练过程中,利用EWC regularizer调整weights的优化方向,使模型能够学习当前detection task的同时,不遗忘已经学习过的detection tasks。这样最终得到的模型能够处理所有task中的所有类别的检测,对漏检问题应该有一定的改善作用,但是否会削弱容易检测的类别的性能,需要实验验证;
(6)知识蒸馏和迁移学习方法;
转自:https://github.com/eeric/Pedestrian-detection-paper-list/issues/1
网友评论