yolov5深度剖析+源码debug级讲解系列(一) yolov5的架构和源码debug准备

深度学习物体检测之YOLOV5源码解读 先打开common.py中的class BottleneckCSP中的代码,可看到模型BottleneckCSP的每一层定义(如conv,conv2d,batchnorm2d,leakyrelu,sequential)情况(__init__),然后计算的forward方法(主要是对__init__定义的各层之间进行怎样的先后计算,组合等)在forward_once方法中它会for每一个模型,然后会在common.py文件中调用相应的模型class,并进入这个类中的forward方法执行。 阅读详情

前言

前段时间分析了yolov3的源码,这次想带着小伙伴一起把yolov5完全掌握。博主还是保持着一贯的风格,依旧采用debug级别的源码剖析。目的就是让大家可以通过一个系列的文章就把yolov5的架构、设计理念和每一行源码都弄懂。只要小伙伴可以花时间把这个系列读完,就会对yolov5的理解有所提升。

去年参加了kaggle的小麦检测比赛,yolov5在比赛的中段开始呈现霸榜趋势,超越了efficientdet。虽然最后yolov5因为权限等某些问题被kaggle官方禁用了,但是仍然体现出了其强大的能力。值得一学,学习本篇前读者应该至少对于yolo系列中的一个或几个有所了解,对照着学习更加利于理解。

前面做了yolov3的源码剖析,不了解的读者也可以学习下:

传送门:

yolov3 源码debug解析

下面我们就开始yolov5的学习吧,第一篇我们先focus在yolov5的架构上,对其各个组件有所了解,对其设计理念有所认知,然后在这个基础上开始逐行对yolov5进行debug解析。值得注意的是yolov5的架构一直在迭代演进,不同版本之间稍有区别,但是基本上是一致的。

一.yolov5 架构剖析

在这里插入图片描述
这是yolov5s的架构,图来自于百度图片,博主查了下应该是知乎上一个大神画的。这里尊重大神创作,给下地址:

图片出处传送门

从yolov5s到yolov5x之间的差别就是不同的block叠加次数不同,见下图:
在这里插入图片描述
从架构上看,yolov5的架构设计并不复杂,整体上维持了FPN的设计方式,FPN加强了重复迭代,两次迭代的结构称为PAN。这个结构还可以进一步重复,类似efficientdet那样演进为BiFPN。backbone仍然是darknet的形式,通过残差结构让网络加深。模型开始引入Focus的设计有点奇特,直接就降低了resolution应该是yolov5轻量的原因之一。SPP模块的引入进一步融合了多尺度特征提取。有两种不同的CSP模块,区别是有无残差结构,

整体设计和模块的加减像是消融实验的产物,不过我们还是逐个模块过下:

1. Focus

在这里插入图片描述
Focus的理念比较特殊,执行过程见下图:
在这里插入图片描述
我在观察Focus这个设计的时候带着的问题是这样的设计是为什么以及这样的设计为什么work?
我的理解是首先它这样的排列方式是将相邻的四个块从平面改为特征上的concat。
在这里插入图片描述
也就是这样的四个块做了叠加,从3通道变为12通道,这样尽可能的保留了位置信息。同一个通道里应该代表着局部的特征表达,这样操作一个grid位置代表了原图四个grid的特征。在保证了位置信息尽可能保留的情况下又增大了感受野。

这样的效果是特征图的尺寸为原来的一半,在这里我想到的问题是卷积是能够保持特征的位置相对性的,那么这种focus操作能否常规化代替pooling或者是stride=2的卷积呢?我们都知道pooling对feature map的信息的丢失是很严重的(当然也有一部分正则化的作用),所以很多现在的架构设计里pooling都被stride=2的convolution代替。我又想到了shufflenet里的channel shuffle操作是在做了组卷积之后,怕看不到全局特征,为了增强channel间的特征共享,进行的特征融合。所以Focus操作后面是否也应该增强每个格点通过concat拼接起来的特征向量的融合,比如通过1x1 group convolution。yolov5的融合采用的是一个普通的CBL(conv–bn–leakyrelu)。

2.CSP

在这里插入图片描述
yolov5的设计中有两种CSP结构,一种是带了resunit(2*CBL卷积+残差),一种是用普通的CBL替换resunit。带残差的部分是用在backbone里,不带残差的是用在backbone之外的地方。这里应该是实验的结果,backbone为较深的网络,增加残差结构可以增强层与层之间反向传播的梯度值,避免因为加深而带来的梯度消失,从而提取到更细粒度的特征而不必担心网络退化。同时,有些研究表明残差结构可以看作非残差的ensemble,从而增强部分的泛化能力。

当然以上都是理论上的分析,我之前在竞赛中对于unet的encoder,bridge,decoder的部分都分别测试了残差结构,也发现encoder的部分对于残差结构是比较依赖的,但是bridge和decoder的残差结构都没有获得精度上的提高。这里只是说一下我之前的实验结果,供大家参考。

CSP结构的好处就是对比普通的CBL,它分为两个支路,有支路就意味着特征的融合,而concat就可以更好的把不同支路的特征信息保留下来,因此CSP的设计可以提取到更为丰富的特征信息。

3.SPP

YOLOv5-6.2源码解析-train.py(超级无敌巨详细版) 本人炼丹小白,此篇博文用于记录学习YOLO系列之旅,一方面供自己回顾,一方面供大家参考,欢迎各路大神评论交流。所写内容均为原创,如需参考引用请标明出处! 阅读详情

相关推荐

torch2trt源码级深度解析:PyTorch到TensorRT推理链路的契约机制与7大生死线

PyTorch模型部署至TensorRT并非简单格式转换,而涉及动态图语义、静态图约束与CUDA内存管理三者间的精密编译时契约。其核心原理在于ONNX作为中间表示层所承载的算子兼容性边界与类型传递规则,技术价值体现在推理性能提升与硬件加速落地,广泛应用于自动驾驶(Jetson Orin)、云边协同(A100/T4混合集群)及医疗影像(V100+FP16)等对延迟、精度和稳定性要求严苛的场景。本文基于torch2trt真实企业级故障案例,深入剖析trace输入纯净性、ONNX opset版本控制、自定义算子注

weixin_34221775的博客 289

【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)

一文带你详细了解YOLOv5(含YOLO系列论文讲解+源码详解+入门实践+算法改进)

路人贾的博客 25万+

CPU核心、die和package的区别:从硬件小白到高手的进阶指南

本文深入浅出地解析了CPU核心、Die与Package的核心概念与区别,是硬件爱好者从入门到精通的实用指南。文章从硅晶圆制造讲起,阐述了物理核心与逻辑线程(如超线程技术)的工作原理,并详细介绍了封装(Package)的作用与多Die模块化设计。最后,结合实际应用场景,提供了选购、性能解读与优化调优的实用建议。

pz89012345的博客 195

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 228

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境

本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。

weixin_29294395的博客 254

MCSDK5.4.8电机库双电阻采样适配:从扇区判断到固定采样的重构实践

本文详细解析了MCSDK5.4.8电机库中双电阻采样技术的重构实践,从扇区判断到固定采样的关键步骤。通过硬件配置优化、核心文件重构及电流读取函数改造,实现高效稳定的电机控制,特别适用于成本敏感型项目。文章还提供了占空比限制计算、参数调整及常见问题排查等实用技巧,助力工程师快速掌握两电阻采样方法。

weixin_42532938的博客 271

5分钟搞懂深度学习如何革新声源定位:从GCC-PHAT到DNN的实战对比

本文深入对比了深度学习与传统GCC-PHAT方法在声源定位领域的实战表现。通过具体实验数据,展示了DNN模型在强混响、低信噪比等复杂场景下,如何实现定位准确率的显著提升,并探讨了其数据驱动范式带来的鲁棒性优势与工程部署挑战。

3a9bq4r8t2y的博客 220

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 347

MT25QL256完整操作指南:从ID读取到4KB扇区擦除(附华大SPI例程)

本文提供了MT25QL256 NOR FLASH在华大MCU上的完整驱动开发指南。内容涵盖从SPI初始化、器件ID读取、状态寄存器查询,到核心的页编程和4KB扇区擦除操作,并分享了构建健壮驱动框架、处理跨页写入及常见调试问题的实战经验。

tt34567的博客 878

node: /lib64/libstdc++.so.6: version `CXXABI_1.3.11‘ not found (required by node) 解决方案

本文主要介绍了node: /lib64/libstdc++.so.6: version `CXXABI_1.3.11’ not found (required by node) ,希望能对使用nodejs的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 2020年AI竞赛获奖方案复盘系列(二) 遥感语义分割竞赛trick-2020华为云人工智能大赛
下一篇: yolov5深度剖析+源码debug级讲解系列(二)backbone构建
吸欧大王
博客等级 码龄10年 611粉丝 27原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值