YOLO系列总结

在研究了目标检测领域YOLO系列算法,读了作者相关的论文,参加了目标检测比赛,最终对YOLO系列算法做一个总结,包括算法解决的问题、架构设计、优势、缺点等。

YOLOv1

解决的问题和优势

  1. 将目标检测打通为端到端的训练。
  2. 目标检测速度快。端到端的架构使得速度有了很大提升,base YOLO model可以达到45帧/秒,tiny YOLO可以达到155帧/秒。

模型设计

YOLO系列总结_第1张图片

  1. 包含24个卷积层和2个全连接层。作者使用ImageNet预训练模型,使用了224 * 224预训练模型,在inference时分辨率加倍为448 * 448,这一技巧在CS231n课程中有所提及(使用低分辨率训练,预测采用高分辨率,这有助于提高准确率)。
  2. 最后一层全连接层尺寸7*7*(2*5+20),将图片划分为7*7的Cell,每个Cell只可以预测一类物体,每一个Cell包含2个BBox(Bounding Box),每个BBox预测(confidence, x, y, w, h)其中confidence为该BBox包含物体的概率。VOC有20类(含背景),所以最后一层全连接层尺寸为7*7*(2*5+20)。类似于一个30通道的图片,每一个通道代表了其中一个Cell预测的一个BBox的概率和坐标。
  3. 值得注意的是YOLO同时预测多个BBox(作者论文中VOC数据集训练的模型是2个BBox),在训练时只选取一个与ground truth的IoU最大的BBox。

YOLO系列总结_第2张图片
每个cell会预设2个default bbox,但是inference过程只有一个bbox有效,也就是一个cell最终只能预测一个bbox类别。如class probability map所示,一个cell只有一个class。

Loss Function

YOLO系列总结_第3张图片

  1. 对预测的中心坐标做损失
    λ cord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj  [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] \lambda_{\text {cord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] λcord i=0S2j=0B1ijobj [(xix^i)2+(yiy^i)2]
  2. 对预测边界框的宽高做损失
    λ coord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj  [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}})^{2}+(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}})^{2}\right] λcoord i=0S2j=0B1ijobj [(wi w^i )2+(hi h^i )2]
  3. 对预测的类别做损失
    ∑ i = 0 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j n o o b j ( C i − C ^ i ) 2 \begin{array}{c}{\sum_{i=0}^{2} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\mathrm{obj}}\left(C_{i}-\hat{C}_{i}\right)^{2}} {+\lambda_{\mathrm{noobj}} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\mathrm{noobj}}\left(C_{i}-\hat{C}_{i}\right)^{2}}\end{array} i=02j=0B1ijobj(CiC^i)2+λnoobji=0S2j=0B1ijnoobj(CiC^i)2
  4. 对预测的置信度做损失
    ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 \sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\mathrm{obj}} \sum_{c \in \mathrm{classes}}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} i=0S21iobjcclasses(pi(c)p^i(c))2

缺点

  1. 定位错误相对于RCNN系列较大。
  2. 召回率低。(你挑选出的真正的好瓜占所有真正的好瓜的比例)

R e c a l l = T P T P + F N , P r e c i s i o n = T P T P + F P Recall = \frac{TP}{TP+FN}, Precision=\frac{TP}{TP+FP} Recall=TP+FNTP,Precision=TP+FPTP

YOLOv2

解决的问题和优势

  1. 对YOLOv1检测精度、召回率和速度的提升。
  2. 采用多尺度训练,能够在精度和速度中根据需求权衡。

模型设计

  1. 使用Batch Normalization。在每一层卷积后使用BN并去掉最后一层dropout后,模型也不会过拟合,mAP提升了2%.
  2. High Resolution Classifier:先在ImageNet上采用224224分辨率训练160 epochs,后使用448448分辨率训练10 epoch,让模型调整网络以适应高分辨率,在预测时采用448*448分辨率。mAP提高了4%,可以说这是一个比较重要的训练方法。
  3. Anchor Box:类似于Faster RCNN,YOLOv2在每一个Cell采用9个anchor box。
  4. Dimension Clusters:通过k-means聚类生成anchor box尺寸,聚类生成9个尺寸,考虑模型的效率最终只使用5个IOU最大的anchor box。考虑到若使用欧式距离不同大小的BBox误差与BBox大小有关,采用IOU作为聚类的标准就能避免这一问题。
  5. Direct location prediction:
  6. Fine-Grained Features(细粒度特征):采用了类似于Resnet的结构,通过在最后一层1313上一层添加passthrough将上一层2626的特征图添加到13*13上,增加最后一层细粒度特征提高了1%mAP。
  7. Multi-Scale Training:注意这一步是在检测数据集上fine tune时候采用的,不要跟前面在Imagenet数据集上的两步预训练分类模型混淆。具体来讲,在训练网络时,每训练10个batch,网络就会随机选择另一种size的输入。那么输入图像的size的变化范围要怎么定呢?前面我们知道本文网络本来的输入是416416,最后会输出1313的feature map,也就是说downsample的factor是32,因此作者采用32的倍数作为输入的size,具体来讲文中作者采用从{320,352,…,608}的输入尺寸。
  8. 最后作者提出了新的架构Darknet 19(19个卷积层),计算消耗和分类准确率相较于基于Googlenet的自定义架构和VGG16都有提升。该网络可以用于分类也可用于检测。
    参考

Loss函数
YOLOv2详解

你可能感兴趣的:(总结,Machine,Learning)