yolo原理及代码学习

原理

 

很是详细!!!html

http://www.javashuo.com/article/p-qtiocjua-mk.html网络

 

这篇博客文章讲解特别详细,以前不懂得一些点在这里都找到了答案。ide

https://blog.csdn.net/c20081052/article/details/80236015函数

https://zhuanlan.zhihu.com/p/25045711性能

 

 

YOLO的核心思想

  • YOLO的核心思想就是利用整张图做为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别学习

  • faster RCNN中也直接用整张图做为输入,可是faster-RCNN总体仍是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。测试

大体流程

  1. Resize成448*448,图片分割获得7*7网格(cell)
  2. CNN提取特征和预测:卷积不忿负责提特征。全连接部分负责预测:a) 7*7*2=98个bounding box(bbox) 的坐标x_{center},y_{center},w,h 和是否有物体的confidence 。     b) 7*7=49个cell所属20个物体的几率。
  3. 过滤bbox(经过nms)

 

 

YOLO的实现方法

将一幅图像分红SxS个网格(grid cell),若是某个object的中心 落在这个网格中,则这个网格就负责预测这个object。 
这里写图片描述.net

1. 每一个网格要预测B个bounding box,每一个bounding box除了要回归自身的位置以外,还要附带预测一个confidence值。 设计

2. 这个confidence表明了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的: code

其中若是有object落在一个grid cell里,第一项取1,不然取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。

3. 每一个bounding box要预测(x, y, w, h)和confidence共5个值,每一个网格还要预测一个类别信息,记为C类。则SxS个网格,每一个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。 

注意:class信息是针对每一个网格的,confidence信息是针对每一个bounding box的。

4. 举例说明: 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。

 

 

网络结构

网络结构借鉴了 GoogLeNet 。24个卷积层,2个全连接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )

1. 在test的时候,每一个网格预测的class信息和bounding box预测的confidence信息相乘,就获得每一个bounding box的class-specific confidence score: 这里写图片描述等式左边第一项就是每一个网格预测的类别信息,第二三项就是每一个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的几率,也有该box准确度的信息。

2. 获得每一个box的class-specific confidence score之后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就获得最终的检测结果。

 

损失函数

  • 最后整个的损失函数以下所示: 
    这里写图片描述
    这个损失函数中: 
    • 只有当某个网格中有object的时候才对classification error进行惩罚。
    • 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪一个ground truth box负责就看其预测值和ground truth box的IoU是否是在那个cell的全部box中最大。
  • 其余细节,例如使用激活函数使用leak RELU,模型用ImageNet预训练等等。

损失函数设计:

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的所有采用了sum-squared error loss来作这件事会有如下不足: a) 8维的localization error和20维的classification error同等重要显然是不合理的; b) 若是一个网格中没有object(一幅图中这种网格不少),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种作法是overpowering的,这会致使网络不稳定甚至发散。 解决方案以下:

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 \lambda_{coord} ,在pascal VOC训练中取5。
  • 对没有object的bbox的confidence loss,赋予小的loss weight,记为 \lambda_{noobj} ,在pascal VOC训练中取0.5。
  • 有object的bbox的confidence loss 和类别的loss 的loss weight正常取1。
  • 对不一样大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对一样的偏移loss是同样。 为了缓和这个问题,做者用了一个比较取巧的办法,就是将box的width和height取平方根代替本来的height和width。small bbox的横轴值较小,发生偏移时,反应到y轴上的loss比big box要大。

 

    • 一个网格预测多个bounding box,在训练时咱们但愿每一个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体作法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种作法称做bounding box predictor的specialization(专职化)。每一个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的愈来愈好。(我的理解:IOU最大者偏移会更少一些,能够更快速的学习到正确位置)

 

训练

预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer+ fully connected layer (此时网络输入是224*224)。


训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增长卷积和全连接层能够改善性能。在他们例子基础上添加4个卷积层和2个全连接层,随机初始化权重。检测要求细粒度的视觉信息,因此把网络输入也又224*224变成448*448。

 

 

  • 一幅图片分红7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体。
  • 最后一层输出为 (7*7)*30的维度。每一个 1*1*30的维度对应原图7*7个cell中的一个,1*1*30中含有类别预测和bbox坐标预测。总得来说就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。具体以下:

    • 每一个网格(1*1*30维度对应原图中的cell)要预测2个bounding box (图中黄色实线框)的坐标(x_{center},y_{center},w,h) ,其中:中心坐标的x_{center},y_{center} 相对于对应的网格归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。 每一个bounding box除了要回归自身的位置以外,还要附带预测一个confidence值。 这个confidence表明了所预测的box中含有object的置信度和这个box预测的有多准两重信息:confidence = Pr(Object) \ast IOU^{truth}_{pred}。其中若是有ground truth  box(人工标记的物体)落在一个grid cell里,第一项取1,不然取0。 第二项是预测的bounding box和实际的ground truth box之间的IOU值。即:每一个bounding box要预测 x_{center},y_{center},w,h,confidence,共5个值 ,2个bounding box共10个值,对应 1*1*30维度特征中的前10个。
    • 每一个网格还要预测类别信息,论文中有20类。7x7的网格,每一个网格要预测2个 bounding box 和 20个类别几率,输出就是 7x7x(5x2 + 20)  。 (通用公式: SxS个网格,每一个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:class信息是针对每一个网格的,confidence信息是针对每一个bounding box的)



测试

Test的时候,每一个网格预测的class信息( Pr(Class_i | Object)  )和bounding box预测的confidence信息( Pr(Object) \ast IOU^{truth}_{pred} ) 相乘,就获得每一个bounding box的class-specific confidence score。

    • 等式左边第一项就是每一个网格预测的类别信息,第二三项就是每一个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的几率,也有该box准确度的信息。

    • 对每个网格的每个bbox执行一样操做: 7x7x2 = 98 bbox  (每一个bbox既有对应的class信息又有坐标信息)

 

  •       获得每一个bbox的class-specific confidence score之后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就获得最终的检测结果。  

 

YOLO的缺点

    • YOLO对相互靠的很近的物体,还有很小的群体 检测效果很差,这是由于一个网格中只预测了两个框,而且只属于一类。

    • 对测试图像中,同一类物体出现的新的不常见的长宽比和其余状况是。泛化能力偏弱。

    • 因为损失函数的问题,定位偏差是影响检测效果的主要缘由。尤为是大小物体的处理上,还有待增强。

 

实现

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

http://www.javashuo.com/article/p-fbwammag-cp.html

 https://mp.weixin.qq.com/s/SzHhBf9_5lb0bTtY-qAEJQ

 

 

划分网格怎么实现呢?

 

https://mp.weixin.qq.com/s/SzHhBf9_5lb0bTtY-qAEJQ

相关文章
相关标签/搜索