《You Only Look Once: Unified, Real-Time Object Detection》

【R-CNN系列不足】

  R-CNN系列算法(R-CNN、SPPNet、Fast R-CNN、Faster R-CNN)均是采用two-stage的方法(1.提取region proposal 2.分类+边框回归),主要是对region proposal进行识别定位。虽然这类方法检测精度很高,但由于需要一个单独的网络进行提取region proposal,因此在速度上无法突破瓶颈。
  RCNN开创性的提出了候选区(Region Proposals)的方法,先从图片中搜索出一些可能存在对象的候选区(Selective Search),大概2000个左右,然后对每个候选区进行对象识别。大幅提升了对象识别和定位的效率。
  不过RCNN的速度依然很慢,其处理一张图片大概需要49秒。因此又有了后续的Fast RCNN 和 Faster RCNN,针对 RCNN的神经网络结构和候选区的算法不断改进,Faster RCNN已经可以达到一张图片约0.2秒的处理速度。下图来自 R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms。
在这里插入图片描述              图一
在这里插入图片描述              图二

【YOLOv1创新点】

  • 将detection视为回归问题,仅使用一个neural network同时预测bounding box的位置和类别,因此速度很快。
  • 由于不需提取region proposal,而是直接在整幅图像进行检测,因此YOLOv1可以联系上下文信息和特征,减少将背景检测为物体的错误。
  • YOLOv1学习到的是目标的泛化表示(generalizable representations),泛化能力非常强,更容易应用于新的领域或输入。

【设计思路】

在这里插入图片描述              图三
         图 1 YOLOv1检测流程
由于不需提取region proposal,则YOLOv1的检测流程很简单:

  • Resize image:将输入图片resize到448x448。
  • Run ConvNet:使用CNN提取特征,FC层输出分类和回归结果。
  • Non-max Suppression:非极大值抑制筛选出最终的结果。

  没有region proposal,那应该怎么定位那些包含目标的区域并固定输出呢?简单来说,YOLOv1的做法是:CNN网络将resize后的图像分割成S x S(7 x 7)的单元格,若目标的中心点落在某一单元格,则该单元格负责检测该目标,输出该目标的类别和边框坐标。例如:下图中狗的中心落在红色单元格内,则这个单元格负责预测狗。
在这里插入图片描述
              图5
  还有分类问题,对于每一个单元格其还要给出预测出个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即。值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是Yolo算法的一个缺点,在后来的改进版本中,Yolo9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores):。边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。后面会说,一般会根据类别置信度来过滤网络的预测框。

  总结一下,每个单元格需要预测个值。如果将输入图片划分为网格,那么最终预测值为大小的张量。整个模型的预测值结构如下图所示。对于PASCAL VOC数据,其共有20个类别,如果使用,那么最终的预测结果就是大小的张量。在下面的网络结构中我们会详细讲述每个单元格的预测值的分布位置。
在这里插入图片描述           图6、模型预测值结构

【网络结构】

  Yolo采用卷积网络来提取特征,然后使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,如下图所示。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:。但是最后一层却采用线性激活函数。除了上面这个结构,文章还提出了一个轻量级版本Fast Yolo,其仅使用9个卷积层,并且卷积层中使用更少的卷积核。
在这里插入图片描述              图七
  可以看到网络的最后输出为大小的张量。这和前面的讨论是一致的。这个张量所代表的具体含义如下图所示。对于每一个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,两者相乘可以得到类别置信度,最后8个元素是边界框的。大家可能会感到奇怪,对于边界框为什么把置信度和都分开排列,而不是按照这样排列,其实纯粹是为了计算方便,因为实际上这30个元素都是对应一个单元格,其排列是可以任意的。但是分离排布,可以方便地提取每一个部分。这里来解释一下,首先网络的预测值是一个二维张量,其shape为。采用切片,那么就是类别概率部分,而是置信度部分,最后剩余部分是边界框的预测结果。这样,提取每个部分是非常方便的,这会方面后面的训练及预测时的计算。
在这里插入图片描述
           图八、预测张量的解析

网络训练

  在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图7中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。整个网络的流程如下图所示:
在这里插入图片描述            图9、网络流程

  YOLOv1的网络结构很简单,借鉴了GooLeNet设计,共包含24个卷积层,2个全链接层(前20层中用1×1 reduction layers 紧跟 3×3 convolutional layers 取代GooLeNet的 inception modules)。

1.输入:448 x 448 x 3,由于网络的最后需要接入两个全连接层,全连接层需要固定尺寸的输入,故需要将输入resize。
2.Conv + FC:主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数: m a x ( x , 0.1 x ) max(x, 0.1x) max(x,0.1x),但是最后一层采用线性激活函数。
3.输出:最后一个FC层得到一个1470 x 1的输出,将这个输出reshap一下,得到 7 ∗ 7 ∗ 30 7 * 7 * 30 7730 的一个tensor,即最终每个单元格都有一个30维的输出,代表预测结果。具体如下:
在这里插入图片描述            图10

7 x 7 (网格)

输入图像被划分为 7 x 7 的单元格(grid),输出tensor中的 7 x 7 对应着输入图像的 7 x 7 个单元格,每个单元格对应输出30维的向量。如上图所示,输入图像左上角的网格对应到输出张量中左上角的向量。要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理,最后编码到那个30维向量中。

30维向量:
在这里插入图片描述

(1) 2 2 2 b o u n d i n g b o x bounding box boundingbox的位置:对于每个单元格,YOLOv1会预测出 2 2 2 b o u n d i n g   b o x bounding \ box bounding box,每个 b o u n d i n g   b o x bounding\ box bounding box需要 4 4 4 个数值 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)来表示其位置, 2 2 2 b o u n d i n g   b o x bounding\ box bounding box共需要 8 8 8 个数值来表示其位置。是 b b o x bbox bbox的中心点的位置,这个位置值相对于单元格归一化到0-1之间,例如图片的宽为 w i d t h width width,高为 h e i g h t height height图10 红框中的单元格坐标为 ( 5 , 5 ) (5, 5) (5,5),那 x = b b o x x = bbox x=bbox的实际坐标 x / ( w i d t h / s ) − 5 x/(width/s) - 5 x/(width/s)5, y = b b o x y = bbox y=bbox 的实际坐标 y / ( h e i g h t / s ) − 5 y/(height/s) - 5 y/(height/s)5 ( w , h ) (w,h) (w,h) b b o x bbox bbox的宽和高,这个是相对于整张图片的,即 w = b b o x w=bbox w=bbox 实 际 的 宽 / 图 片 的 宽 实际的宽/图片的宽 / h = b b o x h=bbox h=bbox 实 际 的 高 / 图 片 的 高 实际的高/图片的高 /,这样做可以将 w w w h h h归一到 0 − 1 0-1 01之间,这有利于之后的回归。

(2)2个bounding box的置信度:对于每个单元格,YOLOv1会预测出2个置信度,分别对应该单元格预测两个bounding box。每一个置信度包含两个方面,一是该边界框含有目标的可能性大小,二是该边界框的准确度。前者记为$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^{truth}_{pred} IOUpredtruth。因此置信度可以定义为 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

(3)20类对象分类的概率对于每个单元格,YOLOv1预测出20个类别概率值(对于PASCAL VOC数据集),其表征的是由该单元格负责预测的两个边界框中的目标属于各个类别的概率。注意这些概率值其实是在各个边界框置信度下的条件概率,即 P r ( c l a s s i ∣ o j e c t ) Pr(class_i|oject) Pr(classioject),也就是说不管一个单元格预测多少个边界框,该单元格只预测一组类别概率值(YOLOv1的一大缺点)。

总结:输入图片被分成 7 x 7 个单元格,每个单元格预测输出2个bounding box,每个bounding box包含5个值(4个坐标+1置信度),另外每个单元格预测20个类别,所以最终预测输出7 x 7 (4 + 1 + 20) = 7 x 7 x 30 的tensor。

【训练】

  首先在ImageNet上对网络中的前20层进行预训练,之后再在这20层后连上4层卷积和2层全连接层进行训练。所以,前20层是用预训练网络初始化,最后的这6层是随机初始化的并在训练过程中更新权重。此外,因为detection需要更多图片细节的信息,所以在训练时,统一将输入图片的size从 224 ∗ 224 224*224 224224调整为 448 ∗ 448 448*448 448448。对于loss函数,是通过ground truth和输出之间的sum-squared error进行计算的,所以相当于把分类问题也当成回归问题来计算loss。下面分析loss函数:
在这里插入图片描述            图11

位置误差:主要是计算bbox的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 和对应的ground truth box的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 之间的sum-squared error,需要注意的是并不是所有的bbox都参与loss的计算,首先必须是第i个单元格中存在object,并且该单元格中的第j个bbox和ground truth box有最大的IoU值,那么这个bbox j才参与loss的计算,其他的不满足条件的bbox不参与。此外,因为误差在小的box上体现的更明显,就是一点点小的位置上的偏差可能对大的box影响不是很大,但是对小的box的影响就比较明显了,所以为了给不同size的box的位置loss赋予不同的‘权重’,需要对w和h开方后才进行计算。根据 y = x 1 / 2 y = x^{1/2} y=x1/2的函数图像可知,当 x x x较小时, x x x的一点小的变化都会导致 y y y大的变化,而当 x x x较大的时候, x x x的一点儿小的变化不会让 y y y的变化太大。 但这个方法只能减弱这个问题,并不能彻底解决这个问题。在这里插入图片描述

置信度误差:分两种情况,一是有object的单元格的置信度计算,另一种是没有object的单元格的置信度计算。两种情况都是单元格中所有的bbox都参与计算。对于有object的单元格中的bbox的置信度的ground truth就是 1 ∗ I O U p r e d t r u t h 1*IOU^{truth}_{pred} 1IOUpredtruth。需要注意的是这个IOU是在训练过程中不断计算出来的,因为网络在训练过程中每次预测的bbox是变化的,所以bbox和ground truth计算出来的IOU每次也会不一样。而对于没有object的单元格中的bbox的置信度的ground truth为 0 ∗ I O U p r e d t r u t h = 0 0*IOU^{truth}_{pred}=0 0IOUpredtruth=0,因为不包含物体。

分类误差:当作回归误差来计算,使用sum-squared error来计算分类误差,需要注意的是只有包含object的单元格才参与分类loss的计算,即有object中心点落入的单元格才进行分类loss的计算,而这个单元格的ground truth label就是该物体的label。

此外,为了使得三种误差达到平衡,就需要给不同的误差赋予不同的权重。

更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λ c o o r d \lambda_{coord} λcoord ,在pascal VOC训练中取5。(图11蓝色框)

对没有object的bbox的confidence loss,赋予小的loss weight,记为 λ n o o b j \lambda_{noobj} λnoobj ,在pascal VOC训练中取0.5。(图11橙色框)

有object的bbox的confidence loss (图6红色框) 和类别的loss (图6紫色框)的loss weight正常取1。

总结起来就是:

  • 对于有object的cell,那么计算cell的分类误差,然后cell中两个bbox的置信度误差,然后cell中和ground truth box的IoU最大的bbox的位置误差。
  • 对于没有object的cell,那就只计算cell中两个bbox的置信度误差。

【测试】

将一张图输入到网络中,然后得到一个 7 × 7 × 30 7 \times 7 \times 30 7×7×30的预测结果。然后将计算结果中的每个单元格预测的类别信 P r ( c l a s s i ∣ o b j e c t ) Pr(class_i|object) Pr(classiobject) 的置信度信息 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 。 相乘即可得到每个bbox的class-specific confidence score:
在这里插入图片描述
如下图所示:
在这里插入图片描述
根据同样的方法可以计算得到7 x 7 x 2 = 98个bbox的confidence score,然后根据confidence score对预测得到的98个bbox进行非极大值抑制,得到最终的检测结果。NMS参考Jacqueline大佬的文章【目标检测】基础知识:IoU、NMS、Bounding box regression

【YOLOv1缺点】

因为YOLO中每个cell只预测两个bbox和一个类别,这就限制了能预测重叠或邻近物体的数量,比如说两个物体的中心点都落在这个cell中,但是这个cell只能预测一个类别。

此外,不像Faster R-CNN一样预测offset,YOLO是直接预测bbox的位置的,这就增加了训练的难度。

YOLO是根据训练数据来预测bbox的,但是当测试数据中的物体出现了训练数据中的物体没有的长宽比时,YOLO的泛化能力低

同时经过多次下采样,使得最终得到的feature的分辨率比较低,就是得到coarse feature,这可能会影响到物体的定位。

损失函数的设计存在缺陷,使得物体的定位误差有点儿大,尤其在不同尺寸大小的物体的处理上还有待加强。

【参考文章】

【目标检测】YOLO
<机器爱学习>YOLO v1深入理解
YOLOv1
图解YOLO
目标检测|YOLO原理与实现

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

☞源仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值