我的阶段性总结😶

1.概述

1.2 目标检测的任务

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

1.3 目标检测的分类

1.one-stagetwo-stage

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

出处:yolov4

2.anchor-basedanchor-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年提出的,整体结构如下:

在这里插入图片描述

具体做法步骤如下:

step1:在输入图片上使用Selective Search产生大约2k个候选区域

step2:将不同形状的候选区域统一变换到227*227尺寸,输入CNN(AlexNet)中提取特征

step3:使用SVM进行分类

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

2.2 Fast R-CNN

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

在这里插入图片描述

具体做法如下:

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

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

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

ROI Pooling具体操作如下:

  1. 根据输入image,将ROI映射(projection)到feature map对应位置;
  2. 将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
  3. 对每个sections进行max pooling操作;

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

2.3 Faster R-CNN

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

重点: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 W\times H W×H,使用 k k k个先验anchor,则总共有 W H k WHk WHk个矩形候选区域;

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

2.4 Mask R-CNN

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

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

在这里插入图片描述

RoI Pooling的缺点 RoI Pooling会将不同大小的特征子图采样成固定大小的 7 × 7 7\times 7 7×7的特征图。这意味倘若特征子图大于 7 × 7 7\times7 7×7,便会丢失像素的位置信息,这对语义分割有影响。

RoI Align的具体做法 如下图所示,虚线是特征图,黑实线是RoI区域。可以看到,RoI是保留小数的。然后将RoI的分为4个区域(本例为 2 × 2 2\times2 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年)​

3.1 YOLOv1

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

在这里插入图片描述

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

在这里插入图片描述

yolov1的做法如下:

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

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

3.2 YOLOV2/YOLO9000

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

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

Better:

  • BN
  • 高精度与训练
  • Anchor
  • 使用聚类选anchor
  • 使用相对坐标进行预测(相对于格子)
  • passthrough层(将 26 × 26 × 1 26\times26\times1 26×26×1特征图变为了 13 × 13 × 4 13\times13\times4 13×13×4的特征图)
  • 多尺度训练(32的倍数 { 320 , 352 , … , 608 } \{320,352,\dots,608\} {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 32\times32 32×32, 16 × 16 16\times16 16×16, 8 × 8 8\times8 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和yolov1的对比:

在这里插入图片描述

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

4.2 RetinaNet/Focal Loss

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

Focal Loss的是在cross entropy损失函数上改进的:
F L = − ( 1 − p t ) γ l o g ( p t ) FL=-(1-p_t)^\gamma log(pt) FL=(1pt)γlog(pt)
γ \gamma γ是对于容易学习样本的惩罚, γ \gamma γ越大,越容易学习到的样本计算后的loss越小。

在这里插入图片描述

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

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 12\times12 12×12(这样做可以检测到多尺度的目标)。然后根据P-Net的输出反算回原图,得到目标在图片上的坐标;

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

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

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

5. 总结

​ 本文重点介绍了one-stage和two-stage算法的两个代表,R-CNN系列和YOLO系列(anchor-free也没写,😐没怎么接触过),在第4章里面也只介绍了我目前接触过的其他类型的模型(主要是Neck层的方法),这显然是不完整的。其实Backbone也可以写,但是这些模型太多,写不完(懒🙇)。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐