YOLO物体检测-系列教程2:YOLOV2整体解读

🎈🎈🎈YOLO 系列教程 总目录

YOLOV1整体解读
YOLOV2整体解读

YOLOV2提出论文:YOLO9000: Better, Faster, Stronger

1、YOLOV1

  • 优点:快速,简单!
  • 问题1:每个Cell只预测一个类别,如果重叠无法解决
  • 问题2:小物体检测效果一般,长宽比可选的但单一

YOLOV2更快!更强!

YOLO YOLOV2
batch norm
hi-res classifier
convolutional
anchor boxes
new network
dimension priors
location prediction
passthrough
multi-scale
hi-res detecttor
VOC2007 mAP 63.4 65.8 69.5 69.2 69.6 74.4 75.4 76.8 78.6

V2版本整体上没有太多改变,主要在网络上、实现上的细节上有一些改进,如表格中的mAP值是有明显的上升的。看这个表格,v2版本的mAP值有一个很明显的上升,接下来我会根据表格内容依次介绍v2版本在哪些方面有改进。

2、Batch Normalization

  • V2版本舍弃Dropout,卷积后全部加入Batch Normalization
  • 网络的每一层的输入都做了归一化,收敛相对更容易
  • 经过Batch Normalization处理后的网络会提升2%的mAP
  • 从现在的角度来看,Batch Normalization已经成网络必备处理

Batch Normalization:顾名思义,批量归一化处理,分别对一列特征进行进行归一化操作,具体为当前值减去均值再除以方差。

Dropout:随机杀死一些神经元,即被杀死的神经元部分的特征权重为0,避免过拟合,在全连接层最常使用。

在v2版本,首先就全面剔除Dropout,在每一次卷积后都进行了Batch Normalization,能够避免网络往不好的方向训练,能够使得收敛更快,由于这个地方的改动,YOLOv2的mAP提升了约2%。

3、更大的分辨率

  • V1训练时用的是224224,测试时使用448448
  • 可能导致模型水土不服,V2训练时额外又进行了10次448*448 的微调
  • 使用高分辨率分类器后,YOLOv2的mAP提升了约4%

这个实际上就是V1和V2都是使用(224,224)的图像训练,然后都是用(448,448 )的图像测试。只不过V2版本,在训练的时候加了10个epoch,这10个epoch都是用(448,448 )的图像进行训练,因为10个epoch比较个数比较少,所以实际上是对模型进行微调。

这是因为用(224,224)的图像训练,然后用(448,448 )的图像测试会让模型无法适应,增加了10个epoch用(448,448 )的图像进行训练对模型进行微调有一个适应的过程,就是因为这个适应的过程使得YOLOv2的mAP提升了约4%

4、网络结构

  1. DarkNet,实际输入为416*416
  2. 没有FC层,5次降采样,(13*13)
  3. 1*1卷积节省了很多参数

YOLOV2借助了ResNet和VGG的一些思想:

  1. 所有的全连接层都不见了,全连接层容易过拟合,收敛慢,参数多,最后的输出是(7,7,30)这个用卷积也同样能够做到
  2. 5次降采样操作,maxpooling,(224,224)变成(112,112),最终输出(7,7)
  3. 输入输出进行了改变,输入改成了(416,416)输出为(13,13)
  4. darknet,具体为darknet19,一共有19个卷积层,每次经过卷积的时候特征图的个数会翻倍,这里用了(1,1)的一维卷积降低了卷积核的个数

5、YOLO-V2聚类提取先验框

  • faster-rcnn系列选择的先验比例都是常规的,但是不一定完全适合数据集
  • K-means聚类中的距离: d ( b o x , c e n t r o i d s ) = 1 − I O U ( b o x , c e n t r o i d s ) d(box,centroids) = 1-IOU(box,centroids) d(box,centroids)=1−IOU(box,centroids)

5.1 YOLOV1先验框

在YOLOV1中,有两个预选框可供选择,但是实际中物体可能远不止两种,并且有长的宽的,多个物体重叠在一起或者一个物体有多个标签,可能就会出现问题。

5.2 Fast-RCNN先验框

在当时Fast-RCNN用了9种先验框,但是它的做法是有三种scale不同大小,每种大小三种比例的先验框有1:1、1:2、2:1这3种比例,但是这种做法对实际的数据集可能无法完全适配。

5.3 YOLO-V2聚类提取先验框

比如在coco数据集中,有很多标注数据,假如说在标注的数据中标注了100万个框,对这100万个框使用kmeans进行聚类,加入k=5,就会将先验框的大小、长宽比例、中心坐标点等特征分成5类,而这5类也是专门针对当前数据集的个性化分类。那先验框就会有5种确定的大小比例,这就会和最终的实际任务会比较接近。

而kmeans的距离计算公式用LOU来实现。

作者通过实验发现,k=5可以获得比较好的IOU值。

YOLOV1 = 77 2 = 98

YOLOV2 = 1313 5 = 845

YOLOV2在先验框的数量上大幅度提升,V1是98个,V2则为845个

6、偏移量计算方法

6.1 anchor boxes

  • 通过引入anchor boxes(锚框,即先验框),使得预测的box数量更多(1313n)
  • 跟faster-rcnn系列不同的是先验框并不是直接按照长宽固定比给定
without anchor 69.5mAP 81%recall
with anchor 69.2mAP 88%recall

在第5节提到增加了先验框,但是如表格所示,并没有增加mAP值,但是recall是明显增加的,recall描述了被标记物体全部被检测的可能性。

YOLOV1:使用全连接层来预测边界框的坐标

Faster R-CNN:使用手工挑选的先验因素来预测边界框,Faster R-CNN中的区域生成网络(RPN)只使用卷积层来预测锚框的偏移量和置信度。由于预测层是卷积,RPN预测了特征图中每个位置的偏移量。

Anchor Box的构成:

  • 使用CNN提取的Feature Map的点,来定位目标的位置
  • 使用Anchor Box的Scale来表示目标的大小
  • 使用Anchor Box的Aspect Ratio来表示目标的形状。

6.2 YOLO-V2-Directed Location Prediction

直接的位置预测 改为相对位置预测策略

  1. bbox:中心为 ( x p , y p ) (x_p,y_p) (xp,yp),宽和高为 ( w p , h p ) (w_p,h_p) (wp,hp),则: x = x p + w p ∗ t x x = x_p+w_p*t_x x=xp+wp∗tx , y = y p + h p ∗ t y y = y_p+h_p*t_y y=yp+hp∗ty
  2. t x t_x tx=1,则将bbox在x轴向右移动 w p w_p wp; t x t_x tx=−1则将其向左移动 w p w_p wp
  3. 这样会导致收敛问题,模型不稳定,尤其是刚开始进行训练的时候
  4. V2中并没有直接使用偏移量,而是选择相对grid cell的偏移量

解析:

  1. 得到先验框有4个参数 ( x p , y p , h p , w p ) (x_p,y_p,h_p,w_p) (xp,yp,hp,wp),这是kmeans聚类预测出来的
  2. 预测出4个偏移量 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),新的框为 ( x , y , h , w ) (x,y,h,w) (x,y,h,w),其中 x = x p + t x x = x_p+t_x x=xp+tx,y、h、w同理
  3. 但是这样存在一个问题,网络初期的时候效果不好(网络啥也不会),预测出的offset偏移量可能导致得到的框会错误的很离谱,V2对此做出改进
  4. 具体改进为中心点x、y的偏移量的预测结果,加上sigmoid的,这样保证了中心点不会离开原来的grid cell格子,还要加上单元格与图像左上角的偏移量为 ( c x , c y ) (cx,cy) (cx,cy),h和w的预测策略不变。

具体公式为:
b x = σ ( t x ) + c x b_x = σ(t_x)+c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = σ(t_y)+c_y by=σ(ty)+cy
b w = p w e t w b_w = p_we^{t_w} bw=pwetw
b h = p h e t h b_h = p_he^{t_h} bh=pheth

加入预测值为 ( σ t x , σ t y , t w , t h ) (σt_x,σt_y,t_w,t_h) (σtx,σty,tw,th) = (0.2,0.1,0.2,0.32)

anchor框为: p w = 3.19275 , p h = 4.00944 p_w = 3.19275,p_h = 4.00944 pw=3.19275,ph=4.00944

在特征图位置:
b x = 0.2 + 1 = 1.2 b_x = 0.2+1 = 1.2 bx=0.2+1=1.2
b y = 0.1 + 1 = 1.1 b_y = 0.1+1 = 1.1 by=0.1+1=1.1
b w = 3.19275 ∗ e 0.2 = 3.89963 b_w = 3.19275*e^{0.2} = 3.89963 bw=3.19275∗e0.2=3.89963
b h = 4.00944 ∗ e 0.32 = 5.52153 b_h = 4.00944*e^{0.32} = 5.52153 bh=4.00944∗e0.32=5.52153

在原位置:
b x = 1.2 ∗ 32 = 38.4 b_x = 1.2*32=38.4 bx=1.2∗32=38.4
b y = 1.1 ∗ 32 = 35.2 b_y = 1.1*32=35.2 by=1.1∗32=35.2
b w = 3.89963 ∗ 32 = 124.78 b_w = 3.89963*32=124.78 bw=3.89963∗32=124.78
b h = 5.52153 ∗ 32 = 176.68 b_h = 5.52153*32=176.68 bh=5.52153∗32=176.68

7、YOLO-V2的感受野

7.1 感受野

从原始图像数据中,经过特征提取,得到一个Feature Map特征图,特征图的一个点可能代表原始图像中一个区域,这个区域就是这个点的感受野。越大的感受野越能感受一个整体。

7.2 卷积核对应参数

如图有一个(5,5)的图像数据(或者特征图),经过一个(3,3)的卷积核,步长为1,得到的输出就是一个(3,3)的特征图,再经过一个一次卷积就能得到(1,1)的输出,如果直接用5*5的卷积核就能得到一个(1,1)的输出,一步能得到的结果为什么要用两步呢?但是实际中却都是在用小的卷积核没有用大的。实际上用多步小的卷积核,用到的参数更少。

假设输入大小都是(H,W,C),并且都使用c个卷积核(得到c个特征图),可以计算一下各自所需参数:

1个(7,7)卷积核所需参数:
= C • ( 7 • 7 • c ) = 49 c 2 =C • (7 • 7 • c) = 49c^2 =C•(7•7•c)=49c2

3个(3,3)卷积核所需参数:
= 3 • c • ( 3 • 3 • c ) = 27 c 2 =3•c•(3•3•c) = 27c^2 =3•c•(3•3•c)=27c2

7.3 Fine-Grained Features

  • 最后一层时感受野太大了,小目标可能丢失了,需融合之前的特征

yolo算法,在一次次的卷积过程中,越往后的感受野越大,(224,224)的图像经过处理最后得到的Feature Map特征图是(7,7),实际上这个感受野太大了,容易忽视一下小物体,比较容易检测到大的物体。

yolov2在最后得到的特征图是(13,13,1024)将其拆分为(1,13,13,1024),倒数第二个特征图为(26,26,512)拆分为(4,13,13,512),再拆分为(2,13,13,1024),将其拼接为(3,13,13,1024),reshape成(13,13,3072)

8、多尺度检测

  • YOLO-V2-Multi-Scale
  • 都是卷积操作可没人能限制我了!一定iterations之后改变输入图片大小

实际中得到的图像大小是不一样的的,全部resize成相同大小,会影响检测效果。

不同输入大小能不能做,肯定能的,卷积和输入大小没有关系啊。

最小的尺寸为(320,320),最大的为(608,608)

原始的YOLO使用448×448的输入分辨率。通过添加锚框,我们将分辨率改为416×416。然而,由于我们的模型只使用卷积层和池化层,因此可以实时调整大小。我们希望YOLOv2能够鲁棒地运行在不同尺寸的图像上,所以我们将多尺度训练应用到模型中。

我们不需要修改输入图像的大小,而是每隔几个迭代就改变网络。每10个批次,我们的网络就会随机选择一个新的图像尺寸。由于我们的模型缩减了32倍,我们从以下32的倍数中抽取:{320, 352, ..., 608}。因此,最小的选项是320 × 320,最大的是608 × 608。我们将调整网络的尺寸,然后继续训练。

这种制度迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。

在低分辨率下,YOLOv2作为一个廉价、相当准确的检测器运行。在288×288时,它以超过90 FPS的速度运行,其mAP几乎与Faster R-CNN一样好。这使它成为较小的GPU、高帧率视频或多个视频流的理想选择。

在高分辨率下,YOLOv2是一个最先进的检测器,在VOC 2007上的mAP为78.6,而运行速度仍高于实时速度。

YOLOV1整体解读
YOLOV2整体解读

相关推荐
吃肉不能购3 小时前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
goomind8 小时前
YOLOv8实战木材缺陷识别
人工智能·yolo·目标检测·缺陷检测·pyqt5·木材缺陷识别
吾门9 小时前
YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】
yolo·分类·数据挖掘
Suyuoa15 小时前
附录2-pytorch yolov5目标检测
python·深度学习·yolo
红色的山茶花1 天前
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
笔记·深度学习·yolo
unix2linux2 天前
YOLO v5 Series - Image & Video Storage ( Openresty + Lua)
yolo·lua·openresty
菠菠萝宝2 天前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
ZZZZ_Y_2 天前
YOLOv5指定标签框背景颜色和标签字
yolo
红色的山茶花2 天前
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-conv.py
笔记·yolo
Eric.Lee20212 天前
数据集-目标检测系列- 花卉 鸡蛋花 检测数据集 frangipani >> DataBall
人工智能·python·yolo·目标检测·计算机视觉·鸡蛋花检查