Yolo笔记

date
May 29, 2021
Last edited time
May 1, 2022 03:37 PM
status
Published
slug
yolo-note
tags
DL
CV
summary
总结yolo网络的笔记, 可能之后会更新, 但也不一定会在网站上发布出来
type
Post
origin
Field
Plat

YOLO是什么?

YOLO是目标检测模型。
目标检测是计算机视觉中比较简单的任务,用来在一张图篇中找到某些特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置
显然,类别是离散数据,位置是连续数据。
notion image
上面的图片中,分别是计算机视觉的三类任务:分类,目标检测,实例分割。
很显然,整体上这三类任务从易到难,我们要讨论的目标检测位于中间。前面的分类任务是我们做目标检测的基础,至于像素级别的实例分割,太难了别想了。
YOLO在2016年被提出,发表在计算机视觉顶会CVPR(Computer Vision and Pattern Recognition)上,论文的国内镜像在这里:
YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。
因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region
也就是说,一个典型的Region-base方法的流程是这样的:先通过计算机图形学(或者深度学习)的方法,对图片进行分析,找出若干个可能存在物体的区域,将这些区域裁剪下来,放入一个图片分类器中,由分类器分类。
因为YOLO这样的Region-free方法只需要一次扫描,也被称为单阶段(1-stage)模型。Region-based方法方法也被称为两阶段(2-stage)方法。

YOLO之前的世界

YOLO之前的世界,额,其实是R-CNN什么的,也就是我们前面说的Region-based方法,但是感觉还是太高端了。我们从用脚都能想到的目标检测方法开始讲起。
如果我们现在有一个分类器:
notion image
这只猫咪好可爱,想撸。
现在我们的追求升级了,我们不仅仅想处理这种一张图片中只有一个物体的图片,我们现在想处理有多个物体的图片。
我们该什么做呢?
首先有几点我们要实现想到:首先物体的位置是不确定的,你没办法保证物体一定在最中间;其次,物体的大小是不确定的,有的物体比较大,也有的物体比较小,注意,这里不是说大象一定更大,猫咪一定更小,毕竟还有近大远小嘛;然后,我们还没办法保证物体的种类,假设我们有一个可以识别100中物体的分类器,那么起码图片中出现了这100种物体我们都要识别出来。
比如说这样:
notion image
挺难的,是吧?
最naive的方法是滑窗法,就是用滑动窗口去识别一个个物体。
比如这样:
notion image
上图的红色框框就是所谓的滑窗。如果一个物体正好出现在一个滑窗中,那么我们就可以把它检测出来了,这个滑窗的位置也就是我们认为这个物体所在的位置
等下,如果物体没有正好出现在一个滑窗中呢?
我们管滑窗每次滑动的距离叫做步长,如果我们把步长设置的特别小,如果步长仅仅为一个像素点,那一定可以保证物体可以正好出现在某个窗口中了。
那如果某个物体特别大,或者特别小呢?
例如在上图中,每个窗口和汽车差不多大小,但是如果我们要识别一辆卡车,一个窗口可能就不够大了。
显然,我们可以设计不同大小的窗口,我们可以设计几十中不同大小的窗口,让他们按照最小的步长滑动,把窗口里的所有图片都放入分类器中。
但是这样太太太浪费时间了。
到这里R-CNN同学出现了,他说,你这样用滑窗法可能最后得到了几十万个窗口,而我可以提前扫描一下图片,得到2000个左右的Region(其实就是前面的窗口),这样不就节省了很多时间?
R-CNN同学管这个叫做Region Proposal,并且提出了一个叫做Selective Search的算法。(吐槽一下这个名字起得太大众了)
但是R-CNN被YOLO打脸了,YOLO说,我更快。

YOLO原理

在这之前,我们再重申一下我们的任务。我们的目的是在一张图片中找出物体,并给出它的类别和位置。目标检测是基于监督学习的,每张图片的监督信息是它所包含的N个物体,每个物体的信息有五个,分别是物体的中心位置(x,y)和它的高(h)宽(w),最后是它的类别。
YOLO 的预测是基于整个图片的,并且它会一次性输出所有检测到的目标信息,包括类别和位置。
就好像捕鱼一样,R-CNN是先选好哪里可能出现鱼,而YOLO是直接一个大网下去,把所有的鱼都捞出来。
先假设我们处理的图片是一个正方形
YOLO的第一步是分割图片,它将图片分割为个grid,每个grid的大小都是相等的,像这样:
notion image
如果我们让每个框只能识别出一个物体,且要求这个物体必须在这个框之内,那YOLO就变成了很蠢的滑窗法了。
YOLO的聪明之处在于,它只要求这个物体的中心落在这个框框之中。
这意味着,我们不用设计非常非常的框,因为我们只需要让物体的中心在这个框中就可以了,而不是必须要让整个物体都在这个框中。
具体怎么实现呢?
我们要让这个 个框每个都预测出B个bounding boxs,这个bounding boxs有5个量,分别是物体的中心位置(x,y)和它的高(h)宽(w),以及这次预测的置信度
也就是说,如果我们有个框框,每个框框的bounding boxes个数为B,分类器可以识别出C种不同的物体,那么所有整个ground truth的长度为:
论文当中是先验框不负责预测类别, 只有 grid 预测类别, 因此维度是 . 但是在常见的实现当中, 看到的基本是先验框也负责预测类别.
破案了, 这个论文是旧版本的, 里面居然还用了全连接层 ( ̄▽ ̄)"
先看这些bounding boxs显示出来是什么样的:
notion image
在上面的例子中,图片被分成了49个框,每个框预测2个bounding boxs,因此上面的图中有98个bounding boxs。
可以看到大致上每个框里确实有两个bounding boxs。
可以看到这些BOX中有的边框比较粗,有的比较细,这是置信度不同的表现,置信度高的比较粗,置信度低的比较细。

Bounding Box

notion image
网络的结构如上, 就拿最底层的输出 来作为示例吧, 图上写的输出大小为 , 其实可以看作
然后单独拿出一个位置的一个预测框来做处理, 写作
那么在这个特征图尺度上的对应AnchorBox 预测出来的先验框为:
对了, AnchorBox的大小要缩放到这个特征图的大小 预测出来的 也是对应这个特征图大小, 因此最后要乘stride, 返回真是预测结果
对了, 是预测物体的中心坐标哦~
那么, 对于 个先验框, 我们都有预测结构, 所以可以看成是一个 的输出. 然后, 我们就可以把三个网络的三个输出 愉快地叠加在一起啦!
 

Confidence

接下来,我们好好说道说道这个confidence。
confidence的计算公式是:
这个IOU的全称是intersection over union,也就是交并比,它反应了两个框框的相似度。
notion image
的意思是预测的bounding box和真实的物体位置的交并比。
是一个grid有物体的概率,在有物体的时候ground truth为1,没有物体的时候ground truth为0.
如果某个grid cell无object则 ,否则 ,则此时的 ,即预测的bbox和ground truth的IOU值作为置信度。因此这个confidence不仅反映了该grid cell是否含有物体,还预测这个bbox坐标预测的有多准。
当在预测阶段的时候, 此时的类别概率为
At test time we multiply the conditional class probabilities and the individual box confidence predictions, which gives us class-specific confidence scores for each box. These scores encode both the probability of that class appearing in the box and how well the predicted box fits the object.

非极大值抑制

这里,我们要用到一个叫做非极大值抑制Non-maximal suppression(NMS)的技术。
这个NMS还是基于交并比实现的。
notion image
例如在上面狗狗的图里,B1,B2,B3,B4这四个框框可能都说狗狗在我的框里,但是最后的输出应该只有一个框,那怎么把其他框删除呢?
这里就用到了我们之前讲的confidence了,confidence预测有多大的把握这个物体在我的框里,我们在同样是检测狗狗的框里,也就是B1,B2,B3,B4中,选择confidence最大的,把其余的都删掉。
也就是只保留B1.
这里用到NMS的技巧,我们首先判断这几个grid的类别是不是相同的,假设上面的B1,B2,B3和B4识别的都是狗狗,那么进入下一步,我们保留B1,然后判断B2,B3和B4要不要删除。
我们把B1成为极大bounding box,计算极大bounding box和其他几个bounding box的IOU,如果超过一个阈值,例如0.5,就认为这两个bounding box实际上预测的是同一个物体,就把其中confidence比较小的删除。
最后,我们结合极大bounding box和grid识别的种类,判断图片中有什么物体,它们分别是什么,它们分别在哪。
notion image
我们刚才说confidence有两个功能,一个是用来极大值抑制,另一个就是在最后输出结果的时候,将某个bounding box的confidencd和这个bounding box所属的grid的类别概率相乘,然后输出。
举个例子,比如某个grid中的某个bounding box预测到了一个物体,将这个bounding box送入神经网络(其实是整张图片一起送进去的,我们这样说是为了方便),然后神经网络对bounding box说,你这里有一个物体的概率是0.8.然后神经网络又对grid说,你这个grid里物体最可能是狗,概率是
那最后这里是狗的概率就是
 

损失函数

yolo的损失函数是这样的:
denotes if object appears in cell denotes that the th bounding box predictor in cell is “responsible” for that prediction.
其中可以分为四个部分
  1. 对预测的中心坐标做损失
    1. 这里的x, y 是每个grid当中置信度对高的先验框预测出来的值
  1. 对预测边界框的宽高做损失
    1. 和上一个类似, 不过使用开方来使灵敏度相同
      像是那个线控里面学的对数流量特性, 保证宽高不同的时候又相同的灵敏度
  1. 对预测的类别做损失
  1. 对预测的置信度做损失
 

© Lazurite 2021 - 2024