我是靠谱客的博主 小巧火龙果,最近开发中收集的这篇文章主要介绍『论文笔记』YOLOV1最全面解读!,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

YOLOV1最全面解读!

文章目录

    • 一. 前言
    • 二. YOLO V1的优点与缺点
    • 三. YOLO V1的核心思想
      • 3.1. S是多少?
      • 3.2. 为什么要分成S x S个网格?
      • 3.3. 选择哪些网格(grid cell)去预测框?
      • 3.4. 选好了网格,下一步计算x,y,w,h(用来训练),它们是怎么计算的?
      • 3.5. 实际的训练过程中,需要分S x S个网格么?
      • 3.6. 最后输出的30维向量,代表什么?
      • 3.7. 框的分数是怎么算的?
      • 3.8. 为什么每个输出有两个框,实际却只负责一个框?
    • 四. YOLO V1的损失函数
    • 五. 具体实现过程:
      • 5.1. 训练的时候:
      • 5.2. 测试的时候:

  • 论文链接:You only look once unified real-time object detection
  • 代码下载:https://github.com/hizhangp/yolo_tensorflow
  • 源码分析可参考:https://zhuanlan.zhihu.com/p/25053311

一. 前言

当前主流的 C N N CNN CNN目标检测框架可分为两类:

  1. 包含 R e g i o n Region Region p r o p o s a l s proposals proposals提取阶段的两阶段目标检测框架。如 R − C N N R-CNN RCNN系列像 R − C N N / F a s t − R C N N / F a s t e r − F C N N / R − F C N R-CNN/Fast-RCNN/Faster-FCNN/R-FCN RCNN/FastRCNN/FasterFCNN/RFCN等;
  2. 端到端的单阶段目标检测框架。如 Y O L O YOLO YOLO系列像 y o l o v 1 / y o l o v 2 / y o l o v 3 及 S S D yolov1/yolov2/yolov3及SSD yolov1/yolov2/yolov3SSD

Y O L O YOLO YOLO (You Only Look Once) 是第一个相对成功的 O n e − S t a g e One-Stage OneStage物体检测方法,在2016年 C V P R CVPR CVPR会议上被提出,以简单,高效的优势,一跃成为与 R C N N RCNN RCNN系列并驾齐驱的物体检测框架,直至今日, Y O L O V 3 YOLOV3 YOLOV3依然作为物体检测的首选方案之一。

二. YOLO V1的优点与缺点

优点:

  1. 速度快,体现在很高的 F P S ( f r a m e s p e r s e c o n d ) FPS(frames per second) FPS(framespersecond),这也是 Y O L O V 1 YOLOV1 YOLOV1主打的亮点;
  2. 误检少 Y O L O YOLO YOLO是基于图像的全局信息进行预测的。这一点和基于 s l i d i n g sliding sliding w i n d o w window window以及 r e g i o n region region p r o p o s a l proposal proposal等检测算法不一样。与 F a s t R − C N N Fast R-CNN FastRCNN相比, Y O L O YOLO YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多;
  3. 泛化能力强,体现在可以检测出美术画中的物体;

缺点:

  1. 位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟;
  2. Y O L O YOLO YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低

三. YOLO V1的核心思想

这张图,诠释了YOLO V1的运行过程:

  1. 输入一张图,然后Resize到 448 × 448 448 × 448 448×448
  2. 然后输入到 C N N CNN CNN中;
  3. 输出结果,经过后处理,包括 N M S NMS NMS,得到结果(框和类别);
  • 其中 C N N CNN CNN整体的结构参考 G o o g L e N e t GoogLeNet GoogLeNet模型,包含 24 个 卷 积 层 和 2 个 全 连 接 层 24个卷积层和2个全连接层 242,激活函数为“ L e a k y R e L U Leaky ReLU LeakyReLU",但是最后一层却采用线性激活函数,最后输出的向量维度是 1470 = 7 × 7 × 30 1470 = 7 ×7 ×30 1470=7×7×30,说明最后输出了 7 × 7 7 × 7 7×7“组”结果,每组结果由 30 30 30个数组成。除了上面这个结构,文章还提出了一个轻量级版本 F a s t Fast Fast Y o l o Yolo Yolo,其仅使用 9 个 卷 积 层 9个卷积层 9,并且卷积层中使用更少的卷积核。网络结构如下:
  • Y O L O V 1 YOLO V1 YOLOV1算法首先把重置后的输入图像划分成 S × S S×S S×S的格子,然后对每个格子都预测 B 个 b o u n d i n g B个bounding Bbounding b o x e s boxes boxes,每个 b o u n d i n g bounding bounding b o x box box都包含5个预测值: x , y , w , h 和 c o n f i d e n c e x,y,w,h和confidence x,y,w,hconfidence,再经过概率和 N M S NMS NMS过滤,得到最终结果。其中: x , y x,y x,y就是bounding box的中心坐标,与 g r i d grid grid c e l l cell cell对齐(即相对于当前 g r i d grid grid c e l l cell cell的偏移值),使得范围变成 0 到 1 0到1 01;w和h进行归一化(分别除以图像的w和h,这样最后的w和h就在 0 到 1 0到1 01范围。

3.1. S是多少?

  • 直接回答 S = 7 S=7 S=7,由于网格(grid cell)的数目需要跟最后特征图尺寸一一对应,最后特征图的尺寸为 7 × 7 7 × 7 7×7,因此网格的数目也就是 S × S = 7 × 7 S × S = 7 × 7 S×S=7×7

3.2. 为什么要分成S x S个网格?

用以预测结果(框和类别)的特征图大小为 7 × 7 7× 7 7×7,有49个向量(这里有点像 R P N RPN RPN),每个向量都要去预测**“框”和“类别”**,训练时,我们需要为每个向量分配类别以及是否需要负责预测框,那么如何分配呢?我们需要把 7 × 7 7× 7 7×7个点映射回原图,正好形成 7 × 7 7× 7 7×7个网格,然后根据每个网格跟 G r o u n d Ground Ground T r u t h Truth Truth之间的关系(作者设定了规则去建立联系),来做后续分配。也就是为什么分成 S × S ( 7 × 7 ) S× S(7 × 7) S×S7×7个框了。

3.3. 选择哪些网格(grid cell)去预测框?

每个网格在最后 7 × 7 7 × 7 7×7的特征图上对应一个向量,这个30维向量用来预测结果,那么我们应该选择哪个网格来负责预测框呢?通俗一些,就是哪些网格是正例,哪些是负例(过程有点儿类似RPN,但区别蛮大),先看文中的一段描述:

这句话给了其标准答案,物体的“中心”落在哪个网格中,哪个网格就负责训练这个框(类别和坐标)。这句英文大家都能看懂,但是实际呢?看看下面这张图:

这张图,中心点被标出来了,并且落在了“橘黄网格”中,那么它就是正例,那么“绿色网格”和“白色网格”的标签(Label)是什么呢?这里是与 R P N RPN RPN最大不同之处了, Y O L O V 1 YOLOV1 YOLOV1中,对于一个 G r o u n d Ground Ground T r u t h Truth Truth有且只有一个网格是正例,其余的就算与Ground Truth IOU很大,也是负例,所以“绿色网格”和“白色网格”Label为负,所以也就不用负责训练框坐标了(但是会负责训练其他信息)

3.4. 选好了网格,下一步计算x,y,w,h(用来训练),它们是怎么计算的?

根据原论文我们可以确定几点:

  • 第一: x , y x,y xy指的是中心点,是物体框的中心点,不是网格的中心点(当然物体的中心点必然会落在相应的网格中);
  • 第二: w , h w,h wh指的是物体框的宽高;
  • 第三: x , y , w , h x,y, w, h x,y,w,h都在0-1之间。我们在训练的时候,损失函数( L o s s F u n c t i o n LossFunction LossFunction)计算的是预测的 ( x ‘ , y ’ , w ‘ , h ’ ) (x‘,y’,w‘,h’) xywh与实际值 ( x , y , w , h ) (x,y,w,h) xywh之间的 L 2 − L o s s L2-Loss L2Loss,预测值是通过网络,最后在30维向量中 ( 7 × 7 × 30 ) (7 × 7 × 30) 7×7×30,实际值是怎么算的呢?

比如图片的宽高为 w i d t h , h e i g h t width,height widthheight,物体的中心点为 x , y , x,y, xy宽高为 w , h w,h wh,那么根据论文的描述:
w = w w i d t h h = h h e i g h t begin{aligned} w &=frac{w}{w i d t h} \ h &=frac{h}{h e i g h t} end{aligned} wh=widthw=heighth
x,y在Loss中的值是相对网格的偏移,是相对于网格的中心点还是左上角点的偏移呢?其实这个顾虑是多余的,因为在最后7 x 7大小的特征图上,网格仅仅是一个”点“,相对于它的偏移,我们需要把x,y也映射到7 x 7的特征图上,然后与对应的网格的位置相减,然而我们不难发现,这个过程可以简化为:
x = x ∗ S w i d t h − i n t ( x ∗ S w i d t h ) y = y ∗ S h e i g h t − i n t ( y ∗ S h e i g h t ) begin{aligned} x &=frac{x * S}{w i d t h}-i n tleft(frac{x * S}{w i d t h}right) \ y &=frac{y * S}{h e i g h t}-i n tleft(frac{y * S}{h e i g h t}right) end{aligned} xy=widthxSint(widthxS)=heightySint(heightyS)
根据”选取网格 “的方法,我们知道中心点x,y在7 x 7特征图上的位置的整数部分就是对应网格的位置,因为它们在原图上距离也不超过 448 / S 448 / S 448/S(网格的大小),所以在 7 × 7 7 × 7 7×7的图片上,它们的距离不超过1。

3.5. 实际的训练过程中,需要分S x S个网格么?

根据上一个问题的答案,我们不难发现,实际的训练和预测的过程中,我们是不需要对原图划分网格的,论文中划分网格的目的主要是为了方便表达。

3.6. 最后输出的30维向量,代表什么?

论文中说了,我们一共预测98个框(明明只有49组向量),所以30维向量中一定包含了2个框的信息,也就是两组(x, y, w, h)。由于是在Pascal VOC上训练的,所以还有20个类别信息,这样组合发现只有28个值,难道大家就没有疑问, Y O L O V 1 YOLO V1 YOLOV1是如何区分背景的么? Y O L O V 1 YOLO V1 YOLOV1不仅预测了框的x, y, w, h,还预测了框的分数,用来判断是不是框,所以30维向量成分:2组 ( x , y , w , h , s c o r e ) + 20 ( x, y, w, h, score) + 20 (x,y,w,h,score)+20个类别概率。原文如下:

3.7. 框的分数是怎么算的?

预测的时候,分数是直接输出的,那么训练的时候呢?是不是选中的网格分数为1,没选中的为0,答案是NO,这也是YOLO V1的巧妙之处,YOLO V1计算了一个所谓的IOU(intersection over union:交并比)分数,IOU指的是预测的框与实际框的IOU,这样在训练的时候,我们需要实时的计算这个IOU,作为输入到Loss Function中的“目标”,与预测的IOU分数做L2-Loss,举个例子,第一次迭代,网络会输出一个预测框P1,对应的真实框为G,程序会计算P1和G的IOU,然后继续做Loss。

3.8. 为什么每个输出有两个框,实际却只负责一个框?

其中 Y O L O V 1 YOLO V1 YOLOV1有一个细节,我画图描述一下:

其中,绿色的框P1与白色的框P2是网络预测的框,而红色的框G是真实值,YOLO V1会计算P1与G的IOU1,以及P2与G的IOU2,然后比较哪个IOU大,比如IOU2更大,那么P2的信息会输入到LossFunction中,P1被忽略掉(??)并不是100%被忽略,如果IOU1小于一个阈值,会作为负例,压向0值。

四. YOLO V1的损失函数

这里详细讲一下 l o s s loss loss f u n c t i o n function function。在 l o s s loss loss f u n c t i o n function function中,前面两行表示 l o c a l i z a t i o n localization localization e r r o r error error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。

注意:这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。

第三、四行表示bounding box的confidence损失,就像前面所说的,分成grid cell包含与不包含object两种情况。

注意:这里因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项。

第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object的时候才为1。

损失函数公式如上,里面有几个值得我们借鉴的地方:

  1. 对于平方差,同样很小的数值,对于大框影响相对于小框的影响小一些,(同样的值,加在大框上,可能几乎没有变化,而小框的变化会很大),此时作者是如何处理的呢?文中是把w,h都开根号了,预测的是开根号的值,这样影响会相对一致一些。
  2. 由于每个框只有一个网格负责,那么49个网格,预测98个框,可能只有1-2个是正例,其余的都是负例,需要取向零,这样会导致网络更好的学习负例:
  3. 文中的做法是赋予不同的权重,预测坐标的权重为5,“没有物体“的权重为0.5,权重相差10倍。以上就是 Y O L O V 1 YOLO V1 YOLOV1的主要内容了,建议大家读读论文,感受思想,不用去实现,毕竟 Y O L O V 2 , V 3 YOLO V2,V3 YOLOV2V3更好。

五. 具体实现过程:

5.1. 训练的时候:

输入N个图像,每个图像包含M个object,每个object包含4个坐标 ( x , y , w , h ) (x,y,w,h) xywh和1个label。然后通过网络得到 7 × 7 × 30 7× 7× 30 7×7×30大小的三维矩阵。每个1×30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以**计算损失函数的第一、二 、五行。**至于第二三行,confidence可以根据ground truth(真实边框)和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。

5.2. 测试的时候:

输入一张图像,跑到网络的末端得到 7 × 7 × 30 7× 7× 30 7×7×30 的三维矩阵,这里虽然没有计算 I O U IOU IOU,但是由训练好的权重已经直接计算出了 b o u n d i n g bounding bounding b o x box box c o n f i d e n c e confidence confidence。然后再跟预测的类别概率相乘就得到每个 b o u n d i n g bounding bounding b o x box box属于哪一类的概率。

下一节:论文阅读笔记:YOLOV2全面解读!

参考文献:

  • 懒人赏析YOLO V1
  • https://blog.csdn.net/u014380165/article/details/72616238
  • https://blog.csdn.net/m0_37192554/article/details/81092514
  • https://zhuanlan.zhihu.com/p/25236464
  • 码字不易,欢迎给个赞!

最后

以上就是小巧火龙果为你收集整理的『论文笔记』YOLOV1最全面解读!的全部内容,希望文章能够帮你解决『论文笔记』YOLOV1最全面解读!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部