YOLOv1到YOLOv3之比较

文章转载自https://www.cnblogs.com/makefile/p/YOLOv3.html

本文逐步介绍YOLO v1~v3的设计历程。

YOLOv1的基本思想

YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。

每个格子预测B个bounding box及其置信度(confidence score),以及C个类别概率。bbox信息 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)为物体的中心位置相对格子位置的偏移及宽度和高度,均被归一化.置信度反映是否包含物体以及包含物体情况下位置的准确性,定义为 P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Object)\times IOU^{truth}_{pred} Pr(Object)×IOUpredtruth,其中 P r ( O b j e c t ) ∈ 0 , 1 . Pr(Object)\in {0,1}. Pr(Object)0,1.

网络结构

YOLOv1网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用 1 × 1 1\times 1 1×1卷积层(此处 1 × 1 1\times 1 1×1卷积层的存在是为了跨通道信息整合) + 3 × 3 + 3\times 3 +3×3卷积层简单替代。
YOLOv1网络在最后使用全连接层进行类别输出,因此全连接层的输出维度是 S × S × ( B × 5 + C ) . S\times S\times (B\times 5 + C). S×S×(B×5+C).
YOLOv1网络比VGG16快(浮点数少于VGG的1/3),准确率稍差。

缺馅:

  • 输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成改分辨率。

  • 占比较小的目标检测效果不好.虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。

损失函数

YOLO全部使用了均方和误差作为loss函数.由三部分组成:坐标误差、IOU误差和分类误差。
L o s s = ∑ i = 0 s 2 c o o r d E r r + i o u E r r + c l s E r r Loss = \sum_{i=0}^{s^2} coordErr + iouErr + clsErr Loss=i=0s2coordErr+iouErr+clsErr

简单相加时还要考虑每种 l o s s loss loss的贡献率,YOLO给 c o o r d E r r coordErr coordErr设置权重 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5。在计算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络 l o s s loss loss的贡献值是不同的。若采用相同的权值,那么不包含物体的格子的confidence值近似为0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用 λ n o o b j = 0.5 \lambda_{noobj}=0.5 λnoobj=0.5修正 i o u E r r iouErr iouErr。(此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内)。对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项( w w w h h h)进行求平方根来改进这个问题,但并不能完全解决这个问题。

综上,YOLO在训练过程中Loss计算如下式所示:

其中有宝盖帽子符号 ( x ^ , y ^ , w ^ , C ^ , p ^ ) (\hat x, \hat y, \hat w, \hat C, \hat p) (x^,y^,w^,C^,p^)为预测值,无帽子的为训练标记值。 1 i j o b j \mathbb{1}^{obj}_{ij} 1ijobj表示物体落入格子 i i i的第 j j j个bbox内。如果某个单元格中没有目标,则不对分类误差进行反向传播; B B B个bbox中与ground truth bbox具有最高IoU的一个进行坐标误差的反向传播,其余不进行。

训练过程

1)预训练 — 使用 ImageNet 1000 类数据训练YOLO网络的前20个卷积层,$+$1个average池化层 + + + 1个全连接层。训练图像分辨率resize到 224 × 224 224\times 224 224×224

2)用步骤1)得到的前20个卷积层网络参数来初始化YOLO模型前20个卷积层的网络参数,然后用 VOC 20 类标注数据进行YOLO模型训练。检测通常需要有细密纹理的视觉信息,所以为提高图像精度,在训练检测模型时,将输入图像分辨率从 224 × 224 224 \times 224 224×224 resize到 448 × 448 448\times 448 448×448

训练时 B B B个bbox的ground truth设置成相同的。

与Fast R-CNN对比

YOLO与Fast R-CNN相比有较大的定位误差,与基于region proposal的方法相比具有较低的召回率。但是,YOLO在定位识别背景时准确率更高,而 Fast-R-CNN 的 false positive 很高。基于此作者设计了 Fast-R-CNN + YOLO 检测识别模式,即先用R-CNN提取得到一组bounding box,然后用YOLO处理图像也得到一组bounding box。对比这两组bounding box是否基本一致,如果一致就用YOLO计算得到的概率对目标分类,最终的bouding box的区域选取二者的相交区域。这种组合方式将准确率提高了3个百分点。

升级版 YOLOv2

为提高物体定位精准性和召回率,YOLO作者提出了 “YOLO9000: Better, Faster, Stronger” (Joseph Redmon, Ali Farhadi, CVPR 2017, Best Paper Honorable Mention),相比YOLOv1 提高了训练图像的分辨率;引入了faster rcnn中anchor box的思想,对网络结构的设计进行了改进,输出层使用卷积层替代YOLO的全连接层,联合使用coco物体检测标注数据和imagenet物体分类标注数据训练物体检测模型。相比YOLO,YOLO9000在识别种类、精度、速度、和定位准确性等方面都有大大提升。

YOLOv2的改进之处

YOLO与Fast R-CNN相比有较大的定位误差,与基于region proposal的方法相比具有较低的召回率。因此YOLO v2主要改进是提高召回率定位能力。下面是改进之处:

  • Batch Normalization: v1中也大量用了Batch Normalization,同时在定位层后边用了dropout,v2中取消了dropout,在卷积层全部使用Batch Normalization。
  • 高分辨率分类器:v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。
  • Anchor Boxes:YOLOv1中直接在卷积层之后使用全连接层预测bbox的坐标。YOLOv2借鉴Faster R-CNN的思想预测bbox的偏移。移除了全连接层,并且删掉了一个pooling层使特征的分辨率更大一些。另外调整了网络的输入( 448 → 416 448\rightarrow 416 448416)以使得位置坐标是奇数只有一个中心点(YOLO使用pooling来下采样,有5个 s i z e = 2 size=2 size=2 s t r i d e = 2 stride=2 stride=2的max pooling,而卷积层没有降低大小,因此最后的特征是 416 / ( 2 5 ) = 13 ) 416/(2^5)=13) 416/(25)=13)。YOLOv1中每张图片预测 7 × 7 × 2 = 98 7\times 7\times 2=98 7×7×2=98个box,而YOLOv2加上Anchor Boxes能预测超过1000个。检测结果从69.5mAP,81% recall变为69.2 mAP,88% recall。

YOLOv2对Faster R-CNN的手选先验框方法做了改进,采样k-means在训练集bbox上进行聚类产生合适的先验框。由于使用欧氏距离会使较大的bbox比小的bbox产生更大的误差,而IOU与bbox尺寸无关,因此使用IOU参与距离计算,使得通过这些anchor boxes获得好的IOU分值。距离公式:
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)

使用聚类进行选择的优势是达到相同的IOU结果时所需的anchor box数量更少,使得模型的表示能力更强,任务更容易学习。k-means算法代码实现参考:k_means_yolo.py。算法过程是:将每个bbox的宽和高相对整张图片的比例 ( w r , h r ) (w_r,h_r) (wr,hr)进行聚类,得到 k k k个anchor boxes,由于DarkNet代码需要配置文件中region层的anchors参数是绝对值大小,因此需要将这个比例值乘上卷积层的输出特征的大小。如输入是 416 × 416 416\times 416 416×416。那么最后卷积层的特征是 13 × 13 13\times 13 13×13

  • 细粒度特征(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以适应不同尺度大小的目标。YOLOv2使用了一种不同的方法,简单添加一个 pass through layer,把浅层特征图( 26 × 26 26\times 26 26×26)连接到深层特征图(连接到新加入的三个卷积核尺寸为 3 × 3 3 \times 3 3×3的卷积层最后一层的输入)。 通过叠加浅层特征图相邻特征到不同通道(而非空间位置),类似于Resnet中的identity mapping。这个方法把 26 × 26 × 512 26\times 26\times 512 26×26×512的特征图叠加成 13 × 13 × 2048 13\times 13\times 2048 13×13×2048的特征图,与原生的深层特征图相连接,使模型有了细粒度特征。此方法使得模型的性能获得了1%的提升。
  • Multi-Scale Training:和YOLOv1训练时网络输入的图像尺寸固定不变不同,YOLOv2(在cfg文件中random=1时)每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代10次,就会随机选择新的输入图像尺寸。因为YOLOv2的网络使用的downsamples倍率为32,所以使用32的倍数调整输入图像尺寸 320 , 35 , ⋯ , 608 {320,35, \cdots,608} 320,35,608。训练使用的最小的图像尺寸为 320 × 320 320 \times 320 320×320,最大的图像尺寸为 608 × 608 608 \times 608 608×608。 这使得网络可以适应多种不同尺度的输入。

YOLOv2网络结构

YOLOv2对v1的基础网络做了更改。
分类网络
YOLOv2提出了一种新的分类模型Darknet-19。借鉴了很多其它网络的设计概念。主要使用 3 × 3 3\times 3 3×3卷积并在pooling之后channel数加倍(VGG);Global average pooling替代全连接做预测分类,并在 3 × 3 3\times 3 3×3卷积之间使用 1 × 1 1\times 1 1×1卷积压缩特征表示(Network in Network);使用 batch normalization 来提高稳定性,加速收敛,对模型正则化。
Darknet-19的结构如下表:

包含19个卷积层和5个max pooling层。

训练:使用Darknet框架在ImageNet 1000类上训练160 epochs,学习率初始为0.1,以4级多项式衰减。weight decay=0.0005,momentum=0.9。使用标准的数据增广方法:random crops, rotations, (hue, saturation), exposure shifts。

之后将输入从224放大至448,学习率调整为0.001,迭代10 epochs。结果达到top-1 accuracy 76.5% , top-5 accuracy 93.3%。

检测网络

在分类网络中移除最后一个 1 × 1 1\times 1 1×1的层,在最后添加3个 3 × 3 × 1024 3\times 3\times 1024 3×3×1024的卷积层,再接上输出是类别个数的 1 × 1 1\times 1 1×1卷积。
对于输入图像尺寸为 S i × S i S_i \times S_i Si×Si,最终 3 × 3 3\times 3 3×3卷积层输出的feature map是 O i × O i ( O i = S i / ( 2 5 ) ) O_i \times O_i(O_i=S_i/(2^5)) Oi×Oi(Oi=Si/(25)),对应输入图像的 O i × O i O_i \times O_i Oi×Oi个栅格,每个栅格预测 n u m a n c h o r s num_{anchors} numanchors种boxes大小,每个box包含4个坐标值,1个置信度和
n u m c l a s s e s num_{classes} numclasses个条件类别概率,所以输出维度是 O i × O i × n u m a n c h o r s × ( 5 + n u m c l a s s e s ) O_i \times O_i \times num_{anchors} \times (5 + num_{classes}) Oi×Oi×numanchors×(5+numclasses)

passthrough layer
添加passthrough layer(跨层跳跃连接,借鉴ResNet等思想),融合粗细粒度的特征:将前面最后一个 3 × 3 × 512 3\times 3\times 512 3×3×512卷积的特征图,对于 416 × 416 416\times 416 416×416的输入,该层输出 26 × 26 × 512 26\times 26\times 512 26×26×512,直接连接到最后新加的三个 3 × 3 3\times 3 3×3卷积层的最后一个的前边。将 26 × 26 × 512 26\times 26\times 512 26×26×512变形为 13 × 13 × 1024 13\times 13\times 1024 13×13×1024与后边的 13 × 13 × 1024 13\times 13\times 1024 13×13×1024特征按channel堆起来得到 13 × 13 × 3072 13\times 13\times 3072 13×13×3072。从yolo-voc.cfg文件可以看到,第25层为route层,逆向9层拿到第16层 26 × 26 × 512 26\times 26\times 512 26×26×512的输出,并由第26层的reorg层把 26 × 26 × 512 26\times 26\times 512 26×26×512 变形为 13 × 13 × 2048 13\times 13\times 2048 13×13×2048,再有第27层的route层连接24层和26层的输出,堆叠为 13 × 13 × 3072 13\times 13\times 3072 13×13×3072,由最后一个卷积核为 3 × 3 3\times 3 3×3的卷积层进行跨通道的信息融合并把通道降维为1024。

训练:作者在VOC2007和2012以及COCO2014数据集上迭代了160 epochs,初始学习率0.001,在60和90 epochs分别减小为0.1倍。
Darknet训练VOC的参数如下:

YOLOv3

提出了一种联合训练方法,能够容许同时使用目标检测数据集和分类数据集。使用有标记的检测数据集精确定位,使用分类数据增加类别和鲁棒性。

YOLOv3在Pascal Titan X上处理 608 × 608 608\times 608 608×608图像速度达到20FPS,在 COCO test-dev 上 mAP@0.5 达到 57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快4倍.

YOLO v3的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

速度对比如下:

改进之处

  • 多尺度预测(与FPN类似);
  • 更好的基础分类网络(与ResNet类似)和分类器。

分类器 - 类别预测

YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:

  • Softmax 使得每个框分配一个类别(score最大的那个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因而Softmax不适用于多标签分类。
  • Softmax可被独立的多个logistic分类器替代,且准确率不会下降。分类损失采用binary cross-entropy loss。

多尺度预测

每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3种尺度。

  • 尺度1:在基础网络之后添加一些卷积层,再输出box信息;
  • 尺度2:从尺度1种的倒数第二层的卷积层上采样( × 2 \times 2 ×2),再与最后一个 16 × 16 16\times 16 16×16大小的特征图相加,再次通过多个卷积后输出box信息,相比尺度1变大两倍;
  • 尺度3:和尺度2类似,使用了 32 × 32 32\times 32 32×32大小的特征图。

参考网络结构定义文件:yolov3.cfg

基础网络 Darknet-53

仿ResNet, 与ResNet-101或ResNet-152准确率接近,但速度更快。对比如下:

网络结构如下:

YOLOv3在 mAP 为0.5 及小目标 APS 上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合。

边框预测

作者尝试了常规的预测方式(Faster R-CNN),然而并不奏效: x , y x,y x,y的偏移作为box的长宽的线性变换。
G ^ x = P w t x ( P ) + P x \hat G_x = P_w t_x (P) + P_x G^x=Pwtx(P)+Px
G ^ y = P h t y ( P ) + P y \hat G_y = P_h t_y (P) + P_y G^y=Phty(P)+Py
G ^ w = P w e t w ( P ) \hat G_w = P_w e^{t_w (P)} G^w=Pwetw(P)
G ^ h = P h e t h ( P ) \hat G_h = P_h e^{t_h (P)} G^h=Pheth(P)

仍然采用之前的logistic方式:
b x = σ ( t x ) + c x b_x = \sigma(t_x) + c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = \sigma(t_y) + c_y by=σ(ty)+cy
b w = p w e t w b_w = p_w e^{t_w} bw=pwetw
b h = p h e t h b_h = p_h e^{t_h} bh=pheth

其中 c x , c y c_x, c_y cx,cy是网格的坐标偏移量, p w , p h p_w, p_h pw,ph是预设的anchor box的边长。最终得到的边框坐标值是 b x , b y , b w , b h b_x, b_y, b_w, b_h bx,by,bw,bh,而网络学习目标是 t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th

优缺点

优点

  • 快速,pipeline简单;
  • 背景误检率低;
  • 通用性强,YOLO对于艺术品种的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和R-CNN系列检测算法。

但相比R-CNN系列物体检测方法,YOLO具有以下缺点

  • 识别物体位置精度差;
  • Recall低,在每个网格中预测固定数量的bbox这种约束方式减少了候选框的数量。

YOLO v.s. Faster R-CNN

  1. 统一的网络:YOLO没有显示求取region proposal的过程。Faster R-CNN中,尽管RPN与Fast R-CNN共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和Fast R-CNN网络。相对于R-CNN系列的"看两眼"(候选框提取与分类,图示如下),YOLO只需要Look Once。
  2. YOLO统一为一个回归问题:而R-CNN将检测结果分为两部分求解,物体类别(分类问题),物体位置即bounding box(回归问题)。

下图是R-CNN的流程:

在这里插入图片描述

Darknet 框架

Darknet 由 C 语言和 CUDA 实现,对GPU显存利用效率较高(CPU速度差一些,通过与SSD的Caffe程序对比发现存在CPU较慢,GPU较快的情况)。Darknet 对第三方库的依赖较少,且仅使用了少量GNU Linux平台C接口,因此很容易移植到其它平台,如Windows或嵌入式设备。

参考Windows 版 Darknet (YOLOv2) 移植, 代码在此.

Region层:参数anchors指定k-means计算出来的anchor box的长宽的绝对值(与网络输入大小相关),num参数为anchor box的数量,另外还有bias_match,classes,coords等参数。在parser.c代码中的parse_region函数中解析这些参数,并保存在region_layer.num参数保存在l.n变量中;anchors保存在l.biases数组中。region_layer的前向传播中使用for(n = 0; n < l.n; ++n)这样的语句,因此,如果在配置文件中anchors的数量大于num时,仅使用前num个,小于时内存越界。

region层的输入和输出大小与前一层( 1 × 1 1\times 1 1×1 conv)的输出大小和网络的输入大小相关。

Detection层:坐标及类别的输出层。

yolo层:指定anchors等信息,计算loss等。YOLOv3使用了3个yolo层作为输出。

unsample层:上采样层,进行2倍上采样。

鉴于 Darknet 作者率性的代码风格,将它作为我们自己的开发框架并非是一个好的选择。 可以在我们更为熟悉的Caffe等框架中复现YOLO网络。 这里有一份Caffe版YOLOv3实现(仅部署,不能训练),另可参照其它框架的可训练代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值