YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点

2年前博客6100
YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点 湘粤Ian 已于2022-09-23 23:42:43修改 4959 收藏 47 分类专栏: 目标检测 计算机视觉 于2022-08-17 20:58:02首次发布 目标检测 同时被 2 个专栏收录 13 篇文章 3 订阅 订阅专栏 计算机视觉 13 篇文章 2 订阅 订阅专栏

文章目录 前言背景一、YOLO的核心原理预览二、网络结构为什么每个网格有固定的B个Bounding Boes?(即B=2) 三、网络细节3.1 网络单元(grid)3.1.1 作用3.1.2 细节特征 3.2 网络实现3.2.1 检测策略 实现过程如下: 3.2.2 预测形状3.2.3 非极大值抑制(Non-Maximum Suppression)作用具体实现 3.3 目标损失函数3.3.1 思路3.3.2 分类3.3.3 细节分类预测损失坐标预测损失置信度预测损失 四、YOLO的优点五、YOLOv1的伏笔——YOLOv2,YOLOv3的诞生


前言

代码地址:GitHub:ultralytics/yolov3

本文适用于目标检测之YOLO零基础入门。YOLO检测效果如下:

若想了解Faster RCNN算法的细节与思想,可参考: 《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就需要负责检测该物体。一次性输出所检测到的目标信息,包括类别和位置。

对于每一个网格(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网格。每个网格单元仅预测一个目的。例如,上面的黄色网格单元尝试预测其中心(蓝点)位于网格单元内的“人”对象。 每个网格单元对对象进行固定数量B的bounding boxes预测 每个网格单元预测固定数量 B 的bounding boxes。在这个例子中,黄色网格单元进行两个边界框预测(蓝色框)来定位人的位置(B = 2)。 YOLO可能会错过太近的物体 但是,单对象规则(one-object rule)限制了检测到的对象的接近程度。为此,YOLO 确实对物体的接近程度有一些限制。例如,上面的图,左下角有 9 个圣诞老人,但 YOLO 只能检测到 5 个。 3.2 网络实现 3.2.1 检测策略 YOLOv1采用的是“分而治之”的策略,将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。回忆一下,在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络,这无疑增加了训练的负担。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域。通过这种方式,我们就不需要再额外设计一个RPN网络,这正是YOLOv1作为单阶段网络的简单快捷之处! 使用 b 个bounding boxes进行 (S x S) 预测。 原文中为了评估 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 预测形状

Output = 7 × 7 × (2 x 5 + 20)= 1470 通过图像的宽度和高度对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)

算法原理图如下:

简化理解为:

作用 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)。 置信度预测损失

如果在 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的诞生 【读后再读】:《YOLO超详细入门02 v2零基础看懂 图文详解(含代码及原文)——网络架构,BN,高分辨率,细粒度特征,多尺度训练,Anchor Box,维度聚类,直接位置预测,输出特点,YOLO9000》【读后再读】:《YOLO超详细入门 03 v3 图文详解(含代码+原文)》

SSD与YOLOv3的对比,详细请见参考论文《SSD vs. YOLO for Detection of Outdoor Urban Advertising Panels under Multiple Variabilities》

SSD 是 YOLOv1的强大竞争对手,它在当时展示了更高的实时处理精度。与基于区域的检测器相比,YOLO 的坐标定位误差更高,recall(召回率:衡量定位所有目标物体的好坏程度)更低。YOLOv2 是YOLO的第二个版本,其目标是显着提高准确性,同时使其更快。 详情下回分解。

相关文章

用过Apifox这个API接口工具后,确实感觉postman有点鸡肋......

用过Apifox这个API接口工具后,确实感觉postman有点鸡肋.........

使用 DataX 实现数据同步(高效的同步工具)

使用 DataX 实现数据同步(高效的同步工具)...

JMeter压力测试教程(超详细&小白版)

JMeter压力测试教程(超详细&小白版)...

猿创征文|深度学习基于ResNet18网络完成图像分类

猿创征文|深度学习基于ResNet18网络完成图像分类...

Python+Selenium安装及环境配置手把手教会你

Python+Selenium安装及环境配置手把手教会你...

前端面试八股文(超详细)

前端面试八股文(超详细)...