
CenterNet是一种anchor free的方法,也就是在这个算法的流程中,已经没有anchor这个概念。也可以说是一种keypoiint(关键点)系列的方法。
CenterNet把物体看成一个中心点,中心点可以看成是某一种关键点。还有其他的方法,将物体表示为其他的点。
CenterNet的网络结构采用ResNet的结果,或者FPN这种金字塔结构,来作为backbone,对图像进行特征提取,输出的特征图,可以是单分辨率的特征图,也可以是多个分辨率的特征图。
CenterNet的不同在于后面的3个head。
一个是Center Heatmap:网络的输出要体现出每个位置是否出现中心点,及对中心点的分类,
另外需要知道bounding box的信息,就需要另外2个头:Center Offset和bbox size。
将上面3个head结合,就能找到目标。
Center Heatmap 中心点的分类

anchor的机制如左图所示,黑色为groud truth,绿色为正样本anchor,因为IOU比最大,红色为负样本anchor,这里只是举例,实际anchor会更多,一般是9个。
CenterNet的机制看中间的图,图像上的每一个位置,是否属于物体的中心点,绿色的点是物体的中心点,所以就是一个正样本,一个特征图可能不能和物体中心点100%match,我们选最近的,作为正样本,对于每一个物体,只会有一个对应中心,其他都是负样本。因为物体是有一定的范围的,所以其他点可能也会落在物体上,比如浅红色的点,他们计算loss全权重值是比较低,因为这两个点是正负样本之间的点,忽略它。
右图是groud truth,与feature map的分辨率是一致的,白色的点是正样本,其他的都是负样本。实际上每一个负样本应该有一个权重,这里只做了0-1的处理。
网络的输出会在每一个特征图的位置上,输出一个置信度,出现物体的概率。出现物体的会出现峰值,算法在做后处理,会用pick search的操作。除了比较高的位置,也会在没有出现物体的位置,输出,这个就是false positive。
对于多个物体,会有多个groud truth的图,也会有多个feature map,最后我们来计算2张图的focal loss,它们的差异,focal loss可以平衡正负样本。在自动驾驶场景下,正样本数量远远少于负样本数量,这时候负样本产生的loss对于整体loss,有一个支配的作用,所以用focal loss对其进行一个平衡。

heatmap在特征图的每一个位置,输出这个位置属于物体中心点的概率。比如我们关心车辆检测,图片输出2个pick的位置,2个位置并不是很精确的对应物体的中心点。我们用center offset对center的位置进行一个修正,center offset包含x,y,2维坐标。一张特征图对应x的偏移,一张特征图对应y的偏移。合起来,得到每一个位置的偏移量。但是,我们只关心有目标输出位置的偏移量。然后将物体中心点位置按照offset偏移量,移动到物体的中心上,但是有时候偏移量并不是那么准。
移动到中心上以后,我们还需要知道bounding box的size,2个channel,对应bounding box的长度和宽度。我们就知道车辆,中心点,以及bounding box的size,3个特征图的结合,就得到了final output。物体检测想要的结果。

CenterNet是一个one-stage的检测器,与two-stage的检测相比,最大的区别在于没有ROI Pooling,只采用物体中心点的特征进行物体分类和bounding box的回归。
two-stage是通过RPN网络拿到粗略bounding box的范围,对于bounding box里面的特征进行一个Pooling,用这个特征来进行bounding box的回归。对于算法有一个很快的加速。
CenterNet是一个anchor free的方法,没有anchor这个概念,直接从物体中心点得到的特征来直接回归物体bounding box的参数。不需要手工设计anchor的超参数,简化了算法的设计流程。
CenterNet主要问题是只采用了中心点,有些物体有很大的形变,中心点特征无法很好表示物体,比如左图的小女孩,他的中心点可能和实际身体的中心点位置并不吻合。即使他们的中心点吻合,但是这个中心点,并不能描述头部和腿部的特征。
但是在自动驾驶中,车辆,行人,在交通的环境下,这些形变不是很大,用中心点可以比较好的表示物体。这是一般的情况。但是有特例,比如两节的公交车,转弯时,有一个角度,s形状,这时候只采用中心点的特征,无法很好的描述车的形状。归根结底,是因为只采用了中心点的特征。很难描述比较大行变的物体。

FCOS是对CenterNet的改进,整体结构上看,FCOS的结构和CenterNet非常的相似,下面说下他们的不同点:
FCOS是在多个分辨率的特征图上进行预测,比如右上角那个图,人的中心点和网球拍的中心点进行了重合,这样的话,我们就不知道这里是属于哪个物体了。我们将网球拍这个小的物体映射到大的分辨率特征图上,而人映射到小的特征图上,这样他们的特征图就完美的分开了,不同分辨率特征图处理不同的物体,很好解决不同物体重叠和中心点模糊问题了。
自动驾驶中,也会遇到同样的问题。如右下角图所示,是我们用CenterNet训练的图,可以看到前面识别出了人而没有识别出车,而后面又只识别出了车,没有识别出骑自行车的人。这时候可以通过FCOS来分别映射到不同的feature map,分别处理。骑车的人和车在图像上发上重叠,是因为透视投影的问题,实际中,他们没有发生重叠。FCOS在2D感知中,可以很好的解决这个问题。当然,有3D点云,这些物体是没有重叠的,这种情况下,CenterNet可以避免这个问题,这个问题在3D中,并不是很严重。FCOS在3D中,不是很必要。或者只取几个分辨率的特征图。

第二个区别是,FCOS在中心点周边选择了多个正样本。正样本是FCOS通过Centerness的准则进行选取的。Centerness衡量一个点到物体中心的指标,上面那个蓝色框是bouding box。我们对bouding box里的所有点进行扫描,大于阈值的,都设为正样本。上右图中,越是暖色的点,centerness越大,越是冷色的点,centerness越小。

最后FCOS增加了一个对centerness的预测分支。预测某一个点距离物体中心点的程度。classification是否出现物体的置信度,和centerness进行相乘,表示出现物体的置信度。

ConnerNet主要是提取物体的边缘点,对于物体进行检测。输出预测的bb的4个角点。网络会对这4个角点进行匹配,得到属于同一个物体的4个角点,完成物体的检测。
下面展示CenterNet再真实场景下,定性分析的结果:

上图可以看到,并不是所有车辆都倍检测到,尤其是有遮挡的问题。
可以用ConnerNet来提高鲁棒性,这里不是说用ConnerNet的思想,不是用它做整个网络。也就是说可能不光是检测center点,也检测conner点。如果center和conner是match的,就不需要额外计算。这是目前比较好的研究课题。
另外也可以通过语义分割将其检测为一般性的障碍物。对于上述场景中,如果检测不到每一个物体,退而求其次,我们可以把整体区域认为是障碍物的区域,车辆无法行驶。但是具体有几个物体,我们不知道。这对于自动驾驶来说,这也是一个非常好的信息。

再图像边缘出现了一些误检,这个可能的方法可以通过物体跟踪对物体进行过滤。静态的检测结果。实际自动驾驶场景,是动态的,当前可能无法看到目标完成的状态,但是前几针,我们是知道的。
另一个方案就是多目系统,通过增加信息的冗余,多个不同的摄像头,虽然每个摄像头只看到一部分物体,但是整合起来可以看到完成的物体。这个是特斯拉FFD系统中的。3D老师会继续讲。

正前方有2个比较小的车辆,算法没有检测到,因为物体距离比较远,比较小,下采样特征图,如果分辨率不够,信息就丢掉了,无法检测到。解决:
增加特征图的分辨率,计算量会增加。100万的像素,我们的算力无法处理这么大的特征图,沃门会通过下采样,降低到300300或者200200.这样小物体就丢掉的,如果增加分辨率,比如500500或者800800,小物体就可以检测到,也增加了算法的计算量。这就是自动驾驶无法调和的矛盾,也是为什么芯片快速发展的原因。
另一个工程方面的优化就是在高速公路这个特定场景中,比较小的物体,不会出现在天空,只会出现在前方中心区的位置,我们可以通过相机的内参和外参计算出来,我们可以提高这个区域的置信度,或者降低阈值,提升检测率,这里没有算法本身的关系,工程用的技巧。这种技巧在工程上很有用。

很多行人聚集,没有检测出来,两个人行人并排行走,无法检测。多个目标聚集,他的视觉特性和单个行人有很大的差别,如果算法以单个行人为目标,这里会觉得群体和单人差的比较多。并排的人,可能中心点很近,最后只选了一个pick,另一个行人就被覆盖了。
我们可以定义一组行人,新的目标类别,当然2个行人也可以定义为2个行人的类别,在实际应用中,当2个人并排走的时候,一个bb也就够了。对于聚集行人,也是相同的道理,另外可以采用语义分割的方法。将一群人定义为一个区域,不能行驶的区域。

左边mish了,可能是例子在数据库出现太少了。右边是误检的。也是出现的太少了。
这时候就在数据上做工作,hard 挖掘,收集错误的例子,加到训练集里,retrain模型。再寻找错误的例子,在迭代模型。收集失败的场景,有针对性的收集失败场景的数据,在训练模型,一步步迭代模型。这都是工程上的方法。或者数据上的方法。数据为王。数据收集、标注和清洗时非常重要的。

上面的数字不是原始论文的,是一些第三方实践的结构。这个对比不是100%公平,作为一个参考。

老师提到的每一个模型,都值得刷一遍论文。
R-CNN是第一个利用深度学习的方法,提出了从图像自动学习特征,避免了手动学习。针对有重叠的图像块,有冗余。Fast提出了复用图像特征。Selective search这个步骤生成候选框,这个很好使,在Faster 利用RPN网络直接生成候选框,避免耗时,同时是一个完整的端对端学习,提升了物体的检测精度。FPN在特征提取上进行了改进,多尺度特征图,适应不同大小的物体。R-CNNN都是2阶段的,也涉及anchor进行回归。Region Proposal需要ROI Pooling这里比较耗时,所以提出了单阶段的方法。
SSD系列和Yolo系列。SSD在特征图每一个位置进行分类和回归,遇到正负样本不平衡问题,需要Retinanet的focal loss。更关注hard example,提升算法在hard example的解决能力。Anchor引入了一些人工设计的步骤,这也是和后端任务相关的,Keypoint提出将物体表示为关键点,避免手工设计Anchor,让网络进一步简化,FCOS,Cornernet,Reppoints,对center点进行了扩展,进一步提高特征表示的能力。

自动驾驶的应用中,光照和天气影响很大,算法需要自动学习特征,来适应不同的变化,深度学习可以自动学习特征。另外由于目标种类和形状相对比较少和固定,这时候可以采用
Centernet这样的方法,将物体表示中心点,简化算法的设计,提升算法实现的效率。
由于透视变化,近的物体比较大,远的物体比较小,FPN的思想就是大小物体在不同feature map提取特征,更好的学习。
自动驾驶物体目标在图像中占的比例比较小,和通用物体检测相比。这时需要用到Retinanet的Focal Loss来对正负样本进行一个平衡,关注hard的样本。Centernet对一些罕见的样本,在训练集比较少,所以要用到Focal Loss的机制。
最后算法对于实时性的要求比较高,排除了很多算法,比如R-CNN的系列。一般会选择Yolo或者Centernet。都是比较常用的落地算法。