二阶段目标检测总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

⼆阶段⽬标检测总结
概述:
最新⼏年的论⽂都是在单阶段、Transform上进⾏发掘提升,基本上2020-2021年⼆阶段论⽂全军覆没,这篇博⽂也是总结2016-2019年的发展,最后⼀篇CenternetV2⽐较特殊,不能完全算作传统意义的⼆阶段⽹络。

⽬前什么地⽅还使⽤⼆阶段论⽂?
1. ⽐赛场景,经常使⽤FasterRCNN的变种+其它⽹络进⾏联合预测
2. ⽬标⽐较⼩的场景(使⽤较少,⼀般⽤anchor-free、增⼤输⼊去代替、分割图像检测)
3. 辅助⼀阶段使⽤,和(2)类似但不同。

⽐如检测远距离⼈形+⼈脸,⽅案⼀:先检测⼈,后检测⼈脸,两个都是OneStage。

⽅案
⼆:使⽤TwoStage⽹络,第⼀阶段检测⼈形,第⼆阶段检测⼈脸。

当然只有第⼆类别是第⼀类别的从属,且是唯⼀关系才能进⾏!⼀. FasterRCNN
以torchvision给出的demo为例⼦:
1. 第⼀阶段,和基础SSD等⼀阶段操作类似,但是这⼀阶段会⽴刻输出候选区域
2. 将候选区域从FPN输出的feature上抠出来
3. 使⽤ROIPooling对齐候选特征的⼤⼩
4. 第⼆阶段,直接进⾏FC细化Reg/Cls,当然这⾥只能是⼀个候选区域最多⼀个⽬标。

class FastRCNNPredictor(nn.Module):
"""
Standard classification + bounding box regression layers
for Fast R-CNN.
Args:
in_channels (int): number of input channels
num_classes (int): number of output classes (including background)
"""
def __init__(self, in_channels, num_classes):
super(FastRCNNPredictor, self).__init__()
self.cls_score = nn.Linear(in_channels, num_classes)
self.bbox_pred = nn.Linear(in_channels, num_classes * 4)
def forward(self, x):
if x.dim() == 4:
assert list(x.shape[2:]) == [1, 1]
x = x.flatten(start_dim=1)
scores = self.cls_score(x)
bbox_deltas = self.bbox_pred(x)
return scores, bbox_deltas
注释:
最后⼀步FC是参考anchor的做法,⾸先想到的是self.bbox_pred=nn.Linear(in_channels,4) ,因为已经使⽤class进⾏了过滤,没有必要再把regression去使⽤class再去过滤⼀遍。

当然使⽤class对回归进⾏区分,这效果肯定优于单个回归。

我们再进⼀步延伸,如果在不同的class之下,再使⽤⼀种⼿段(长宽、⾯积、anchor等)对其进⼀步划分,⽐如:假设候选区域数量不变为P,类别为两类(⼈形、⼈脸),进⼀步使⽤anchor限制(两个anchor,5和20,⽐例4倍以内使⽤5,超过4倍使⽤20),这样会不会更精细?
上⼀步我们限制了候选区域数量,能不能使⽤输⼊多个不同组的候选区域,后⾯连接多个不同的predict?这就是后续改进
cascadeRCNN的由来。

⼆. MaskRCNN
1. 第⼀阶段使⽤FasterRCNN,RPN⽹络都相同
2. 第⼆阶段输出多⼀个分⽀K×m×m , 其中K表⽰种类,m表⽰输出分辨率
注意:最后输出的mask⼤⼩是固定的,设置⼤⼩得根据实际种类⽽定。

这个mask分⽀和FCN有点区别,这⾥使⽤K个feature,然后直接进⾏⼆分类操作,⽽FCN使⽤单个feature进⾏多分类操作,⽬前检测的分类loss 都是进⾏单独的⼆分类操作。

三. CascadeRCNN
1. 第⼀阶段和FasterRCNN完全⼀样
2. 第⼆阶段使⽤多个RoiHead层进⾏级联
下图完全显⽰了CascadeRCNN的由来
下图(C)仅仅在前向计算的时候使⽤级联finetune操作,精度也得到⼀定提升,但是有两个缺陷。

1)使⽤共享的Head-H1,不仅时间没降低,⽽且参数效果还不好。

所以在端侧单阶段⽬标检测中,⼀般不使⽤共享的头,虽然参数减少了,但是计算量⼀点未变,所以都使⽤不共享的头。

2)都是固定的,不能进⾏训练,后⾯的阶段已经处于过拟合状态。

下图(d)最⼤的缺点就是候选区域固定,⾮常容易过拟合。

有⼀个优点,后⾯的stage仅仅进⾏分类⽽不进⾏reg,这是cascade未考虑的。

但是,分类分⽀花费的代价很⼩,基本影响不到⼤局,所以讨论的⼈很少。

下图(b)融合了两者的优点,1)可训练。

2)不共享。

3)候选区域不同。

四. Libra RCNN
未改变实际的流程结构,⽂章从均衡的⾓度对各个模块进⾏改进。

1. feature均衡,使⽤FPN、PAN、BiFPN进⾏互相链接
2. 采样均衡,原始SSD分配使⽤Max-IOU,采样使⽤Random-Sample
3. loss均衡,原始SSD直接使⽤独⽴的分⽀进⾏计算
IOU-Balance采样,下图是困难负样本(Iou<0.5 称为困难负样本)的Iou分布,其中64%样本Iou>0.05,36%的样本Iou<0.05,注意这⾥是百分⽐图,不是个数量图!!!下图中使⽤随机采样,会导致70%的样本Iou<0.05 ,这明显是不符合下图的困难负样本的分布图的。

如何将下附图的每个⽅格采样⽐例趋于平衡?很明显的想到还是使⽤⽅格将IOU进⾏区域划分(直⽅图的表⽰⽅法),然后按照⼀定⽐例进⾏采样即可。

论⽂给出⼀些控制参数,使得表达更为通俗易懂。

关于feature部分的平衡,这部分有点⽞,意义不⼤。

关于loss的平衡,主要对smooth-L1进⾏调整,⽂章分析了loss的贡献率,loss<1.0 贡献30%,相反贡献70%,既然要平衡,那就要提升loss<1.0 的梯度(loss占⽐),其实和focal-loss⼀样,都是提升困难样本的⽐重。

L b(x)=α
b(b|x|+1)ln(b|x|+1)−α|x| if |x|<1γ|x|+C
otherwise {
五. GridRCNN
1. 第⼀阶段和FasterRCNN完全⼀样
2. 分类分⽀相同,回归分⽀使⽤关键点
从当前的⾓度看,这篇论⽂较为简单,属于简化版的anchor-free模型,因为是对候选区域进⾏操作,不需要anchor的匹配,不需要进⾏nms 等操作。

和top-bottom的pose估计⼀模⼀样!!
如果把第⼀阶段也使⽤关键点去估计,那这篇⼆阶段⽂章就完全是anchor-free+pose的⽂章了。

需要注意⼀点,经常出现候选区域把⽬标截断(⼆阶段⽹络都存在的问题),那关键点就不存在(使⽤0表⽰),但是对于定位就很不准确。

最简单的⽅式是直接扩⼤候选区域的截图范围,作者尝试这种⽅案效果不理想。

作者采⽤候选区域不变,仅对候选回归框做扩⼤。

如下图所
⽰,绿⾊是⽬标框,⽩⾊实线是候选框,输⼊⽩⾊实线候选区域,在⽩⾊虚线的基础上进⾏回归。

六. GridRCNN-V2
1. 第⼀阶段和FasterRCNN完全⼀样
2. 第⼆阶段和GridRCNN-V1基本相同
这篇论⽂主要是对第⼀版本的速度进⾏改进:
keypoint branch 从56×56降低到28×28 ,论⽂说这样做不仅会加快速度,⽽且还会提⾼精度。

之前在关键点上试验,使⽤期望定位会有精度损失。

减⼩候选区域的⼤⼩,降低channels
联合整个batch图像进⾏计算。

之前使⽤for循环,单次计算单张图像,对于⽬标数量⾮常敏感,现在是对batch进⾏⼀次计算。

NMS仅进⾏⼀次
七. Double-Head RCNN
1. 第⼀阶段和FasterRCNN 完全⼀样
2. 第⼆阶段ROI-Head 使⽤多个头进⾏预测
此想法类似多模型W 联合预测WBF ,使⽤全连接头+卷积头联合预测,唯⼀注意的是cls 分⽀使⽤联合loss ,⽽reg 分⽀使⽤单独预测。

s =s fc +s conv 1−s fc =s conv +s fc 1−s conv ,
利⽤联合预测效果绝对有所提升,但是额外的分⽀预测占⽤较多的资源,如何做到Trade-Off 是关键。

⼋. CenterNetV2
在刚开始的概述(3)中,表达了⼀种⼆阶段⽹络的特殊应⽤,这篇⽂章将此应⽤表述成⼀种⽅案:我们可以使⽤任何⼀阶段的⽹络作为RPN 层(包括anchor-based 、anchor-free 操作),后⾯ROI 阶段可以使⽤任何之前的第⼆阶段⽹络。

这不就是集合前⼈的⼤杂烩?搞不懂为啥没有使⽤YOLOV4
作为第⼀阶段进⾏⽐较?
()(
)
进⼀步引申:
类似⼈形+⼈脸的检测组合(概述3)
Top-Bottom),⽐如⼈体关键点估计,可以直接使⽤⼆阶段⽹络。

相关文档
最新文档