主流网络模型之目标检测

AAAI 2021 目标检测论文大盘点(YOLObile/R3Det/StarNet等)

AAAI 2021 3D目标检测论文大盘点(CIA-SSD/Voxel R-CNN等)

综述 | MIT提出视频理解/行为识别:全面调研(2004-2020)

综述 | 基于深度学习的实时语义分割方法:全面调研

综述 | 人脸图像质量评估:全面调研(2004-2020)

综述 | 小样本学习:全面调研(Few-shot)

基于FairMOT训练的多人脸跟踪(Multi-face tracking)速度和精度都非常好

1.概述

1.2 目标检测的任务

目标检测任务就是找到图片中有哪些物体(分类)及它们的位置(坐标回归)

目标检测算法工程师技能

这份表看得太舒适了!这份目标检测超全的技术路线总结来自于 GitHub 上一个知名项目,作者是毕业于韩国首尔国立大学电气与计算机工程专业的 Lee hoseong,目前已经收获 7.3k star。

该项目地址是:

https://github.com/hoya012/deep_learning_object_detection​github.com

模型性能对比表

由于硬件不同(例如 CPU、GPU、RAM 等),来比较 FPS 往往不够准确。更合适的比较方法是在同一硬件配置下测量所有模型的性能。以上所有模型的性能对比结果如下:

从上面的表格中,可以清楚看到不同模型在 VOC07、VOC12、COCO 数据集上的性能表现。同时列出了模型论文发表来源。

该技术路线纵贯的时间线是 2013 年到 2020 年初,上图总结了这期间目标检测所有具有代表性的模型。图中标红的部分是相对来说比较重要,需要重点掌握的模型。

1.3 目标检测的分类

1.one-stage和two-stage

one-stage直接输出物体的类别概率和坐标,速度快,准确度较two-stage低。two-stage第一步是通过RPN(Region Proposal Network)生成候选区域,第二步对每个候选区域进行分类和回归得到最终结果。

出处:yolov4

2.anchor-based和anchor-free

对于anchor-based模型来说,anchor的形状是一般是通过对数据集内的框进行K-means聚类得到。anchor代表了数据集一种统计,相当于一种先验。

3种聚合方式的特点:Mean,反映分布;Max,忽略重复;Sum:单射。👈这句话可以忽略

出处:yolov3

anchor-based模型的缺点:

1.anchor的质量影响模型效果;

2.大部分的在图上的anchor都是负样本,正负样本不均匀的问题。

3.NMS的计算

对于anchor-free模型来说,以FCOS为例,直接对特征图上每个像素点进行预测。

出处:FOCS。其他anchor free的还有Reppoints ,CornerNet等

2.R-CNN系列

 

two-stage

2.1 R-CNN(Region with CNN features)

R-CNN是2014年提出的,RCNN具体原理解析

整体结构如下:

网络分为四个部分:区域划分、特征提取、区域分类、边框回归

区域划分:使用selective search算法画出2k个左右候选框,送入CNN

特征提取:使用imagenet上训练好的模型,进行finetune

区域分类:从头训练一个SVM分类器,对CNN出来的特征向量进行分类

边框回归:使用线性回归,对边框坐标进行精修

优点

ss算法比滑窗得到候选框高效一些;使用了神经网络的结构,准确率比传统检测提高了

缺点

1、ss算法太耗时,每张图片都分成2k,并全部送入CNN,计算量很大,训练和inference时间长

2、四个模块基本是单独训练的,CNN使用预训练模型finetune、SVM重头训练、边框回归重头训练。微调困难,可能有些有利于边框回归的特征并没有被CNN保留

GPU上13s/image(Nvidia的,具体没说什么型号),CPU上53s/imge。🐢

2.2 Fast R-CNN

Fast R-CNN是R-CNN的同一个作者(Ross Girshick)在2015年提出的。

Fast-RCNN具体原理解析

 

 

具体做法如下:

step1:输入是整张图片和候选区域(Selective Search得到)的集合,经过CNN(VGG16)后得到特征图

step2:使用RoI pooling将特征图采样(RoI pooling layer+ FC)为一个定长的特征向量;

step3:对于每个RoI特征向量进行两个任务1)softmax输出类别;2)bbox回归

ROI Pooling具体操作如下:

根据输入image,将ROI映射(projection)到feature map对应位置;

将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);

对每个sections进行max pooling操作;

相对RCNN,准确率和速度都提高了,具体做了以下改进

1、依旧使用了selective search算法对原始图片进行候选区域划分,但送入CNN的是整张原始图片,相当于对一张图片只做一次特征提取,计算量明显降低

2、在原图上selective search算法画出的候选区域对应到CNN后面输出的feature map上,得到2k个左右的大小长宽比不一的候选区域,然后使用RoI pooling将这些候选区域resize到统一尺寸,继续后续的运算

3、将边框回归融入到卷积网络中,相当于CNN网络出来后,接上两个并行的全连接网络,一个用于分类,一个用于边框回归,变成多任务卷积网络训练。这一改进,相当于除了selective search外,剩余的属于端到端,网络一起训练可以更好的使对于分类和回归有利的特征被保留下来

4、分类器从SVM改为softmax,回归使用平滑L1损失

缺点:因为有selective search,所以还是太慢了,一张图片inference需要3s左右,其中2s多耗费在ss上,且整个网络不是端到端

在nvidia k40 GPU上最快0.06s/image。✈️

2.3 Faster R-CNN

Faster R-CNN是2016年提出的模型,作者中包括R-CNN的作者。

Fseter-RCNN具体原理解析 1

Fseter-RCNN具体原理解析 2

重点:RPN(Region Proposal Network),anchor

Faster R-CNN将整个框架分为了2个部分1)RPN;2)detector

Our object detection system, called Faster R-CNN, is composed of two modules. The first module is a deep fully convolutional network that proposes regions, and the second module is the Fast R-CNN detector that uses the proposed regions.

具体做法如下:

step1:卷积层对输入的图像进行特征提取得到特征图

step2:RPN网络使用先验anchor输出带有objectness socre的矩形候选区域(通过先验anchor产生)集合

objecness socre:二分类,表示是背景类和有目标;

倘若特征图大小为W × H ,使用k个先验anchor,则总共有W H k个矩形候选区域;

k表示使用k个anchor;2k:表示二分类数量,4k:是坐标数量

用下面一张图更容易理解:

特征图通过一个3 × 3的卷积核遍历整个特征图,然后以特征图上的每个像素为中心生成k个anchor,然后利用全连接对anchors进行分类(上面的分支)和初步的bbox回归(下面的分支)。

step3:将RPN的输出经过ROI Pooling后进行bbox回归和分类

引入RPN,Faster-RCNN相当于Fast-RCNN+RPN,准确率和速度进一步提高,主要做了以下改进:

1、移除selective search算法,还是整张原始图片输入CNN进行特征提取,在CNN后面的卷积不再使用ss算法映射过来的候选区域,而是采用新的网络RPN,使用神经网络自动进行候选区域划分

2、RPN通过生成锚点,以每个锚点为中心,画出9个不同长宽比的框,作为候选区域,然后对这些候选区域进行初步判断和筛选,看里面是否包含物体(与groundtruth对比IoU,大于0.7的为前景,小于0.3的为背景,中间的丢弃),若没有就删除,减少了不必要的计算

3、有效的候选区域(置信度排序后选取大概前300个左右)进行RoI pooling后送入分类和边框回归网络

优点:端到端网络,整体进行优化训练;使用神经网络自动生成的候选区域对结果更有利,比ss算法好;过滤了一些无效候选区,较少了冗余计算,提升了速度

RPN网络和锚点具体原理和训练过程

RPN训练

1、加载预训练模型,训练RPN

2、训练fast-rcnn,使用的候选区域是RPN的输出结果,然后进行后续的bb的回归和分类

3、再训练RPN,但固定网络公共的参数,只更新RPN自己的参数

4、根据RPN,对fast-rcnn进行微调训练

在k40 GPU上最快17fps(ZF+Fast R-CNN)🚀

 

2.4.1 R-FCN

R-FCN具体原理解析

在Faster-RCNN基础上,进一步提高了准确率,主要以下改进

1、使用全卷积层代替CNN basenet里面的全连接层

2、CNN得到的feature map在RoI pooling之后变成3x3大小,把groundtruth也变成3x3大小,对9宫格每个区域分别比较和投票

2.4.2 Mask R-CNN(201703)

Mask R-CNN是何凯明在2017年提出的实例分割模型。

Mask-RCNN具体原理解析1

Mask-RCNN具体原理解析2

Mask-RCNN具体原理解析3(RoI Align解释)

主要改进1)Faster R-CNN加了一个输出mask的分支;2)将RoI Pooling改为了RoI Align

 

RoI Pooling的缺点 RoI pooling是在fast-rcnn里提出的,用于对大小不同的候选框进行resize之后送入后面的全连接层分类和回归,但RoI pooling计算时存在近似/量化,即对浮点结果的像素直接近似为整数,这对于分类来说影响不大(平移不变性),但新引入的Mask分割来说,影响很大,造成结果不准确,所以引入了RoI Align,对浮点的像素,使用其周围4个像素点进行双线性插值,得到该浮点像素的估计值,这样使结果更加准确

RoI Align的具体做法 如下图所示,虚线是特征图,黑实线是RoI区域。可以看到,RoI是保留小数的。然后将RoI的分为4个区域(本例为2 × 2 2,原文叫bin,仓),每个区域设立4个采样点。RoI Align通过从特征图上附近的网格点进行双线性插值来计算每个采样点的值。对RoI、其bin或采样点所涉及的任何坐标不进行量化。

3.YOLO系列

官方网站:https://pjreddie.com/publications/

yolo->v2->v3:https://github.com/pjreddie/darknet

└->v4:https://github.com/AlexeyAB/darknet

│ │ https://github.com/Tianxiaomo/pytorch-YOLOv4 🐍

│ └->scaled-v4:https://github.com/WongKinYiu/ScaledYOLOv4 🐍 🆕 🚀

└->v5:https://github.com/ultralytics/yolov5 🐍🆕

关于yolov5:https://github.com/pjreddie/darknet/issues/2198 🍉

🐍表示python实现;🆕表示新提出的模型(2020年)

YOLO具体原理解析1

YOLO具体原理解析2

3.1 YOLOv1

yolov1是发表于2016年的一种anchor-free模型。

YOLOv1论文理解

yolov1的模型如上图,有24个卷积层和2个全连接层组成,输出形状为7 × 7 × 30。其中7 × 7表示网络将原图划分为了7 × 7 个区域;30 = ( 4 + 1 ) × 2 + 20,4表示( w , h , x , y ),1表示置信度c cc,2表示预测两个矩形框;20代表预测20个类。当然,最后输出也可以是其他值,满足S × S × ( B ∗ 5 + C )规则。

 

yolov1的做法如下:

图像输入网络后,输出 S × S × ( B ∗ 5 + C )的特征图; S × S特征图中的每个格子负责预测一个类,输出一个置信度c 加上bbox回归的值5 55,类别信息C,如果每个格子负责预测两个,则乘一个B。最后使用NMS去重。

显然,yolov1最多只能预测S × S 个目标且对小目标不敏感。

YOLO缺点:

1、对小目标和密集型目标检测的效果差,如一群小鸭子(因为图片划分为7x7个grid cell,而每个cell只产生两个bounding box,意思就是每个grid cell的区域最多只会预测两个object)(是否可以用裁剪方法得到原图的局部放大图?每个grid cell预测多个bounding box?最后的卷积使用14x14x20?)

2、YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。

3、YOLO容易产生物体的定位错误

YOLO优点:

1、YOLO检测物体非常快(45-155FPS)

2、YOLO可以很好的避免背景错误,产生false positives(可以看到全局图像,有上下文信息)

 

3.2 YOLOV2/YOLO9000

yolov2是2017年提出,首次引入了Faster RCNN的anchor及其他的trick。

YOLO9000的论文标题为:YOLO9000: Better, Faster, Stronger

Better:

BN

高精度与训练

Anchor

使用聚类选anchor

使用相对坐标进行预测(相对于格子)

passthrough层(将26 × 26 × 1 特征图变为了13 × 13 × 4 的特征图)

多尺度训练(32的倍数{ 320 , 352 , … , 608 })

Faster

Darknet-19

bottleneck结构

 

Stronger

使用WordTree进行层次分类(预测9000类的技术,从大类往小类预测,层次)

3.3 YOLOv3

YOLOv3是YOLO原作者(Joseph Redmon)最后参与的、2018年发布的模型。

主要改进在网络结构上。

Backbone:DarkNet53! 🍺

残差;更深了

 

Neck:FPN:

出处:Feature Pyramid Networks for Object Detection;上采样使用最近邻插值

 

FPN接受3个尺度的特征图32 × 32 ,16 × 16 ,8 × 8,分别对应小、中、大尺度的目标。每个预测分支使用3种anchor,共9个anchor。

3.4 YOLOv4

我的翻译:https://blog.csdn.net/kobayashi_/article/details/109361339

yolov4是现在的darknet的维护者Alexey Bochkovskiy于今年(2020年4月)提出的模型,即对模型进行了优化也对数据预处理进行了优化!🐄🍺

YOLOv4由下列组成:

Backbone:CSPDarknet53

Neck:SPP,PAN

Head:YOLOv3

YOLOv4使用了:

在Backbone上使用的BoF:CutMix和Mosaic数据增强,DropBlock正则化,类标签平滑(Class label smoothing)

在Backbone上使用的BoS:Mish激活,跨阶段部分连接(CSP),多输入残差连接加权(MiWRC)

在探测器上使用的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,自对抗训练,使用对单个ground truth用对各anchor来消除网格敏感性,余弦退火scheduler,最优超参数,随机训练形状

在探测器上使用的BoS:Mish激活,SPP块,SAM块,PAN路径聚合块,DIoU-NMS

3.4.1 scaled YOLOv4

我的翻译:https://blog.csdn.net/kobayashi_/article/details/109960073

scaled-yolov4是今年(2020年11月)在yolov4的基础上提出的,将yolov4使用的CSP技术进一步扩展到了Neck层。提高了网络的速度,最高能跑到1774FPS(YOLOV4-tiny)!⚡️

3.5 YOLOv5

至今为止没有论文,预计于2020年年底出,代码还在更新中。模型没啥大改动,数据集处理的亮点是马赛克(Mosaic)数据增强,不过v4也用了。具体等论文。

关于yolov5论文: https://github.com/ultralytics/yolov5/issues/1333

4.其他模型

4.1 SSD

SSD是2016年提出的模型。

SSD具体原理解析

SSD和yolov1的对比:

对比上图可知,SSD使用了多尺度的特征图进行检测,这样做的好处是可以利用多种尺度的特征图来预测多种尺度的目标。SSD对小目标的检测能力优于yolov1。同时,又因为SSD生成的多尺度default box一定有更高概率找到更加贴近于 Ground Truth 的候选框,所以模型的训练稳定性是肯定比yolov1强。

SSD算法的核心:

1、对于每个feature map cell都使用多种横纵比的default boxes,所以算法对于不同横纵比的object的检测都有效

2、对default boxes的使用来自于多个层次的feature map,而不是单层,所以能提取到更多完整的信息

优点:

1、检测速度很快

2、检测准确率比faster-rcnn和yolo高

缺点:

文中作者提到该算法对于小的object的detection比大的object要差,还达不到Faster R-CNN的水准。作者认为原因在于这些小的object在网络的顶层所占的信息量太少,另外较低层级的特征非线性程度不够,所以增加输入图像的尺寸对于小的object的检测有帮助。另外增加数据集对于小的object的检测也有帮助,原因在于随机裁剪后的图像相当于“放大”原图像,所以这样的裁剪操作不仅增加了图像数量,也放大了图像。不过这样速度很慢。

4.1.1 FPN(CVPR2017)——对于小目标难检测问题的解决

FPN具体原理解析

低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。对图像feature的利用有以下四个方法:

1)输入网络前进行裁切,然后scale,缩放图像,这种方法会增加网络训练和预测的时间

2)类似于faster-rcnn和fast-rcnn,对卷积网络最后一层的feature map进行利用

3)类似于SSD,在网络中间,抽取一些卷积层产生的feature map进行利用

4)RPN

FPN类似于SSD+FCN+RPN,先自底向上进行正常的网络前向传播,每个阶段生成空间尺寸不断缩小的feature map,然后再从顶部的feature map(空间尺寸最小的那个)开始,进行2倍上采样,倒数第二层的feature map进行1x1卷积后(通道数匹配),两个feature map进行加和,然后再用3x3的卷积对新的feature map进行卷积融合,去除上采样加和的混叠。之后就按照这个思路不断上采样加和到前一个stage(前向传播中空间尺寸一致的当做一个stage),每一个stage生成的新feature map都独立进行预测。这里的预测可以是把生成的feature map送入RPN中,进行滑窗生成锚点和对应的bounding box,总共有15种不同的锚点。

4.2 RetinaNet/Focal Loss

RetinaNet在2018提出,主要是为了验证一个更为重要的技术——Focal Loss。

Focal Loss的是在cross entropy损失函数上改进的:

FL=-(1-p_{t})^{\gamma }log(p_{t})

γ是对于容易学习样本的惩罚,γ越大,越容易学习到的样本计算后的loss越小。

一般来说,网络对容易样本的拟合能力强,具体体现在输出层的输出的概率值接近于1。(1-p_{t})^{\gamma }在这里的作用是将概率值大的loss变小(从横轴看),将loss大的概率值变小(从纵轴看),具体体现在γ越大,小概率值区间的梯度越大。

Focal loss主要解决的是one-stage类模型的正负样本不均衡问题(we discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause)

4.3 EfficientDet

EfficientDet是2019年年底提出的模型,它使用EfficientNet作为backbone,并提出了BiFPN结构

BiFPN:Bi-directional FPN,双向FPN

各种类型的FPN:

[FPN:自顶向下

PANet:先自顶向下再自地向上(双向)]->简单的多尺度特征融合方式

[NAS-FPN:NAS(神经网络架构搜索)出来的结构

BiFPN:双向,重复,残差结构]->复杂的融合方式

4.4 MTCNN

MTCNN不同于上面所有的模型,它于2016年提出,使用了**级联(Cascade)**的思想。

 

MTCNN的结构如上图所示,由3个网络构成:1)P-Net:负责输出候选区域;2)R-Net:负责对候选区域进行进一步调整;3)O-Net:负责对R-Net调整之后的区域又进一步调整,然后输出。有了这种级联的思想,甚至可以根据任务需要在O-Net后面再加n个!

 MTCNN的数据处理流程如下图:

 

P-Net:首先对输入图片使用金字塔,每缩放一次传入P-Net得到候选区域,直至图片缩放的12 × 12(这样做可以检测到多尺度的目标)。然后根据P-Net的输出反算回原图,得到目标在图片上的坐标;

R-Net:R-Net接受到P-Net输出的目标在原图的候选区域(缩放到24 × 24尺度大小)进行分类和调整,根据输出反算回原图得到目标在图片上的区域;

O-Net: O-Net接受到R-Net输出的目标在原图的候选区域(缩放到48 × 48尺度大小)进行分类和调整,根据输出反算回原图得到目标在图片上的区域;

NMS:NMS根据反算回原图的坐标结果进行去重处理。

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值