在之前我有总结过一些目标检测网络:
计算机视觉算法——目标检测网络总结
这些方法大都是Anchor Based方法,Anchor Based方法的主要问题是:
CornerNet发表于2018年ECCV,原论文名为《CornerNet: Detecting Objects as Paired Keypoints》,该论文将目标检测问题当作关键点检测问题来解决,通过检测目标框的左上角和右下角两个关键点得到预测框。从同期SOTA方法在MS COCO数据集的对比i结果看,相对于One-Stage方法精度有明显提升,但是相对于Two-Stage方法精度接近,但是该方法在推断时间上无优势:
网络结构如下图所示:
如上图所示,ConerNet模型包括三部分,首先是通过堆叠两个Hourglass Network提取图像Feature,然后就是将图像Feature分别通过Top-left Corner和Bottom-right Corner两个Prediction Modules。
Prediction Module的具体结构如下图所示:
可以看出来Prediction Module整体是一个残差结构,其中Top-Left Corner Pooling Module我们稍后介绍,这里先看下Prediction Module的输出包括三部分:Heatmaps,Embeddings,Offsets。
此外,在上图中还有一个Top-left Corner Pooling Module操作,该操作公式如下:
t i j = { max ( f t i j , t ( i + 1 ) j ) if i < H f t H j otherwise t_{i j}=\left\{\begin{array}{cc} \max \left(f_{t_{i j}}, t_{(i+1) j}\right) & \text { if } i
论文认为Corner Pooling之所以有效,是因为(1)目标定位框的中心难以确定,和边界框的四条边相关,但是每个顶点只与边界框的两条边相关,所以Corner跟他容易获取;(2)顶点更有效提供离散边界空间,作者做了Corner Pooling的实验如下:
对于每个角点,只有一个正样本,其余的都是负样本。但是为了保证样本均衡,作者在角点半径范围内区域会加大对负样本的惩罚力度。实际怎么做呢?
在构建Heatmaps Groundtruth时,如果不加任何惩罚,那么正样本处应该就为1,而负样本处为0;而加上惩罚后就是在角点半径范围内构建一个 e − x 2 + y 2 2 σ 2 e^{-\frac{x^2+y^2}{2 \sigma^2}} e−2σ2x2+y2的高斯分布,该 σ \sigma σ可以是个固定值,可以与物体大小相关,总而言之是越靠近角点的地方越接近于1,越远离角点的地方越接近于0。如下图所示:
作者做了负样本惩罚的消融实验如下:
注意,这里还是只有角点一个正样本,在计算 L pull L_{\text {pull }} Lpull 、 L push L_{\text {push }} Lpush 和 L o f f L_{o f f} Loff时还是只在角点处计算。
Corner损失函数定义如下: L = L det + α L pull + β L push + γ L o f f L=L_{\text {det }}+\alpha L_{\text {pull }}+\beta L_{\text {push }}+\gamma L_{o f f} L=Ldet +αLpull +βLpush +γLoff其中
L det L_{\text {det }} Ldet 是Heatmaps的Loss,采用的是Focal Loss,准确地说,是针对Heatmaps改进的Focal Loss,公式如下所示: L det = − 1 N ∑ c = 1 C ∑ i = 1 H ∑ j = 1 W { ( 1 − p c i j ) α log ( p c i j ) if y c i j = 1 ( 1 − y c i j ) β ( p c i j ) α log ( 1 − p c i j ) otherwise L_{\text {det }}=\frac{-1}{N} \sum_{c=1}^C \sum_{i=1}^H \sum_{j=1}^W\left\{\begin{array}{cc} \left(1-p_{c i j}\right)^\alpha \log \left(p_{c i j}\right) & \text { if } y_{c i j}=1 \\ \left(1-y_{c i j}\right)^\beta\left(p_{c i j}\right)^\alpha \log \left(1-p_{c i j}\right) & \text { otherwise } \end{array}\right. Ldet =N−1c=1∑Ci=1∑Hj=1∑W{(1−pcij)αlog(pcij)(1−ycij)β(pcij)αlog(1−pcij) if ycij=1 otherwise 其中 y c i j y_{c i j} ycij为真值, p c i j p_{c i j} pcij是预测值,我们分两部分来解释该公式:
L pull L_{\text {pull }} Lpull 和 L push L_{\text {push }} Lpush 是Embeddings的Loss, L pull L_{\text {pull }} Lpull 使同一函目标的顶点进行分组, L push L_{\text {push }} Lpush 用与分离不同目标的顶点: L pull = 1 N ∑ k = 1 N [ ( e t k − e k ) 2 + ( e b k − e k ) 2 ] L_{\text {pull }}=\frac{1}{N} \sum_{k=1}^N\left[\left(e_{t_k}-e_k\right)^2+\left(e_{b_k}-e_k\right)^2\right] Lpull =N1k=1∑N[(etk−ek)2+(ebk−ek)2] L p u s h = 1 N ( N − 1 ) ∑ k = 1 N ∑ j = 1 j ≠ k N max ( 0 , Δ − ∣ e k − e j ∣ ) L_{p u s h}=\frac{1}{N(N-1)} \sum_{k=1}^N \sum_{\substack{j=1 \\ j \neq k}}^N \max \left(0, \Delta-\left|e_k-e_j\right|\right) Lpush=N(N−1)1k=1∑Nj=1j=k∑Nmax(0,Δ−∣ek−ej∣)其中 e k e_k ek为真值,其他为网络输出结果, Δ \Delta Δ为在作者实验中设置为1,我们简单分析下就可以看出,同一物体的 L pull L_{\text {pull }} Lpull 应该为 0 0 0,而不同物体的Embeddings结果如果比较越接近 L p u s h L_{p u s h} Lpush就会越大。
L o f f L_{o f f} Loff是Offsets的Loss,采用的是Smooth L1 Loss,公式如下: L o f f = 1 N ∑ k = 1 N SmoothL1Loss ( o k , o ^ k ) L_{o f f}=\frac{1}{N} \sum_{k=1}^N \operatorname{SmoothL1Loss}\left(\boldsymbol{o}_k, \hat{\boldsymbol{o}}_k\right) Loff=N1k=1∑NSmoothL1Loss(ok,o^k) L det L_{\text {det }} Ldet 在正负样本处都会计算,而 L pull L_{\text {pull }} Lpull 、 L push L_{\text {push }} Lpush 和 L o f f L_{o f f} Loff只在正样本处计算
CenterNet发表于2019年,原论文名为《Objects as Points》,CenterNet感觉是基于CornerNet进行的该井,使得检测速度和精度相比于One-Stage和Two-Stage的方法都了不小的提高,在和YOLO v3的比较中,相同速度下,CenterNet提高了4个左右的点。同时网络经过少量的扩展,就可以迁移到3D目标检测和人体关键点检测上。
CenterNet的网络结构是非常简单的,其实就是一个Backbone加上3个Head,3个Head分别输出80维的类别、2维的中心点坐标和2维的长宽偏置。Backbone的示意图如下图所示:
从左到右分别是(a)Hourglass-104,(b)ResNet,(c)DLA-34,(4)Modified DLA-34,CornerNet的Head是从1/4下采样率的Feature上接出来的,作者在论文中对比了不同的BackBone的结果,如下图所示,其中Hourglass效果是最好的:
CornreNet的损失由三部分构成,分别是类别损失、目标中心偏置损失和目标大小损失: L det = L k + λ size L size + λ off L o f f L_{\text {det }}=L_k+\lambda_{\text {size }} L_{\text {size }}+\lambda_{\text {off }} L_{o f f} Ldet =Lk+λsize Lsize +λoff Loff首先,类被采用的是类别损失采用的Focal Loss:
L k = − 1 N ∑ x y c { ( 1 − Y ^ x y c ) α log ( Y ^ x y c ) if Y x y c = 1 ( 1 − Y x y c ) β ( Y ^ x y c ) α log ( 1 − Y ^ x y c ) otherwise L_k=\frac{-1}{N} \sum_{x y c}\left\{\begin{array}{cc} \left(1-\hat{Y}_{x y c}\right)^\alpha \log \left(\hat{Y}_{x y c}\right) & \text { if } Y_{x y c}=1 \\ \left(1-Y_{x y c}\right)^\beta\left(\hat{Y}_{x y c}\right)^\alpha \log \left(1-\hat{Y}_{x y c}\right) & \text { otherwise } \end{array}\right. Lk=N−1xyc∑⎩ ⎨ ⎧(1−Y^xyc)αlog(Y^xyc)(1−Yxyc)β(Y^xyc)αlog(1−Y^xyc) if Yxyc=1 otherwise 该公式的和CornerNet中的公式没有区别,在此就不再赘述。
目标中心偏置损失采用的是L1 Loss,如下所示: L o f f = 1 N ∑ p ∣ O ^ p ~ − ( p R − p ~ ) ∣ L_{o f f}=\frac{1}{N} \sum_p\left|\hat{O}_{\tilde{p}}-\left(\frac{p}{R}-\tilde{p}\right)\right| Loff=N1p∑∣ ∣O^p~−(Rp−p~)∣ ∣其中, O ^ ∈ R W R × H R × 2 \hat{O} \in \mathcal{R}^{\frac{W}{R} \times \frac{H}{R} \times 2} O^∈RRW×RH×2为网络输出, R R R是特征图下采样倍率, p p p为原始图像中心点坐标, p ~ \tilde{p} p~为特征图上中心点坐标。
目标大小损失使用的同样是L1损失: L s i z e = 1 N ∑ k = 1 N ∣ S ^ p k − s k ∣ L_{s i z e}=\frac{1}{N} \sum_{k=1}^N\left|\hat{S} p_k-s_k\right| Lsize=N1k=1∑N∣ ∣S^pk−sk∣ ∣其中 S ^ ∈ R W ′ R × H R × 2 \hat{S} \in \mathcal{R}^{\frac{W^{\prime}}{R} \times \frac{H}{R} \times 2} S^∈RRW′×RH×2为预测值, s k = ( x 2 ( k ) − x 1 ( k ) , y 2 ( k ) − y 1 ( k ) ) s_k=\left(x_2^{(k)}-x_1^{(k)}, y_2^{(k)}-y_1^{(k)}\right) sk=(x2(k)−x1(k),y2(k)−y1(k))为真值, ( x 1 ( k ) , y 1 ( k ) , x 2 ( k ) , y 2 ( k ) ) \left(x_1^{(k)}, y_1^{(k)}, x_2^{(k)}, y_2^{(k)}\right) (x1(k),y1(k),x2(k),y2(k))分别为左上角和右下角坐标。
FCOS发表于2019年CVPR,原论文名为《Fully Convolutional One-Stage Object Detection》,它与当时的SOTA方法结果对比如下:
网络结构如下图所示:
通过上图网络结构还是一目了然的,需要注意的几点是:
关于FCOS的正负样本匹配一共有两个版本,最开始的版本作者将落入Ground Truth的Bounding Box内的Grid都作为正样本,但是后来通过是实验发现,落入Ground Truth的Bounding Box的中心部分区域的Grid的作为正样本。
由于我们每个Grid只会输出一种类别,如果同一个Grid同时落入两个Ground Truth Bounding Box中,就会面临一个Ambiguity问题,在论文中,作者指出这种情况就会默认将该Grid分配面积Area最小的Ground Truth Box。如下图就会分配给球拍:
但是结合FPN结构,将不同大小的GroundTruth分配到不同分辨率输出上,该问题可以得到大大缓解。
FCOS的损失计算函数如下: L ( { p x , y } , { t x , y } ) = 1 N pos ∑ x , y L c l s ( p x , y , c x , y ∗ ) + λ N p o s ∑ x , y 1 { c x , y ∗ > 0 } L r e g ( t x , y , t x , y ∗ ) + λ N p o s ∑ x , y 1 { c x , y ∗ > 0 } L c e n t e r n e s s ( s x , y , s x , y ∗ ) \begin{aligned} L\left(\left\{\boldsymbol{p}_{x, y}\right\},\left\{\boldsymbol{t}_{x, y}\right\}\right) &=\frac{1}{N_{\text {pos }}} \sum_{x, y} L_{\mathrm{cls}}\left(\boldsymbol{p}_{x, y}, c_{x, y}^*\right) \\ &+\frac{\lambda}{N_{\mathrm{pos}}} \sum_{x, y} \mathbb{1}_{\left\{c_{x, y}^*>0\right\}} L_{\mathrm{reg}}\left(\boldsymbol{t}_{x, y}, \boldsymbol{t}_{x, y}^*\right) \\ &+\frac{\lambda}{N_{\mathrm{pos}}} \sum_{x, y} \mathbb{1}_{\left\{c_{x, y}^*>0\right\}} L_{\mathrm{centerness}}\left(\boldsymbol{s}_{x, y}, \boldsymbol{s}_{x, y}^*\right) \end{aligned} L({px,y},{tx,y})=Npos 1x,y∑Lcls(px,y,cx,y∗)+Nposλx,y∑1{cx,y∗>0}Lreg(tx,y,tx,y∗)+Nposλx,y∑1{cx,y∗>0}Lcenterness(sx,y,sx,y∗)其中分类损失 L c l s L_{\mathrm{cls}} Lcls采用的BECLoss+FocalLoss,回归损失 L r e g L_{\mathrm{reg}} Lreg和中心度损失 L c e n t e r n e s s L_{\mathrm{centerness}} Lcenterness损失只计算正样本下的损失。回归损失 L r e g L_{\mathrm{reg}} Lreg为GIoULoss,而 L c e n t e r n e s s L_{\mathrm{centerness}} Lcenterness损失为BCELoss。
YOLOX发表于2021年,原论文名为《YOLOX: Exceeding YOLO Series in 2021》,YOLOX相对于之前的YOLO版本的一些的亮点在于:Anchor-Free,Decoupeld Detection Head和Advanced Label Assigning Strategy。与SOTA方法对比如下,相对于YOLO v5是有一定的提升:
YOLOX的Backbone的和YOLO v5的Backbone是一摸一样的,对YOLO v5 BackBone不熟悉的同学可以参考计算机视觉算法——目标检测网络总结,该Backbone主要的特点是使用CSP-Darknet53、SPPF和CSP-PAN的模块或者结构。
YOLOX采用的Decoupled Head,这与YOLO v5的Coupled Head的区别如下图所示:
其中Coupled Head和Decoupled Head具体区别是:
论文中指出使用Decoupled head不但使得收敛速度变快,同时使得AP也有所提升:
YOLOX中使用的正负样本匹配的是SimOTA,SimOTA是OTA(Optimal Transport Assignment)简化得到的,OTA对应的论文名为《Optimal transport assignment for object detection》,目的是将匹配正负样本的过程看成一个最优传输问题,和DETR中的匹配方法区别是,在DETR中预测结果和真值是一对一匹配,而在SimOTA中预测结果和真值是多对一匹配。下面我们来具体看下:
首先为什么要左SimOTA呢,主要是为不同的目标设定不同数量的正样本数,假如我们在一张图中同时检测一个人和一个网球,如果在人和网球设置相同多的正样本,因为人和网球的大小有着明显的区别,因此要么人就只有一两个正样本,要么网球就会很多低质量的正样本,这样肯定是不合理的。在FCOS中,将正样本数量和真值Bounding Box的大小关联在一定程度上解决了该问题,而SimOTA则是将这一解决方案做得更加细致了。
SimOTA步骤如下:
这里我们来理解下第3步中的Dynamic_K的原理,其实很好理解,还是以人和网球的例子为例,同样分辨率的特征图上,与人的Ground Truth IOU较大的预测值肯定较多,因此按照第3步计算出来的Dynamic_K肯定就大,人获得的正样本就多。
由于在网络检测头中有类别、位置参数和IoU三个分支,因此损失由 L c l s 、 L r e g 、 L i o u L_{cls}、L_{reg}、L_{iou} Lcls、Lreg、Liou这三部分组成: L o s s = L c l s + λ L r e g + L i o u N p o s L o s s=\frac{L_{c l s}+\lambda L_{r e g}+L_{iou}}{N_{p o s}} Loss=NposLcls+λLreg+Liou其中 L c l s 、 L i o u L_{cls}、L_{iou} Lcls、Liou由BCELoss,而 L r e g L_{reg} Lreg采用的是IoULoss,还需要注意的是, L c l s 、 L r e g L_{cls}、L_{reg} Lcls、Lreg只计算正样本损失,而 L i o u L_{iou} Liou既计算正样本损失有计算负样本损失,其实可以理解为我们先判断这里是否存在物体,然后再看物体的类别和位置。 N p o s N_{pos} Npos指的是被划分为正样本的Anchor Point数。
以上就是我对几篇Anchor Free的方法的总结,有问题欢迎交流~