赞
踩
图像表示为二维的矩阵

灰阶图像
0-255,0表示黑色,255表示白色,其余表示灰色。
图像的坐标轴


彩色图像

注意:颜色信息对于任务有时候有用,有时候没用。
目标检测是计算机视觉中的经典的原子问题,即通过输入的图像来完成物体的检测,它需要解决两个问题:
目标检测算法的传统实现 sift hog 等算法。这些算法的大致逻辑如下:
2012年后,深度学习开始火爆,深度学习开始在计算机视觉领域开始发展。
You Only Look Once 是目标检测算法中,one stage 算法的开端。You Only Look Once 即你只看一眼,表达的含义是只用一个步骤就完成目标检测的过程。
目标检测用矩阵框来框出待检测的目标。在二维图像中,表示一个矩阵框至少需要 2 个点(即 4 个值)。有以下两种表示的方式?

哪种表示方式更好呢?
在目标检测中,有几个很重要的名词:

如何度量 pd 相对于 gd 的好坏呢?经典的方法,就是 IOU 。

yolo 系列和大部分的目标检测算法的本质思想来源于人进行目标检测的过程。

通过“部分”的图像信息就能推测出图像大致位置。
重新审视一下神经网络:

以分类网络举例,神经网络的 logit 输出可以看做是特征提取的过程。最后一层接的就是简单的逻辑斯特回归(线性模型)。
后面所有的 yolo 系列算法会从
四个方面进行讲解。其中所有的网络结构均以 darknet 官方的 github 库为准1 ,为简略图,目的是方便大家理解和学习。网络结构的详细图在对应的文件附件中。
在 two stage 算法中,需要先找出候选区,然后识别候选区中的对象。
yolo 是 one stage 算法的开篇之作,它并没有真正的去掉候选区,而是划分了“负责”区域(7
RCNN 系列是先通过算法找到候选区,然后对候选区进行边框回归,得到最终的 bbox。yolov1 则是直接对负责区域直接进行判别和回归,一步到位的 bbox。
回想一下前面说的关于人进行目标检测的本质。“负责”区域可能包含“部分”我们关心的待检对象,通过一系列复杂运算,推理出物体的 bbox。


YoloV1 的网络结构如上图所示。
在 YoloV1 才出来时,作者并没有加上卷积的 BatchNorm,这里是作者修复后版本,加上了 BatchNorm。
最左边是图片的输入,输入图片是 448
从输入图像开始,一直到第一行最右边的立方体
所以作者选择了通过局部连接层(卷积 = 局部连接+共享参数)。然后 flatten 后接 dropout 层,最后接 1715 的全连接,再reshape 成
可以看到,整个网络结构使用的是 leakyrelu 激活函数。最后一层的输出没使用激活函数,所以输出是 logit。
按照我们前面对神经网络的理解,可以把
注意,由于最后输出的 tensor 是通过全连接得到的。所以每一个像素点的包含了整个输入图片的信息。
分析一下
最后来分析一下

这里有两个 Bbbox,Bbox1(2) 的置信度和 Bbox1(2) 坐标对应。
Bbox 置信度:
Bbox 的置信度的公式如下:
Bbox 置信度表达了这个像素点对应的“负责”区域有没有,且 Bbox 准不准的程度。反应了 Bbox 的准确性程度。
要注意,Bbox置信度虽然有多个,(一个像素点对应的负责区域会有多个 Bbox,比如这里是2个)。但我们只看和 GroudTruth IOU 大的那个,另外一个自动设定为 0 。
Bbox 置信度的大小期望在 [0,1] 之间。
具体对象的概率:
具体对象的概率公式如下:
表示这个像素点“负责“原始图像的区域“存在”对应对象的概率。注意,这里的前提是该网格中存在待检测的对象。每一个值的大小期望在 [0,1] 之间。
如何定义前面说的“存在”对应对象呢?如果原始图像的待检目标的 bbox 的中心点在对应的“负责”区域内。则表示存在对应对象。

Bbox 的坐标:
2 个 Bbox 需要 8 个值进行存储。
我们主要需要看一下 gd 的 Bbox 的坐标表示。 gd 的 Bbox 坐标会做一些变换(编码)。
直接让

为什么我们需要两个 Bbox 来进行预测呢?
在训练时,我们希望两个框同时工作,但真正计算损失的时候,我们只去对 IOU 最大的框进行梯度下降和修正。类似于一个相同的工作,让两个人一起做,为了保障工作正常完成。在训练最后,会发现两个框意见开始出现了分工,比如一个框倾向于去检测细长型的物体。另一个框倾向于去检测扁宽型的物体。
总结一下就是,在训练阶段,输出的两个 Bbox 只会选择其中一个参与损失的计算(和 gd IOU大的那个)。
在测试阶段,输出的两个 Bbox 只有一个有实际预测的意义。
通过前面讲解,可以看到 YoloV1 至多只能预测 49 个目标,即每个“负责”区域输出一个目标。
注意!我们可以使用不止 2 个 Bbox,理论上 Bbox 越多效果越好,但是效率会降低。作者取两个 Bbox 的原因是因为性能和效率的取舍。
损失函数章节我们关心两个东西。一是损失函数的输入,也就是标签值(gd)和预测值(pd)。二是损失函数的具体形式。
通过 2.1 关于 Bbox 坐标的讲解,我们知道训练样本的标签是动态变化的,和 yolov1 预测出的 bbox 的 iou 有关。


公式中
yoloV1 将预测和真实标签看做回归问题。使用均方误差作为损失函数。
思考一下: 为什么 yolov1 概率处的损失函数不使用交叉熵?
对象分类误差:
BBox 置信度误差:
Bbox 位置误差:
而且
最后
YoloV1 先使用 ImageNet 数据集对前几十层的卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测,在训练过程中,加入了数据增强,lrelu 的值设定为 0.1 ,dropout的值设定为 0.5 。
训练过程中的标签生成如前面所述,这里不再赘述。
在测试阶段,Bbox置信度和对象概率相乘,得到的是存在对应类别目标的概率:
对每一个网格的每一个 bbox 执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
得到 98 个 bbox 的信息后,用 NMS 算法去掉重复率较大的 bounding box 。
注意,在测试阶段需要将 dropout 也开启为测试模式。(如果有 BatchNorm 需要将 BatchNorm 也开启为测试模式,原始论文中没有 BatchNorm 层)。
NMS计算方法如下:
最后预测的结果,需要还原到原始图像的坐标值。(预测的 bbox 都是做了归一化的)
在结束 YoloV1 讲解之前,我们再提一个小点:
最后输出的
YoloV2 至少有两个不同的版本,Yolo9000 和 YoloV2'(为了加以区别,我加上'这个符号)。总的说来 YoloV2 是 YoloV3 正式发布前的试水,网络的结构变化不大,但也有四个很有意思的创新和启发。
BTW, yolov9000 这个名字是因为它扩展到了能检测 9000 种不同对象。
首先来看一下 anchor 。在 YoloV1 中我们提过,两个 bbox 会各司其职,起到不同的预测 bbox 的效果。比如一个预测长的,一个预测宽的。所以为何不直接先指定一个先验框,然后最终的检测 bbox 就是在先验框(anchor)的基础上去做修正(two stage 中就是这种思想)

首先我们会将原始图片划分成
还有一个问题,anchor 的长宽到底该如何设定呢?在 two stage 的算法中都是人为设置。在 YoloV2 作者创新的用 Kmeans 对训练数据聚类得到。

注意这里 Kmeans 的距离定义如下:
下面我们来分别看一下 Yolo9000 和 Yolov2 的网络结构图

Yolo9000 的结构和 YoloV1 差距不大,非常不一样的地方在于,最后的输出层改为了

相比于 Yolo9000,YoloV2 的最大不同在于引入了
最后是网络的输出 tensor,这个输出 tensor 的含义如下:
N 表示输出特征图空间维度,B 表示 anchor 的个数,C 表示识别的类别个数,5 表示 Bbox 的坐标(4个)和 Bbox 的置信度(1个)。
下面我们就来详细的说一下 Bbox 的坐标,和 YoloV1 的思想一样,我们要将 gd 的 Bbox 坐标进行编码(不同的是,现在是相对于 anchor 进行编码)
假设输出 tensor 的 Bbox 坐标为
假设 gd 的映射到最后 feature map 的 Bbox 坐标为
假设 anchor 所在“负责”区域在最后 feature map 上对应的左上角坐标为
从 anchor 的 Bbox 变换到 gd 的 Bbox 的最简单方式就是对点做平移,对长宽分别做放缩。
直接用
最后经过反向的解码就得到了原始论文的样子

方法很简单,计算
在测试阶段,只需要将这个值乘到原始图像的大小上,就能得到原始的图像上的 pd 框。
yoloV2 的损失函数在论文中并没有详细说明,需要通过源码进行比对分析。总的说来和 yoloV1 的基本思想保持一致。

详细解读可以参考连接:
关于这个损失函数,有几个地方需要强调一下:
YoloV2 的训练过程比较有意思,从这里能感受到“炼丹”的不易。
高分辨率预训练:
图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用
所以YOLO2在采用
多尺度训练:
由于是全卷积网络,其降采样的倍数是 32 。所以可以支持输入任何的 32 倍数尺寸的图片。于是可以输入不同尺寸的图片进行训练。
每10个batch之后,就将图片resize成{320, 352, ..., 608}中的一种。
联合训练:
联合训练方法思路简单清晰,Yolov2中物体矩形框生成,不依赖于物理类别预测,二者同时独立进行。当输入是检测数据集时,标注信息有类别、有位置,那么对整个loss函数计算loss,进行反向传播;当输入图片只包含分类信息时,loss函数只计算分类loss,其余部分loss为零。当然,一般的训练策略为,先在检测数据集上训练一定的epoch,待预测框的loss基本稳定后,再联合分类数据集、检测数据集进行交替训练,同时为了分类、检测数据量平衡,作者对coco数据集进行了上采样,使得coco数据总数和 ImageNet 大致相同。
注意:联合训练和预训练是不同的东西。
由于 coco 和 Imagenet 数据类别不一致的问题,为了能正常联合训练,作者引入了 wordtree。

wordtree 在工业界上是很有大的启发。因为真实场景下的标准数据少,如何最大的利用已有标准数据,wordtree 和联合训练是很有意思的想法。
同 YoloV1,最后注意下一下预测框需要还原到原始图像上,这个前面有提,这里不再赘述。
YoloV3 的网络框架有了很大的改变,它在“特征融合”上做了很大的改进。YoloV3 也有两个版本,一个是普通版,一个是YoloV3-spp。YoloV3-spp 版本很重要,因为它直接启发了后续的 YoloV4。
YoloV3 采用和 YoloV2 同样的 gd 编码方式。并也采用了 anchor 的思想。它借鉴了特征图金字塔的思想,用不同尺度的特征图来检测目标。小尺寸特征图感受野大,于是用来检测大尺寸的物体,大尺寸的特征图感受野小,检测小尺寸的物体。(其实也算是借鉴了 SSD 的思想)

YoloV3 总共输出 3 个不同尺度的特征图,分别是
对于这个网络结构如果熟悉 FPN 的读者,应该不难看出,后半部分的“特征融合”就是借鉴了 FPN 网络。

接下来是 YoloV3-SPP,YoloV3-SPP 的网络结构和 YoloV3 几乎一致,唯一不同的是,YoloV3 借鉴 SPPNET 的思想,增加了 SPP 模块。

这个思想其实很简单,就是以不同的 kernel (
关于 anchor ,YoloV3 也使用了 YoloV2 的技巧,使用 Kmeans 进行聚类作为先验框(距离仍然使用
注意看输出的立方体 tensor (
特征图
特征图
特征图
gd 的编码方式和解码方式和 YoloV2 保持一致,略有不同的是,类别概率输出使用 sigmoid,不再是 softmax。这样一个“负责”区域可以同时输出多个类别。
损失函数和 YoloV2 基本保持一致

不同的地方在于,对于类别和置信度的损失使用交叉熵。
YoloV3 的训练过程,特别是样本的选择和 V1 和 V2 已经完全不一样了。
在 V1 和 V2 中是看 gd 中心所落的负责区域来确定 gd 由哪个点来负责。由于 V3 中有多个最终的 feature map。使用这种策略可能会导致矛盾(即一个 gd 同时属于多个点负责)。所以需要新的方式确定样本由哪个点的区域负责。原则很简单:
所有预测的 pd 中和 gd 的 IOU 最大的那个就是正样本。
作者还创新的把预测 pd 分成三类:
正例:
对任意的 gd,与所有的 pd 计算IOU,IOU 最大那个就是正例。一个pd,只能分配给一个gd。比如第一个 gd 已经匹配了一个正例的 pd,那么下一个 gd,需要在剩下的 pd 中寻找 IOU 最大的作为正例。
负例:
除正例以外(与 gd 计算后 IOU 最大的检测框,但是IOU小于阈值,仍为正例),与全部 gd 的 IOU 都小于阈值(论文中为 0.5),则为负例。
忽略:
除正例以外,与任意一个 gd 的 IOU 大于阈值(论文中为 0.5),则为忽略。
在 YoloV3 中置信域标签直接设置为 1 和0。而不是 YoloV1 的 IOU 值。原因是假设 iou 是0.8,但学习到的可能只有 0.6 总是会低一些。不如直接将标签设为 1 (学习到的可能就是 0.8)。
由于有三个特征图,所以需要对三个特征图分别进行预测。
三个特征图一共可以出预测 19 × 19 × 3 + 38 × 38 × 3 + 76 × 76 × 3 = 22743 个 pd 坐标以及对应的类别和置信度。
测试时,选取一个置信度阈值,过滤掉低阈值 box,经过 NMS(非极大值抑制),输出整个网络的预测结果。注意最后要还原到原始坐标。该改成测试模式的模块需要改成测试模式(比如 BatchNorm)
Yolo 系列的原作者在推出了 YoloV3 后宣布退出 CV 界。俄罗斯的程序员 Alexey Bochkovskiy 凭借自己的摸索复现了 Yolo 系列全部模型,并总结了最接近几年目标检测的各种套路。就在前几个推出了 YoloV4.
YoloV4 将最近几年 CV 界大量的trick 集中在一套模型中。这篇论文不仅仅可以看作是一个模型的学习,更能看成是一个不错的文献总署。更有意思的是作者提出了 backbone,neck,head 的目标检测通用框架套路。
backbone, neck, head 其实非常的形象。它表示组成一个“人”的三个部分。从下到上就是 backbone, neck, head 。
YoloV3 就是一个典型的 backbone, neck, head 结构:


Mish 激活函数:

Dropblock:
对 feature map 的“局部区域”进行丢弃。其实就是 cutout 的推广形式。

PANET结构:

和正常的 PANET 结构的区别:

特征图和 anchor 的对应方式和 YoloV3 一致。原则是大的特征图对应小的 anchor,小的特征图对应大的 anchor。
YoloV4 的损失函数相比 YoloV3 有一定的变化,主要体现在 Bbox 边框回归的损失上。
YoloV1-3 都是使用 MSE 进行回归(只是编码方式不同)。作者认为这种损失是不合理的。因为 MSE 的
IOU 能捕捉到他们之间的关系 (
首先看一下 DIOU 对应的损失的公式:

DIOU 考虑到了
但是没有考虑到长宽比。一个好的 pd,应该和 gd 的长宽比尽量保持一致。
于是我们有了 CIOU:



测试过程重要注意两点:
这里 NMS 不用 CIOU 是合理的。因为只有 gd 和对应的 pd 才需要保持 bbox 的长宽比一致。在测试阶段,pd 之间并不一定长宽比一致。
需要yolov1-v4的pdf论文以及目标检测相关性的探讨请关注
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。