Yolo算法v1-v3介绍(未完成)

YoloV1

一. Yolo的核心思想就是把整张图作为网络的输入, 直接在输出层回归bounding box的位置及其类别.

二. 实现方法:

  1. 将图像分成S*S个网格, 每个网格预测B个bounding box, 每个bounding box输出5个值, 包括p, x, y, w, h
  2. 每个网格还需要输出C个类别概率. 所以给定一张图片, 网络输出维度为S * S * (5*B+C). 例如在PASCAL VOC中, 图像输入为448 * 448, S=7, B=2, 20个类别, 于是输出为7 * 7 * 30.
  3. 网络结构:
    在这里插入图片描述
    网络基本结构为GoogleNet, 只是去掉了Inception模块用1 * 1 + 3 * 3 的卷积结构替代(简化). 最后把GoogleNet的classifier output用4个卷积层和2个全连接层替换掉, 得到想要的输出维度. 因为使用了全连接层, 预测图片必须和训练图片分辨率一致.
  4. 损失函数:
    在这里插入图片描述
    训练的时候, 分三个部分计算损失, 包括"座标损失", “IOU损失"和"类别损失”.
座标损失: 只计算label中有物体的格子所对应的box. 
用label中的座标x,y, w, h与predict得到的box的x',y', w', h'做平方和损失. 
其余没有物体的格子中的box座标不计入损失函数中. 
x, y, w, h都归一化到0-1之间. 
应该更重视座标预测, 所以座标损失赋予更大的权重, 5. 

注意: 座标损失中, w和h的计算取了根号, 原因是相等的误差值, 对大物体的影响应该小于对小物体的影响. 根据平方根函数(如下图)来看, 取平方根能一定程度缓解这个问题(仍然没有解决).
在这里插入图片描述

IOU损失: 计入损失函数的目的是为了优化所有box的p值(置信度). 
对于有物体的格子, 它的box中的p值应该尽可能的大, 此时把IOU作为p值, 就是希望p尽可能等于1, 表示predict的座标与label的座标尽可能重合. 
对于没有物体的格子, 它的box中的p值应该尽可能等于0, 方便后续根据p值把这些box过滤掉. 
同时, 因为没有物体的格子更多, 数据不平衡, 所以对这些box设置权重为0.5, 减弱每个box的影响. 
类别损失: 关注有物体的格子做的分类预测是否准确, 把分类误差计入损失中. 
  1. 训练过程:
    a. 先用ImageNet预训练: Yolo的前20个卷积层 + 1个average池化层 + 1个全连接层做分类. 图像分辨率为224 * 224.
    b. 前20个卷积层得到了初始化, 然后接上4个卷积层 + 2个全连接层得到检测模型. 在Pascal Voc上用448 * 448的图片训练检测模型.

  2. 预测:
    预测的时候, 对网络得到的所有box, 先把p小于0.5(阈值, 可调节)的box先去掉, 然后对剩下的box, 用非极大值抑制法(NMS)筛选得到最终的结果.

  3. Yolo的优点:
    a. 快: 高准确率下的实时检测.
    b. 背景误检率低. 因为Yolo能看到全局图像, 而基于region的rcnn/fast rcnn等只能看到局部图像.

  4. Yolo的缺点:
    a. 对相互靠近的物体以及小物体的检测效果不好, 因为一个格子只能检测一个物体, 并且算loss的时候即使对w和h开了根号, 小物体的位置偏差仍然对loss贡献不大, 因此没有做到很好的优化.
    b. 泛化能力弱, 对于非常见形状的物体检测效果不好.

YoloV2

YoloV2的目标是提高定位的准确度, 以及改善recall(召回率/查全率).
改进之处有:

  1. Batch Normalization: 卷积层全部使用Batch Normalization, 同时取消Dropout.
  2. 高分辨率分类器: V1中用224 * 224的图片来训练分类器网络, 然后用448 * 448的图像来微调检测网络. V2除了224 * 224的图像, 还用了448 * 448的图像来微调分类器网络, 让filter有时间来调整.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章