Yolo

yolo 思想

  • 什么是目标检测

  • 找出图片中物体的bounding box(边界框),并判定框内物体的类别。边界框可以用左上角坐标(x,y)和矩形的宽高(w,h)来表示。
    在这里插入图片描述

  • 目标检测如何做?

  • 一个很自然的想法是,把图片喂给深度模型,让网络吐出 bounding box的 xywh四个值以及边框中物体的类别就好了。这么做貌似可行,但如果,图片中不止一个物体,我们想把它们都框出来,但是我们不知道图片中有多少个物体,模型的输出维度是没法固定的,且图片中存在的物体越多,模型输出的维度就越大,看来这种思路行不通。

  • yolo 做法

    • 既然模型的输出需要固定维度,那我们能不能设计一个固定维度大小的输出,并且输出的维度足够大,足以覆盖图像中所有的物体呢?答案是肯定的,yolo这是这么干的。
    • yolo 固定维度的办法是把模型的输出(图片)划分成网格形状,每个网格中cell(格子)都可以输出物体的类别和bounding box坐标
  • cell怎么知道需要预测图像中的那个物体呢?这取决于我们怎么设置模型的训练目标,说白点就是,你要教他去预测那个物体。

  • 在这里插入图片描述

  • 具体来说,yolo是这么做的:

  • 将输入图像按照模型的输出网格(如7*7大小)划分,划分后就有很多小cell。再看图像中物体的中心是落在哪个cell里面,落在哪个cell哪个就负责预测这个物体,如图中,狗的中心落在了红色cell内,这个cell负责预测狗。

  • 物体落在哪个cell,哪个cell就负责预测这个物体,要分两个阶段看,训练和预测阶段

    • 训练阶段。 如果物体中心落在这个cell,那么就给这个cell打上这个物体的label(包括xywh和类别)。通过这种方式来设置训练的label,我们在训练阶段教会cell要预测图像中的哪个物体。
    • 测试阶段。因为训练阶段已经教会了cell去预测中心落在该cell中的物体,那么cell在测试阶段自然会这么做,预测中心落在它上面的物体。
    • 原文是按照测试阶段来解说的,其实知道训练阶段的意义更重要,因为训练阶段你告诉网络去预测什么,然后测试阶段网络才能按照你训练阶段教它的去做,物体落在哪个cell,哪个cell就负责预测这个物体 开始时看的一头雾水,看了知乎stone解释才算明白。

模型

在这里插入图片描述
在这里插入图片描述

  • 从图中可以看到,yolo网络的输出的网格是7*7大小的,也可用计算得到448/2^6=7。输出的channel数目是30,前20个元素是类别概率值,然后2个是边界框confidence,最后8个元素是边界框的xywh

这里的channel和分类任务中的channel所代表的意义还是有点不同的。

每个cell有两个 predictor

  • 每个predictor 分别预测一个bounding box的xywh和对应的confidence,但分类部分的预测却是共享的,正是因为这个共享,同个cell无法预测多个目标。
  • 假设类别预测不是共享的,cell中两个predictor分别有各自的类别预测,这样能否在一个cell中预测两个目标?
  • 答案是否定的。如果一个cell要预测两个目标,那么这两个predictor要怎么分工预测这两个目标?谁负责谁?不知道,所以没办法预测。而像faster r-cnn这类算法,可以根据anchor与ground truth的IOU大小来安排anchor负责预测哪个物体,所以后来loyo v2也采用了anchor思想,同一个cell才能预测多个目标
  • 为什么要预测两个bounding box?
    • 既然一个cell只能预测一个目标,为什么还要预测两个bounding box(或者更多)?这个要从训练阶段怎么给两个predictor 安排训练目标来说。在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor,就会负责预测这个物体,另外一个则不预测。这么做有什么好处?我的理解是,这样做的话,实际上有两个predictor来一起进行预测,然后网络会在线选择预测得好的那个predictor(也就是IOU大)来进行预测。通俗一点说,就是我找一堆人来并行地干一件事,然后我选干的最好的那个。

yolo v2

better faster stronger

  • 这篇论文是为了改进 yolo 原有的算法,yolo 有两个缺点:一个是定位不准确,另一个是和基于 region proposal 的方法相比,召回率低

better

  • batch normalization
  • 对网络的每一层的输入都做了归一化处理,这样网络就不用每层都去学数据的分布,收敛会更快。yolo v2 加入 BN,去掉了 dropout,提高了 2% mAP
  • high resolution classifier
    • 原来的YOLO网络在预训练的时候采用的是224224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP
  • convolution with anchor boxes
    • 原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。
    • 奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell。为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测。
    • 原来的YOLO算法将输入图像分成77的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为1313为例,每个grid cell有9个anchor box的话,一共就是13139=1521个,yolo v2中,最终每个grid cell选择5个anchor box 3135 = 845)
  • dimension cluster
  • Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸(如何调整?)。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。
    • 如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关
  • d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroid) = 1-IOU(box, centroid) d(box,centroid)=1IOU(box,centroid)
  • direction location prediction
    • 作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的(x,y)值。我们知道在基于region proposal的object detection算法中,预测的是offset
    • t x = ( x − x a ) w a , t y = y − y a h a t_x = {(x-x_a) \over w_a} , t_y = {y-y_a \over h_a} tx=wa(xxa),ty=hayya
    • 作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式
      在这里插入图片描述在这里插入图片描述
  • fine-grained features
    • passthrough layer。这个层的作用就是将前面一层的2626的feature map和本层的1313的feature map进行连接,有点像ResNet。这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。也容易理解,越小的object,经过层层卷积和pooling,可能到最后都不见了,所以通过合并前一层的size大一点的feature map,可以有效检测小的object。
  • 未完待续。。。。
标题卷积输出尺寸计算
  • 一般卷积层不会改变输入输出图像的大小,赤化层会缩小图像的大小
    • 例如,输入图像是 416x416 经过 5个池化层,输出图像大小为 13 x13(416/2^5 = 13)
1 x 1 卷积
  • 将孤立的通道特征组合起来

[1] : https://zhuanlan.zhihu.com/p/37850811 你真的读懂yolo了吗?
[2] : https://zhuanlan.zhihu.com/p/31427164 yolo
[3] : https://blog.csdn.net/u014380165/article/details/77961414 yolo v2
[4] : https://blog.csdn.net/u014380165/article/details/80202337 yolo v3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值