YOLO 超详细入门02 v2 (含代码及原文)
文章目录
- 前言
- 背景
- 总结
- 一、YOLOv2改进之框架
- 1.1 网络架构
- 1.2 Batch Normalization
- 二、YOLOv2改进方法之尺寸相关
- 2.1 High Resolution Classifier(高分辨率的分类器)
- 原因
- 步骤
- 2.2 Fine-Grained Features(细粒度特征)
- 原因
- 步骤
- 2.3 Multi-Scale-Training(多尺度训练)
- 原因
- 训练细节
- 三、YOLOv2改进方法之Anchor Box
- 3.1 Convolutional With Anchor Boxes(带anchor的卷积)
- 原因
- 想法
- 为什么采用416 x 416大小的输入代替原来的448 x 448?
- 3.2 Dimension Clusters(维度聚类)
- 目的
- 公式
- 思路
- 效果
- 3.3 Direct location prediction(直接位置预测)
- 四、YOLOv1 vs YOLOv2 输出
- 五、YOLO9000
- 5.1 策略和方式
- 5.2 Loss
- 5.3 Word Tree
- 原因
- 思想
- 输出及效果
前言
代码地址:Github:ultralytics/yolov3
- 【建议先读】《YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点》
笔者在阅读《YOLO9000:Better, Faster, Stronger》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
背景
- SSD 是 YOLOv1的强大竞争对手,它在当时展示了更高的实时处理精度。与基于区域的检测器相比,YOLO 的坐标定位误差更高,recall(召回率:衡量定位所有目标物体的好坏程度)更低。YOLOv2 是YOLO的第二个版本,其目标是显着提高准确性,同时使其更快。
- YOLOv2 在 YOLOv1的基础上做了许多改进,其中在 VOC2007 资料集上的mAP 由 63.4% 提升到 78.6%,并且保持检测速度。从预测更准确(Better),速度更快(Faster),识别物体更多(Stronger)这三个方面进行了改进。其中识别更多目标物体也就是扩展到能够检测9000种不同物体,称之为YOLO9000。
总结
- Better:准确度提升。 主要手段有:
- Batch Normalization(批归一化)1.2
- High Resolution Classifier(高分辨率的分类器)2.1
- Fine-Grained Features(细粒度特征)2.2
- Multi-Scale-Training(多尺度训练)2.3
- Anchor Box(锚盒)3.1
- Dimension Cluster(维度聚类)3.2
- Direct location prediction(直接位置预测)3.3
- Faster:速度提升。 主要手段:GoogleNet+DarkNet 1.1
- Stronger:识别种类提升。 主要手段:YOLO9000 5
一、YOLOv2改进之框架
1.1 网络架构
YOLOv2 采用Darknet-19 作为特征提取网络,包括19个卷积层, 5个 maxpooling 层。
原型设计与 VGG16 一致,主要采用3x3卷积, 2x2 maxpooling层 (feature map维度降低两倍, channles增加两倍)。
与NIN (Network in Network) 类似,Darknet-19最终采用global avgpooling做预测。
在3x3卷积层之间使用1x1卷积层来压缩 feature map channles 以降低模型计算量和参数 (parameters)。
每个卷积层后面同样使用了 batch normalization 层以加快收敛速度,降低模型over-fitting。
1.2 Batch Normalization
原理等可参考:《Batch Normalization(BN)超易懂!图文详解——目的,原理,本质,有效性,副作用》
在每层卷积层的后面都加入 batch normalization 层,不再使用dropout,使得模型在 mAP 上提升了2.4%。
二、YOLOv2改进方法之尺寸相关
2.1 High Resolution Classifier(高分辨率的分类器)
原因
因为大部分的检测模型是使用 ImageNet 分类数据集上pre-train的模型,YOLOv1 采用 224x224 的图片分类器,但因为分辨率比较低,不利于检测模型。因此YOLO2 提高分辨率至 448x448 并在test数据集上进行 fine-tuning(微调)。
步骤
如果直接切换图片尺寸即分辨率大小,模型可能难以快速地对高分辨率的图片进行反应。因此,YOLO 训练由 2 个阶段组成。我们训练一个像 VGG16 这样的分类器网络。然后我们用卷积层替换全连接层,并对其进行端到端的重新训练以进行目标检测。
Pre-training步骤如下:
- 先采用 224x224 的 ImageNet 图像数据集进行约160个 epoch的训练,然后再将输入图像的尺寸更改为 448x448 再训练10个 epoch。训练完的这个 pre-train model也就可以适用高分辨率的图像输入了。
- 最后再拿这个model 在test数据集上 fine-tuning。
最终使得mAP提升了3.7%。
2.2 Fine-Grained Features(细粒度特征)
原因
我们知道,卷积层会逐渐减小空间维度。随着相应分辨率的降低,也就更难检测到小物体。
YOLOv2 图片输入大小为 416 x 416,经过5次 maxpooling 后得到13x13 的feature map,并以此 feature map 采用卷积做预测,如此已经可以达到检测大物体的作用。但如果需要检测小物体,则还需要更精细的 feature map,因此 YOLOv2 提出了一种 passthrough 层以利用更精细的 feature map。
步骤
它将 26 × 26 × 512 层使用按行列隔行采样的方法,抽取 2x2 的局部区域,然后将其转化为 channel 维度,便可以巧妙地reshape为 13 × 13 × 2048。然后与原始的 13 × 13 ×1024 输出层连接。现在我们在新的 13 × 13 × 3072 层上应用卷积滤波器来进行预测,相当于做了一次特征融合,有利于检测小的目标。
2.3 Multi-Scale-Training(多尺度训练)
原因
由于模型仅使用卷积层和池化层,因此可以随时调整输入的大小。为了使 YOLOv2 在不同大小的图像上运行时具有鲁棒性,作者针对不同的输入大小训练了模型,就是在训练的过程中每间隔一定的 iterations 后改变输入的图片大小。
训练细节
YOLOv2 下采样步长为32,因此输入图片大小要选择32的倍数 (最小尺寸为320x320, 最大尺寸为608x608)。在训练过程,每隔10个 iterations 随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。这起到了数据增强的作用,并迫使网络对不同的输入图像尺寸和比例进行良好的预测。
采用 Multi-Scale Training 策略使 YOLOv2 模型可以更好的预测不同大小的图片,由上图 VOC 2007 数据集上的结果可以看到: 采用较低分辨率的图片mAP 值略低,但速度更快。采用较高解析度的图片mAP 值较高,但速度较慢。对于 554X554 的图片 mAP 高达78.6%!
三、YOLOv2改进方法之Anchor Box
3.1 Convolutional With Anchor Boxes(带anchor的卷积)
ps:原文中anchor也被称为prior box以表示对目标检测的最佳anchor的选择。
原因
YOLOv1在训练过程中学习适应不同物体的形状比较困难,导致其在精度定位方面表现不佳。其早期训练容易受到不稳定梯度的影响。首先,YOLO对bounding box进行随机预测。这些随机的预测可能对部分目标的检测有效果,但对另一些目标识别却很糟糕,从而导致陡然的梯度变化。在早期的训练中,预测会在专门研究什么形状上去探索,尝试,甚至竞争。
例如上图,早期训练中,对人和车预测的bounding box形状可能都是竖着的。对人也许应该这样预测,因为行人的横纵比为0.41,但汽车显然需要更扁的bounding box来预测。
因为我们只需要一个猜测是正确,只要有一个猜测能找到物体就行,因此如果从生活中常见的猜测开始,那么初始训练就会更加地稳定。(比如预测一个横的,一个纵的)
想法
- 一般而言,我们可以创建5个具有上面形状的anchors。
- 借鉴 Faster R-CNN 的方法: 用卷积层与RPN( Region Proposal Network )来预测Anchor Box 的偏移值与置信度,作者发现通过预测偏移量而不是 bounding box坐标值能够简化问题,让神经网络学习起来更容易,因此 YOLOv2 也尝试使用不同形状的矩形来作为锚框 (Anchor Box)。
- YOLOv2首先移除掉 YOLOv1 网路的全连接层 (FC层),改用 Anchor Box 来预测bounding box。跟 YOLOv1 不一样的是 Anchor Box 不是直接预测 bounding box 的坐标值,而是预测 Anchor Box的 offset (坐标的偏移值) 与 confidence scores (置信度)。如果我们限制偏移值,我们可以保持预测的多样性并使每个预测都集中在一个特定的形状上。所以初期训练会比较稳定。
为什么采用416 x 416大小的输入代替原来的448 x 448?
奇数可以使grid只有唯一Center cell
- 为了使最后的卷积层可以有更高分辨率的特征YOLOv2 将其中一个Pooling层去掉,并且用 416x416 大小的输入代替原来的 448x448,目的是为了使网路输出的特征图 (feature map) 有奇数大小的宽和高,进而使每个特征图在划分网格 grid) 的时候只有一个中心单元格 (Center Cell)。
- 因为物体倾向出现在照片中央,物体中心点往往落入图片中心位置,因此使用这个中心单元格去预测这些物体的边界框相对容易。
3.2 Dimension Clusters(维度聚类)
目的
**为了识别对训练数据具有最佳覆盖率的 top-K 边界框,我们对训练数据运行 K-means 聚类来定位 top-K 聚类的质心。**在许多问题域中,边界框具有很强的模式。在 Faster R-CNN 和 SSD 中,Anchor Box 的尺寸是手动选择的,有一定的主观性。若能选取合适的 Anchor Box,可以使模型更容易学习并预测出准确的 bounding box。例如,在自动驾驶中,最常见的 2 个边界框则是不同距离的汽车和行人。
公式
聚类目的为提高选取的 Anchor Box 和同一个聚类下的 ground truth 之间的 IoU,采用的距离公式如下:
d(box,centroid)=1−IoU(box,centroid)d(box,centroid) = 1-IoU(box,centroid)d(box,centroid)=1−IoU(box,centroid)ps:1.centroid为聚类时被选作中心的boundingboxps:1.centroid为聚类时被选作中心的bounding\ boxps:1.centroid为聚类时被选作中心的bounding box2.box为其他的boundingbox2.box为其他的bounding\ box2.box为其他的bounding box
思路
5个红色框代表VOC 2007数据集集中对象的平均尺寸和位置。
在训练集边界框上针对各种 k 值运行k-means 聚类,并绘制具有最近质心的平均 IOU,但作者没有使用欧几里德距离,而是使用边界框和质心之间的 IOU,公式如上。
作者权衡了模型复杂度和高召回率(Recall),选择 k = 5 (也就是选择了5个不同大小的Anchor Box来进行定位预测)作为模型复杂性和高召回率(Recall),如上图。
效果
作者采用5个不同大小的 Anchor Box (Cluster IOU 5),Avg IOU 是61,比不使用聚类方法的9种 Anchor Box 的 Avg IOU高一些。若选择 Cluster IOU 9,Avg IOU更显著提高。
3.3 Direct location prediction(直接位置预测)
我们对锚点的offset(偏移量)进行预测。然而,如果它不受约束,我们的预测将再次随机化。因此YOLOv2此次预测 5 个参数(tx、ty、tw、tht_{x}、t_{y} 、t_{w}、t_{h}tx、ty、tw、th和tot_{o}to ,并应用 sigmoid(σ\sigmaσ) 函数来限制其可能的偏移范围,即(0,1)(0,1)(0,1)之间。
- tx、ty、tw、tht_{x}、t_{y} 、t_{w}、t_{h}tx、ty、tw、th是预测的bounding box中心点左边和宽高, Pr(
YOLO 超详细入门02 v2 (含代码及原文)相关推荐
- YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点
文章目录 前言 背景 一.YOLO的核心原理预览 二.网络结构 为什么每个网格有固定的B个Bounding Boes?(即B=2) 三.网络细节 3.1 网络单元(grid) 3.1.1 作用 3.1 ...
- Faster RCNN超详细入门 02 网络细节与训练方法
文章目录 前言 论文结构 Abstract Introduction Related Work Region Proposal Network Experiments Conclusion 网络架构 ...
- TypeScript超详细入门教程(上)
TypeScript超详细入门教程(上) 01 开篇词:Hello~TypeScript 01 开篇词:Hello~TypeScript 更新时间:2019-10-30 13:49:46 既然我已经踏 ...
- GoJS超详细入门(插件使用无非:引包、初始化、配参数(json)、引数据(json)四步)...
GoJS超详细入门(插件使用无非:引包.初始化.配参数(json).引数据(json)四步) 一.总结 一句话总结:插件使用无非:引包.初始化.配参数(json).引数据(json)四步. 1.goj ...
- arcgis 地图_ArcGIS超详细入门操作:ArcGIS矢量化地图详细步骤
今天给大家带来的干货是[ArcGIS超详细入门操作:ArcGIS矢量化地图详细步骤],欢迎大家收藏查阅! 在桌面上新建一个文件夹,打开ArcCatalog, "文件"--" ...
- 自学前端设计——【开源骚客】FPGA超详细入门视频教程
前言 本文基于[开源骚客]FPGA超详细入门视频教程,简单做个笔记 00. FPGA开发软件的安装 Quartus II 13.1 Modelsim Notepad++ Vim 01. 我的第一个FP ...
- Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12
目录 相关教程 环境配置 0基础上手例子(C/C++) 使用CMake的例子(C语言) 使用CMake的例子(C++) 本文主要是手把手教萌新们如何用官方用例构建(有许多本人亲身踩坑血泪史) 相关教程 ...
- Apollo Control——超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导
专栏文章列表 Apollo Control--超详细入门教程(一):基于道路误差的车辆动力学模型 Apollo Control--超详细入门教程(二):连续状态空间方程离散化与离散LQR公式推导 Ap ...
- 超详细——入门Github的代码上传
Github的使用与Gitee相差无几,由于网速原因,国内开发者主要使用Gitee作为版本管理器,但有些场景及项目需要用到Github,今天我将对Github的使用制作一个简单的初学者入门教程,不 ...
最新文章
- 单林多域群集环境中将Exchange 2003迁移到Exchange 2010系列之五
- MySQL之单表查询
- 解决java前后端分离端口跨域问题
- 【python3的学习之路四】使用list和tuple
- 使用Sysmon和Splunk探测网络环境中横向渗透
- Py之skflow:skflow的简介、安装、使用方法、代码实现之详细攻略
- Labview 2017安装教程
- iphone如何信任软件_【手机软件】千禾影院:全新观影神器,支持安卓+iOS,最新、最全、高清、免费!...
- 遍历map时删除不需要的元素方法
- 数据结构与算法的分析 —— 渐进复杂度(三个记号)
- rename python_谈谈重命名方法renames详解
- 白鹭引擎 - 项目的创建与动态调试
- 奇怪的UIPanel控件
- 暨南大学人文社科a类期刊_关于调整人文社科B类和C类期刊目录的通知
- 天池历届大赛答辩PPT及视频
- 微信小程序样式大全(一)
- python3网易公开课爬虫实践
- 众包中真值推断的随机猜测和任务难度建模
- Android 动画之 View动画 和 帧动画
- 会说话的电脑,.vbs
热门文章
- YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点