YOLO模型——思想、原理以及为什么使用网格、边界框

1. 前言

\qquad 提起YOLO模型,我想大部分和我一样的初学者不理解使用网格与边界框的原因。并且很多文章也只是讲清楚了流程但没讲清楚思想。本文从YOLO的思想本质为起点,详细介绍YOLO模型的原理。

2. YOLO的思路

2.1 从滑动窗口开始

\qquad 图像检测领域的滑动窗口是一种利用图像分类来实现目标检测的方法,它的思路是在图像上按照不同的大小和比例滑动窗口,然后把每个窗口内的图像片段送入一个预训练的分类器,判断是否存在目标物体。这个方法虽然简单直观,但是也有两个主要的缺陷:

  1. 窗口的尺寸和形状不够灵活,难以适应多样的目标

  2. 计算的开销很大,需要对大量的窗口进行分类,而且对窗口的大小和步长的选择比较敏感

2.2 改进

\qquad 下述内容不代表模型作者是如此想的,但有助于理解。看不懂这部分也没关系,可以接着往下看再重新回顾。下面的内容更多是在讨论YOLO使用网格、边界框的原因。个人认为理解YOLO为什么使用网格、为什么使用边界框比理解YOLO的流程、使用YOLO更加重要

2.2.1 R-CNN

\qquad 假如用神经网络直接预测出所有物体的位置,或者说所有物体候选区,再判断每一个候选区的类别,这样不仅能解决窗口尺寸的问题,同时计算量减少了(相对于滑动窗口来说)。也就是将图像检测分为两步:
\qquad \qquad 1. 产生候选区。
\qquad \qquad 2. 对每个候选区分类。
\qquad 最终把图像检测转换为了一个分类问题,这种方法被称为R-CNN,属于两阶段模型

2.2.2 YOLO

\qquad 滑动窗口方法中,窗口在滑动时,因为步长和窗口大小等原因可能会出现窗口产生的区域/图像块重叠的情况,也有窗口产生的区域之间有缝隙的情况,那么我们可以不用滑动窗口,直接将图片分成 S × S S\times S S×S个区域(网格),再用神经网络来判断每个网格的分类,这样就避免了网格之间的重叠和缝隙的问题。
在这里插入图片描述

\qquad *需要注意的是:在滑动窗口方法中,窗口滑动后产生的区域只负责判断一个类别。分成S×S个网格之后仍是如此。

\qquad 将图片分成 S × S S\times S S×S个网格以及知道了每个网格的分类后,就差物体标识框的大小与位置了。这个时候再想想滑动窗口怎么做的?滑动窗口是窗口滑动产生了区域(你也可以当成网格,暂且不必纠结概念区别),而现在是先有了网格,那就用神经网络在网格中生成一些窗口呗!每个网格的窗口(边界框)数量为B个(如果每个网格生成的边界框数量不同就会很乱,不如生成数量相等的,之后再判断去除)。而且正因为网格已经分好了,每个网格生成的窗口可以随意了!在这里插入图片描述

\qquad 滑动窗口每次滑动时,窗口大小是不能变化的。相对位置也是固定的:因为窗口产生的区域与窗口大小相同,窗口的中心位置就等于产生的区域中心位置。但是上述说的网格划分好了之后,每个网格之间生成的窗口互不干扰。就像图中(示例图!)的红色框和蓝色框大小可以不同,位置也可以随意。

\qquad 那怎么知道一个边界框在哪个网格中呢?那就看边界框中心在哪个网格。正因为这点,边界框愿意多大就多大,愿意多小就多小,反正只要边界框中心在网格中,这个边界框就还是这个网格的。

\qquad 从窗口滑动产生区域,变成了先划分区域,再从区域生成窗口。

\qquad 总的来说,上述做法的步骤就是
\qquad \qquad 1. 分成 S × S S\times S S×S个网格
\qquad \qquad 2. 生成 S × S × B S\times S\times B S×S×B个边界框
\qquad \qquad 3. 判断每个网格的分类
\qquad \qquad 4. 筛选出真正有用的边界框

\qquad 其中,2和3是通过一个神经网络实现的,并且只确定边界框的大小与相对位置,不确定边界框的分类,这种方法就是YOLO算法,它是一个端到端的、单阶段回归模型

\qquad 上述没看懂也没关系,下面来详细地介绍YOLO。

3.YOLO的详细介绍

3.1 流程

\qquad 论文给出的流程如下:
\qquad 1. 将输入图像的大小调整为448×448
\qquad 2. 在图像上运行单个卷积网络
\qquad 3. 通过模型的置信度对结果检测进行阈值设置。(非极大值抑制)
在这里插入图片描述
\qquad 因为卷积神经网络同时生成边界框与网格分类,所以分为三步。不过还是先按照上述说的步骤介绍:
\qquad \qquad 1. 分成 S × S S\times S S×S个网格
\qquad \qquad 2. 生成 S × S × B S\times S\times B S×S×B个边界框
\qquad \qquad 3. 判断每个网格的分类
\qquad \qquad 4. 筛选出真正有用的边界框

3.2 调整图片大小、分成S×S个网格

\qquad 准备阶段。

3.3 生成边界框

\qquad 每个网格都有B个边界框,且边界框的中心都在对应网格内。边界框只负责预测是否有物体,不预测分类。

3.3.1 位置与大小

\qquad 每个网格grid负责预测B个边界框 bounding boxes(也就是上边提到的窗口)。边界框的作用是:预测物体的大小,位置。物体大小是通过矩形框来体现的,所以每个边界框要有宽w、高h。要知道边界框的位置就要知道边界框的中心坐标x、y

\qquad 为了适应不同图片大小,宽w、高h的值是除以图片总宽度,高度的值,中心坐标是边界框中心与其所在网格的左上角的点的偏移量x、y。通过偏移量也可以保证边界框中心一定在网格中心。

3.3.2 置信度

\qquad 因为每个网格都生成了B个边界框,那如何判断这个边界框里是否真的有物体呢?那就用Pr(Object) 来表示,如果边界框有物体那就取1,否则取0。

\qquad 观察下图,网格A和网格B都会生成边界框。但是因为狗的中心落在网格A中,每个网格生成的边界框的中心又必须在网格中,所以网格A的边界框要比网格B更准确(如果你认为这个例子不明显,那让网格B是狗的脚部),那该怎么体现准确度呢?
在这里插入图片描述
\qquad 通过物体实际上所在的框/人工标注框与预测的边界框的交并比 I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth来体现。交并比的含义很简单:就是两个框的重叠面积除以两个框的并集面积(重叠部分+两个不重叠部分)。所以预测框越接近人工标注框,交并比越大,越准确。

\qquad 综上,一个边界框首先要判断是否有物体,再判断他的准确度,YOLO将两者相乘,作边界框的一个属性为置信度 confidence scores,公式如下:
P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object) ∗ IOU^{truth}_{pred} Pr(Object)IOUpredtruth
\qquad 当这个边界框没有物体时,Pr(Object)取0,置信度为0;有物体时,Pr(Object)取1,置信度等于交并比。

3.3.3 总结

\qquad 现在一个边界框一共有5个属性:宽w、高h、中心坐标x、y和置信度。一个网格有B个边界框,所有目前一个网格一共需要B × \times × 5个数据。

在这里插入图片描述
\qquad 边界框越粗说明置信度越高。

3.4 网格分类

\qquad 现在来判断物体的分类。暂时忘了边界框,只考虑网格。上述说了,滑动窗口是窗口产生了区域,判断这个区域的类别,所以一个区域只有一种类别。YOLO是先划分网格,也就是先生成区域,所以每个网格只对应一种分类。

\qquad 判断每个网格类别也是用神经网络来实现的,神经网络会输出每个网格的全部类别概率,如狗:0.7,猫:0.2,人: 0.0 等。之后选出最大的概率值作为该网格的分类。假设一共有C个类别,那么一个网格需要C个类别概率。因为判断类别时是在网格是物体的情况下,每个分类的概率,所以用 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject)这个条件概率来表示网格对应分类概率。
在这里插入图片描述

\qquad 有了网格分类概率之后,边界框的对应分类的置信度就是网格分类概率×边界框置信度,公式为:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_i|Object) ∗ Pr(Object) ∗ IOU^{truth}_{pred} = Pr(Class_i) ∗ IOU^{truth}_{pred} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth

\qquad 另一方面,结合之前一个网格需要B个边界框,一个边界框5个属性,一个网格一共就需要 ( B × 5 + C ) (B \times 5 +C) (B×5+C)个数据,一共 S × S S\times S S×S个网格,所以神经网络会输出一个 S × S × ( B × 5 + C ) S\times S\times(B\times5+C) S×S×(B×5+C)的张量。

3.5 非极大值抑制NMS

\qquad NMS不是YOLO独创的方法。是一种常用于去除冗余的预测边界框的算法。因为现在有很多的边界框,怎么筛选出最后最终结果呢?首先会抛弃一些边界框分类置信度低于阈值的,之后对每个类:

\qquad 1. 对边界框按照置信度从高到低排序;
\qquad 2. 从最高置信度的框开始,计算它与其他框的IoU(交并比);
\qquad 3. 如果IoU大于一个阈值,就把其他框删除;
\qquad 4. 重复上述过程,直到所有框都被处理。
在这里插入图片描述

3.6 总结

\qquad
在这里插入图片描述

4. YOLO的神经网络

4.1 结构

\qquad 网络的初始卷积层从图像中提取特征,而全连接层预测输出概率和坐标。
\qquad YOLO的网络架构受到用于图像分类的GoogLeNet模型的启发。有24个卷积层,然后是2个完全连接的层。
在这里插入图片描述

4.2 损失函数

\qquad 损失函数如下,简单来说,当边界框有物体时,计算1、2、3、5项,不然计算第4项。
在这里插入图片描述

5. 总结

5.1 优点

\qquad 1.使用一个卷积神经网络,所以速度快。
\qquad 2. 背景误检率低。YOLO将输入图像划分为网格,每个网格预测一个物体,这样可以减少对背景的误检。
\qquad 3. 通用性强。YOLO可以在不同的数据集和场景中泛化,甚至可以检测艺术作品中的物体。

5.2 缺点

\qquad 1. 精度低。YOLO的物体检测精度低于其他最先进的物体检测算法,主要是因为定位误差和召回率低。
\qquad 2. 小物体检测效果差。YOLO对小物体的检测效果不好,尤其是当小物体密集或重叠时,因为每个网格只能预测一个物体,而且对小物体的定位不够精确。
\qquad 3. 定位误差高。YOLO的损失函数没有很好地平衡不同大小的物体的定位误差,导致对大物体的检测更准确,而对小物体的检测更不准确。

\qquad 以上就是YOLO模型的全部介绍,欢迎大家补充内容,纠正错误。

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值