yolo.py代码精读

YOLOV5——Model之parse_model(d, ch) yolov5的parse_model(d, ch) 阅读详情

在阅读代码过程中碰到的一些小问题,大家可以查阅目录找找有没有自己需要的地方,分为parse_model和class Detect两部分,不要细看写的很乱。

1.parse_model函数,读入模型yaml中的参数定义

self.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch])  # model, savelist

1.1 ch的含义

input channels

 第一列,即全是-1的这一列,代表输入层,如果是-1就代表是上一层。而Focus这一列是模块的名字,卷积核个数后面分别是卷积核尺寸和降采样尺寸。

m = eval(m) if isinstance(m, str) else m

eval()函数的解释在下面(4)中 

1.2 layers, save, c2 = [ ], [ ], ch[-1]

  • layers是用来放模型的积木的,在循环中逐渐把yaml里面的积木读取到里面去
  •  ch的解释在下面1.4 中

 1.3 for i, (f, n, m, args) in enumerate( d['backbone'] + d['head'] ) :

 

  •  from:输入层,-1代表上一层
  • number:卷积层的数量,后面有利用这个n和gd去算不同大小模型对应卷积层数量n = n_ = max(round(n * gd), 1) if n > 1 else n    (在下面n的地方有介绍)
n = n_ = max(round(n * gd), 1) if n > 1 else n

1.4 eval()函数

在全局变量和局部变量的上下文中计算给定的源。m是module

        for j, a in enumerate(args):
            try:
                args[j] = eval(a) if isinstance(a, str) else a  # eval strings
            except NameError:
                pass

上面这些是解析args里面的str ,j是序号,a获取args中的数据,eval strings 

像这种:

比如backbone的第一行[-1, 1, Conv, [64, 6, 2, 2A]],2A经过eval之后变成2.

 1.5 ch

在下面用到:

layers, save, c2 = [], [], ch[-1]  # layers, savelist, ch out

 从函数入口传进来:

def parse_model(d, ch):

 引用:

self.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch])

 在__init__里面定成3:

def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, anchors=None):

所以最上面 c2 = ch[-1] 取了个c2 = 3 出来

报错1

 for j, a in enumerate(args):
            try:
                args[j] = eval(a) if isinstance(a, str) else a  # eval strings
            except NameError:
                pass

make_divisivle()

            if c2 != no:  # if not output
                c2 = make_divisible(c2 * gw, 8)
def make_divisible(x, divisor):
    # Returns x evenly divisible by divisor
    return math.ceil(x / divisor) * divisor

n 

从这里进来:

for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):

 经过:

n = n_ = max(round(n * gd), 1) if n > 1 else n

插回去(当然只有在m是这几种的情况下):

            if m in [BottleneckCSP, C3, C3TR, C3Ghost]:
                args.insert(2, n)  # number of repeats
                n = 1

 c2

m

m接了module的值,经过:

m = eval(m) if isinstance(m, str) else m  # eval strings

m='Conv' 

变成:

 

m_是真正有各种参数的module,m更多只是一个名字

 x = m_.parameters()是一个迭代器:

 迭代出三个东西:

 save

非常神奇: 

save.extend(x % i for x in ([f] if isinstance(f, int) else f) if x != -1)  # append to savelist

register_buffer()

self.register_buffer(‘my_buffer’, self.tensor):my_buffer是名字,str类型;self.tensor是需要进行register登记的张量。这样我们就得到了一个新的张量,这个张量会保存在model.state_dict()中,也就可以随着模型一起通过.cuda()复制到gpu上。
 

2. class Detect

x

经过:

x[i] = self.m[i](x[i])

得到(1,256,4,4) 

x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

变成:(na=3,ny=nx=4,no=85) 

这里就是最后的feature map了,nx=ny=4是feature map的大小,这里每个像素对应一个grid,3是channal个数。

 onnx_dynamic

这个东西是什么意思

na、nl:

self.nl = len(anchors)  # number of detection layers
        self.na = len(anchors[0]) // 2  # number of anchors

 na是感受野的个数,nl是每个感受野的anchor个数,这里附上yolos.yaml中的anchor:

 解析结果

                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i] * self.stride[i])  # xy  #最后一维就是85那个的解析
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh   #2,3是w,h

self.grid[i]是第几个格,大小是(1,3,4,4,2),y大小是[1,3,4,4,85], self.stride[i]是每个grid代表的原图中的像素倍数,即放大倍数

inplace

应该是本地计算的意思另外一个分支,else部分注释有AWS,是云计算的架构。 

 

两个函数的对比,优化之后的在[-0.5,1.5],优化之前的sigmoid在[0,1],可以在超出一个格子的地方活动 

整个Detect的forward过程

    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            x[i] = self.m[i](x[i])  # conv
            bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()

            if not self.training:  # inference
                if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)

                y = x[i].sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, y[..., 4:]), -1)   
                z.append(y.view(bs, -1, self.no))  # no = 85, y.view=[1,3*80*80,85]   y(1,3,80,80,85)

        return x if self.training else (torch.cat(z, 1), x)

每次i的循环,产生一个z,在我的例子中z的大小z[0]=(1,19200,85),z[1]=(1,4800,85),z[2]=(1,1200,85),19200=3*80*80,在dim=1上cat起来得到(1,25200,85)

 _make_grid()

这里制造参数grid: 

grid = torch.stack((xv, yv), 2).expand((1, self.na, ny, nx, 2)).float()

用在:

y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]

grid的形状是(1,3,4,4,2),y的形状是[1,3,4,4,85],grid中最后一维2对应x,y 

yolo代码解析之task.py中的parse_model()函数 总结:该函数的作用是读取 诸如 yolov8、yolov9等的yaml文件,根据配置文件去搭建网络,简化配置过程。①初始化模型相关参数,类别数nc,激活函数act,缩放因子scales,深度倍率depth,宽度倍率width。,即模型中的这一层是用什么算子或模块构建的。parse_model()函数总代码。,表示当前层在整个模型中的位置,从。是一个列表,包含该模块所需的参数。,即该层接收哪些前置层的输出。③ 设置激活函数act。 阅读详情

相关推荐

YOLO与Transformer模型实战:从原理到代码复现与部署优化

目标检测和序列建模是深度学习的核心基础技术。YOLO通过将检测任务转化为回归问题,实现了实时目标检测的突破,其单阶段设计大幅提升了推理速度。Transformer则基于自注意力机制,彻底改变了序列数据的处理方式,能够有效捕捉长距离依赖关系。这两大技术在计算机视觉和自然语言处理领域展现出巨大技术价值,广泛应用于智能监控、自动驾驶、机器翻译等场景。本文聚焦YOLOv8模型和Vision Transformer的实战应用,详细解析YOLO目标检测的网格划分、边界框预测机制,以及Transformer的多头注意力、

weixin_29053383的博客 237

yolo.py 文件解读[Y5周]

yolo.py文件包括模型解析模块parse_model、计算shape模块Detect和模型搭建模块DetectionModel。需要注意的是,在common.py中添加新的模块,需要在parse_model模块里重新添加。

weixin_56118617的博客 1416

YOLOv5源码逐行详细注释与解读:网络结构yolo.py计算机视觉

anchor表示锚框的大小,nc表示类别数目,img_size表示输入图像的尺寸,yolo_index表示该层在整个网络中的索引。在目标检测的训练过程中,我们计算了预测和目标之间的各项损失。首先,我们将预测结果和目标标签进行匹配,得到目标框的坐标、类别和其他信息。在训练过程中,我们首先获取输入张量p的形状,然后根据形状初始化grid和stride。在计算机视觉领域,YOLOv5是一种基于深度学习的目标检测算法,具有快速、高效和准确的特点。在forward函数中,我们根据模型的训练状态来执行不同的操作。

QvisCs的博客 372

YOLOv5之yolo.py代码讲解

目标检测系列之YOLOv5-yolo.py代码讲解,yolo.py文件主要工作是搭建了YOLOv5网络模型,生成Model,yolo.pt文件也可以单独运行。YOLOv5中yolo.py代码的讲解,本文使用的YOLOV5-v6版本,小伙伴们可以自行去github上下载。

weixin_42254289的博客 4581

YOLOV5代码精读之网络结构(yolo.py)

总体而言,这段代码实现了 YOLOv5 检测头部的主体功能。它定义了如何从输入的特征图中提取目标检测的输出,包括每个锚点的边界框位置、宽高和置信度。通过定义卷积层和计算相应的网格,该模块能够高效地处理目标检测任务,并为实际推理做好准备。类继承自BaseModel,表示这是一个检测模型。__init__方法接收模型配置文件 (cfg)、输入通道数 (ch)、类别数 (nc) 和锚框 (anchors) 作为参数。通过self.yaml获取输入通道数,如果未指定则使用默认值ch。

浩瀚之水的专栏 1441

YOLOV5代码精读之val.py

这段代码的主要功能是执行不同的任务(训练、验证、测试、速度基准测试和研究)以评估YOLOv5模型。它根据用户的输入选项进行适当的环境检查、任务执行和结果记录。此代码不仅确保模型的运行符合预期,还提供了警告以避免常见的错误配置(如置信度阈值过高等),并支持结果的高效管理与评估。该函数run的主要功能是执行模型的推理,评估和结果记录。它支持来自 YOLOv5 系列模型的各种输入配置,并根据不同的任务(如验证、测试等)灵活处理数据。

浩瀚之水的专栏 2480

YOLO v5 代码精读(1) detect模块以及非极大值抑制

YOLO 是目前最先进的目标检测模型之一,现在博客上常有的是如何使用YOLO模型训练自己的数据集,而鲜有对YOLO代码的精读。我认为只有对算法和代码实现有全面的了解,才能将YOLO使用的更加得心应手。这里的代码精读为YOLO v5,github版本为6.0。版本不同代码也会有所不同,请结合源码阅读本文。本文使用注释完成对每行代码的解读,文段来概括总结每个代码段。yolo v5代码 6.0版本 github代码地址。

qq_63708623的博客 7808

Ultralytics框架之conv.py代码精读

这段代码定义了一个名为 的函数,其主要功能是计算卷积操作的填充(padding)量,以确保输入和输出的形状一致,即“same”卷积。函数定义: :卷积核的大小(kernel size),可以是整数或列表(即多个维度的卷积核大小)。 :填充量(padding),默认值为 ,这意味着如果未提供填充量,函数将根据卷积核的大小自动计算填充量。 :膨胀率(dilation),默认为1,表示没有进行膨胀卷积。 调整卷积核大小: 如果膨胀率 大于1,函数会根据膨胀率调整卷

浩瀚之水的专栏 942

YOLO v5 代码精读(2)train模块

精读了YOLO v5 6.0版本的detect模块,这篇博客来精读train模块。

qq_63708623的博客 4125

YOLOV5代码精读之网络结构(common.py)

这个函数是整个网络中最基础的组件,由卷积层 + BN层 + 激活函数 组成,具体结构如下图:这段代码定义了一个名为Conv的类,它是 PyTorch 的一个模型模块(nn.Module的子类),用于实现标准的卷积层。下面逐步分解并解释代码的各个部分。CopyInsertConvnn.ModuleCopyInsertSiLUc1c2kspgdactnn.Module:调用父类的构造函数,初始化基类nn.Module。

浩瀚之水的专栏 1299

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4605

YOLO-V5学习路线与开源项目掌握指南

系统讲解YOLO-V5算法的学习路径,涵盖环境配置、代码阅读方法、核心模块解析及工业部署实践。提供从运行Demo到深入源码的完整进阶策略,适合深度学习开发者提升项目实战能力。

weixin_28729843的博客 1001

SAP EWM 内向交货流程(一)

本文介绍了SAP EWM系统中内向交货单的基本配置与操作流程。

huqinghai的专栏 2398

yolo论文【yolov1-v4】

一、yolov1 1、引言 目前的检测系统通过重新使用(reprupose)分类器来执行形式检测。为了检测一个目标,这些系统为该目标取一个分类器,并在test image的不同locations 和scales上来评估它。像可变形部件模型(DPM)这样的系统使用滑动窗口的方法,分类器在整个图像上均匀间隔的位置运行。 DPM:DPM目标检测算法_知识搬运工的博客-优快云博客_dpm目标检测 更近一些的方法像R-CNN用区域建议方法(region proposal methods),首先在图像中生成.

epic_Lin的博客 4924

西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序)

西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485) 西门子博途系列学习笔记SCL(三)______自由口通讯(RS485轮询程序) 文章目录西门子博途V16系列学习笔记SCL(三)___自由口通讯轮询程序(RS485)前言一、FreePort自由口通讯是什么?二、使用步骤1.模块参数定义2.定义FB功能块参数:3.程序代码如下(每天写代码100行,学不会你来找我):总结 前言 很长时间都没有更新了,主要是最近在学习罗克韦尔的STUDIO5000PLC编程软件,怎么说,和博

weixin_42940283的博客 1万+

Ubuntu系统下MRIcroN、FSL6.0.5、Freesurfer7.1.1、ANTs、MRtrix3、AFNI的安装详解——核磁共振数据处理必备

Ubuntu系统下MRIcroN、FSL6.05、Freesurfer7.1.1、MRtrix3、AFNI、ANTs的安装详解一、安装MRIcroN二、 FSL6.0.5完整安装与FSLeyes等Not Found修复Anaconda与虚拟环境(所有操作均在root下)获取最新版Anaconda3安装Anaconda3配置所有用户可用去掉恼人的base创建虚拟环境FSL与FSLeyes安装(所有操作均在root下)下载FSL安装FSL添加环境变量到/etc/bash.bashrc末尾 (ubuntu)或者

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 6085

7天掌握YOLO目标检测:从论文到代码实践

目标检测是计算机视觉的核心任务之一,通过定位和识别图像中的物体为自动驾驶、安防监控等应用提供关键技术支撑。YOLO(You Only Look Once)作为单阶段检测算法的代表,以其高效的实时性能著称。其核心原理是将检测任务转化为回归问题,通过CNN直接预测边界框和类别概率。从YOLOv1到v8的演进中,多尺度预测、锚框机制等创新不断推动性能边界。本学习计划采用论文精读与源码对照的双轨模式,帮助开发者系统掌握YOLO系列的核心设计思想与工程实现。通过Darknet-53骨干网络、PAN-FPN特征融合等关

weixin_34198881的博客 357

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 275

Ultralytics-YOLO项目介绍(包含YOLOV8、YOLOV10、YOLO11、YOLO12、YOLO26)

Ultralytics-YOLO项目,仅仅99就包含YOLOV8、YOLOV10、YOLO11、YOLO12、YOLO26改进内容,一个项目到毕业~

qq_37706472的博客 8598

6-2 GPU GART 绑定机制与 TLB 失效

本文详细解析了AMD GPU的GART(Graphics Address Remapping Table)绑定机制实现。主要内容包括: 绑定流程:从ttm_tt_bind()到硬件PTE更新的完整调用链,重点分析amdgpu_gart_bind()函数实现。 关键函数: amdgpu_gart_bind():执行安全检查、记录映射关系、更新页表等操作 amdgpu_gart_map():将CPU页映射为多个GPU页并填充PTE amdgpu_gmc_set_pte_pde():处理硬件特定的PTE格式 内存

图形/计算GPU的驱动与虚拟化技术分享园地 2655

手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环

本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特

MHD0815的博客 79

「学习YOLO模型并改进优化算法」的系统化学习路线

以下是针对「学习YOLO模型并改进优化算法」的。的样本分配模块,尝试修改匹配阈值分析效果。在YOLOv8代码中定位。

m0_63923786的博客 1905

基于YOLOv11的手术器械计数系统:从数据集构建到Web应用部署

m2cai16-tool数据集:包含15种腹腔镜手术器械的标注图像Cholec80数据集:包含80个胆囊切除手术视频,标注了7种器械SurgicalTools数据集:包含超过10,000张手术器械图像,涵盖21类常见器械手术剪(Scissors)止血钳(Hemostat)持针器(Needle Holder)手术刀(Scalpel)镊子(Forceps)拉钩(Retractor)吸引器(Suction)

YOLO 396

精读双模态目标检测论文系列二|CDC-YOLOFusion中CDS跨模态数据交换移植到YOLO系列代码中(附可运行代码 + 二次顶刊创新思路)

本文介绍了一种基于跨模态数据交换(CDS)的可见光-红外双模态目标检测方法CDC-YOLOFusion。该方法创新性地提出在训练阶段随机交换成对可见光/红外图像的局部区域,强制模型学习跨模态关联。通过双分支网络架构结合跨尺度动态卷积融合模块(CDCF)和模态交互损失,有效提升了复杂场景下的检测精度。实验证明该方法在多个数据集上达到SOTA性能,mAP提升2-3%。文章还提出了三个二次创新方向:自适应交换策略、轻量化融合模块优化和多尺度监督扩展,为后续研究提供了思路。配套提供了可直接复用的代码实现。

2201_75517551的博客 832

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: yolov4,yolov5(学习记录)
下一篇: yolov5 train.py
epic_Lin
博客等级 码龄5年 338粉丝 34原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值