博主最近在学习无人船舶水面检测的相关内容,需要用到目标检测的知识。于是博主从零开始(其实有一定深度学习的基础)学习2D目标检测的知识。
目录
1.6.2 平均精确率(mean Average Precision,mAP)
1.6.3 交并比(Intersection over Union,IoU)
1.7.2 非最大抑制(Non-Maximum Suppression)
1.7.3 感兴趣区域(Region of Interest,RoI)
1.7.5 每秒进行十亿次运算次数(Billion Float Operation Per Second,BFLOPS)
1.7.6 骨干网络(Backbone)、中间部件(Neck)、检测头(Head)
1.7.7 特征金字塔网络(Feature Pyramid Network,FPN)
1.7.9 选择性搜索(Selective Search,SS)
4.4 Default box和Prior box(先验框)
5.2.3.3 Convolution with Anchor boxes
一、前言
1.1 什么是目标检测
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标或物体,并确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题
1.2 目标检测的任务
计算机视觉中关于图像识别有四大类任务,它们分别是:
(1)分类——Classification:解决“是什么”的问题,即输入的图片或视频中包含什么类别的目标;
(2)定位——Location:解决“在哪里”的问题,即定位出这个目标的具体位置;
(3)检测——Detection:解决“在哪里”和“是什么”的问题,即定位出这个目标的位置并识别出这个目标的类别;
(4)分割——Segmentation:分为实例分割(Instance-Level)和场景分割(Scene-Level),解决每一个像素属于哪个目标或场景的问题。
如上面两张图所展示的内容,第一张为单目标的图像,第二张为多目标的图像。分类任务只回答物体类别是什么的问题,定位任务回答物体在哪里的问题,通常会以边界框(图中红色边框)框柱物体表示其位置,而检测=分类+定位,分割则将每个物体以不同颜色边界与背景分离开。
所以,目标检测是一个分类、回归问题的叠加。
1.3 目标检测的核心任务
目标检测主要有四项核心任务:
1、分类问题:即图片(或某个区域)中图像属于哪个类别;
2、定位问题:目标可能出现在图像的哪个位置;
3、大小问题:目标具有各种的大小;
4、形状问题:目标的形状各异。
1.4 目标检测算法分类
这里主要介绍基于深度学习的目标检测算法,主要分为两类:单阶段(One stage)和两阶段(Two stage)。
上图展示了两种算法的检测流程。
1)单阶段
单阶段算法对输入直接通过网络提取特征,再进行分类和位置的预测。
流程:特征提取——>分类/定位回归
常见单阶段目标检测算法有:Single Shot MultiBox Detector(SSD)、YOLO系列和RetinaNet等。
2)两阶段
两阶段算法经过输入后首先进行区域生成,该区域成为Region Proposal(RP),这个区域为可能包含待检测物体的预选框,再进行卷积神经网络进行样本分类。
流程:特征提取——>生成RP——>分类/定位回归
常见两阶段目标检测算法有:R-CNN(Region Convolutional Neural Network)、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等。
1.5 目标检测的应用
1)人脸检测
智能门控、员工考勤签到、智慧超市、人脸支付、车站机场实名认证、公共安全
2)行人检测
智能辅助驾驶、智能监控、在岗检测、区域入侵检测、安全帽/安全带检测
3)车辆检测
自动驾驶、辅助驾驶、智能交通、违章检测、关键通道检测、车流量统计
4)遥感检测
大地遥感(土地使用、公路、水渠、河流监控)、农作物监控、军事检测
5)工业质检
流水生产线产品检测、精细产品计数、产品内部探伤检测
1.6 检测任务评估指标
1.6.1 准确率、精确率、召回率
下面通过一个示例进行介绍:
假设一个班级有100个学生,其中男生70人,女生30人。如下图,蓝色矩形表示男生,橙色矩形表示女生。又假设,我们不知道这些学生的性别,只知道他们的身高和体重。我们有一个程序(分类器),这个程序可以通过分析每个学生的身高和体重,对这100个学生的性别分别进行预测。最后的预测结果为,60人为男生,40人为女生,如下图。这里我们将男生视作正样本,女生视作负样本。
TP:实际为男生,预测为男生;
FP:实际为女生,预测为男生;
FN:实际为男生,预测为女生;
TN:实际为女生,预测为女生;
准确率(Accuracy) = (TP + TN) / 总样本 =(40 + 10)/100 = 50%。 定义是: 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
精确率(Precision) = TP / (TP + FP) = 40/60 = 66.67%。它表示:预测为正的样本中有多少是真正的正样本,它是针对我们预测结果而言的。Precision又称为查准率。
召回率(Recall) = TP / (TP + FN) = 40/70 = 57.14% 。它表示:样本中的正例有多少被预测正确了, 它是针对我们原来的样本而言的。Recall又称为查全率。
1.6.2 平均精确率(mean Average Precision,mAP)
计算公式: mAP=所有类别AP之和/类别总个数=
如上表所示,通过计算得到行人、汽车和骑行者的AP后,通过上述公式计算得到mAP。
1.6.3 交并比(Intersection over Union,IoU)
交并比反映的是两个区域的重叠程度overlap:候选区域和标定区域的IoU值。
计算公式: IoU=
如上图所示,方块A和方块B的区域值分别为0.5和0.7,他们的重叠区域值为0.3,则通过公式计算得到的IoU值为。
通常我们会设置一个阈值,IoU大于阈值的图像即为正样本(类别正确)。一般阈值设为0.5.
1.7 名次解释
1.7.1 端对端
也称端到端,One to One。即为输入仅经由一个模型后产生最终的输出。
如图所示,输入经过模型A得到输出即为端到端的模式,若经过了模型B、模型C……则为非端到端的模式。
1.7.2 非最大抑制(Non-Maximum Suppression)
在预测的边界框中,可能存在多个相互重叠框,代表同一个目标。为了消除冗余的边界框,一些算法会使用非最大抑制算法,根据置信度和重叠程度筛选出最佳的边界框。
如图所示,对同一个物体的预测结果包含三个概率分别为0.8/0.9/0.95,经过非极大值抑制后,仅保留概率最大的预测结果即最终输出为概率0.95的边界框。
还有一种情况就是找到所有预测框中得分最高的目标,然后计算其他目标与该目标的IoU值,删除所有IoU值大于给定阈值的目标。(IoU值越大,表示候选框重叠程度越大,为同一目标的可能性越大)。
1.7.3 感兴趣区域(Region of Interest,RoI)
从被处理的图像以方框、圆、椭圆或不规则等方式勾勒出需要处理的区域,成为感兴趣区域RoI。主要是遍历图像,找出可能出现的物体或检测目标的输出区域。通常采用SS(Selective Search)算法。
1.7.4 anchor box
锚框。用于训练和预测,选择锚框和真实框交并比大的用作训练和预测。
1.7.5 每秒进行十亿次运算次数(Billion Float Operation Per Second,BFLOPS)
描述硬件运算性能的单位。类似的还有每秒浮点运算次数(Floating Point Operation Per Second,FLOPS),可以理解为计算速度,用于衡量硬件性能的指标;浮点运算数(Floating Point Operation,FLOPs),理解为计算量,可以用来衡量算法/模型的复杂度。
在一个模型进行前向传播的时候,会进行卷积、池化、BatchNorm、RELU、Upsample等操作。这些操作都会有其对应算力消耗,其中,卷积的计算力消耗所占比重最高。
1.7.6 骨干网络(Backbone)、中间部件(Neck)、检测头(Head)
物体检测器(Object detector)的结构分为这三个部分。
如图所示,输入图像经过Backbone进行特征提取后传入Neck,细化特征后传入检测头Head,完成预测后输出特征图。
Backbone负责从输入图像中提取有用的特征。通常由一个卷积神经网络(CNN)组成,在大规模的图像分类任务重进行训练,如ImageNet。骨干网络在不同尺度上捕捉层次化的特征,在较早的层中提取低层次的特征(如边缘和纹理),在较深的层中提取高层次的特征(如物体部分和语义信息)。
Neck是连接Backbone和Head的一个中间部件。英文翻译为脖颈,恰似人体连接头部和身体的器官。它主要用于聚集并细化骨干网络提取的特征,通常侧重于加强不同尺度的空间和语义信息。颈部可能包括额外的卷积层、特征金字塔网络或其他机制,以提高特征的代表性。
Head是物体检测器的最后一部分。它负责根据Backbone和Neck提供的特征进行预测。它通常由一个或多个特定任务的子网络组成,分别执行分类、定位,以及最近的实例分割和姿势估计。头部处理颈部提供的特征,为每个候选物产生预测。最后,一个后处理步骤,如非极大值抑制(NMS),过滤掉重叠的预测,仅仅保留置信度最高的检测结果作为输出。
1.7.7 特征金字塔网络(Feature Pyramid Network,FPN)
由不同大小特征图构成的层次模型,主要用于在目标检测中实现多尺度检测。大的特征图适合检测较小的目标,小的特征图适合检测大的目标。
卷积神经网络输出特征图上的像素点,对应原始图像上所能看到区域的大小称之为“感受野”,卷积层次越深,特征图越小,特征图上每个像素对应的感受野越大,语义信息表征能力越强。但是特征图的分辨率较低,几何细节信息表征能力较弱;特征图越大,特征图上每个像素对应的感受野越小,几何细节信息表征能力强,特征图分辨率较高,但语义表征能力较弱。为了同时获得较大特征图和较小特征图的优点,可以对特征图进行融合。
1.7.8 滑动窗口
通过滑窗法流程图可以很清晰地理解其主要思路:首先对输入图像进行不同大小窗口的滑窗,进行从左到右、从上到下的滑动。每次滑动的时候都会对当前窗口运行一次分类器(分类器是事先训练好的)如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。
滑窗法简单易于理解,但是不同窗口大小进行图像全局搜索导致效率低下,而且设计窗口大小的时候还需要考虑物体的长宽比。所以,对于实时性要求较高的分类器,并不推荐采用滑窗法。
1.7.9 选择性搜索(Selective Search,SS)
1.7.9.1 什么是选择性搜索
滑窗法类似穷举进行图像子区域搜索,但是一般情况下图像中大部分子区域是没有物体的,学者们自然而然想到只对图像中最有可能包含物体的区域进行搜索以此提高计算效率。选择搜索方法是当下最为熟知的图像bounding boxes提取算法,由Koen E.A于2011年提出。选择搜索算法的主要思想:图像中物体可能存在的区域应该是某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes。
首先对输入图像进行分割算法产生许多小的子区域;其次,根据这些子区域的相似性(主要依靠颜色、纹理、大小和填充等进行判断)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常我们所说的候选框。
如图所示,(a)中物体可以通过颜色区分;(b)中物体可以通过大小区分但无法通过颜色区分;(c)中物体可以通过纹理区分,也无法通过颜色区分;(d)中轮胎是车的一部分,并不是因为颜色相近或纹理相近,而是因为车轮包含在车上。
如图所示,选择性搜索的过程。
1.7.9.2 选择性搜索流程
选择性搜索流程图如下:
1.7.9.3 选择性搜索的优点
划分了区域且不用遍历全图进行搜索,故计算效率优于滑窗法;由于采用子区域合并策略,所以可以包含各种大小的疑似物体框,降低了因物体框大小一致导致漏检的情况;合并区域相似的指示多样性,提高了检测物体的概率。
1.8 数据表示
1.8.1 向量(vector)
向量为一个一维数组,通常包含n个分量。
例如,
,
。其中
为预测结果的置信概率,
,
,
,
为边框坐标,
,
,
为属于某个类别的概率。通过预测结果、实际结果来构建损失函数,损失函数包含了分类和回归两部分。
1.8.2 张量(tensor)
张量就是一个多维数组。
如图所示,标量(即一个单独的数)就是0维的张量,矢量/向量/一维数组也就是1维的张量,矩阵/二维数组就是2维的张量,以此类推……
我们可以将三维张量表示成一个长方体的样子,就形成了我们最常见的张量形态。
1.9 效果评估
1.9.1 分类子问题评估
分类子问题使用Precision、Recall、F1等指标来进行评估
1.9.2 定位子问题评估
使用IoU(Intersection over Union,交并比)来判断模型定位的好坏。
1.10 损失函数
损失函数是用来衡量一个算法的好坏的标准。损失函数值越大,表明算法的效果越差,损失函数值越小,表明算法的效果越优良。
损失函数通常由分类损失和回归损失组成:
其中,分类损失通常由交叉熵表示,回归损失由均方误差函数表示:
在分类损失中是神经网络的输出,
是监督数据,k表示数据的维度;在回归损失中log表示以e为底数的自然对数,
是神经网络的输出,
是正确解标签且只有正确标签的索引为1,其余索引均为0。
1.11 多尺度检测
即为使用大小不同的特征图进行检测。尺度即为形状尺寸,输入和输出也成为输入特征图、输出特征图。
大特征图,卷积较浅,适合识别较小的物体;小的特征图,卷积较深,适合识别大的物体。
1.12 特征融合
将尺度不同的特征图融合在一起以兼具大小特征图的优点。
融合方式主要有两种:
add:小特征图进行上采样(大特征图进行下采样),按元素进行逐位相加
concat:按照指定的维度进行连接
上采样和下采样都是指特征图的空间尺寸变化操作。
上采样(upsampling)常用于将特征图的空间尺寸恢复到原始输入尺寸,或者增加特征图的分辨率。常见的上采样操作包括反卷积(Deconvolution)或转置卷积(Transpose Convolution)和插值(Interpolation)。反卷积操作通过学习可逆卷积核来进行上采样,而插值操作则通过插值算法(如最近邻插值、双线性插值等)对特征图进行填充和插值,从而增加特征图的尺寸。
下采样(downsampling)通常称为池化(Pooling),它的作用是减小特征图的空间尺寸。最常见的池化操作是最大池化(Max Pooling),它将原始特征图划分为不重叠的小区域,然后在每个区域中选择最大值作为采样点,从而减小特征图的宽度和高度。池化操作有助于提取特征的平移不变性,同时减少了特征图的尺寸,减少了参数量和计算量,缓解了过拟合。
二、传统目标检测算法
2.1 图像处理的任务分类
图像处理包括图像分类、目标检测、光学字符识别(Optical Character Recognition,OCR)、图像分割、图像拼接、图像配准、人脸识别、图像去噪、图像复原、图像超分辨率重建、图像压缩
下面是OCR识别的流程
2.2 传统目标检测算法流程
传统目标检测算法流程分为三个步骤:区域选择/穷举——>特征提取——>目标分类。
流程图如下:
2.2.1 区域选择
主要用于生成候选区域,在图像中定位出可能包含目标的位置。在这一步骤中,通常采用滑动窗口的方式对整张图像进行遍历,同时设置不同尺寸和长宽比的框,尽可能找到更多目标存在的位置。具体步骤如下:
- 滑动窗口遍历:通过在图像上以不同尺寸和长宽比窗口进行滑动,覆盖整个图像,以检测出尽可能多的包含目标的区域(示例图详见1.7.8 滑动窗口一节);
- 纹理特征和颜色特征提取:对于滑动窗口中的区域,提取其纹理特征和颜色特征等信息。这些特征可以帮助区分目标和背景,从而辅助后续的目标分类工作;
- 非极大值抑制:滑动窗口会生成大量重叠或相似的候选区域,通过非极大值抑制减少冗余的候选框数量。详见1.7.2节。
候选区域生成的这一过程虽然能够有效定位出目标可能存在的位置,但是由于需要遍历整张图像并生成大量的候选区域,因此计算效率低下。并可能产生大量冗余窗口(虽然采用NMS可以减少一些,但仍会存在许多冗余窗口),这些冗余窗口对后续的特征提取和分类都会造成速度和精度上的影响。
2.2.2 特征提取
在特征提取阶段,常用的特征包括方向梯度直方图(Histogram of Oriented Gradient,HOG)和尺度不变特征转换(Scale-Invariant Feature Transform,SIFT)等。这些特征对于不同的图像背景和目标具有一定的鲁棒性,但在面对复杂背景、光照变化、模糊扭曲等因素时,肯呢个表现出一定的局限性。如果输入图像中存在上述情况,单纯地依靠传统特征提取算法可能无法很好地设计一个具有高鲁棒性的算法。由于特征提取阶段所提取到的特征直接影响着后续分类器的精度,因此特征提取非常重要。
2.2.3 目标分类
目前目标检测中常用的分类器包括:
- 支持向量机(Support Vector Machine,SVM):SVM是一种监督学习算法,用于进行二分类和多分类任务。基本思想是在特征空间找到一个最优超平面,能够将不同类别的样本分开。SVM在目标检测中被广泛应用,具有较高的分类性能和泛化能力。
- AdaBoost(Adaptive Boosting):AdaBoost是一种集成学习算法,通过迭代训练一系列弱分类器,然后将他们组合成一个强分类器。AdaBoost在每一轮迭代中,都会调整训练样本的权重,使得之前分类错误的样本在后续迭代中得到更多关注。它在目标检测中也有一定的应用。
- 随机森林(Random Forest):随机森林也是一种集成学习算法,由多课决策树组成。每棵树都是通过对训练集进行自主采样得到的。在每个节点上,通过随机选择一部分特征进行分裂。最后,通过投票或取平均的方式进行分类。随机森林适用于处理高维数据和大规模数据集,通常具有较高的准确性和鲁棒性。
(以上图片均取自百度百科)
2.3 传统目标检测算法的问题
传统目标检测主要存在两个问题:
候选区域生成不准确:传统方法在候选区域生成阶段往往难以准确估计目标的位置,尤其是对于目标尺寸和长宽比变化较大的情况,难以生成高召回率的候选区域;
特征提取缺乏鲁棒性:由于受到各种干扰因素的影响,传统方法在特征提取阶段难以提取到具有高鲁棒性的特征,这会影响到后续目标分类准确度。
现在,我们大多采用的是基于深度学习的目标检测算法,它可以很好地避免传统方法的弊端。这是因为基于深度学习的目标检测方法将候选区域生成、特征提取和目标分类三个步骤放入一个深度学习框架中进行端到端的训练,从而加快了检测速度并提高了效率。下面,我们将开始介绍基于深度学习的目标检测算法。
三 、RCNN系列
3.1 RCNN
3.1.1 介绍
R-CNN,全称Region with CNN features。由Ross Girshick在CVPR 2014中提出。主要采用候选区域方法(Region Proposal Method),创建目标检测的区域改变了图像领域实现目标检测的模型思路,R-CNN是以深度神经网络为基础的目标检测模型。
用CNN提取出Region Proposal中的Features,然后进行SVM分类和bbox的回归。采用将检测问题转化为分类问题的思想。fast R-CNN和Faster R-CNN都是延续R-CNN的思路。
3.1.2 算法流程
R-CNN的简要检测流程如下:
流程可以分为四个步骤:
- 候选区域获取:对输入图像执行SS算法(大约2s),找到RP
- 候选区域特征提取:将每一个RP输入到预训练好的AlexNet(去除全连接)中,提取特征向量(4096)
- 候选区域对应特征分类(SVM):对每个目标(类别)训练一个SVM分类器,识别该区域是否包含目标
- 使用回归器精细修正候选框位置:对于每个类,训练一个线性线性回归模型判断当前框定位是否准确
算法流程图如上所示。R-CNN框架如下:
候选区域获取主要采用选择性搜索(SS)算法,前面已经详细介绍过,这里不再复述。我们直接从步骤二开始介绍。
3.1.3 候选区域特征提取
在R-CNN中,将2000个候选框缩放到227×277大小,接着将候选区域输入事先训练好的AlexNet CNN网络中,获取4096维的特征得到2000×4096维矩阵。
2000是候选框的数量,2000×4096维的矩阵就代表每个候选框都有一个4096维的向量。
3.1.4 候选区域对应特征分类(SVM)
将特征提取的输出(2000×4096维矩阵)传入每一类训练好的SVM分类器进行分类操作判断该特征向量属于哪一个分类。;R-CNN会为每个类别的目标专门训练一个SVM分类器。在为线性SVM分类器训练准备数据的过程中,将包含目标的候选区域标注为正样本,背景区域标注为负样本。
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘获得2000×20维矩阵表示每个候选框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS)剔除重叠候选框,得到该列即该类中得分最高的一些候选框。
矩阵相乘示意图如下:
IoU是计算两个框重叠程度的值,IoU值越大,表面两个框重叠程度越高,候选框中的区域目标为同一物体的概率越大通过计算IoU并采用NMS的原则,可以确保检测结果具有最高的置信度,且不会出现冗余的重叠框。
3.1.5 使用回归器精细修正候选框位置
通过SS算法得到的20个候选区域位置不一定准确,因此采用20个回归器对NMS处理后剩余的候选框进行回归操作,最终得到每个类别的修正后bounding box。
如图所示,黄色框表示最先得到的候选区域Region Proposal,绿色框表示人工标注的实际区域Ground Truth,红色框表示Region Proposal进行回归后得到的预测区域,可以用最小二乘法解决线性回归问题。回归得到的红色框更接近真实框。
3.1.6 分类器的选择
我们在目标检测中使用SVM分类器而不采用CNN的Softmax层进行分类,主要有以下四点原因:
- 训练数据的不同处理:在训练CNN提取特征时,通常会使用较低的IoU阈值(如0.5),这样可以生成更多的正样本,即使是不分包含目标的bounding box也会被标记为正样本。而在训练SVM时,对于正样本的要求更加严格,通常需要较高的IoU阈值(如0.7),确保bounding box完全包围目标。
- 样本量和过拟合问题:CNN需要大量数据来避免过拟合的问题,因此允许包含部分目标的bounding box作为训练样本。然而,SVM适用于少样本训练,因此需要更加严格的标准来筛选正样本,这样可能导致训练数据样本量不足,进而发生过拟合问题。
- 位置准确度和类别识别精度:使用低IoU进行Softmax分类可能会导致最终bounding box位置不准确,因为线性回归无法很好地拟合大偏差。同时,类别识别精度也会下降,因为分类器对于部分包含目标的bounding box可能会产生错误的分类结果。
- 选择SVM完成分类:由于数据量不足和过拟合问题,最终选择使用SVM完成分类,而将CNN用于特征提取。这样可以保证分类器得到的训练数据更加准确,避免过拟合问题。
3.1.7 R-CNN的缺点
RCNN测试速度比较慢,一张图片约53(cpu),用选择性搜索算法提取候选框用时2s,一张图像内候选框之间存在大量重叠,提取特征操作冗余;
训练速度慢,过程极其繁琐;
训练所需空间大,对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘,对于很深的网络,如VGG 16,从VOC 07训练集上的5k图像上提取的特征需要数百GB的存储空间。
3.2 Fast R-CNN
3.2.1 介绍
R-CNN中,每个预先提取的候选区域都会被送入卷积神经网络(CNN)提取特征。然而,可以通过一次将整张图像送入CNN来减少重复计算。这种方法被称为空间金字塔池化网络(Spatial Pyramid Pooling Network,SPP-Net)。SPP-Net解决了在使用卷积神经网络处理不同大小的候选区域和重复卷积计算两个问题。它的主要思想是在整张图像上计算一次全局特征图,然后只需要将候选区域在原图片的位置映射到CNN生成的特征图谱上,并提取出候选区域对应的特征图。这些不同大小的特征图在送入全连接层前需要变成统一大小的特征图。
SPP-Net在全连接层之前,加入了一个空间金字塔池化层,这个层可以将不同尺寸的特征图矩阵池化成尺寸相同的特征图矩阵。在使用这种金字塔策略后,解决了全连接层送入卷积神经网络的输入图像尺寸限制问题,可以输入任意尺寸的图片,在输入到全连接层之前都会被归一化为固定长度的特征向量。
例如,输入图像的尺寸为224×224时,经过一次卷积得到特征图的尺寸为1313×256,对于1313的特征矩阵,将他分别池化成4×4、2×2和1×1三张子特征矩阵,得到(16+4+1)×256维的特征向量。加入金字塔池化层的优点是克服了R-CNN算法中归一化步骤带来的缺点,归一化会损失图像的部分信息,进而导致提取的特征质量较差,间接导致分类结果不准确。这也就可以解释为什么SPP-Net检测精度由于R-CNN。而SPP-Net检测过程只对整张大图提取了一次特征,R-CNN则是在2000张候选区域图片上提取了2000次特征。所以SPP-Net速度优于R-CNN。
3.2.2 算法流程
如图所示,Fast R-CNN算法流程主要有三步:
1、将输入图像生成1000~2000个候选区域(SS算法),并将某个候选区域称为RoI区域
2、将图像输入到卷积网络中得到相应特征图,将SS算法生成的候选框投影到特征图上得到对应的特征矩阵。(R-CNN依次将2000个候选区域输入卷积神经网络得到特征,存在大量冗余且提取时间长)Fast R-CNN直接将整张图像输入网络中,一次性计算整张图像特征,这样就可以根据特征图的坐标获得想要的候选区域特征图,无需重复计算。
3、将我们得到的特征矩阵通过RoI Pooling层缩放到7×7大小的特征图,然后将特征图展平(称为reshape)为向量,即称为1×49的一维向量。通过一系列全连接层和Softmax层得到预测结果。这里RoI池化层是空间金字塔池化层的一种特殊情况。大小不同的候选区域特征通过RoI池化层映射为固定长度的特征向量。最后这些特征向量经过全连接层得到RoI特征向量,这些RoI特征向量被分别送入分类器和回归器进行分类和回归并输出最终检测的结果。
如Fast R-CNN框架所示,其将原本R-CNN中独立的三个步骤:特征提取、边界框分类和边界框回归融合到了一个步骤中,采用统一的卷积神经网络(CNN)实现,达到了端到端的目标检测。
Fast R-CNN的工作流程就是:首先通过选择性搜索(SS)算法生成候选框,候选框可能包含目标区域。接着,整个图像与其对应的候选框一起输入到CNN中生成整张特征图。CNN在前向传播过程中同时完成了特征提取、边界框分类和边界框回归三个任务。通过将三个任务融合到同一个CNN中,Fast R-CNN大大提高了目标检测的效率和准确性,不再需要对每个候选框单独进行特征提取和分类,加快检测速度。
3.2.3 Softmax分类器
Softmax是一种函数,表达式如下:
因为softmax函数适用于多元分类问题,故该输出层共有n个输出……,每一个y代表的是该类别的可能性,例如判断一张水果图像的类别时,输出有三项,y1=0、y2=0和y3=1,分别代表苹果、梨子和香蕉,因为y3=1,故最终输出的类别为香蕉。上式中exp(x)代表的指数函数(e是纳皮尔常数2.7182……)。分子是输入信号ak的指数函数,分母是所有输入信号的指数函数的和。显然,输出层的各个神经元都受到所有输入信号的影响。Softmax函数的输出介于0-1之间,数值越大则表示结果为该分类的可能性越大。
利用Softmax函数的特性我们可以将其作为一个分类器。
Softmax分类器的输出包含了N+1个类别的概率,其中第一个类别表示背景,而其余N个值则表示真实的目标类别概率。在PASCAL VOC2012数据集中,通常有20个目标分类,因此Softmax分类器会输出21个类别的概率。这意味着Softmax分类器的全连接层中会有N+1个节点,其中第一个节点对应背景类别的概率,而剩余的N个节点分别对应于每个目标类别的概率。
3.2.4 边界框回归器(bbox regressor)
由于每幅图片会输出N+1个分类的候选框,每个候选框都有x y w d四个参数,所以bbox regressor的FC中有4(N+1)个节点。
边界框参数回归的计算公式:
Px、Py、Pw和Ph分别为候选框中心x、y坐标以及候选框的宽和高。
3.2.5 多任务损失(Multi-task Loss)函数
Fast R-CNN采用多任务损失函数进行训练,训练过程生成的RoI特征向量被分别送入Softmax多任务分类器和bbox regressor。Softmax层输出的概率训练代表每个类别的概率。Fast R-CNN算法多任务损失函数包括分类损失函数和回归损失函数,多任务损失函数定义为:
其中,u代表候选框对应的真实框类别标签,表示候选框变换为真实框对应的变换参数向量,v表示候选框回归层产生的变换参数向量,
表示判定类别的损失函数,定义如下:
表示候选框变换参数的损失函数,定义如下:
其中smooth函数定义如下:
3.3 Faster R-CNN
3.3.1 介绍
Fast R-CNN在特征提取阶段相较于R-CNN进行了改进,大幅提升了性能,但在候选区域生成阶段仍存在瓶颈(采用SS算法),该方法提取候选区域花费时间较长,且无法与后面的训练过程合并起来。因此,我们考虑从提取候选区域入手进行改进,实现整个过程端到端的训练和检测是非常有必要的。针对这一问题,在Fast R-CNN的基础上提出了一种当前通用的目标检测算法之一:Faster R-CNN。
3.3.2 算法流程
算法的流程图如上所示,Faster R-CNN网络由两部分组成,第一部分是区域建议网络(Region Proposal Network,RPN),该网络是一个全卷积神经网络,用于生成候选区域;第二部分是Fast R-CNN检测网络,主要用于将第一部分RPN生成的候选区域进行分类和边界回归。两个网络连接起来成为一个统一的网络。其中,两个网络在训练时可以共享卷积特征,分别用于各自的任务。
Faster R-CNN算法流程:
1、将输入图像输入CNN网络得到对应特征图
2、使用RPN网络生成候选区域,将RPN生成的候选框投影到特征图上得到RoI区域的特征矩阵
3、将每个RoI区域的特征矩阵通过RoI Pooling层缩放到7×7大小的特征图,接着将特征图展平为vector,之后通过一系列全连接层得到预测结果。
Faster R-CNN与Faster R-CNN相比,最大的改进就是在生成候选区域阶段弃用了SS算法,启用了一种新的候选区域提取方式——RPN。Faster R-CNN把提取候选区域的任务交给了卷积神经网络。RPN是一种全卷积神经网络,它负责生成高质量的待检测物体候选框。它与后面的检测网络即Fast R-CNN网络可以在训练的时候共享卷积特征,节省了计算资源,这就使得区域建议几乎不耗费时间。时间上远远优于SS算法。另外,Fast R-CNN不是绝对意义上的端到端(end to end),SS算法在CPU上实现,其余部分在GPU上进行。Faster R-CNN的RPN部分和剩余部分(Fast R-CNN)都在GPU上实现,其中RPN生成候选框,检测网络负责对这些候选框二次筛选,减少假阳性。从输入图像到输出检测结果,Faster R-CNN真正做到了绝对意义上的end-to-end。
3.3.3RPN(区域建议网络)
基于CNN的目标检测算法一般都是候选区域生成和CNN分类的组合,生成候选区域的质量好坏直接影响总体的检测精度。如果在一张图像上只生成数百个高质量的候选目标区域,并且召回率也很高,这样不仅可以提升检测速度还可以提升精度。区域建议网络(RPN)很好地解决了上述问题。
RPN网络以原始图像所提取的卷积特征图矩阵作为输入,输出一系列矩形候选区域框以及该矩形候选区域是否为目标的分数(objectness scores),RPN网络的结构如下:
如图,其中conv Feature map(图中的网格)是图像输入网络得到相应的特征图,通过sliding window(滑动窗口)处理之后产生一个256d的一维向量。该向量通过两个全连接层,分别输出分类概率scores和边界框回归参数coordinates,其中k是指k个anchor boxes,2k个scores是每个anchor box分别为前景和背景的概率(这里只区分前景和背景,所有的类别都归于前景),4k个coordinates是每个anchor box有四个参数(x y w h)。
RPN网络在Faster R-CNN的共享卷积部分的最后一层输出的特征图上用3×3的卷积核与该特征图进行卷积,也就是使用3×3的窗口在该层特征图矩阵上进行滑窗处理。那么这个3×3的区域卷积后得到一个3维矩阵。因为每个特征图得到一个一维向量,该层有d个通道,d个特征图可以得到d维特征向量。
如果我们使用ZF网络,那么ZF最后一层卷积通道数为256个;如果使用VGG16网络提前图像基础特征,那么最后一层con5_3的通道个数为512个。这个输出的d维向量输出给两个同级的全连接层——包围盒回归层(reg)和包围盒分类层(cls)。
3×3滑窗中心点位置,对应预测输入图像3种尺度(128,256,512),3中长宽比(1:1,1:2,2:1)的Region Proposal(候选区域),这种映射机制称为anchor(锚),产生了k=9个锚框。每个3×3的区域都可以产生9个候选区域。
假设原始图像的最后一层卷积层的特征图矩阵尺寸为H×W,则在原始图像中一共有H×W×k个对应的锚框,也就是预测H×W×k个候选区域。d维特征向量后边接入到两个全连接层,即类别判定层和回归层分别用于分类和边框回归。类别判定层包含2个元素,用于判别目标和非目标的估计概率。回归层包含4个坐标元素(x,y,w,h),用于确定位置。分类的正样本,与真实区域重叠大于0.7,负样本与真实区域重叠小于0.3.最后根据Region Proposal得分高低,选取前300个Region Proposal作为Fast R-CNN网络的输入进行检测。
3.3.4 RPN损失函数
RPN多任务损失函数如下所示:
i是mini-batch中anchor的索引,pi是第i个anchor中目标的预测概率,如果anchor为正,GT(Ground Truth)标签=1,否则为0;ti是一个向量,表示预测的包围盒的4个参数化坐标;
是与正anchor所对应的GT的包围盒的坐标向量;
表示一个mini-batch中的所有样本数量256;
表示anchor的位置的个数,约2400.
分类损失函数式两个类别(目标与非目标背景)的对数损失:
回归算是公式如下:
Faster R-CNN框架如下:
3.4 三种算法比较
四、SSD
4.1 介绍
SSD(Single Shot Detection)属于单阶段目标检测算法的一种,与R-CNN不同,不需要Region Proposal(区域建议)阶段而是可以直接产生物体的类别概率和位置坐标值,经过单词检测即可直接得到最终的检测结果,具有检测速度快的特点。
4.2 算法结构
SSD算法结构分为三部分:卷积层、目标检测层和NMS筛选层。详细结构图如下:
4.2.1 卷积层
输入是300×300的图像,SSD采用VGG16的基础网络并进行了一些修改,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。
具体的修改如下:
1、分别将VGG16的全连接层FC6和FC7转换成了3×3的卷积层CONV6和1×1的卷积层CONV7
2、去掉了所有的Dropout层和FC8层
3、同时将池化层Pool5由原来的stride=2的2×2改成了stride=1的3×3(目的是为了减小特征图大小)
4、添加了Atrous算法(hole算法),目的是获得更加密集的得分映射
5、在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测
SSD中引入了Default Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度Feature map所有特征点上使用priorBox层。
4.2.2 目标检测层
这一层由5个卷积层和一个平均池化层(Avg Pooling)组成。去掉了最后的全连接层。SSD认为目标检测中的物体只与周围信息有关,它的感受野不是全局的,故没必要也不应该做全连接。
4.2.3 筛选层
和YOLO系列的筛选层基本一致:首先过滤掉类别概率低于阈值的default box,再采用NMS(非极大值抑制)筛选重叠度较高的。SSD综合了各个不同的Feature map上的目标检测输出的default box。
SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Andriod上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的事mobileNet,适合在终端上部署和运行。
4.3 多尺度特征预测不同尺度目标
上图左边的方法针对输入的图片获取不同尺度的特征映射,但是在预测阶段仅仅使用了最后一层的特征映射;而SSD(右图)不仅获得不同尺度的特征映射,同时在不同的特征映射上面进行预测,它在增加运算量的同时可能会提高检测的精度,因为它具有更多的可能性。
对于BB(bounding boxes)的生成,Faster-rcnn和SSD有不同的策略,但是都是为了同一个目的,产生不同尺度,不同形状的BB,用来检测物体。对于Faster-rcnn而言,其在特定层的Feature map上面的每一点生成9个预定义好的BB,然后进行回归和分类操作来进行初步检测,然后进行ROI Pooling和检测获得相应的BB;而SSD则在不同的特征层的feature map上的每个点同时获取6个(有的层是4个)不同的BB,然后将这些BB结合起来,最后经过NMS处理获得最后的BB。浅层卷积层对边缘更加感兴趣,可以获得一些细节信息(位置信息),而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch我们利用浅层网络的特征就可以将其检测出来,对于复杂的patch我们利用深层网络的特征就可以将其检测出来,因此,如果我们同时在不同的feature map上面进行目标检测,理论上面应该会获得更好的检测效果。
4.4 Default box和Prior box(先验框)
图片被送进网络之后先生成一系列 feature map,传统框架会在 feature map(或者原图)上进行 region proposal 提取出可能有物体的部分然后进行分类,这一步可能非常费时,所以 SSD 就放弃了 region proposal,而选择直接生成一系列 defaul box(筛选出prior boxes投入训练),然后以prior box 为初始bbox,将bboxes回归到正确的GT位置上去,预测出的定位信息实际上是回归后的bboxes和回归前的(prior box)的相对坐标。整个过程通过网络的一次前向传播就可以完成。
Default box是指在feature map的每个单元格(cell)上都有一系列固定大小的box。SSD 训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上,看下节Prior box概念。如上图所示,每个单元格使用了4个不同的Defalut box(虚线框,仔细看格子的中间有比格子还小的一个box),图片a中猫和狗分别采用最适合它们形状的Defalut box来进行训练。假设每个feature map cell有k个default box,那么对于每个default box都需要预测C(包括背景)个类别score和4个offset,因此如果一个feature map的大小是m*n,那么这个feature map就一共有K*m*n个default box,每个default box需要预测4个坐标相关的值和C(包括背景)个类别概率,则在m*n的特征图上面将会产生(C+4)* K * m * n个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature map卷积时卷积核的个数,包含两部分,实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积:比如数量为C*K的卷积核对应confidence输出,表示每个default box的confidence,也就是类别的概率;数量为4*K的卷积核对应localization输出,表示每个default box回归后的坐标)。作者的实验也表明default box的shape数量越多,效果越好。
SSD的一个核心是同时采用lower和upper的feature maps做检测。SSD中的Defalut box和Faster-rcnn中的anchor机制很相似。就是预设一些目标预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。对于不同尺度的feature map 上使用不同的Default boxes。如上图所示,我们选取的feature map包括38x38x512、19x19x1024、10x10x512、5x5x256、3x3x256、1x1x256。具体怎么得到的看下面的图。我们总共可以获得8732个box,然后我们将这些box送入NMS模块中,获得最终的检测结果。其中特征图层分别为conv4_3、conv7(fc7)、conv8_2、conv9_2、conv10_2、conv11_2。
训练中还有一个东西:Prior box,是指实际中选择的要投入训练过程的Default box(每一个feature map cell 不是k个Default box都取)。
也就是说Default box是一种概念,Prior box则是实际的选取。训练中一张完整的图片送进网络获得各个feature map,对于正样本训练来说,需要先将prior box与ground truth box做匹配,匹配成功说明这个prior box所包含的是个目标,但离完整目标的ground truth box还有段距离,训练的目的是保证default box的分类confidence的同时将prior box尽可能回归到ground truth box。
举个例子:假设一个训练样本中有2个ground truth box,所有的feature map中获取的prior box一共有8732个。那可能分别有10、20个prior box能分别与这2个ground truth box匹配上。
对于检测到目标的真实位置,SSD 300是使用包括conv4_3在内的共计6个feature maps一同检测出最终目标的。在网络运行的时候显然不能一个feature map单独计算一次softmax socre+box regression(虽然原理如此,但是不能如此实现)。那么多个feature maps如何协同工作?这时候就要用到Permute,Flatten和Concat这3种层了。
SSD的 XX_conf 和 XX_loc层的输出,是用通道来保存特征向量的,所以这里需要将通道数调整到最后,也就是 permute所做的事情。通过该层后,数据的顺序被换成了 NHWC,再通过 flatten拉成一列。
Feature map合并方法:
现在以conv4_3和fc7为例分析SSD是如何将不同size的feature map组合在一起进行prediction。上图展示了conv4_3和fc7合并在一起的过程中shape变化(其他层类似)。
1)对于conv4_3 feature map,conv4_3_norm_priorbox(priorbox层)设置了每个点共有4个prior box。由于SSD 300共有21个分类,所以conv4_3_norm_mbox_conf的channel值为num_priorbox * num_class = 4 * 21 = 84;而每个prior box都要回归出4个位置变换量[dx,dy,dx,dymax],所以conv4_3_norm_mbox_loc的channel值为4 * 4 = 16。
2)fc7每个点有6个prior box,其他feature map同理。
3)经过一系列图展示的shape变化后,最后拼接成mbox_conf和mbox_loc。而mbox_conf后接reshape,再进行softmax(为何在softmax前进行reshape,Faster RCNN有提及)。
4)最后这些值输出detection_out_layer,获得检测结果。
4.5 训练过程
- 每一个 prior box 经过Jaccard系数计算和真实框的相似度。
- 阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框。
- 我们令 i 表示第 i 个默认框,j 表示第 j 个真实框,p表示第p个类。那么 表示 第 i 个 prior box 匹配到 第 j 个 ground truth box ,并且这个ground truth box的 类别是p,若不匹配的话,则=0 。
- 总的目标损失函数(objective loss function)为 localization loss(loc) 与 confidence loss(conf) 的加权求和。
4.6 损失函数
损失函数由类别损失和定位损失组成:
类别损失定义如下:
定位损失定义如下:
4.7 优缺点
优点:
- 速度快:由于只需一次前向传递,SSD的检测速度非常快,适合实时应用。
- 多尺度检测:SSD能够同时检测图像中的大对象和小对象。
缺点:
- 对小对象的检测能力有限:尽管SSD引入了多尺度特征映射,但对于非常小的对象,检测效果可能不如其他方法。
参考文献:SSD目标检测详解-优快云博客
五、YOLO系列
参考文献:YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)-优快云博客
5.1 YOLOv1
5.1.1 介绍
在YOLOv1提出之前,R-CNN系列算法在目标检测领域独占鳌头。因为其检测精度高,但由于其网络结构式双阶段(Two-stage)的特点,使得它的检测速度不能满足实时性。为了打破这一僵局,设计一种速度更快的目标检测器是大势所趋。
2016年,Joseph Redmon、Santosh Divvala、Ross Girshick等人提出了一种单阶段(one-stage)的目标检测网络。它的检测速度非常快,每秒可以处理45帧图片,能够轻松地实时运行。由于其速度之快和其使用的特殊方法,作者将其取名为:You Only Look Once(也就是我们常说的YOLO的全称),并将该成果发表在了CVPR 2016上,从而引起了广泛地关注。
YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框) 的位置及其所属的类别。
5.1.2 网络结构
YOLOv1的网络架构如上所示,结构清晰明了,是传统的one-stage卷积神经网络:
- 网络输入:448×448×3的彩色图片(通道数为3代表RGB【Red Green Blue三色】)
- 中间层:由若干卷积层和最大池化层(Max Pooling)组成,用于提取图片的抽象特征
- 全连接层:由两个全连接层组成,用来预测目标的位置和类别概率值
- 网络输出:7×7×30的预测结果
5.1.3 实现细节
5.1.3.1 检测方法
YOLOv1采用的是“分而治之”的策略,将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处!
具体的实现过程如下:
- 将一幅图像分成S×S个网格(YOLOv1中S=7个Grid sell),如果某个Object的中心落在这个网格中,则这个网格就负责预测这个Object
- 每个网格要预测B个bounding box,每个bounding box要预测五个参数,即(x,y,w,h)和置信度confidence
- 每个网格还要预测类别信息,一共C个类
- 总而言之,S×S个网格,每个网格预测B个bounding box以及C个类。网络的输出就是一个S×S×(5×B+C)的张量
在YOLOv1中,S=7,B=2,C=20,,故网络的输出为7×7×20.
5.1.3.2 损失函数
在R-CNN和SSD中,损失函数通常由两部分组成:分类损失和定位损失。在YOLO中添加了置信度预测损失,故定义如下:
每个损失函数的定义如下:
- 其中
用于判断第i个网格中的第j个box是否负责这个Object。
中,第一个表达式为含object的box的confidence预测,第二个表达式为不含object的box的confidence预测,在类别预测损失函数中,
判断是否有object中心落在第i个网格中。
- 损失由三部分组成,分别是:坐标预测损失、置信度预测损失、类别预测损失。
- 使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。
- 定位误差比分类误差更大,所以增加对定位误差的惩罚,使λcoord =5。
- 在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使 λnoobj =0.5。
5.1.4 优缺点
优点:
- YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像;YOLO的极速版本每秒可以处理150帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟,实时地处理视频。对于欠实时系统,在准确率保证的情况下,YOLO速度快于其他方法。
- YOLO 实时检测的平均精度是其他实时监测系统的两倍。
- 迁移能力强,能运用到其他的新的领域(比如艺术品目标检测)。
缺点:
- YOLO对相互靠近的物体,以及很小的群体检测效果不好,这是因为一个网格只预测了2个框,并且都只属于同一类。
- 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。(因为对于小的bounding boxes,small error影响更大)
- YOLO对不常见的角度的目标泛化性能偏弱。
5.2 YOLOv2
5.2.1 介绍
2017年,作者 Joseph Redmon 和 Ali Farhadi 在 YOLOv1 的基础上,进行了大量改进,提出了 YOLOv2 和 YOLO9000。重点解决YOLOv1召回率和定位精度方面的不足。
YOLOv2 是一个先进的目标检测算法,比其它的检测器检测速度更快。除此之外,该网络可以适应多种尺寸的图片输入,并且能在检测精度和速度之间进行很好的权衡。
相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测。
YOLO9000 使用 WorldTree 来混合来自不同资源的训练数据,并使用联合优化技术同时在ImageNet和COCO数据集上进行训练,能够实时地检测超过9000种物体。由于 YOLO9000 的主要检测网络还是YOLOv2,所以这部分以讲解应用更为广泛的YOLOv2为主。
5.2.2 网络结构
YOLOv2 采用 Darknet-19 作为特征提取网络,其整体结构如下:
改进后的YOLOv2:DarkNet-19,改进如下:
- 与VGG相似,使用了很多3×3的卷积核,并且在每一次池化操作后,下一层的卷积核的通道数=池化输出的通道×2
- 在每一层卷积后,都增加了批量标准化(batch normalization)进行预处理
- 采用降维的思想,把1×1的卷积置于3×3之间,用来压缩特征
- 在网络最后的输出增加了 一个global average Pooling层
- 整体上采用了19个卷积层,5个池化层
降维详见:TF2.0深度学习实战(六):搭建GoogLeNet卷积神经网络_tf实现googlenet模型的例子-优快云博客
DarkNet-19、YOLOv1与VGG16的对比:
- VGG-16:大多数检测网络框架都是以VGG-16作为基础特征提取器,它功能强大,准确率高,但是计算复杂度较大,所以速度会相对较慢。因此YOLOv2的网络结构将从这方面进行改进
- YOLOv1:基于GoogleLeNet的自定义网络,比VGG-16速度快,但是精度不如VGG-16
- Darknet-19:速度方面,处理一张图片仅需要55.8亿次运算,相比于VGG306.9亿次,速度高了近6倍。精度方面,在Imagenet上的测试精度为:top1准确率72.9%,top5准确率91.2%。
5.2.3 实现细节
5.2.3.1 Batch Normalization
简称BN,意思是批量标准化。2015年由 Google 研究员在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出。
BN 对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。基于此,YOLOv2 对每一层输入的数据都进行批量标准化,这样网络就不需要每层都去学数据的分布,收敛会变得更快。
BN算法实现:
在卷积或池化之后,激活函数之前,对每个数据输出进行标准化,实现方式如下图所示:
如上图所示,前三行是对Batch进行数据归一化(如果一个Batch中有训练集每个数据,那么同一Batch内数据近似代表了整体训练数据),第四行引入了附加参数 γ 和 β,这两个参数的具体取值可以参考上面提到的 Batch Normalization 这篇论文。
深入了解Batch Normalization:深度学习笔记(三):BatchNorm(BN)层_batchnorm层-优快云博客
5.2.3.1 Anchor box机制
在YOLOv1中,作者设计了端到端的网路,直接对边界框的位置(x, y, w, h)进行预测。这样做虽然简单,但是由于没有类似R-CNN系列的推荐区域,所以网络在前期训练时非常困难,很难收敛。于是,自YOLOv2开始,引入了 Anchors box 机制,希望通过提前筛选得到的具有代表性先验框Anchors,使得网络在训练时更容易收敛。
在 Faster R-CNN 算法中,是通过预测 bounding box 与 ground truth 的位置偏移值 ,间接得到bounding box的位置。其公式如下:
这个公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这会导致模型的不稳定性。
因此 YOLOv2 在此方法上进行了一点改变:预测边界框中心点相对于该网格左上角坐标的相对偏移量,同时为了将bounding box的中心点约束在当前网格中,使用 sigmoid 函数将
归一化处理,将值约束在0-1,这使得模型训练更稳定。
下图为 Anchor box 与 bounding box 转换示意图,其中蓝色的是要预测的bounding box,黑色虚线框是Anchor box。
YOLOv2 在最后一个卷积层输出 13×13 的 feature map,意味着一张图片被分成了13×13个网格。每个网格有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值:(类似YOLOv1的置信度confidence)。引入Anchor box机制后,通过间接预测得到的bounding box的位置的计算公式为:
置信度的计算公式为:
5.2.3.3 Convolution with Anchor boxes
在之前的讲解中,我们知道YOLOv1会预测两个box,每个box有xywh和置信度五个参数以及20个类,所以输出向量表示如下:
在YOLOv2中每个box都要预测五个参数和20个类,一共需要预测K个box,故输出向量表示如上图所示。
YOLOv1 有一个致命的缺陷就是:一张图片被分成7×7的网格,一个网格只能预测一个类,当一个网格中同时出现多个类时,就无法检测出所有类。针对这个问题,YOLOv2做出了相应的改进:
- 首先将YOLOv1网络的FC层和最后一个Pooling层去掉,使得最后的卷积层的输出可以有更高的分辨率特征。
- 然后缩减网络,用416×416大小的输入代替原来的448×448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格的时候只有一个中心单元格(Center Cell)。YOLOv2通过5个Pooling层进行下采样,得到的输出是13×13的像素特征。
- 借鉴Faster R-CNN,YOLOv2通过引入Anchor Boxes,预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。
- 采用Faster R-CNN中的方式,每个Cell可预测出9个Anchor Box,共13×13×9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。比YOLOv1预测的98个bounding box 要多很多,因此在定位精度方面有较好的改善。
5.2.3.4 聚类方法选择Anchors
Faster R-CNN 中 Anchor Box 的大小和比例是按经验设定的,不具有很好的代表性。若一开始就选择了更好的、更有代表性的先验框Anchor Boxes,那么网络就更容易学到准确的预测位置了!
YOLOv2 使用 K-means 聚类方法得到 Anchor Box 的大小,选择具有代表性的尺寸的Anchor Box进行一开始的初始化。传统的K-means聚类方法使用标准的欧氏距离作为距离度量,这意味着大的box会比小的box产生更多的错误。因此这里使用其他的距离度量公式。聚类的目的是使 Anchor boxes 和临近的 ground truth boxes有更大的IOU值,因此自定义的距离度量公式为 :
到聚类中心的距离越小越好,但IoU值越大越好,故采用1-IoU来表示。这样就可以实现距离越小,IoU值越大。具体实现方式如下:
如下图所示,论文中的聚类效果,其中紫色和灰色表示两个不同的数据集,可以看出基本形状是类似的。
从下表得知,YOLOv2采用5种Anchor比Faster R-CNN的9中Anchor得到的平均IoU略高,并且当YOLOv2采用9种时,平均IoU有显著提高。这也说明了k-means的方法生成的Anchor boxes更具有代表性。为了权衡精确度和速度的开销,最终选择K=5.
5.2.3.5 Fine-Grained Features
细粒度特征,可理解为不同层之间的特征融合。YOLOv2通过添加一个Passthrough Layer,把高分辨率的浅层特征连接到低分辨率的深层特征(把特征堆积在不同Channel中)而后进行融合和检测。具体操作是:先获取前层的26×26的特征图,将其同最后输出的13×13的特征图进行连接,而后输入检测器进行检测(而在YOLOv1中网络的FC层起到了全局特征融合的作用),以此来提高对小目标的检测能力。
Passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26×26×512的特征图,经Passthrough层处理之后就变成了13×13×2048的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图,然后在此特征图基础上卷积做预测。示意图如下:
5.2.4 性能表现
在VOC2007数据集上进行测试,YOLOv2在速度为67fps时,精度可以达到76.8的mAP;在速度为40fps时,精度可以达到78.6的mAP 。可以很好的在速度和精度之间进行权衡。下图是YOLOv1在加入各种改进方法后,检测性能的改变。可见在经过多种改进方法后,YOLOv2在原基础上检测精度具有很大的提升!
5.3 YOLOv3
5.3.1 介绍
2018年,作者 Redmon 又在 YOLOv2 的基础上做了一些改进。特征提取部分采用darknet-53网络结构代替原来的darknet-19,利用特征金字塔网络结构实现了多尺度检测,分类方法使用逻辑回归代替了softmax,在兼顾实时性的同时保证了目标检测的准确性。
从YOLOv1到YOLOv3,每一代性能的提升都与backbone(骨干网络)的改进密切相关。在YOLOv3中,作者不仅提供了darknet-53,还提供了轻量级的tiny-darknet。如果你想检测精度与速度兼具,可以选择darknet-53作为backbone;如果你希望达到更快的检测速度,精度方面可以妥协,那么tiny-darknet是你很好的选择。总之,YOLOv3的灵活性使得它在实际工程中得到很多人的青睐!
5.3.2 网络结构
相比于 YOLOv2 的 骨干网络,YOLOv3 进行了较大的改进。借助残差网络的思想,YOLOv3 将原来的 darknet-19 改进为darknet-53。论文中给出的整体结构如下:
Darknet-53主要由1×1和3×3的卷积层组成,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU,加入这两个部分的目的是为了防止过拟合。卷积层、批量归一化层以及Leaky ReLU共同组成Darknet-53中的基本卷积单元DBL。因为在Darknet-53中共包含53个这样的DBL,所以称其为Darknet-53。
Darknet-53的详细网络结构可以参考下面这张图:
为了更好的理解此图,下面对主要单元进行说明:
- DBL: 一个卷积层、一个批量归一化层和一个Leaky ReLU组成的基本卷积单元。
- res unit: 输入通过两个DBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
- resn: 其中的n表示n个res unit;所以 resn = Zero Padding + DBL + n × res unit 。
- concat: 将darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩充张量的维度,而add直接相加不会导致张量维度的改变。
- Y1、Y2、Y3: 分别表示YOLOv3三种尺度的输出。
与darknet-19对比可知,darknet-53主要做了如下改进:
- 没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
- 为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。
- 引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
- 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。
5.3.3 改进之处
YOLOv3最大的改进之处还在于网络结构的改进,由于上面已经讲过。因此下面主要对其它改进方面进行介绍:
5.3.3.1 多尺度预测
为了能够预测多尺度的目标,YOLOv3 选择了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors。在COCO数据集上选择的9种Anchors的尺寸如下图红色框所示:
借鉴特征金字塔网的思想,YOLOv3设计了3种不同尺度的网络输出Y1、Y2、Y3,目的是预测不同尺度的目标。由于在每一个尺度网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是:N ×N ×[3∗(4 + 1 + 80)]。由下采样次数不同,得到的N不同,最终Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。可见参见原文:
5.3.3.2 损失函数
对于神经网络来说,损失函数的设计也非常重要。但是YOLOv3这篇文中并没有直接给出损失函数的表达式。下面通过对源码的分析,给出YOLOv3的损失函数表达式:
对比YOLOv1中的损失函数很容易知道:位置损失部分并没有改变,仍然采用的是sum-square error的损失计算方法。但是置信度损失和类别预测均由原来的sum-square error改为了交叉熵的损失计算方法。对于类别以及置信度的预测,使用交叉熵的效果应该更好!
5.3.3.3 多标签分类
YOLOv3在类别预测方面将YOLOv2的单标签分类改进为多标签分类,在网络结构中将YOLOv2中用于分类的softmax层修改为逻辑分类器。在YOLOv2中,算法认定一个目标只从属于一个类别,根据网络输出类别的得分最大值,将其归为某一类。然而在一些复杂的场景中,单一目标可能从属于多个类别。
比如在一个交通场景中,某目标的种类既属于汽车也属于卡车,如果用softmax进行分类,softmax会假设这个目标只属于一个类别,这个目标只会被认定为汽车或卡车,这种分类方法就称为单标签分类。如果网络输出认定这个目标既是汽车也是卡车,这就被称为多标签分类。
为实现多标签分类就需要用逻辑分类器来对每个类别都进行二分类。逻辑分类器主要用到了sigmoid函数,它可以把输出约束在0到1,如果某一特征图的输出经过该函数处理后的值大于设定阈值,那么就认定该目标框所对应的目标属于该类。
5.3.3.4 性能表现
如下图所示,是各种先进的目标检测算法在COCO数据集上测试结果。很明显,在满足检测精度差不都的情况下,YOLOv3具有更快的推理速度!
如下表所示,对不同的单阶段和两阶段网络进行了测试。通过对比发现,YOLOv3达到了与当前先进检测器的同样的水平。检测精度最高的是单阶段网络RetinaNet,但是YOLOv3的推理速度比RetinaNet快得多。
5.4 YOLOv4
5.4.1 介绍
2020年YOLO系列的作者Redmon在推特上发表声明,出于道德方面的考虑,从此退出CV界。本以为YOLOv3已经是YOLO系列的终局之战。没想到就在今年,Alexey Bochkovskiy等人与Redmon取得联系,正式将他们的研究命名为YOLOv4。
YOLOv4对深度学习中一些常用Tricks进行了大量的测试,最终选择了这些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss。
YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。
YOLOv4的独到之处在于:
- 是一个高效而强大的目标检测网咯。它使我们每个人都可以使用 GTX 1080Ti 或 2080Ti 的GPU来训练一个超快速和精确的目标检测器。这对于买不起高性能显卡的我们来说,简直是个福音!
- 在论文中,验证了大量先进的技巧对目标检测性能的影响,真的是非常良心!
- 对当前先进的目标检测方法进行了改进,使之更有效,并且更适合在单GPU上训练;这些改进包括CBN、PAN、SAM等。
5.4.2 网络结构
最简单清晰的表示: YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
完整的网络结构图如下:
YOLOv4的网络结构是由 CSPDarknet53、 SPP、 PANet、YOLOv3头部等组成,下面对各部分逐一讲解:
5.4.2.1 CSPDarknet53
在YOLOv4中,将CSPDarknet53作为主干网络。在了解CSPDarknet53之前,需要先介绍下CSPNet。
CSPNet来源于这篇论文:《CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN》
CSPNet开源地址: https://github.com/WongKinYiu/CrossStagePartialNetworks
CSPNet全称是Cross Stage Partial Network,在2019年由Chien-Yao Wang等人提出,用来解决以往网络结构需要大量推理计算的问题。作者将问题归结于网络优化中的重复梯度信息。CSPNet在ImageNet dataset和MS COCO数据集上有很好的测试效果,同时它易于实现,在ResNet、ResNeXt和DenseNet网络结构上都能通用。
CSPNet的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。
而在YOLOv4中,将原来的Darknet53结构换为了CSPDarknet53,这在原来的基础上主要进行了两项改变:
- 将原来的Darknet53与CSPNet进行结合。在前面的YOLOv3中,我们已经了解了Darknet53的结构,它是由一系列残差结构组成。进行结合后,CSPnet的主要工作就是将原来的残差块的堆叠进行拆分,把它拆分成左右两部分:主干部分继续堆叠原来的残差块,支路部分则相当于一个残差边,经过少量处理直接连接到最后。具体结构如下:
- 使用MIsh激活函数代替了原来的Leaky ReLU。在YOLOv3中,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU。而在YOLOv4的主干网络CSPDarknet53中,使用Mish代替了原来的Leaky ReLU。Leaky ReLU和Mish激活函数的公式与图像如下:
5.4.2.2 SPP
SPP来源于这篇论文:LNCS 8691 - Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
SPP最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。在YOLOv4中,作者引入SPP,是因为它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。如下图所示,就是SPP中经典的空间金字塔池化层。
在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化对上层输出的feature map进行处理。最大池化的池化核大小分别为13x13、9x9、5x5、1x1,其中1x1就相当于不处理。
5.4.2.3 PANet
这篇文章发表于CVPR2018,它提出的Path Aggregation Network (PANet)既是COCO2017实例分割比赛的冠军,也是目标检测比赛的第二名。PANet整体上可以看做是在Mask R-CNN上做多处改进,充分利用了特征融合,比如引入Bottom-up path augmentation结构,充分利用网络浅特征进行分割;引入Adaptive feature pooling使得提取到的ROI特征更加丰富;引入Fully-conneFcted fusion,通过融合一个前背景二分类支路的输出得到更加精确的分割结果。
下图是PANet的示意图,主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分。
- FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
- Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
- Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
- Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。
在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。
5.4.2.4 YOLOv3 Head
在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。YOLOv3的完整结构在上文已经详细介绍,下面我们截取了YOLOv3的Head进行分析:
YOLOv4学习了YOLOv3的方式,采用三个不同层级的特征图进行融合,并且继承了YOLOv3的Head。从上图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值,所以有:3 x (80+5)=255 。
5.4.3 Tricks总结
作者将所有的Tricks可以分为两类:
- 在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法,作着称之为 “免费包”(Bag of freebies);
- 只增加少量推理成本但能显著提高目标检测精度的插件模块和后处理方法,称之为“特价包”(Bag of specials)
下面分别对这两类技巧进行介绍。
5.4.3.1 免费包
以数据增强方法为例,虽然增加了训练时间,但不增加推理时间,并且能让模型泛化性能和鲁棒性更好。像这种不增加推理成本,还能提升模型性能的方法,作者称之为"免费包",非常形象。下面总结了一些常用的数据增强方法:
- 随机缩放
- 翻转、旋转
- 图像扰动、加噪声、遮挡
- 改变亮度、对比对、饱和度、色调
- 随机裁剪(random crop)
- 随机擦除(random erase)
- Cutout
- MixUp
- CutMix
常见的正则化方法有:
- DropOut
- DropConnect
- DropBlock
平衡正负样本的方法有:
- Focal loss
- OHEM(在线难分样本挖掘)
除此之外,还有回归 损失方面的改进:
- GIOU
- DIOU
- CIoU
5.4.3.2 特价包
增大感受野技巧:
- SPP
- ASPP
- RFB
- 注意力机制:
- Squeeze-and-Excitation (SE)
- Spatial Attention Module (SAM)
特征融合集成:
- FPN
- SFAM
- ASFF
- BiFPN (出自于大名鼎鼎的EfficientDet)
更好的激活函数:
- ReLU
- LReLU
- PReLU
- ReLU6
- SELU
- Swish
- hard-Swish
后处理非极大值抑制算法:
- soft-NMS
- DIoU NMS
5.4.4 改进方法
除了上面已经提到的各种Tricks,为了使目标检测器更容易在单GPU上训练,作者也提出了5种改进方法:
5.4.4.1 Mosaic
这是作者提出的一种新的数据增强方法,该方法借鉴了CutMix数据增强方式的思想。CutMix数据增强方式利用两张图片进行拼接,但是Mosaic使利用四张图片进行拼接。如下图所示:
Mosaic数据增强方法有一个优点:拥有丰富检测目标的背景,并且在BN计算的时候一次性会处理四张图片!
5.4.4.2 SAT
SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。
5.4.4.3 CMBN
CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:
5.4.4.4修改后的SAM
作者在原SAM(Spatial Attention Module)方法上进行了修改,将SAM从空间注意修改为点注意。如下图所示,对于常规的SAM,最大值池化层和平均池化层分别作用于输入的feature map,得到两组shape相同的feature map,再将结果输入到一个卷积层,接着是一个 Sigmoid 函数来创建空间注意力。
将SAM(Spatial Attention Module)应用于输入特征,能够输出精细的特征图。
在YOLOv4中,对原来的SAM方法进行了修改。如下图所示,修改后的SAM直接使用一个卷积层作用于输入特征,得到输出特征,然后再使用一个Sigmoid 函数来创建注意力。作者认为,采用这种方式创建的是点注意力。
5.4.4.5 修改后的PAN
作者对原PAN(Path Aggregation Network)方法进行了修改, 使用张量连接(concat)代替了原来的快捷连接(shortcut connection)。如下图所示:
注:想具体了解原PANet网络结构,可参考上文中的PANet介绍部分。
5.4.5 性能表现
如下图所示,在COCO目标检测数据集上,对当前各种先进的目标检测器进行了测试。可以发现,YOLOv4的检测速度比EfficientDet快两倍,性能相当。同时,将YOLOv3的AP和FPS分别提高10%和12%,吊打YOLOv3!
综合以上分析,总结出YOLOv4带给我们的优点有:
- 与其它先进的检测器相比,对于同样的精度,YOLOv4更快(FPS);对于同样的速度,YOLOv4更准(AP)。
- YOLOv4能在普通的GPU上训练和使用,比如GTX 1080Ti和GTX 2080Ti等。
- 论文中总结了各种Tricks(包括各种BoF和BoS),给我们启示,选择合适的Tricks来提高自己的检测器性能。
5.5 YOLOv5
5.5.1 介绍
YOLOv5是一个在COCO数据集上预训练的物体检测架构和模型系列,它代表了Ultralytics对未来视觉AI方法的开源研究,其中包含了经过数千小时的研究和开发而形成的经验教训和最佳实践。
YOLOv5是YOLO系列的一个延申,您也可以看作是基于YOLOv3、YOLOv4的改进作品。YOLOv5没有相应的论文说明,但是作者在Github上积极地开放源代码,通过对源码分析,我们也能很快地了解YOLOv5的网络架构和工作原理。
源代码地址:GitCode - 全球开发者的开源社区,开源代码托管平台
5.5.2 网络结构
YOLOv5官方代码中,一共给出了5个版本,分别是 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLO5x 五个模型。这些不同的变体使得YOLOv5能很好的在精度和速度中权衡,方便用户选择。
本文中,我们以较为常用的YOLOv5s进行介绍,下面是YOLOv5s的整体网络结构示意图:
5.5.2.1 输入
和YOLOv4一样,对输入的图像进行Mosaic数据增强。Mosaic数据增强的作者也是来自Yolov5团队的成员,通过随机缩放、随机裁剪、随机排布的方式对不同图像进行拼接,如下如所示:
采用Mosaic数据增强方法,不仅使图片能丰富检测目标的背景,而且能够提高小目标的检测效果。并且在BN计算的时候一次性会处理四张图片!
5.5.2.2 骨干网络(Backbone)
骨干网路部分主要采用的是:Focus结构、CSP结构。其中 Focus 结构在YOLOv1-YOLOv4中没有引入,作者将 Focus 结构引入了YOLOv5,用于直接处理输入的图片,通过降维和压缩输入特征图,从而减少计算量和提高感受野,同时提高目标检测的精度和模型的表达能力。
Focus重要的是切片操作,如下图所示,4x4x3的图像切片后变成2x2x12的特征图。
以YOLOv5s的结构为例,原始608x608x3的图像输入Focus结构,采用切片操作,先变成304x304x12的特征图,再经过一次32个卷积核的卷积操作,最终变成304x304x32的特征图。
5.5.2.3 Neck
在网络的颈部,采用的是:FPN+PAN结构,进行丰富的特征融合,这一部分和YOLOv4的结构相同。详细内容可参考:TensorFlow2深度学习实战(十四):目标检测算法 YOLOv4 解析_使用tensorslow 完成目标检测算法-优快云博客
5.5.2.4 检测头(Head)
对于网络的输出,遵循YOLO系列的一贯做法,采用的是耦合的Head。并且和YOLOv3、YOLOv4类似,采用了三个不同的输出Head,进行多尺度预测。详细内容可参考:TensorFlow2深度学习实战(十四):目标检测算法 YOLOv4 解析_使用tensorslow 完成目标检测算法-优快云博客
5.5.3 改进方法
5.5.3.1 自适应锚框计算
在YOLOv3、YOLOv4中,是通过K-Means方法来获取数据集的最佳anchors,这部分操作需要在网络训练之前单独进行。为了省去这部分"额外"的操作,Yolov5的作者将此功能嵌入到整体代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭。
5.5.3.2 自适应会读填充
为了应对输入图片尺寸 不一的问题,通常做法是将原图直接resize成统一大小,但是这样会造成目标变形,如下图所示:
为了避免这种情况的发生,YOLOv5采用了灰度填充的方式统一输入尺寸,避免了目标变形的问题。灰度填充的核心思想就是将原图的长宽等比缩放对应统一尺寸,然后对于空白部分用灰色填充。如下图所示:
5.5.3.3 损失函数
- 分类用交叉熵损失函数(BEC Loss),边界框回归用 CIoU Loss。
- CIOU将目标与anchor之间的中心距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。而惩罚因子把预测框长宽比拟合目标框的长宽比考虑进去。
- CIOU具体见:目标检测网络中的定位损失函数对比:IOU、GIOU、CIOU、DIOU、L1、L2、Smooth L1_wiou损失函数提出时间-优快云博客
5.5.4 性能表现
在COCO数据集上,当输入原图的尺寸是:640x640时,YOLOv5的5个不同版本的模型的检测数据如下:
在COCO数据集上,当输入原图的尺寸是:640x640时,YOLOv5的5个不同版本的模型的检测数据如下:
从上表可得知,从YOLOv5n到YOLOv5x,这五个YOLOv5模型的检测精度逐渐上升,检测速度逐渐下降。根据项目要求,用户可以选择合适的模型,来实现精度与速度的最佳权衡!
5.6 YOLOv8
5.6.1 介绍
YOLOv8 与YOLOv5出自同一个团队,是一款前沿、最先进(SOTA)的模型,基于先前 YOLOv5版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 设计快速、准确且易于使用,使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。
5.6.2 网络结构
整体结构上与YOLOv5类似: CSPDarknet(主干) + PAN-FPN(颈) + Decoupled-Head(输出头部),但是在各模块的细节上有一些改进,并且整体上是基于anchor-free的思想,这与yolov5也有着本质上的不同。
5.6.3 改进方法
5.6.3.1 Backbone
使用的依旧是CSP的思想,不过YOLOv5中的C3模块被替换成了C2f模块,实现了进一步的轻量化,同时YOLOv8依旧使用了YOLOv5等架构中使用的SPPF模块;
针对C3模块,其主要是借助CSPNet提取分流的思想,同时结合残差结构的思想,设计了所谓的C3 Block,这里的CSP主分支梯度模块为BottleNeck模块,也就是所谓的残差模块。同时堆叠的个数由参数n来进行控制,也就是说不同规模的模型,n的值是有变化的。
- C2f模块就是参考了C3模块以及ELAN(来自YOLOv7)的思想进行的设计,让YOLOv8可以在保证轻量化的同时获得更加丰富的梯度流信息。
- YOLOv7通过并行更多的梯度流分支,设计ELAN模块可以获得更丰富的梯度信息,进而或者更高的精度和更合理的延迟。
5.6.3.2 PAN-FPN
毫无疑问YOLOv8依旧使用了PAN的思想,不过通过对比YOLOv5与YOLOv8的结构图可以看到,YOLOv8将YOLOv5中PAN-FPN上采样阶段中的卷积结构删除了,同时也将C3模块替换为了C2f模块。
5.6.3.3 Decoupled-Head
与YOLOX类似,采用了解耦的输出头部,分别进行类别和边界框的回归学习
5.6.3.4 Anchor-Free
YOLOv8抛弃了以往的Anchor-Base,使用了Anchor-Free的思想。
5.6.3.5 损失函数
YOLOv8使用VFL Loss作为分类损失,使用DFL Loss+CIOU Loss作为分类损失;
VFL主要改进是提出了非对称的加权操作,FL和QFL都是对称的。而非对称加权的思想来源于论文PISA,该论文指出首先正负样本有不平衡问题,即使在正样本中也存在不等权问题,因为mAP的计算是主正样本。
q是label,正样本时候q为bbox和gt的IoU,负样本时候q=0,当为正样本时候其实没有采用FL,而是普通的BCE,只不过多了一个自适应IoU加权,用于突出主样本。而为负样本时候就是标准的FL了。可以明显发现VFL比QFL更加简单,主要特点是正负样本非对称加权、突出正样本为主样本。
针对这里的DFL(Distribution Focal Loss),其主要是将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布;DFL 能够让网络更快地聚焦于目标 y 附近的值,增大它们的概率。
DFL的含义是以交叉熵的形式去优化与标签y最接近的一左一右2个位置的概率,从而让网络更快的聚焦到目标位置的邻近区域的分布;也就是说学出来的分布理论上是在真实浮点坐标的附近,并且以线性插值的模式得到距离左右整数坐标的权重。
5.6.3.6 样本匹配
YOLOv8抛弃了以往的IOU匹配或者边长比例的分配方式,而是使用了Task-Aligned Assigner匹配方式。
5.6.4 性能表现
YOLOv8 的检测、分割和姿态模型在 COCO 数据集上进行预训练,而分类模型在 ImageNet 数据集上进行预训练。在首次使用时,模型会自动从最新的 Ultralytics 发布版本中下载。
YOLOv8共提供了5中不同大小的模型选择,方便开发者在性能和精度之前进行平衡。以下以YOLOv8的目标检测模型为例:
YOLOv8的分割模型也提供了5中不同大小的模型选择:
相关链接:ultralytics/README.zh-CN.md at main · ultralytics/ultralytics · GitHub
5.7 YOLOv9(2024)
5.7.1 介绍
YOLOv9是原YOLOv7团队打造,提出了可编程梯度信息(PGI)的概念来应对深度网络实现多个目标所需的各种变化。 PGI可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,还设计了一种新的轻量级网络架构——基于梯度路径规划的通用高效层聚合网络(GELAN)。 GELAN的架构证实了PGI在轻量级模型上取得了优异的结果。
5.7.2 网络结构
上图展示了不同网络架构的随机初始权重输出特征图的可视化结果:(a) 输入图像,(b) PlainNet,(c) ResNet,(d) CSPNet,和 (e) 提议的GELAN。从这些可视化结果中,我们可以看出在不同的架构中,提供给目标函数用以计算损失的信息在不同程度上有所丢失,而提议的GELAN架构能够保留最完整的信息,并为计算目标函数提供最可靠的梯度信息。
具体来说,输入图像(a)是原始未处理的图像。接下来的四个图像(b-e)分别展示了当这个输入图像通过不同的网络架构时,在网络的某一层上的特征图。这些特征图通过网络层的权重随机初始化得到,旨在展示网络在处理数据时的特征提取能力。图中的颜色变化代表特征的激活程度,激活程度越高,说明网络对于图像的某一部分特征越敏感。
- PlainNet (b) 显示了一个基本网络结构的特征图,可以看到有大量的信息丢失,这意味着在实际应用中可能不会捕捉到所有有用的特征。
- ResNet (c) 作为一个经典的深度学习架构,展示了更好的信息保留能力,但仍有一些信息损失。
- CSPNet (d) 通过其特殊的结构设计,进一步减少了信息的丢失。
- GELAN (e) 展示了该研究提出的架构,从图中可以看出,与其他架构相比,它保留了最完整的信息,这表明GELAN架构能更好地保留输入数据的信息,为后续的目标函数计算提供更准确的梯度信息。
5.7.3 改进之处
- 我们从可逆函数的角度理论分析了现有的深度神经网络架构,并通过这一过程成功解释了过去难以解释的许多现象。我们还基于这一分析设计了PGI和辅助可逆分支,并取得了优异的结果。
- 我们设计的PGI解决了深度监督只能用于极深神经网络架构的问题,因此允许新的轻量级架构真正应用于日常生活中。
- 我们设计的GELAN仅使用传统卷积就实现了比基于最先进技术的深度卷积设计更高的参数利用率,同时展现了轻巧、快速和准确的巨大优势。
- 结合所提出的PGI和GELAN,YOLOv9在MS COCO数据集上的对象检测性能在所有方面都大大超过了现有的实时对象检测器。
5.7.3.1 可编程梯度信息(PG)
为了解决上述问题,论文提出了一种新的辅助监督框架,称为可编程梯度信息(PGI),如图3(d)所示。 PGI主要包括三个组成部分:主分支、辅助可逆分支、多级辅助信息。
从图3(d)中我们可以看出,PGI的推理过程仅使用主分支,因此不需要任何额外的推理成本。至于其他两个组件,它们仅用于训练阶段而不在推理阶段,用于解决或减缓深度学习方法中的几个重要问题:
- 辅助可逆分支:是为了处理神经网络加深带来的问题而设计的。网络加深会造成信息瓶颈,导致损失函数无法生成可靠的梯度。
- 对于多级辅助信息:旨在处理深度监督带来的误差累积问题,特别是针对多个预测分支的架构和轻量级模型。
5.7.3.2 GELAN
通过结合采用梯度路径规划设计的两种神经网络架构CSPNet 和ELAN ,论文设计了兼顾轻量级、推理速度和准确性的广义高效层聚合网络(GELAN)。其整体架构如图 4 所示。论文将最初仅使用卷积层堆叠的 ELAN 的功能推广到可以使用任何计算块的新架构。
5.7.4 性能表现
我们基于YOLOv7和Dynamic YOLOv7分别构建了YOLOv9的通用和扩展版本。在网络架构设计中,我们用GELAN替换了ELAN,GELAN使用CSPNet块作为计算块,并计划采用RepConv。我们还简化了下采样模块,并优化了无锚点的预测头。至于PGI的辅助损失部分,我们完全遵循了YOLOv7的辅助头设置。
如表1所示,与轻量级和中型模型YOLO MS相比,YOLOv9的参数减少了约10%,计算量减少了5∼15%,但AP仍然有0.4∼0.6%的提升。与 YOLOv7 AF 相比,YOLOv9-C 的参数减少了 42%,计算量减少了 22%,但达到了相同的 AP(53%)。与YOLOv8-X相比,YOLOv9-E参数减少16%,计算量减少27%,AP显着提升1.7%。上述对比结果表明,论文提出的YOLOv9与现有方法相比在各方面都有显著改进。
5.8 YOLOv10和YOLOv11
后续还有YOLOv10 YOLOv11的发表,具体可参考下面的链接:
YOLOv10:YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)_yolov10创新点-优快云博客
YOLOv11:YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)-优快云博客
全文近四万字,整理不易,求个点赞!