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


前言

代码地址:GitHub:ultralytics/yolov3

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

若想了解Faster RCNN算法的细节与思想,可参考:

笔者在阅读《You Only Look Once:Unified, Real-Time Object Detection》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。

背景

在这里插入图片描述

  • 依照目标检测里程碑的 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的诞生

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

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

  • 97
    点赞
  • 740
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湘粤Ian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值