YOLO v3 网络结构分析
YOLO v3 网络结构分析
微信公众号:幼儿园的学霸
个人的学习笔记,关于OpenCV,关于机器学习, …。问题或建议,请公众号留言;
最近在看Tensorflow,没有经过实践的学习总感觉很心虚,因此打算做点什么。所以,那就从YOLO入手吧,将YOLO v3改写为Tensorflow版本来进行练手。那第一步便是需要对YOLO网络结构有一定的理解,不能像之前仅仅用YOLO训练数据然后检测目标那样浮于表面。
目录
文章目录
- YOLO v3 网络结构分析
- 目录
- Darknet-53 network
- Feature Extractor
- 后记
- 参考资料
Darknet-53 network
整个网络主要是由一系列的1x1
和3x3
的卷积层组成(每个卷积层后都会跟一个BN层和一个LeakyReLU)层,作者说因为网络中有53个convolutional layers,所以叫做Darknet-53。下图就是Darknet-53的结构图,在其中标注了一些信息方便理解。(卷积的strides默认为(1,1),padding默认为same,当strides为(2,2)时padding为valid)
网络输入:原论文中提到的大小320*320
,416*416
,608*608
。这个大小必须是32的整数倍数,yolo_v3有5次下采样,每次采样步长为2,所以网络的最大步幅(步幅指层的输入大小除以输出)为2^5=32
。
如上图所示为darknet-53残差模块。Darknet-53采用了ResNet这种跳层连接方式,性能完全比ResNet-152和ResNet-101这两种深层网络好,这里作者并没有给出原因,可能的原因:a.网络的基本单元的差异,b.网络层数越少,参数少。需要的计算量少。
使用残差的结构的好处:(1)深度模型一个关键的点就是能否正常收敛,残差这种结构能保证网络结构在很深的情况下,仍能收敛,模型能训练下去。(2)网络越深,表达的特征越好,分类+检测的效果都会提升。(3)残差中的1*1卷积,使用network in network的想法,大量的减少了每次卷积的channel,一方面减少了参数量(参数量越大,保存的模型越大),另一方面在一定程度上减少了计算量
Feature Extractor
利用三个特征层进行边框的预测,流程如下图所示。注意:原Darknet53中的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256
,下图是以YOLO v3 416模型进行绘制的,所以输入的尺寸是416x416
,预测的三个特征层大小分别是52,26,13
。
在上图中我们能够很清晰的看到三个预测层分别来自的什么地方,以及Concatenate层与哪个层进行拼接。注意Convolutional是指Conv2d+BN+LeakyReLU,和Darknet53图中的一样,而生成预测结果的最后三层都只是Conv2d。通过上图就能更加容易地搭建出YOLOv3的网络框架了。
网络中作者进行了三次检测,分别是在32倍降采样(2^5)
,16倍降采样(2^4)
,8倍降采样(2^3)
时进行检测,这样在多尺度的feature map上检测跟SSD有点像。在网络中使用up-sample(上采样)的原因:网络越深的特征表达效果越好,比如在进行16倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就使用了浅层特征,这样效果一般并不好。如果想使用32倍降采样后的特征,但深层特征的大小太小,因此yolo_v3使用了步长为2的up-sample(上采样),把32倍降采样得到的feature map的大小提升一倍,也就成了16倍降采样。同理8倍采样也是对16倍降采样的特征进行步长为2的上采样,这样就可以使用深层特征进行detection。
Yolo v3通过上采样的方式很好的使16倍降采样和8倍降采样使用深层特征,但进行4次下采样和3次下采样得到的浅层feature map大小是一样的。Yolo_v3想把这些浅层特征也利用起来,就有了route层。把16倍降采样得到的feature map和四次下采样得到的层拼接在一起,在channel那个维度进行拼接。这样拼接的好处:让网络同时学习深层和浅层特征,表达效果更好。8倍降采样同样也是这样的操作,把三次下采样的feature map拼接在一起。
网络输出大小的确定:
- a.首先先确定网络输出特征层的大小。比如输入为
320*320
时,则输出为320/32=10,因此输出为10*10
大小的特征层(feature map),此时有10*10=100
个cell;同理当输入为416*416
时输出的特征层为13*13
大小的特征层,13*13=169
个cell;输入为608*608
时,输出的feature map大小为19*19
,cell有19*19=361
个。进行每进行一次up-sample时,输出特征层扩大一倍。 - b. Anchor box的确定。这个先验框不同于之前Faster-Rcnn和SSD那样人工设定,在yolo v2和yolo v3中,都采用了对图像中的object采用k-means聚类。在yolo_v3中作者是这样描述的:
We still use k-means clustering to determine our bounding box priors. We just sort of chose 9 clusters and 3 scales arbitrarily and then divide up the clusters evenly across scales. On the COCO dataset the 9 clusters were:(10,13); (16,30); (33,23); (30,61); (62,45); (59,119); (116 ,90); (156 ,198); (373 ,326).
这个地方,作者有一个地方没有说清楚,这个框的大小是在什么输入大小的图像下确定的,比如你在608*608
作为输入图像中object的大小和在320*320
大小图像中的object大小肯定不同,对这两种输入聚类的结果肯定不同。但查看作者提供的yolo_v3网络配置文件,这个聚类结果应该是在416*416
大小的图像下聚类得到的结果. - c.feature map中的每一个cell都会预测3个边界框(bounding box) ,每个bounding box每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有N个类别的概率,coco数据集80类目标,voc20类目标。因此对于coco数据集,在网络输入为
416*416
时,网络的输出大小为13*13(3*(4+1+80))=43095
后记
暂时先到这里吧,最近项目比较忙。看了一些资料,目前对yolov3也只是了解一些表面的东西,尚未涉及到内部的数学过程,尤其是损失函数部分作为重中之重根本就没有进行过研究。但是,我想了解以上对于实现TensorFlow版本的yolovv3应该是可以入门了,后续对于涉及的东西,可以边编写边学习了。
NOTE:对于其中的feature map部分,yolo在3个尺度上进行目标检测,是不是挺像opencv的多尺度目标检测思想啊!在opencv中,detectMultiScale()函数就是构造图像金字塔,在不同分辨率图像上进行目标检测,我想,借助于这个思想,可以对yolo进行部分更改,以加深或者裁减或者指定图像金字塔的数量或者分辨率。
参考资料
1.YOLO_V3 原理以及训练说明https://blog.csdn.net/chandanyan8568/article/details/81089083
2.yolo系列之yolo v3【深度解析】https://blog.csdn.net/leviopku/article/details/82660381
下面的是我的公众号二维码图片,欢迎关注。
YOLO v3 网络结构分析相关推荐
- YOLO v3网络结构分析
转载于https://blog.csdn.net/qq_37541097/article/details/81214953 相信阅读了YOLO v3论文的小伙伴们会发现为什么这次的论文篇幅这么少?除去 ...
- 基于改进YOLO v3网络的夜间环境柑橘识别方法
基于改进YOLO v3网络的夜间环境柑橘识别方法 人工智能技术与咨询 本文来自<农业机械学报>,作者熊俊涛等 关注微信公众号:人工智能技术与咨询.了解更多咨询!
- layer output 激活函数_深入理解YOLO v3实现细节 - 第3篇 构建v3的Loss_layer
深入理解YOLO v3实现细节系列文章,是本人根据自己对YOLO v3原理的理解,结合开源项目tensorflow-yolov3,写的学习笔记.如有不正确的地方,请大佬们指出,谢谢! 目录 第1篇 数 ...
- 对象检测目标小用什么模型好_自动驾驶目标检测- YOLO v3 深入解析
从2016年 Joseph Redmon 发布第一代YOLO开始,YOLO已经更新四代了,凭借着在一个网络模型中完成对图像中所有对象边界框和类别预测的独特创新,成为现今使用最广泛也是最快的对象检测算法 ...
- YOLO v3算法详解
论文地址:YOLOv3: An Incremental Improvement YOLO算法详解,YOLO v2算法详解 1.The Deal 接下来,从头梳理整个网络,如果对YOLO和YOLO v2 ...
- yolov3网络结构图_目标检测——YOLO V3简介及代码注释(附github代码——已跑通)...
GitHub: liuyuemaicha/PyTorch-YOLOv3github.com 注:该代码fork自eriklindernoren/PyTorch-YOLOv3,该代码相比master分 ...
- Darknet53(YOLO V3骨干网络)
YOLO V3算法使用的骨干网络是Darknet53.Darknet53网络的具体结构如图所示,在ImageNet图像分类任务上取得了很好的成绩.在检测任务中,将图中C0后面的平均池化.全连接层和So ...
- python实现yolo目标检测_从零开始PyTorch项目:YOLO v3目标检测实现
在过去几个月中,我一直在实验室中研究提升目标检测的方法.在这之中我获得的最大启发就是意识到:学习目标检测的最佳方法就是自己动手实现这些算法,而这正是本教程引导你去做的. 在本教程中,我们将使用 PyT ...
- 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1.跟踪基础知识简介 首先要说明一点,现在多目标跟踪算法的效果,与 ...
最新文章
- Python中6种基本数据类型
- python画三维几何图-Python常见几何图形绘制
- CentOS 7核心安装及基本配置
- 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]
- 零基础带你五行代码实现聊天机器人-再这么玩?咱还能做朋友吗?
- 如何学机器计算机,学习编程的你要了解程序是如何被计算机所执行的?
- php文件名函数,详解php 获取文件名basename()函数的用法
- while循环 for循环的理解
- 线程中这么调用类_一文学会 Python 多线程编程
- lua 去除小数点有效数字后面的0_【物联网学习番外篇】Lua脚本编程扫盲
- QQ官方单向好友删除 免软件
- 四阶龙格库塔法的计算例子
- I2C电路故障排除---边沿时间与杜邦线
- php生成拟合线,excel拟合曲线怎么做
- leach分簇功能实现matlab,LEACH分簇算法实现和能量控制算法实现
- UML建模与软件开发设计(二)——UML概述
- android清理安全app测试经验总结
- AMD三季度营收创新高,借数据中心业务与英特尔打响5G前哨战?
- 记录一次Specified key was too long的问题
- 科学理论和计算机技术的发展史,探究计算机科学与技术的发展趋势
热门文章
- TOF-SIMS测试常见的问题及解答(一)
- getApp()获取不到的情况
- AFL二三事——源码分析
- 小学四年级上册计算机课程安排,四年级上册信息技术的教学计划(通用5篇)...
- openwrt配置内核驱动_openwrt 增加RTC(MCP7940 I2C总线)驱动详解
- Element UI 中 el-input 标签去掉边框的一种办法
- 计算机组成原理唐朔飞高分笔记,计算机组成原理唐朔飞高分笔记【参考】.doc...
- 十年程序员的亲身经历
- Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码
- 百炼:4083:我爱北大