参考链接 :
https://www.zhihu.com/question/266143762/answer/304172590
https://blog.csdn.net/JNingWei/article/details/80039079 图很清晰
https://blog.csdn.net/nwu_nbl/article/details/81110286
Two-stage
R-CNN,SPPNet,Fast R-CNN,Faster R-CNN,R-FCN,FPN,Mask R-CNN等
two-stage检测器包括两个步骤:
- 第一步,使用RPN生成anchor并对anchor做筛选,过滤掉很多的负样本proposals,生成稀疏的proposals;
- 第二步,进行分类和回归,对选择的proposals,使用roi pooling等操作,进一步的精细化,因此得到的框更加精准。(比如,一个anchor有可能只覆盖了一个目标的50%,但却作为完全的正样本,因此其预测肯定是有误差的。)
One-stage
OverFeat,YOLO,YOLOv2,YOLOv3,SSD,DSSD,DSOD,RetinaNet等
One-stage检测器步骤:
在指定特征图上,对每个位置,使用不同scale、不同长宽比密集采样生成anchor(没有对这些anchor进行筛选),直接进行分类和回归。主要优点是计算效率高,但是,检测精度通常落后于Two-stage方法。
【注意】:yolo没有anchor,使用单个神经网络直接预测object的类别和位置。
【One-stage精度低】:
原因:
主要原因是类别不均衡问题(因为没有对负类的anchor进行删除)。
解决方案:
为了改善类别不均衡问题,RetinaNet提出了Focalloss重建标准交叉熵损失,降低easy sample的权重,增加hard sample的权重。
【One-stage对小物体检测不好(没有Two-stage好)】:
原因:
如果所有的anchor都没有覆盖到这个目标,那么这个目标就会漏检。如果一个比较大的anchor覆盖了这个目标,那么较大的感受野会弱化目标的真实特征,得分也不会高。two-stage算法中的roi pooling会对目标做resize, 小目标的特征被放大,其特征轮廓也更为清晰,因此检测也更为准确。
解决方案:
- 最直接的提升就是增大input size(但是不能一味的增大,因为会让后面的特征量增大,时间增多,失去One-stage的速度优势)
- 借鉴FPN,把深层特征通过反卷积,然后通过skip pooling来结合底层的特征层。(结合的方式上有: concat, pixel-wise sum/ add等)(这样做的好处是,只用SSD的话虽然用了底层特征图,但是底层语义特征比较弱,处理小物体时效果表现的不好)
- 空洞卷积增加感受野(TridentNet)
- attention机制(One-stage中目前用的好像比较少)
Two-Stage和One-Stage方法的结合
RON,RefineDet等
RefineDet(CVPR2018) https://blog.csdn.net/u014380165/article/details/79502308
RefineDet是one-stage和two-stage的结合,FPN和SSD的结合。 由三个模块构成:
- anchor refinement module (ARM) ——类似于RPN,用来生成anchors并过滤
- transfer connection block (TCB)——类似于FPN,做特征转换,将ARM的输出转换成ODM的输入,
- object detection module (ODM)——类似于SSD,融合不同层特征,做multi class classification和regression。
One-stage和Two-stage的比较
【个人理解】two-stage的好处在于第一步是将anhor生成出来,经过了筛选,第二步是使用roi pooling之后再进一步的精细化,因此更加精准。
- two-stage检测算法将检测问题划分为两个阶段,第一阶段产生候选区域(region proposals)(并筛选),然后对候选区域分类(一般还需要对位置精修)
- one-stage检测算法,anchor产生后,直接用于后续的分类和回归。没有经过筛选。
Anchor-Free
DenseNet(百度2015),CornerNet(ECCV2018),ExtremeNet(CVPR2019)、FSAF(CVPR2019)、FCOS(CVPR2019)等
https://zhuanlan.zhihu.com/p/62103812
https://zhuanlan.zhihu.com/p/62372897
Guided Anchoring
Guided Anchoring可以说是anchor-free和anchor-based结合
对于anchor-based检测器而言,anchor的选取很重要,anchor需要能够尽可能多的覆盖所有的目标尺寸和宽高比,在检测的过程中,每个检测器只负责预测尺寸和宽高比与之相近的物体。
anchor是事先选择的。它们是恒定的,在训练期间不会改变。
(PS:每个边界框回归称为一个检测器)
现在有一种新的方式,就是让检测器自己学anchor——guided anchor
Guided Anchoring: 物体检测器也能自己学 Anchor https://zhuanlan.zhihu.com/p/55854246