目标检测从入门到入土

OD_0_yolov1-v3全解析

2019-04-11  本文已影响0人  zestloveheart

1. Introduction

  1. yolo从v1-v2-v3做了一步步迭代,从速度、精度、强度都有了显著的提高。yolo的核心思想在v1中提出,在v2中结合其他研究者的工作做了各方面的改进,在v3中使用了许多技巧进一步优化。
  2. yolo将以往目标检测的two stage方法缩减成one stage,它将以往region proposal的过程融合到后续的分类任务中,将目标的定位和分类用一个end to end的神经网络作为回归问题求解。
  3. 效果与其他网络对比起来,很快,背景误判率低,通用性强,但定位精准性稍差。

2. yolov1

总体流程

yolo先将图像切分成s*s个grid(单元格),让每一个grid负责检测中心点落入该格的目标,预测出B个bounding box定位目标并给出目标类别。

结构

yolo网络由24个卷积层和2个全连接层组成。卷积层用于提取特征,全连接层用于定位和分类。
它借鉴了googleNet的结构,但是未使用inception模块,仅用11和33卷积核简单替代,减小了模型的复杂度。

Loss

它的loss很简单又很巧妙,使用误差平方和(sum-square error)
loss=\sum_{i=0}^{s^2}(coordError^2+iouError^2+classError^2
由于定位误差和分类误差对网络的loss的贡献值是不同的,因此加上了坐标误差权值\lambda_{coord},给无物体的IOU误差权值\lambda_{noobj}
又因为宽高错误对大物体的影响应该小于小物体的影响,所以给宽高加上了根号,但并不能完全解决这个问题。最后得到一个形式稍复杂一点的loss公式。

image.png

训练过程

  1. 预训练,使用前20个conv和1个ave pool和1个全连接做预训练。
  2. 用预训练得到的20层conv初始化yolo的前20层,为了提高精度,将输入图像从224*224 resize到448*448
  3. 使用了leaky ReLU,dropout,data augmentation
  4. 调整学习率。第一个epoch从0.001到0.01,然后0.01持续75epoch,0.001持续30epochs,0.0001持续30epochs

缺陷:

  1. 由于输出为全连接,所以输入图像分辨率大小都要一致
  2. 有很强的空间约束,每个格子只能预测一个目标。每个格子虽然有B个bounding box,但是只选择IOU最高的bounding box做预测,所以有B*5个坐标值,只有C个类别概率,输出为(B*5+C),而不是B*(5+C)。
  3. 对小物体的预测不好
  4. 对于长宽比例的适应性不是太强

3. yolov2

yolov2提高了精度、速度、广泛度。

精度的提高主要表现在对recall的提高。做了以下的修改。

  1. 加上BN,并去除了其他正则化方法如dropout,保证不过拟合。

  2. 使用高分辨率的图像分类器,将预训练的图像从224*224直接转为448*448。
    [图片上传中...(image.png-1ced27-1555252428685-0)]

  3. 加上了anchor机制

    • 移除了最后的全连接(使用conv和GAP替代)和一个池化层(为了使分辨率不减小一半),使recall从81%加到了88%。将图像从448改成416,因为该网络最后是将图像缩小了32倍,416除32会得到一个奇数13,这样可以使每个grid有一个唯一的中心点而不是像偶数有4个。

    • 由于传统anchor的大小比例是手动设置为(8,16,32)*(1:2,1:1,2:1)共9个,而如果能直接使用更好的anchor肯定会对网络效果有利。这里使用了一种改进的k-means算法来自动产生prior anchor(先验框)。在选择kmeans的距离时发现,L2距离在这个任务中不太适用。因为box尺寸大时其误差也会变大,而我们希望和尺寸关系较小,而和是否吻合ground truth较大,所以将距离函数设置为 d=1-IOU。在k定为5时,就取得了传统的9个anchor的效果;k=9时则远超传统anchor。


      image.png
      image.png
    • 引入了anchor后,训练变得不稳定。改进了anchor的坐标公式,之前r-cnn中是全局的偏移,这里改成预测相对于grid的偏移。使用坐标公式:xy=该grid左上角相对于图片的偏移cxcy+预测的xy。wh=先验框的宽高*e^twth


      image.png
      image.png
  4. 为了得到细粒度特征,类似resnet的shortcut引入了passthrough层,直接将高像素特征和低像素特征concatenate,使多级别的特征在最后的预测中都起到效果,提高了小物体的正确率。

  5. 采用多尺度图片训练。把原先固定输入图片大小改成了动态调整输入图像大小,每10个batch就在range(320,608,32)中随机选出一个大小训练。这个操作强制让网络学习多个分辨率的图像,提高了适应性。

速度上,

提出了darknet19模型,19*卷积层+5max pooling+1GAP(global average pooling),取得了很快的速度。

image.png

广泛度

主要体现在yolo9000可以对超过9000个类别的目标进行检测。引入了分层预测的机制,把类别标签从imagenet的横向改成了wordnet的图式构造。在预测一个物体时,逐层预测,使用条件概率,增加准确性。


image.png

4. yolov3

yolov3是增量式改动,也借鉴了他人的诸多工作,提出了darknet53模型。几个重点是:
1、多分类;2、多尺度;3、引入resnet。

定位上使用logistic regression

对anchor包围的部分进行评分,判定该位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。
logistic回归就是用曲线对prior相对于 objectness score映射关系的线性建模。如果先验边界框与真实框的重叠度比之前的任何其他边界框都要好,则该值应该为1。 如果先验边界框不是最好的,但确实与真实对象的重叠超过某个阈值(这里是0.5),那么就忽略这次预测。YOLOv3只为每个真实对象分配一个边界框,如果先验边界框与真实对象不吻合,则不会产生坐标或类别预测损失,只会产生物体预测损失。

分类上不使用softmax,而采用logistic

支持多标签的预测,而非单标签。当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示属于该类。在loss函数中使用了二分类交叉熵。

多尺度预测(FPN)

将高维的特征和低维的特征连接,得到3层特征,对这三层特征分别做预测。每一个scale都输出S*S*B*(5+C)替代了之前的S*S*(B*5+C),将v2中提到的k-means的k改成了9。

基于yolov2的结构,提出了darknet53

使用了residual block。用了更少的浮点运算,并且每秒浮点运算更高。
整个v3中,取消了池化层,图像缩小是通过改变卷积核步长实现的,想缩小一半边长,就设stride=2。在最后的输出层,借鉴了FPN(feature pyramid networks)采用多尺度对不同size的目标进行检测。


image.png

5. 参考

  1. YOLO系列之yolo v2
  2. YOLO v2算法详解
  3. yolo系列之yolo v3【深度解析】(无图无真相)
  4. YOLO v3算法笔记(该抓的重点都抓到了)
  5. 目标检测网络之 YOLOv3(v1-v3合集)
上一篇下一篇

猜你喜欢

热点阅读