pytorch YoLOV3 源码解析 train.py

本文详细解析了YoloV3的训练流程,包括初始设定、混合精度训练、超参数解析、预训练权重选择等内容,并深入介绍了train.py的主要功能模块,如训练参数设定、模型初始化、数据集与数据加载器的初始化、模型参数设定及训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

train.py

总体分为三部分(不算import 库)
初始的一些设定 + train函数 + main函数
源码地址:
https://github.com/ultralytics/yolov3

一 .import 相关

在这里插入图片描述
torch.distributed 分布式训练
torch.optim.lr_scheduler 学习率衰减

二.初始设定

1使用混合精度训练
在这里插入图片描述
2预训练权重路径
在这里插入图片描述
Python可跨平台使用,但win和linux 的路径分隔符是不同的(斜杠)。
这里的os.sep会根据你所处的平台,自动采用相应的分隔符号。
results.txt 记录loss

3获取本地的超参数文件并解析
在这里插入图片描述
使用glob.glob来获取文件
4是否使用focal loss
在这里插入图片描述


三.main函数:

1参数的设定(之后涉及会说明)
这里是程序的默认参数
在这里插入图片描述
关于parser.add_argument的action=‘store_true’ 的解释是如果命令行执行程序时 设定对应的参数 那么这个参数的布尔值会变为True。
以这个为例:
parser.add_argument(’–nosave’, action=‘store_true’, help=‘only save final checkpoint’)
如果执行
train.py nosave
那么
opt.nosave 布尔值为True 一般涉及if判断 即 if opt.nosave :
2
在这里插入图片描述
p1 预训练权重的选择 如果设定了opt.resume就使用上次保存的权重 即命名带last.pt。else使用opt.weights路径下的权重

p2 一些check操作
check_git_status()函数 check一些版本 和 进程相关的内容。

p3 原本opt.img_size 设定的是一个img最大值和最小值 这里再添加一个test中img的size

p4 程序运行device的设定
如果opt.device 设定为GPU就使用混合精度计算。
设定GPU一般用数字id表示 0表示在第一个GPU上执行程序

3
在这里插入图片描述
if not:如果为False 就使用之前预设好的超参数进行训练 train(hyp)是进行正常的训练
之前设定的hyp是超参数搜索之后的超参数值。
使用opt.evolve判断是否使用超参数搜索的参数来训练

else:
以# Evolve hyperparameters (optional)方式来训练
以下暂略

四.train normal:

在这里插入图片描述
初始的一些设定
accumulate是用于判断模型是否进行更新参数
在这里插入图片描述
这个32是指模型的32前向传播会进行32倍的下采样率
也就是指32下采样后的featmap 的一个像素点 表示原图 32像素点的特征信息。详见原理
判断imgsz_min 是否可以整除32,刚好整除就不会出现 featmap 大小32.5 取整 为32 导致的信息损失。
assert函数 是判断后面是否出现异常。

在这里插入图片描述
解析运行程序时所对应的data文件
我感觉如果是训练自己的数据集 这个80要修改成对应的类别数,不知道是否是这样的。
在这里插入图片描述
移除之前保存的图片

初始化模型

在这里插入图片描述

在这里插入图片描述
attempt_download 用来获取权重 weights 是之前的opt.weights
在这里插入图片描述
if 权重文件是以pt结尾 也就是使用pytorch state_dict方式保存的形式。
这个pt文件包含四个部分(有的部分可能为空,就是写入的时候没有写入)
ckpt[weights]模型权重参数,ckpt[optimizer]优化器的参数,
ckpt[training_results]是这个权重文件中之前保存的结果 如果有就把里面的值写入我们这个程序的result.txt文件
ckpt[epoch] 这个权重文件中训练的epoch
def ckpt 释放一些内存
在这里插入图片描述
如果模型是YOLOV3 源码相关的格式保存的就用这种方式加载,比如我跑的预训练权重文件就叫
YOLOV3.weights

在这里插入图片描述
这段函数的含义就是是否进行freeze_layers操作,字面意思就是冻结一些层的权重参数,不去训练这些层,而是训练一些特定的层。这里训练yolo层 和 yolo层之后的一层。其他的层冻结操作。

在这里插入图片描述
关于混合精度训练的设定
在这里插入图片描述
学习率

在这里插入图片描述
分布式训练设定
在这里插入图片描述

初始化Dataset和Dataloader 用于训练

在这里插入图片描述
初始化Testloader 用于test
在这里插入图片描述
模型的参数设定
nc模型的类别数
hyp超参数
GIoU
gr 是涉及到giou的权重系数
原本使用iou来判别回归损失的时候有自身的缺点。1如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度)。同时因为loss=0,没有梯度回传,无法进行学习训练。2不能判别两个标定框的重合程度。
在这里插入图片描述
c是指A和B的最小封闭形状。
GIoU公式 是指IoU 减去 ( |c中不包含A和B的区域| :|c的区域|)
这个公式可以表示两个标定框的重合程度。在IoU为0的时候也不会对更新参数有不好的影响。

EMA指数加权平均操作
也叫滑动平均值
在这里插入图片描述
在这里插入图片描述
计算公式 β×之前时刻数值 + (1-β)×此时的数字
当β越大时,滑动平均得到的值越和v的历史值相关
在这里插入图片描述


训练
一次迭代为一个周期
在这里插入图片描述
这里是判断是否要更改权重 这里没有使用。
在这里插入图片描述
把迭代dataloader的操作 使用tqdm 来封装 迭代的时候会显示进度条
ni是总体上已迭代的batch数
归一化操作
在这里插入图片描述
n_burn 是之前设定的参数
用于是否进行x interp操作
在这里插入图片描述
opt.multi_scale 是上面求得的,判断是否对图片进行随机缩放
在这里插入图片描述
前向传播的到模型的预测值

在这里插入图片描述
计算loss
在这里插入图片描述
backward
在这里插入图片描述
accumulate 之前设定的值 判断是否更新参数
在这里插入图片描述
把mloss,mem 等信息set到进度条显示中
在这里插入图片描述
ni = 0 时 也就是第一个batch 会保存一张带有模型预测信息的图片
到此迭代完一个batch

迭代完整体的dataloader时,也就是是一个epoch:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
记录最好的 results
在这里插入图片描述
保存最好的模型权重 并释放ckpt
在这里插入图片描述
opt.name = ’ ’ 为空
len(opt.name) = 0
if 0 相当于 if False 不执行
在这里插入图片描述

时间不够 有的地方不具体 之后补充 欢迎留言

涉及的论文:
https://arxiv.org/pdf/1812.01187.pdf
https://arxiv.org/pdf/1812.01187.pdf
网站:
论文相关博客:
https://zhuanlan.zhihu.com/p/51870052
https://blog.csdn.net/diligent_321/article/details/87885418
超参数搜索
https://www.cnblogs.com/pprp/p/12432549.html
round()函数
https://blog.csdn.net/lly1122334/article/details/80596026
math.fmod()
https://blog.csdn.net/sunline_wanghj/article/details/79490986
check out()
https://www.cnblogs.com/hubavyn/p/8467329.html
GIoU
https://zhuanlan.zhihu.com/p/57992040
https://zhuanlan.zhihu.com/p/94799295
EMA:
https://blog.csdn.net/mikelkl/article/details/85227053
https://www.jianshu.com/p/f99f982ad370
分布式训练:
https://blog.csdn.net/m0_38008956/article/details/86559432?utm_source=blogxgwz4

### YOLOv8 中 `loss.py` 的实现与解析 YOLOv8 是 Ultralytics 提供的一个高效的目标检测框架,其核心功能基于 PyTorch 实现。虽然官方并未单独提供名为 `loss.py` 的独立文件[^3],但在 YOLOv8 的源码结构中,损失计算的功能主要集中在模型定义的部分,尤其是 `model.py` 和 `trainer.py` 文件中。 以下是关于 YOLOv8 损失计算的核心逻辑及其代码解析: #### 1. 前向传播中的损失计算 在 YOLOv8 的训练流程中,损失值通过调用模型本身的方法来计算。具体来说,在 `trainer.py` 文件中,前向传播部分如下所示: ```python with torch.cuda.amp.autocast(self.amp): # 开启混合精度训练 batch = self.preprocess_batch(batch) # 对输入数据进行预处理 self.loss, self.loss_items = self.model(batch) # 调用模型计算损失值和各项损失明细 ``` 上述代码片段展示了如何利用模型的前向传播方法计算损失值。其中,`self.model(batch)` 返回两个值:整体损失 (`self.loss`) 和各个子项的损失详情 (`self.loss_items`) [^1]。 #### 2. 反向传播中的梯度更新 反向传播阶段同样依赖于 PyTorch 的自动求导机制,并结合了混合精度训练的支持: ```python self.scaler.scale(self.loss).backward() # 使用 scaler 自动缩放损失并执行反向传播 ``` 这里的关键在于 `torch.cuda.amp.GradScaler` 的使用,它能够有效提升 GPU 利用率并减少内存占用 。 #### 3. 损失的具体构成 尽管 YOLOv8 并未像 YOLOv5 那样显式分离出一个专门用于构建目标框匹配的模块(如 `build_targets`),但它仍然继承了类似的多尺度锚点设计思路。YOLOv8 的损失主要包括以下几个组成部分: - **Box Loss**: 表示预测边界框与真实边界框之间的回归误差。 - **Objectness Loss**: 衡量预测置信度与实际物体存在的差异。 - **Class Loss**: 测量分类概率分布与真实标签之间的交叉熵损失。 这些损失项通常由模型内部的头部网络负责计算,并最终汇总为总的损失值返回给训练器 [^4]。 #### 4. 正样本扩充策略 类似于 YOLOv5 的做法,YOLOv8 同样采用了正样本扩充的技术以提高模型鲁棒性和泛化能力。不过,具体的实现细节有所调整。例如: - 锚点分配不再严格绑定到固定的三个比例尺上; - 支持动态选择最佳候选区域作为正样本; - 结合特征图的空间位置关系进一步优化目标匹配过程 [^2]。 这种改进使得 YOLOv8 在保持高性能的同时简化了配置参数的选择难度。 --- ### 示例代码展示 以下是一个简化的伪代码版本,用来说明 YOLOv8 如何集成损失计算与训练循环: ```python class Trainer: def __init__(self, model, amp=True): self.model = model self.amp = amp self.scaler = torch.cuda.amp.GradScaler(enabled=amp) def train_step(self, batch): with torch.cuda.amp.autocast(self.amp): preds = self.model(batch["img"]) # 获取模型输出 loss, loss_items = compute_loss(preds, batch["labels"]) # 计算损失 self.scaler.scale(loss).backward() # 执行反向传播 return loss_items ``` 在此基础上,`compute_loss` 函数会综合考虑 box、objectness 和 class 等多个维度上的偏差贡献,从而形成完整的监督信号指导权重更新。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值