文章目录
前言
代码地址:GitHub:ultralytics/yolov3
本文适用于目标检测之YOLO零基础入门。YOLO检测效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f84ee610c7536d361a53c5bbf7bc3f38.png#pic_center)
- 《Faster RCNN超详细入门 01-准备篇-背景 RCNN,SPPnet,Fast RCNN,RoI Pooling》
- 《Faster RCNN超详细入门 02网络细节与训练方法(anchors,RPN,bbox,bounding box,Region proposal layer……)》
笔者在阅读《You Only Look Once:Unified, Real-Time Object Detection》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
- 【读后再读】:《YOLO超详细入门02 v2零基础看懂 图文详解(含代码及原文)——网络架构,BN,高分辨率,细粒度特征,多尺度训练,Anchor Box,维度聚类,直接位置预测,输出特点,YOLO9000》
- 【读后再读】:《YOLO超详细入门 03 v3 图文详解(含代码+原文)》
背景
- 依照目标检测里程碑的 roadmap,我们可以看到 双阶段(two-stage )的算法,例如:RCNN、Fast RCNN 都是 YOLO 的前辈,在当时提出RPN (region proposal)可以说是当时的热门,但 two-stage 的算法缺点也相当明显。例如:RCNN 使用SS(Selective Search )找出 2000–3000 个 region proposal,将取出的 region proposal 压缩成一样大小之后再丟入CNN中提取特征,利用 SVM 进行分类,并对bounding box做线性回归,这一步骤执行起来非常耗时,并且这个方法对于box size的选择非常地敏感。
- YOLO作为实时影像目标检测的开山鼻祖,采用单阶段(one-stage)方法,使其检测速度远超当时作为主流目标检测算法的R-CNN系列(two-stage),但也牺牲了部分准确率(而这为后续YOLO的改进埋下了伏笔)。
- ;作者將region proposal创造性地,巧妙地转化为回归分析问题,也就是将挑选region proposal的问题也丢到model內,让model也帮忙预测bounding box。
一、YOLO的核心原理预览
- YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
- 一次性输出所检测到的目标信息,包括类别和位置。
![](https://i-blog.csdnimg.cn/blog_migrate/279f66be5b832a4d5bdb7c5833e08397.jpeg#pic_center)
-
对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。
-
每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。
-
综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数,再加上每个网格都有C个预测类)
二、网络结构
模型原理图如上,网络结构图如下。
网络结构是由GoogLeNet所启发,取代了GoogLeNet使用的inception。
为什么每个网格有固定的B个Bounding Boes?(即B=2)
YOLO 有 24 个卷积层,后面是 2 个全连接层(FC)。一些卷积层交替使用 1×1 减少层来减少特征图的深度。对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。然后张量被展平。使用 2 个全连接层作为线性回归的一种形式,它输出 7×7×30 参数,然后reshape为 (7, 7, 30),即每个位置 2 个bounding boxes预测。
- 网络输入:448 x 448 x 3的RGB图片。
- 中间层:由若干卷积层和最大池化层组成,用于提取图片的抽象特征。
- 全连接层:由两个全连接层组成,用来预测目标的位置和类别概率值。
- 网络输出:7 × 7 × (2 x 5 + 20)= 1470的预测结果。
三、网络细节
3.1 网络单元(grid)
3.1.1 作用
- 预测B个边界框,每个框都有一个置信度分数(confidence score)。
- 不管框 B 的数量是多少,都只检测一个对象。
- 预测物体在C个类别的概率(物体属于每一种类别的可能性)。
3.1.2 细节特征
- YOLO 将输入图像划分为S × S网格。每个网格单元仅预测一个目的。例如,上面的黄色网格单元尝试预测其中心(蓝点)位于网格单元内的“人”对象。
![](https://i-blog.csdnimg.cn/blog_migrate/8ceed78532b9877aec9ee9d1217d2ab8.jpeg#pic_center)
- 每个网格单元预测固定数量 B 的bounding boxes。在这个例子中,黄色网格单元进行两个边界框预测(蓝色框)来定位人的位置(B = 2)。
![](https://i-blog.csdnimg.cn/blog_migrate/adce2d9b21ee5520a82ab1b574816d24.jpeg#pic_center)
- 但是,单对象规则(one-object rule)限制了检测到的对象的接近程度。为此,YOLO 确实对物体的接近程度有一些限制。例如,上面的图,左下角有 9 个圣诞老人,但 YOLO 只能检测到 5 个。
3.2 网络实现
3.2.1 检测策略
![](https://i-blog.csdnimg.cn/blog_migrate/6e596738ff6f6c06888c34b454374cc4.jpeg#pic_center)
- YOLOv1采用的是“分而治之”的策略,将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处!
- 原文中为了评估 PASCAL VOC数据集,YOLO使用了 7×7 网格 (S×S)、2 个bounding boxes (B=2) 和 20 个类别 ©。
实现过程如下:
1.YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
2.对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。
3.每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。
4.综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。
3.2.2 预测形状
- 通过图像的宽度和高度对bounding boxes的宽度w和高度h进行归一化。x和y是对应网络单元格*(grid)的偏移量。因此,x、y、w和h都在 0 和 1 之间。每个网络单元格有 20 个条件类概率。条件类概率是检测到的对象属于特定类别的概率(每个单元属于每个类别的概率)。因此,YOLO 的预测形状为 (S, S, B×5 + C) = (7, 7, 2×5 + 20) = (7, 7, 30)。
3.2.3 非极大值抑制(Non-Maximum Suppression)
算法原理图如下:
简化理解为:
![](https://i-blog.csdnimg.cn/blog_migrate/5e1bc638d395911078edac952e3e8b95.png#pic_center)
作用
- YOLO 可以对同一对象进行重复检测。为了解决这个问题,YOLO 应用非极大值抑制(NMS)来以删除重复的具有较低的置信度的预测。
- NMS使得模型的 mAP 表现增加了 2-3%。
具体实现
1.设定置信度阈值(confidence score threshold),去掉无用的bounding box 再开始做NMS,可以有效减少多余的计算量。
2.设定IoU阈值(IoU threshold) (一般用0.5,如果太高会造成物件重复检测的问题),用来刪掉IoU值太高的两个框其中之一。
3.使用置信度(confidence score)对Bounding box 排序然后用第一的Bounding box跟其他Bounding box算IoU,如果大于IoU threshould 就将其置信度归零。
4.重复步骤2-3,直到所有物件的IoU值为0,此时剩下的就是结果。
3.3 目标损失函数
3.3.1 思路
- YOLO 预测每个网格单元的多个bouding boxes。为了计算TP(True positive)的损失,我们只希望其中一个bounding box负责检测物体。为此,我们选择与ground truth具有最高 IoU(交并比)的那个bounding box。这样便可以使得bounding boxes预测的更加精确。并且预测出来的某些尺寸和纵横比都会变得更好。
3.3.2 分类
YOLO用预测(predictions)和ground truth之间的平方和误差(sum-squared error)来计算损失。损失函数包括:
- 分类预测损失
- 坐标预测损失(预测的bounding box和ground truth之间的差距)
- 置信度预测损失(框的客观真实性)
3.3.3 细节
分类预测损失
- 如果检测到一个物体,则每个单元格的分类损失是每个类的类条件概率的平方差。
坐标预测损失
- 坐标预测损失可算出预测bounding box位置和大小的误差(只计算负责检测物体的box)。
- 使用差方和误差。w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。我们不想对大的bounding box和小的bounding box中的绝对误差进行同等赋权。例如,一个大的bounding box中的 2 像素误差对于一个小的bounding box来说是相同的。
- 而差方和误差函数中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h。为了部分解决这个问题,YOLO 实际上预测的是bounding boxes的宽度(w)和高度(h)的平方根(square root),而不仅仅是宽度和高度。
- 因为坐标误差比分类误差大,为了增加对坐标误差为了提高bounding box的准确性,我们将损失乘以 λ c o o r d λ_{coord} λcoord (默认值:5)。
![](https://i-blog.csdnimg.cn/blog_migrate/651f24bd88d4b551fd53a412776f3a4f.jpeg#pic_center)
置信度预测损失
-
如果在 box 中检测到物体,则置信度预测损失为:
-
如果在 box 中没有检测到物体,则置信度预测损失为:
-
大多数box不包含任何物体对象。这会导致类不平衡问题,即我们训练模型时检测背景比检测物体更加频繁。为了解决这个问题,我们通过乘以 λ n o o b j λ_{noobj} λnoobj (默认值:0.5),对这种损失进行赋权。
四、YOLO的优点
-
快速,实时处理数据。
-
采用但阶段网络(one-stage)。预测(物体位置和类别)由一个网络进行。可以进行端到端(end-to-end)训练以提高准确性。
-
通用性强。当从自然图像推广到艺术品等其他领域时,YOLO的效果也同样优于其他方法。
-
RPN(Region Proposal)区域提议方法将分类器限制在特定区域。而YOLO 在预测边界时却访问整个图像。
-
YOLO 在背景区域中的表现更好,错误率更低。
-
YOLO中的每个网格单元(gride cell)都负责检测一个物体,而这实际上使得YOLO在进行预测时增强了空间多样性。
五、YOLOv1的伏笔——YOLOv2,YOLOv3的诞生
![](https://i-blog.csdnimg.cn/blog_migrate/08fd4167d7a051bc843283c9dbf0419a.png#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/09373fd67128026eafd155c1df18662c.png#pic_center)
SSD与YOLOv3的对比,详细请见参考论文《SSD vs. YOLO for Detection of Outdoor Urban Advertising Panels under Multiple Variabilities》
SSD 是 YOLOv1的强大竞争对手,它在当时展示了更高的实时处理精度。与基于区域的检测器相比,YOLO 的坐标定位误差更高,recall(召回率:衡量定位所有目标物体的好坏程度)更低。YOLOv2 是YOLO的第二个版本,其目标是显着提高准确性,同时使其更快。
详情下回分解。