目标检测 object detection
目标检测的任务可以进行拆分,先在原始图像上产生候选区域,再对每个候选区域进行图像分类,最终可以得到物体出现的位置与类别。
图像分类已有成熟的算法,问题的关键即转换到如何产生候选区域(Region Proposal),引出了两种算法模型:
- 两阶段算法:应用传统图像算法先产生候选区域,然后再用卷积神经网络对这些区域进行分类,代表为:R-CNN系列,R-FCN;
- 单阶段算法:只使用一个网络同时产生候选区域并预测出物体的类别和位置,代表为:SSD,YOLO。
根据是否依赖锚框又可以分为 Anchor based 和 Anchor free 的方法。
目标检测涉及的相关概念如下:
边界框 Bounding box
边界框:正好能包含住物体的矩形框。
有如下几种格式:
- xywh:左上角坐标+宽+高,最常用;
- xyxy:左上角坐标+右下角坐标;
- cxcywh:中心点坐标+宽+高。
通常定义图片坐标的原点在左上角,x轴向右为正方向,y轴向下为正方向
锚框 Anchor
锚框:假想出来的一种框。在目标检测模型中,通常会以某种规则在图片上生成一系列锚框,将这些锚框当成 可能的候选区域。不同的模型往往有着不同的生成锚框的方式。
锚框与边界框往往存在误差,需要在锚框的基础上进行微调以形成能准确描述物体位置的 预测框,模型需要预测出微调的幅度。
候选区域 Region Proposal
RoI(Region of Interest)最早在Fsater R-CNN中提出,
候选区域(Region Proposal)与RoI的关系如下,RoI Pooling即表示对每个RoI进行池化:
空洞卷积 Dilated Convolutions/Atrous Convolutions
与普通的卷积相比,增加了一个扩张率(dilation rate)参数,主要用来表示扩张的大小。
扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,在神经网络中参数数量不变;区别在于扩张卷积具有更大的感受野。
如图所示为空洞卷积计算的形象化展示:
图中所示a为普通卷积,b和c为不同扩张率的空洞卷积
评价指标
1)交并比(Interp of Union,IoU):衡量锚框跟真实框之间的关系
- 定义为两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,在图像领域体现为重叠面积除以总面积;
- 1:完全重合,0:完全不重合;
- 通常会选取一个阈值,比如0.5,来确定预测框是正确的还是错误的。
2)精确度(Precision)与召回率(Recall)
- 两者都是机器学习的基础评价指标之一, Precision衡量你的预测有多准确, Recall衡量你发现所有正例的能力
- 该评价指标基于如下背景:根据预测目标的实际值和模型的预测结果,有如下矩阵(蓝色字体为预测正确,红色字体为预测错误):
Precision指标即:TP/(TP+FP),Recall指标即:TP/(TP+FN)
形象化表示如下图:
交并比也可在此背景下进行公式定义:IOU=TP/(TP+FP+FN)
4)平均正确率(Average Precision,AP)
- P-R曲线:Precision与Recall的关系曲线
- AP:PR曲线下的面积
5)平均类别的平均正确率(mean Average Precision,mAP)
- AP是针对一个类别而言的,把所有类别的AP都计算出来后,再对它们求平均值,即可得到mAP
- 面积越接近1性能越好
- mAP@0.5 :mean Average Precision(IoU=0.5),即将IoU设为0.5时的mAP
- mAP@.5:.95 :表示在不同IoU阈值(从0.5到0.95,步长0.05)上的平均mAP
6)FPS(每秒传输帧数-Frames Per Second)
- 目标网络每秒可以处理(检测)多少帧(多少张图片),衡量网络的处理速度
- 可以理解为图像的刷新频率,也就是每秒多少帧
代表性算法
Ⅰ. R-CNN系列:
1. R-CNN[2013]:使用传统图像算法selective search产生候选区域,+ CNN分类。
2. Fast RCNN[2015]:将不同区域的物体共用卷积层的计算,缩减计算量,提高处理速度;引入了调整目标物体位置的回归方法(引入锚框)。
3. Faster RCNN[2015]:使用RPN(Region Proposal Network)来产生候选区域,进一步提升处理速度。
4. Mask RCNN[2017]:在Faster RCNN模型上添加比较少的计算量,同时实现目标检测和物体实例分割两个任务。
Ⅱ. SSD:
Single Shot MultiBox Detector,出现在YOLOv1与YOLOv2之间,提出了多尺度特征图的思想;
采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。
Ⅲ. YOLO系列:
YOLO模型在v3之后有不同团队都对这一模型进行了迭代,关系如图:
1. YOLOv1:基于GoogLeNet,但未使用Inception模块(实际即DarkNet网络的前身)
2. YOLOv2:backbone为DarkNet-19并取消全连接层改用1*1卷积层;采用anchor。ImageNet上的分类表现:top-1精度:72.9%,top-5精度:91.2%
3. YOLOv3:backbone为DarkNet-53,使用残差模块;使用DBL为整个模型的基本部件;引入FPN进行多尺寸预测
DBL:conv+BN+leakyReLU(也可称为CBL)
- conv即卷积;
- BN:BatchNorm,使得每一层神经网络的输入保持相同分布
- leakyReLU:针对ReLU小于0的部分改进后的激活函数
多尺寸预测:
- 通常一幅图像包含各种不同的物体,并且有大有小。网络越深,特征图就会越小,小的物体也就越难检测出来。
- 网络的每一层卷积计算都会得到一次特征图(feature map),随着网络深度的加深,浅层的feature map中主要包含低级的信息(物体边缘,颜色,初级位置信息等),深层的feature map中包含高等信息(例如物体的语义信息:狗,猫,汽车等等)
对于多重scale,目前主要有以下几种主流方法:
- (a) Featurized image pyramid: 这种方法最直观。首先对于一幅图像建立图像金字塔,不同级别的金字塔图像被输入到对应的网络当中,用于不同scale物体的检测。但这样做的结果就是每个级别的金字塔都需要进行一次处理,速度很慢。
- (b) Single feature map: 检测只在最后一个feature map阶段进行,这个结构无法检测不同大小的物体。
- (c) Pyramidal feature hierarchy: 对不同深度的feature map分别进行目标检测。SSD中采用的便是这样的结构。每一个feature map获得的信息仅来源于之前的层,之后的层的特征信息无法获取并加以利用,且精度并没有期待的那么高。
- (d) Feature Pyramid Network(FPN): 与(c)很接近,但有一点不同的是,当前层的feature map会对未来层的feature map进行上采样,并加以利用。这是一个有跨越性的设计。因为有了这样一个结构,当前的feature map就可以获得“未来”层的信息,这样的话低阶特征与高阶特征就有机融合起来了,提升检测精度。
YOLOv3检测效果:
4. YOLOv5(从V1.0到V6.2):使用Pytorch框架(v1~v4都使用Darknet框架);140FPS;27MB(对比v4 244MB)
分为四个版本:Yolov5s、Yolov5m、Yolov5l、Yolov5x,通过改变网络宽度来改变Conv中卷积核的数量,通过改变网络深度来改变BottleneckC3中C3的数量,从而实现不同网络深度和不同网络宽度之间的组合,达到精度与效率的平衡。
基本结构如下:
(1)输入端:Mosaic数据增强、自适应锚框计算、自适应图片缩放
(2)Backbone:CSPDarknet:
- Focus结构(对输入图片隔列采样+拼接,6.0版改为Conv,理伦等价计算更高效)
- CBL结构(4.0版中激活函数改为SiLU:x*sigmoid(x))
- CSP结构(4.0版中改为C3模块)
- SPP(6.0版改为SPPF,时间快一倍)
(3)Neck:FPN+PAN结构
(4)Prediction:分类用BEC_Loss,回归使用GIOU_Loss(IOU->GIOU->DIOU->CIOU)
V1.0到V6.2过程中的更新模块:
Silu:
C3:
SPFF: