关于算法:全网呕血整理关于YOLO-v3原理分析

6次阅读

共计 5572 个字符,预计需要花费 14 分钟才能阅读完成。

摘要:YOLO 系列的指标检测算法能够说是指标检测史上的宏篇巨作,接下来咱们来具体介绍一下 YOLO v3 算法内容。

算法根本思维

首先通过特征提取网络对输出特征提取特色,失去特定大小的特色图输入。输出图像分成 13×13 的 grid cell,接着如果实在框中某个 object 的核心坐标落在某个 grid cell 中,那么就由该 grid cell 来预测该 object。每个 object 有固定数量的 bounding box,YOLO v3 中有三个 bounding box,应用逻辑回归确定用来预测的回归框。

网络结构

上图 DBL 是 Yolo v3 的根本组件。Darknet 的卷积层后接 BatchNormalization(BN)和 LeakyReLU。除最初一层卷积层外,在 yolo v3 中 BN 和 LeakyReLU 曾经是卷积层不可拆散的局部了,独特形成了最小组件。

骨干网络中应用了 5 个 resn 构造。n 代表数字,有 res1,res2, … ,res8 等等,示意这个 res_block 里含有 n 个 res_unit,这是 Yolo v3 的大组件。从 Yolo v3 开始借鉴了 ResNet 的残差构造,应用这种构造能够让网络结构更深。对于 res_block 的解释,能够在上图网络后果的右下角直观看到,其根本组件也是 DBL。

在预测支路上有张量拼接(concat)操作。其实现办法是将 darknet 中间层和中间层后某一层的上采样进行拼接。值得注意的是,张量拼接和 Res_unit 构造的 add 的操作是不一样的,张量拼接会裁减张量的维度,而 add 只是间接相加不会导致张量维度的扭转。

Yolo_body 一共有 252 层。23 个 Res_unit 对应 23 个 add 层。BN 层和 LeakyReLU 层数量都是 72 层,在网络结构中的体现为:每一层 BN 前面都会接一层 LeakyReLU。上采样和张量拼接操作各 2 个,5 个零填充对应 5 个 res_block。卷积层一共有 75 层,其中有 72 层前面都会接 BatchNormalization 和 LeakyReLU 形成的 DBL。三个不同尺度的输入对应三个卷积层,最初的卷积层的卷积核个数是 255,针对 COCO 数据集的 80 类:3×(80+4+1)=255,3 示意一个 grid cell 蕴含 3 个 bounding box,4 示意框的 4 个坐标信息,1 示意置信度。

下图为具体网络后果图。

输出映射到输入

不思考神经网络构造细节的话,总的来说,对于一个输出图像,YOLO3 将其映射到 3 个尺度的输入张量,代表图像各个地位存在各种对象的概率。

咱们看一下 YOLO3 共进行了多少个预测。对于一个 416416 的输出图像,在每个尺度的特色图的每个网格设置 3 个先验框,总共有 13133 + 26263 + 5252*3 = 10647 个预测。每一个预测是一个(4+1+80)=85 维向量,这个 85 维向量蕴含边框坐标(4 个数值),边框置信度(1 个数值),对象类别的概率(对于 COCO 数据集,有 80 种对象)。

边界框预测(Bounding Box Prediction)

Yolo v3 对于 bounding box 的初始尺寸还是采纳 Yolo v2 中的 k -means 聚类的形式来做,这种先验常识对于 bounding box 的初始化帮忙还是很大的,毕竟过多的 bounding box 尽管对于成果来说有保障,然而对于算法速度影响还是比拟大的。

在 COCO 数据集上,9 个聚类如下表所示,注这里须要阐明:特色图越大,感触野越小。对小指标越敏感,所以选用小的 anchor box。特色图越小,感触野越大。对大指标越敏感,所以选用大的 anchor box。

Yolo v3 采纳间接预测绝对地位的办法。预测出 b -box 中心点绝对于网格单元左上角的绝对坐标。间接预测出(tx,ty,tw,th,t0),而后通过以下坐标偏移公式计算失去 b -box 的地位大小和 confidence。

tx、ty、tw、th 就是模型的预测输入。cx 和 cy 示意 grid cell 的坐标,比方某层的 feature map 大小是 13×13,那么 grid cell 就有 13×13 个,第 0 行第 1 列的 grid cell 的坐标 cx 就是 0,cy 就是 1。pw 和 ph 示意预测前 bounding box 的 size。bx、by、bw 和 bh 就是预测失去的 bounding box 的核心的坐标和 size。在训练这几个坐标值的时候采纳了 sum of squared error loss(平方和间隔误差损失),因为这种形式的误差能够很快的计算出来。

注:这里 confidence = Pr(Object)*IoU 示意框 含有 object 的置信度 这个 box 预测的有多准。也就是说,如果这个框对应的是背景,那么这个值应该是 0,如果这个框对应的是前景,那么这个值应该是与对应前景 GT 的 IoU。

Yolo v3 应用逻辑回归预测每个边界框的分数。如果边界框与实在框的重叠度比之前的任何其余边界框都要好,则该值应该为 1。如果边界框不是最好的,但的确与实在对象的重叠超过某个阈值(Yolo v3 中这里设定的阈值是 0.5),那么就疏忽这次预测。Yolo v3 只为每个实在对象调配一个边界框,如果边界框与实在对象不吻合,则不会产生坐标或类别预测损失,只会产生物体预测损失。

多尺度预测

在下面网络结构图中能够看出,Yolo v3 设定的是每个网格单元预测 3 个 box,所以每个 box 须要有 (x, y, w, h, confidence) 五个基本参数。Yolo v3 输入了 3 个不同尺度的 feature map,如上图所示的 y1, y2, y3。y1,y2 和 y3 的深度都是 255,边长的法则是 13:26:52。

每个预测工作失去的特色大小都为 N ×N ×[3∗(4+1+80)],N 为格子大小,3 为每个格子失去的边界框数量,4 是边界框坐标数量,1 是指标预测值,80 是类别数量。对于 COCO 类别而言,有 80 个类别的概率,所以每个 box 应该对每个品种都输入一个概率。所以 3×(5 + 80) = 255。这个 255 就是这么来的。

Yolo v3 用上采样的办法来实现这种多尺度的 feature map。在 Darknet-53 失去的特色图的根底上,通过六个 DBL 构造和最初一层卷积层失去第一个特色图谱,在这个特色图谱上做 第一次预测 。Y1 支路上,从后向前的倒数第 3 个卷积层的输入,通过一个 DBL 构造和一次(2,2)上采样,将上采样特色与第 2 个 Res8 构造输入的卷积特色张量连贯,通过六个 DBL 构造和最初一层卷积层失去第二个特色图谱,在这个特色图谱上做 第二次预测 。Y2 支路上,从后向前倒数第 3 个卷积层的输入,通过一个 DBL 构造和一次(2,2)上采样,将上采样特色与第 1 个 Res8 构造输入的卷积特色张量连贯,通过六个 DBL 构造和最初一层卷积层失去第三个特色图谱,在这个特色图谱上做 第三次预测

就整个网络而言,Yolo v3 多尺度预测输入的 feature map 尺寸为 y1:(13×13),y2:(26×26),y3:(52×52)。网络接管一张(416×416)的图,通过 5 个步长为 2 的卷积来进行降采样(416 / 2ˆ5 = 13,y1 输入(13×13)。从 y1 的倒数第二层的卷积层上采样 (x2,up sampling) 再与最初一个 26×26 大小的特色图张量连贯,y2 输入(26×26)。从 y2 的倒数第二层的卷积层上采样 (x2,up sampling) 再与最初一个 52×52 大小的特色图张量连贯,y3 输入(52×52)感受一下 9 种先验框的尺寸,下图中蓝色框为聚类失去的先验框。黄色框 式 ground truth,红框是对象中心点所在的网格。

预测框的 3 种状况

预测框一共分为三种状况:正例(positive负例(negative疏忽样例(ignore)。

  • 正例 :任取一个 ground truth, 与下面计算的10647 个框全副计算 IOU, IOU 最大的预测框, 即为正例。并且一个预测框, 只能调配给一个 ground truth。例如第一个 ground truth 曾经匹配了一个正例检测框, 那么下一个 ground truth, 就在余下的 10646 个检测框中, 寻找 IOU 最大的检测框作为正例。ground truth 的先后顺序可疏忽。正例产生置信度 loss、检测框 loss、类别 loss。预测框为对应的 ground truth box 标签(应用实在的 x、y、w、h 计算出); 类别标签对应类别为 1, 其余为 0; 置信度标签为 1。
  • 疏忽样例:正例除外, 与任意一个 ground truth 的 IOU 大于阈值(论文中应用 5), 则为疏忽样例。疏忽样例不产生任何 loss。

o 为什么会有疏忽样例?

因为 Yolov3 采纳了多尺度检测, 那么再检测时会有反复检测景象. 比方有一个实在物体,在训练时被调配到的检测框是特色图 1 的第三个 box,IOU 达 0.98,此时恰好特色图 2 的第一个 box 与该 ground truth 的 IOU 达 0.95,也检测到了该 ground truth,如果此时给其置信度强行打 0 的标签,网络学习效果会不现实。

  • 负例 :正例除外(与 ground truth 计算后 IOU 最大的检测框,然而 IOU 小于阈值,仍为正例), 与全副 ground truth 的 IOU 都小于阈值(0.5), 则为负例。负例只有 置信度产生loss, 置信度标签为 0。

如下图所示:

  • λ 为权重参数, 用于管制检测框 loss, obj 与 noobj 的置信度 loss, 以及类别
  • 对于正类而言, 1ijobj 输入为 1; 对于负例而言, 1ijnoobj 输入为 1; 对于疏忽样例而言, 全副为 0;
  • 类别采纳穿插熵作为损失函数。

类别预测

类别预测方面 Yolo v2 网络中的 Softmax 分类器,认为一个指标只属于一个类别,通过输入 Score 大小,使得每个框调配到 Score 最大的一个类别。但在一些简单场景下,一个指标可能属于多个类(有重叠的类别标签),因而 Yolo v3 用多个独立的 Logistic 分类器 代替 Softmax 层解决多标签分类问题,且准确率不会降落。

举例说明,原来分类网络中的 softmax 层都是假如一张图像或一个 object 只属于一个类别,然而在一些简单场景下,一个 object 可能属于多个类,比方你的类别中有 woman 和 person 这两个类,那么如果一张图像中有一个 woman,那么你检测的后果中类别标签就要同时有 woman 和 person 两个类,这就是多标签分类,须要用 Logistic 分类器来对每个类别做二分类。Logistic 分类器次要用到 sigmoid 函数,该函数能够将输出束缚在 0 到 1 的范畴内,因而当一张图像通过特征提取后的某一类输入通过 sigmoid 函数束缚后如果大于 0.5,就示意该边界框负责的指标属于该类。

物体分数和类置信度

物体分数:示意一个边界框蕴含一个物体的概率,对于红色框和其四周的框简直都为 1,但边角的框可能简直都为 0。物体分数也通过一个 sigmoid 函数,示意概率值。

类置信度:示意检测到的物体属于一个具体类的概率值,以前的 YOLO 版本应用 softmax 将类分数转化为类概率。在 YOLOv3 中作者决定应用 sigmoid 函数取代,起因是 softmax 假如类之间都是互斥的,例如属于“Person”就不能示意属于“Woman”,然而很多状况是这个物体既是“Person”也是“Woman”。

输入解决

咱们的网络生成 10647 个锚框,而图像中只有一个狗,怎么将 10647 个框缩小为 1 个呢?首先,咱们通过 物体分数 过滤一些锚框,例如低于阈值(假如 0.5)的锚框间接舍去;而后,应用 NMS(非极大值克制)解决多个锚框检测一个物体的问题(例如红色框的 3 个锚框检测一个框或者间断的 cell 检测雷同的物体,产生冗余),NMS 用于去除多个检测框。

具体应用以下步骤:摈弃分数低的框(意味着框对于检测一个类信念不大);当多个框重合度高且都检测同一个物体时只抉择一个框(NMS)。

为了更不便了解,咱们选用下面的汽车图像。首先,咱们应用阈值进行过滤一部分锚框。模型有 19193*85 个数,每个盒子由 85 个数字形容。将 (19,19,3,85) 宰割为上面的形态:

box_confidence:(19,19,3,1)示意 19*19 个 cell,每个 cell 的 3 个框,每个框有物体的置信度概率;

boxes:(19,19,3,4)示意每个 cell 的 3 个框,每个框的示意;

box_class_probs:(19,19,3,80)示意每个 cell 的 3 个框,每个框 80 个类检测概率。

每个锚框咱们计算上面的元素级乘法并且失去锚框蕴含一个物体类的概率,如下图:

即便通过类分数阈值过滤一部分锚框,还剩下很多重合的框。第二个过程叫 NMS,外面有个 IoU,如下图所示。

实现非极大值克制,关键在于:抉择一个最高分数的框;计算它和其余框的重合度,去除重合度超过 IoU 阈值的框;回到步骤 1 迭代直到没有比以后所选框低的框。

Loss Function

在 Yolo v3 的论文里没有明确提出所用的损失函数,确切地说,Yolo 系列论文外面只有 Yolo v1 明确提了损失函数的公式。在 Yolo v1 中应用了一种叫 sum-square error 的损失计算方法,只是简略的差方相加。咱们晓得,在指标检测工作里,有几个要害信息是须要确定的:(x,y),(w,h),class,confidence。依据要害信息的特点能够分为上述四类,损失函数应该由各自特点确定。最初加到一起就能够组成最终的 loss function 了,也就是一个 loss function 搞定端到端的训练。

yolov3 网络硬核解说(视频)

视频地址:

https://www.bilibili.com/vide…

实在值是如何编码

预测锚框的设计

锚框与指标框做 iou

本文分享自华为云社区《YOLOV3 原理剖析(全网材料整顿)》,原文作者:lutianfei。

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0