参考代码:CrowdDetection
1. 概述
导读:在一些密集场景下检测算法由于算法自身问题导致其对密集场景检测存在问题,整篇文章正是解决这样的场景下的检测问题。这篇文章主要的思想就是将原来单个框检测的方式修改为预测一个相互关联框的集合(instance set)(可以看作是一块区域目标的集合),并且针对这种改进提出了EMD Loss和Set NMS去监督与提取最后的结果。文章的方法使用FPN-Res50作为backbone在CrowdHuman数据集上获得了4.9%(without RM),在CityPersons数据集上提升1%的 M R − 2 MR^{-2} MR−2。并且文章的方法具有较好的可移植性(适配很多现有的检测算法)和通用性(其在COCO数据集上也有较好的性能表现)。
密集场景下的检测一直是传统检测算法较难解决的问题,这主要有两个原因:
- 1)密集场景下检测的目标一般具有近似的特征表达,这就使得网络很难将这些单独的个体分离开;
- 2)由于不同个体的检测框相互存在较多的重叠部分,这就使得这些检测结果很大可能被NMS算法给去除掉;
下图是传统的检测算法检测结果(上图,虚线框就是被漏掉的)和文章提出方法的检测结果(下图):
文章针对这样的密集场景处理办法是去预测目标集合的位置,而不是单独的个体目标,其示意图见下图所示:
上图(a)中分别使用红绿蓝表示刀子/叉子/空,(b)图将这些划分为集合进行预测。对于这样的改进文章提出了三点改进优化:
- 1)使用EMD Loss监督集合目标的回归;
- 2)使用Set NMS作为集合目标检测结果的后处理;
- 3)提供一个可选择的RM(refinement module),用以排除一些错误的定位;
2. 方法设计
2.1 网络结构
这篇文章采用的检测网络架构师Res50-FPN,之后使用RCNN的检测头进行目标检测,其结构见下图所示:
2.2 instance set定义
既然相互重叠较多的目标较难单个进行处理,因而一个很自然的理念就是将几个重叠较为严重的融合成一个进行预测,因而融合之后的样本描述为:
G ( b i ) = { g i ∈ G ∣ I o U ( g i , b i ) < θ } G(b_i)=\{g_i\in G|IoU(g_i,b_i)\lt \theta\} G(bi)={
gi∈G∣IoU(gi,bi