目标检测YOLO V1 论文以及原理解读

摘要

  • YOLO 提出了一种新的目标检测方法。在Yolo之前目标检测主要是基于滑动窗再利用分类器来执行检测。相反YOLO将目标检测框架看作是回归问题,利用单个神经网络在一次评估中直接从完整图像上预测边界框和类别概率。由于整个检测流水线是单一网络,因此可以直接对检测性能进行端到端的优化。
  • YOLO的运行速度非常快。基础YOLO模型以45帧/秒的速度实时处理图像。网络的一个较小版本,快速YOLO,每秒能处理惊人的155帧,同时实现其它实时检测器两倍的mAP。尽管与最先进的检测系统相比,YOLO产生了更多的定位误差,但不太可能在背景上的预测假阳性。

引言

  • 人们瞥一眼图像,立即知道图像中的物体是什么,它们在哪里以及它们如何相互作用。人类的视觉系统是快速和准确的,使我们能够执行复杂的任务,如驾驶时没有多少有意识的想法。快速,准确的目标检测算法可以让计算机在没有专门传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时的场景信息,并且能够让一般用途和响应式机器人系统,释放出他们的潜力。
  • 在YOLO之前的检测系统主要是反复使用分类器来执行检测。为了检测目标,这些系统为该目标提供一个分类器,并在不同的位置对其进行评估,并在测试图像中进行缩放。像可变形部件模型(DPM)这样的系统使用滑动窗口方法,其分类器在整个图像的均匀间隔的位置上运行[10]。
  • 与YOLO同时期的目标检测方法,如R-CNN使用区域提出方法首先在图像中生成潜在的边界框,然后在这些提出的框上运行分类器。在分类之后,后处理用于细化边界框,消除重复的检测,并根据场景中的其它目标重新定位边界框[13]。这些复杂的流程很慢,很难优化,因为每个单独的组件都必须单独进行训练。
  • YOLO将目标检测重新看作单一的回归问题,直接从图像像素到边界框坐标和类概率。使用YOLO的系统,您只需要在图像上看一次(YOLO),便可以预测出现的目标和位置。

背景知识:

  • two-stage算法
    基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是two-stage的,需要先使用启发式方法(selective search)或者CNN网络(RPN)产生Region Proposal,然后再在Region Proposal上做分类与回归。
  • one-stage算法
    Yolo,SSD这类,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。 two-stage方法是准确度高一些,但是速度慢,one-stage算法是速度快,但是准确性要低一些。这可以在图2中看到。本文介绍的是Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,基本上把Yolo算法的特点概括全了:You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。这里我们谈的是Yolo-v1版本算法,其性能是差于后来的SSD算法的,但是Yolo后来也继续进行改进,产生了Yolo9000,YOLOV3/4/5算法。
    在这里插入图片描述 图 2 目标检测算法进展与对比 图2 目标检测算法进展与对比 2目标检测算法进展与对比

YOLO 设计理念
YOLO很简单:参见图5。单个卷积网络同时预测这些盒子的多个边界框和类概率。YOLO在整个图像上训练并直接优化检测性能。这种统一的模型比传统的目标检测方法有一些好处。
在这里插入图片描述 图 5 Y O L O 检测系统 : ( 1 ) 将输入图像调整为 448 × 448 ( 2 ) 在图像上运行单个卷积网络 ( 3 ) 由模型的置信度对所得到的检测进行阈值处理。 \begin{aligned} 图5 YOLO检测系统&: \\ & (1) 将输入图像调整为448×448 \\ &(2) 在图像上运行单个卷积网络 \\ &(3) 由模型的置信度对所得到的检测进行阈值处理。 \end{aligned} 5YOLO检测系统:(1)将输入图像调整为448×448(2)在图像上运行单个卷积网络(3)由模型的置信度对所得到的检测进行阈值处理。

首先,YOLO速度非常快。由于我们将检测视为回归问题,所以我们不需要复杂的流程。测试时我们在一张新图像上简单的运行我们的神经网络来预测检测。我们的基础网络以每秒45帧的速度运行,在Titan X GPU上没有批处理,快速版本运行速度超过150fps。这意味着我们可以在不到25毫秒的延迟内实时处理流媒体视频。此外,YOLO实现了其它实时系统两倍以上的平均精度。

其次,YOLO在进行预测时,会对图像进行全面地推理。与基于滑动窗口和区域提出的技术不同,YOLO在训练期间和测试时会看到整个图像,所以它隐式地编码了关于类的上下文信息以及它们的外观。快速R-CNN是一种顶级的检测方法,因为它看不到更大的上下文,所以在图像中会将背景块误检为目标。与快速R-CNN相比,YOLO的背景误检数量少了一半。

YOLO在精度上仍然落后于最先进的检测系统。虽然它可以快速识别图像中的目标,但它仍在努力精确定位一些目标,尤其是小的目标。

Yolo 算法原理
图6 网格划分

  • Yolo将输入图像分成S×S的网格,如图6所示
    如果一个目标的中心落入一个网格单元中,该网格单元“负责”检测该目标。如图6所示, 可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格“负责”预测这个狗。这里“负责”我的理解是对于训练来说的,实际在推理时,单元格的每一部分都会产生输出,得到推理结果。

  • 每个单元格会预测 B B B 个边界框(bounding box)以及边界框的置信度(bounding box confidence score)。
    边界框的大小与位置可以用4个值来表征: ( x , y , w , h ) (x,y,w,h) (x,y,w,h) ,其中 ( x , y ) (x,y) (x,y) 是边界框的中心坐标,而 w w w h h h 是边界框的宽与高。还有一点要注意,中心坐标的预测值 ( x , y ) (x,y) (x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 w w w h h h 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在 [ 0 , 1 ] [0,1] [0,1] 范围。

  • 边界框置信度(bounding box confidence score)其实包含两个方面:
    一是这个边界框含有目标的可能性大小,记为 P r ( o b j e c t ) Pr(object) Pr(object)。当该边界框是背景时(即不包含目标),此时 P r ( o b j e c t ) = 0 Pr(object) = 0 Pr(object)=0 。而当该边界框包含目标时, P r ( o b j e c t ) = 1 Pr(object) = 1 Pr(object)=1
    二是这个边界框的准确度。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 I O U p r e d t r u t h IOU_{pred}^{truth} IOUpredtruth,它反映了预测的边界框与物体的真实的边界框的匹配程度如何。因此边界框置信度可以定义为 P r ( o b j e c t ) ∗ I O U p r e d t r u t h Pr(object)*IOU_{pred}^{truth} Pr(object)IOUpredtruth 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测的边界框与物体真实的边界狂的匹配程度也反映在里面

  • 这样,每个边界框的预测值实际上包含5个元素: ( x , y , w , h , c ) (x,y,w,h,c) (x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是边界框的置信度。

  • 还有分类问题,对于每一个单元格其还要给出预测出 C C C 个类别概率值。
    其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即 P r ( c l a s s i ∣ o b j e c t ) Pr(class_i|object) Pr(classiobject)。值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,所有的类别概率值是用one-hot编码的这就决定了Yolo V1每个单元格最多只能预测一个物体。这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。

  • 我们可以计算出各个边界框类别置信度(class-specific confidence scores):
    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_{pred}^{truth}=Pr(class_i)*IOU_{pred}^{truth} Pr(classiobject)Pr(object)IOUpredtruth=Pr(classi)IOUpredtruth
    边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。在nms阶段,一般会根据类别置信度来过滤网络的预测框:当类别置信度低于threshold值时,则将该预测框忽略掉。

总结一下,每个单元格需要预测 ( B ∗ 5 + C (B*5+C (B5+C)个值。如果将输入图片划分为 S S S × \times × S S S网格,那么最终预测值为 S S S × \times × S S S × \times × ( B ∗ 5 + C ) (B*5+C) (B5+C)大小的张量。整个模型的预测值结构如下图所示。对于PASCAL VOC数据,其共有20个类别,如果使用 S S S × \times × S S S × \times × ( B ∗ 5 + C ) (B*5+C) (B5+C),那么最终的预测结果就是 S S S × \times × S S S × \times × ( 2 ∗ 5 + 20 ) (2*5+20) (25+20)大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。

图 7 模型预测值结构 图7 模型预测值结构 7模型预测值结构
网络设计
Yolo采用卷积网络来提取特征,而全连接层预测输出概率和坐标。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如图8所示。对于卷积层,主要使用1x1卷积来做降维,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: m a x ( x , 0.1 x ) max(x,0.1x) max(x,0.1x) 。但是最后一层却采用线性激活函数。
在这里插入图片描述 图 8 网络结构 1 图8 网络结构1 8网络结构1

┌────────────┬────────────────────────┬───────────────────┐
│    Name    │        Filters         │ Output Dimension  │
├────────────┼────────────────────────┼───────────────────┤
│ Conv 17 x 7 x 64, stride=2224 x 224 x 64    │
│ Max Pool 12 x 2, stride=2112 x 112 x 64    │
│ Conv 23 x 3 x 192112 x 112 x 192   │
│ Max Pool 22 x 2, stride=256 x 56 x 192     │
│ Conv 31 x 1 x 12856 x 56 x 128     │
│ Conv 43 x 3 x 25656 x 56 x 256     │
│ Conv 51 x 1 x 25656 x 56 x 256     │
│ Conv 61 x 1 x 51256 x 56 x 512     │
│ Max Pool 32 x 2, stride=228 x 28 x 512     │
│ Conv 71 x 1 x 25628 x 28 x 256     │
│ Conv 83 x 3 x 51228 x 28 x 512     │
│ Conv 91 x 1 x 25628 x 28 x 256     │
│ Conv 103 x 3 x 51228 x 28 x 512     │
│ Conv 111 x 1 x 25628 x 28 x 256     │
│ Conv 123 x 3 x 51228 x 28 x 512     │
│ Conv 131 x 1 x 25628 x 28 x 256     │
│ Conv 143 x 3 x 51228 x 28 x 512     │
│ Conv 151 x 1 x 51228 x 28 x 512     │
│ Conv 163 x 3 x 102428 x 28 x 1024    │
│ Max Pool 42 x 2, stride=214 x 14 x 1024    │
│ Conv 171 x 1 x 51214 x 14 x 512     │
│ Conv 183 x 3 x 102414 x 14 x 1024    │
│ Conv 191 x 1 x 51214 x 14 x 512     │
│ Conv 203 x 3 x 102414 x 14 x 1024    │
│ Conv 213 x 3 x 102414 x 14 x 1024    │
│ Conv 223 x 3 x 1024, stride=27 x 7 x 1024      │
│ Conv 233 x 3 x 10247 x 7 x 1024      │
│ Conv 243 x 3 x 10247 x 7 x 1024      │
│ FC 1-4096              │
│ FC 2-7 x 7 x 30 (1470) │
└────────────┴────────────────────────┴───────────────────┘

图 8 网络结构 2 图8 网络结构2 8网络结构2

  • 可以看到网络的最后输出为 7 × 7 × 30 7\times7\times30 7×7×30 大小的张量。这和前面的讨论是一致的。 这个张量所代表的具体含义如图9所示。对于每一个单元格,后20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到边界框类别置信度,8个元素是两个边界框的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)
    在这里插入图片描述

图 9 预测张量的解析 图9 预测张量的解析 9预测张量的解析

  • 请注意,该架构是专为在Pascal VOC中使用而设计的20个分类,其中作者使用S = 7,B = 2和C = 20。这解释了为什么 最终的特征图是7x7,并说明了 输出(7x7x(2 * 5 + 20))。使用具有不同网格大小或不同类别数量的该网络可能需要调整各层的尺寸。C是用one-hot编码的,例如如下2分类的x,y,w,h,c,c1,c2:
    在这里插入图片描述

  • 作者提到,有一个快速版本的YOLO,卷积层较少。但是,上表显示了完整版本。 - 1x1降维层和3x3卷积层是受GoogLeNet(Inception)模型的启发 - 最后一层使用线性激活函数。所有其他层都使用Leaky ReLU(如果x> 0,则Φ(x)= x;否则为0.1x)激活函数

  • 如果您不熟悉卷积网络,请看一下这个很棒的介绍

损失函数

  1. 预测框中心坐标损失误差

λ coord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i j}^{\mathrm{obj}}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] λcoord i=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2]
该方程计算与预测边界框位置(x,y)有关的损失。暂时不用关心λ,只需将其视为给定常数即可。该函数计算每个网格单元 ( i = 0... S 2 ) (i = 0 ... S ^ 2) (i=0...S2)的每个边界框预测变量(j = 0 … B)的总和。
1 o b j 1^{\mathrm{obj}} 1obj的定义如下:

  • 1,如果在网格单元格i中存在对象,并且第j个边界框预测变量对该预测“负责”
  • 0,否则,也就是不是上面两种情况

但是,我们如何知道哪个预测变量负责该对象?引用原始文件:

YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth
YOLO每个网格单元预测多个边界框。在训练时,每个目标我们只需要一个边界框预测器来负责。我们指定一个预测器“负责”根据哪个预测与真实值之间具有当前最高的IOU来预测目标。

方程中的其他部分应​​该易于理解:(x,y)是预测的边界框位置,(x̂,ŷ)是训练数据中的实际位置。

  1. 预测框的宽和高损失误差

λ coord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{o b j}\left(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}}\right)^{2}+\left(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}}\right)^{2} λcoord i=0S2j=0B1ijobj(wi w^i )2+(hi h^i )2
这是与预测框宽度/高度有关的误差。该方程看起来与第一个方程相似,只是平方根不同。那是怎么回事?再次引用该文件:

Our error metric should reflect that small deviations in large boxes matter less than in small boxes. To partially address this we predict the square root of the bounding box width and height instead of the width and height directly.
平方和误差也可以在大盒子和小盒子中同样加权误差。我们的错误指标应该反映出,大盒子小偏差的重要性不如小盒子小偏差的重要性。为了部分解决这个问题,我们直接预测边界框宽度和高度的平方根,而不是宽度和高度。

  1. 包含目标的边界框的置信度误差项和不包含目标的边界框的置信度误差项
    ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C ^ i ) 2 \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{o b j}\left(C_{i}-\hat{C}_{i}\right)^{2}+\lambda_{n o o b j} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{n o o b j}\left(C_{i}-\hat{C}_{i}\right)^{2} i=0S2j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2
    在这里,我们为每个边界框预测变量计算与置信度得分相关的损失。 C是置信度分数,而Ĉ是预测边界框与标签真值的交并比。 1 o b j 1^{\mathrm{obj}} 1obj与位置误差中的一致。 1 n o o b j 1^{\mathrm{noobj}} 1noobj 1 o b j 1^{\mathrm{obj}} 1obj相反。
  2. 包含目标的单元格的分类误差项
    ∑ i = 0 S 2 1 i o b j ∑ c ∈  classes  ( p i ( c ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\mathrm{obj}} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} i=0S21iobjc classes (pi(c)p^i(c))2
    1 i o b j \mathbb{1}_{i}^{\mathrm{obj}} 1iobj项外,它看起来与常规的平方和误差相似。使用该项是因为当单元格上没有对象时,我们不会惩罚分类错误。
    综上讨论,最终的损失函数计算如下:

在这里插入图片描述网络训练

  • 首先,使用224x224的输入大小,使用ImageNet 1000类竞赛数据集对前20个卷积层进行预训练
  • 然后,将输入分辨率提高到448x448
  • 使用64的batch size,0.9 momentum 和0.0005的衰减(decay ),训练整个网络约135 epochs
  • 学习率策略,在第一个epochs ,学习率(Learning rate )从0.001缓慢提高到0.01。训练约75个epochs ,然后开始减少它。
  • 将数据增强与随机缩放和转换一起使用,并随机调整曝光和饱和度。

网络预测
在说明Yolo算法的预测过程之前,这里先介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法不单单是针对Yolo算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图11中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,比如对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。Yolo预测过程也需要用到NMS算法。
在这里插入图片描述 图 11 N M S 应用在人脸检测 图11 NMS应用在人脸检测 11NMS应用在人脸检测
下面就来分析Yolo的预测过程,这里我们不考虑batch,认为只是预测一张输入图片。根据前面的分析,最终的网络输出是KaTeX parse error: Undefined control sequence: \3 at position 15: 7\times7\times\̲3̲0,但是我们可以将其分割成三个部分:类别概率部分为 [ 7 , 7 , 20 ] [7,7,20] [7,7,20] ,置信度部分为 [ 7 , 7 , 2 ] [7,7,2] [7,7,2] ,而边界框部分为 [ 7 , 7 , 2 , 4 ] [7,7,2,4] [7,7,2,4] (对于这部分不要忘记根据原始图片计算出其真实值)。然后将前两项相乘(矩阵 [ 7 , 7 , 20 ] [7,7,20] [7,7,20] 乘以 [ 7 , 7 , 2 ] [7,7,2] [7,7,2] 可以各补一个维度来完成 [ 7 , 7 , 1 , 20 ] × [ 7 , 7 , 2 , 1 ] [7,7,1,20]\times[7,7,2,1] [7,7,1,20]×[7,7,2,1]可以得到类别置信度值为 [ 7 , 7 , 2 , 20 ] [7,7,2,20] [7,7,2,20],这里总共预测了 7 ∗ 7 ∗ 2 = 98 7*7*2=98 772=98个边界框。
所有的准备数据已经得到了,那么我们先说第一种策略来得到检测框的结果,我认为这是最正常与自然的处理。首先,对于每个预测框根据类别置信度选取置信度最大的那个类别作为其预测标签,经过这层处理我们得到各个预测框的预测类别及对应的置信度值,其大小都是 [ 7 , 7 , 2 ] [7,7,2] [7,7,2]。一般情况下,会设置置信度阈值,就是将置信度小于该阈值的box过滤掉,所以经过这层处理,剩余的是置信度比较高的预测框。最后再对这些预测框使用NMS算法,最后留下来的就是检测结果。一个值得注意的点是NMS是对所有预测框一视同仁,还是区分每个类别,分别使用NMS。Ng在deeplearning.ai中讲应该区分每个类别分别使用NMS,但是看了很多实现,其实还是同等对待所有的框,我觉得可能是不同类别的目标出现在相同位置这种概率很低吧。
上面的预测方法应该非常简单明了,但是对于Yolo算法,其却采用了另外一个不同的处理思路(至少从C源码看是这样的),其区别就是先使用NMS,然后再确定各个box的类别。其基本过程如图12所示。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。这个策略不是很直接,但是貌似Yolo源码就是这样做的。Yolo论文里面说NMS算法对Yolo的性能是影响很大的,所以可能这种策略对Yolo更好。但是我测试了普通的图片检测,两种策略结果是一样的。
在这里插入图片描述 图 12 Y o l o 的预测处理流程 图12 Yolo的预测处理流程 12Yolo的预测处理流程

算法性能分析

这里看一下Yolo算法在PASCAL VOC 2007数据集上的性能,这里Yolo与其它检测算法做了对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如表1所示。与实时性检测方法DPM对比,可以看到Yolo算法可以在较高的mAP上达到较快的检测速度,其中Fast Yolo算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,Yolo的mAP稍低,但是速度更快。所以。Yolo算法算是在速度与准确度上做了折中。
在这里插入图片描述 表 1 Y o l o 在 P A S C A L V O C 2007 上与其他算法的对比 表1 Yolo在PASCAL VOC 2007上与其他算法的对比 1YoloPASCALVOC2007上与其他算法的对比
为了进一步分析Yolo算法,文章还做了误差分析,将预测结果按照分类与定位准确性分成以下5类:

  • Correct:类别正确,IOU>0.5;(准确度)
  • Localization:类别正确,0.1 < IOU<0.5(定位不准);
  • Similar:类别相似,IOU>0.1;
  • Other:类别错误,IOU>0.1;
  • Background:对任何目标其IOU<0.1。(误把背景当物体)

Yolo与Fast R-CNN的误差对比分析如下图所示:
在这里插入图片描述 图 13 Y o l o 与 F a s t R − C N N 的误差对比分析 图13 Yolo与Fast R-CNN的误差对比分析 13YoloFastRCNN的误差对比分析

可以看到,Yolo的Correct的是低于Fast R-CNN。另外Yolo的Localization误差偏高,即定位不是很准确。但是Yolo的Background误差很低,说明其对背景的误判率较低。Yolo的那篇文章中还有更多性能对比,感兴趣可以看看。

现在来总结一下Yolo的优缺点。首先是优点,Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。其实我觉得全连接层也是对这个有贡献的,因为全连接起到了attention的作用。另外,Yolo的泛化能力强,在做迁移时,模型鲁棒性高。

最后不得不谈一下Yolo的缺点,首先Yolo各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,Yolo的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单元格。也可以看Faster R-CNN,其采用了anchor boxes。Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然Yolo的定位不准确也是很大的问题。

参考文献
https://arxiv.org/abs/1506.02640
https://hackernoon.com/understanding-yolo-f5a74bbc7967
https://github.com/SnailTyan/deep-learning-papers-translation
https://zhuanlan.zhihu.com/p/32525231
https://cs231n.github.io/convolutional-networks/

yolo v1
https://hackernoon.com/understanding-yolo-f5a74bbc7967
yolov2, yolo9000
https://manalelaidouni.github.io/manalelaidouni.github.io/Understanding%20YOLO%20and%20YOLOv2.html#what-are-anchor-boxes-

yolov3
https://www.jianshu.com/p/d13ae1055302

https://zhuanlan.zhihu.com/p/52336258

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值