yolov5训练部分

简易版

# 开始训练轮次
    for epoch in range(start_epoch,epochs):
        # 回调函数
        callbacks.run('on_train_epoch_start')
        # 设置模型为训练模式,这样模型会启用dropout和batchnormlization等训练特有的层
        model.train()
        # 初始化损失
        mloss=torch.zeros(3,device=device)

        # 清0优化器梯度
        optimizer.zero_grad()
        pbar=enumerate(train_loader)
        # 遍历每个批次
        for i,(imgs,targets,paths,_) in pbar:
            callbacks.run('on_train_batch_start')
            # 图像处理
            imgs=imgs.to(device,non_blocking=True).float()/255


        # forward
        # 上下文管理器 启用自动混合精度
        with torch.cuda.amp.autocast(amp):
            # 模型前向传播
            pred=model(imgs)
            # 计算损失
            loss,loss_items=compute_loss(pred,targets.to(device))

        # backward
        # 使用scaler 对损失值进行缩放
        scaler.scale(loss).backward()
        
        # optimizer
        # ni:当前的训练步骤 上次优化的步骤  设置的累计步数
        # 是否达到了梯度累计的标准
        if ni-last_opt_step>=accumulate:
            # 梯度从缩放状态转化为原始状态
            scaler.unscale_(optimizer)
            # 进行梯度裁剪,防止梯度爆炸 max_norm=10.0:裁剪的阈值
            torch.nn.utils.clip_grad_norm_(model.parameters(),max_norm=10.0)
            # 优化步骤
            scaler.step(optimizer)
            # 更新
            scaler.update()
            # 梯度清0,以准备下一次前向和反向传播
            optimizer.zero_grad()

日志记录表头信息

LOGGER.info(('\n' + '%11s' * 7) % ('Epoch', 'GPU_mem', 'box_loss', 'obj_loss', 'cls_loss', 'Instances', 'Size'))

(‘%11s’ * 7) 创建了一个格式字符串,表示每个字符串占 11 个字符的位置,并且重复了 7 次。

分布式训练准备

LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1))  # https://pytorch.org/docs/stable/elastic/run.html
RANK = int(os.getenv('RANK', -1))
WORLD_SIZE = int(os.getenv('WORLD_SIZE', 1))
GIT_INFO = check_git_info()

断点训练Resume

def train(hyp, opt, device, callbacks):  # hyp is path/to/hyp.yaml or hyp dictionary
    save_dir, epochs, batch_size, weights, single_cls, evolve, data, cfg, resume, noval, nosave, workers, freeze = \
        Path(opt.save_dir), opt.epochs, opt.batch_size, opt.weights, opt.single_cls, opt.evolve, opt.data, opt.cfg, \
        opt.resume, opt.noval, opt.nosave, opt.workers, opt.freeze
    callbacks.run('on_pretrain_routine_start')

    # Directories
    w = save_dir / 'weights'  # weights dir
    # 如果目录已存在则不会报错(exist_ok=True),mkdir 创建目录
    (w.parent if evolve else w).mkdir(parents=True, exist_ok=True)  # make dir
    last, best = w / 'last.pt', w / 'best.pt'

    # Hyperparameters
    if isinstance(hyp, str):
        with open(hyp, errors='ignore') as f:
            hyp = yaml.safe_load(f)  # load hyps dict
    LOGGER.info(colorstr('hyperparameters: ') + ', '.join(f'{
     
     k}={
     
     v}' for k, v in hyp.items()))
    # 将超参数的副本存储在 opt.hyp 中,以便在检查点中保存
    opt.hyp = hyp.copy()  # for saving hyps to checkpoints

    # Save run settings
    if not evolve:
        yaml_save(save_dir / 'hyp.yaml', hyp)
        yaml_save(save_dir / 'opt.yaml', vars(opt))

    # Loggers
    data_dict = None
    # 如果当前进程是主进程(RANK 为 -1 或 0),则实例化日志记录器 Loggers,并传入保存目录、权重、选项、超参数和日志记录器
    if RANK in {
   
   -1, 0}:
        loggers = Loggers(save_dir, weights, opt, hyp, LOGGER)  # loggers instance

        # Register actions
        # 遍历 loggers 中的方法,并将这些方法注册为回调动作,以便在训练过程中能够调用它们
        for k in methods(loggers):
            callbacks.register_action(k, callback=getattr(loggers, k))

        # Process custom dataset artifact link
        # 从 loggers 中获取远程数据集的信息。
        data_dict = loggers.remote_dataset
        if resume:  # If resuming runs from remote artifact
            weights, epochs, hyp, batch_size = opt.weights, opt.epochs, opt.hyp, opt.batch_size

    # Config
    # plots 变量用于决定是否生成训练过程中的可视化图表。只有在不进行超参数进化且没有禁用绘图时,plots 才会为 True。
    plots = not evolve and not opt.noplots  # create plots
    cuda = device.type != 'cpu'
    # 初始化随机种子,以确保训练的可重复性。种子是根据传入的种子加上 RANK(进程标识符)生成的,deterministic=True 确保所有操作都是确定性的。
    init_seeds(opt.seed + 1 + RANK, deterministic=True)
    # 使用 torch_distributed_zero_first 上下文管理器确保在分布式训练中,只有主进程(LOCAL_RANK 为 0)会调用 check_dataset 函数检查数据集。如果 data_dict 是 None,则调用 check_dataset 来验证数据集的有效性。
    with torch_distributed_zero_first(LOCAL_RANK):
        data_dict = data_dict or check_dataset(data)  # check if None
    # 从 data_dict 中提取训练和验证数据集的路径
    train_path, val_path = data_dict['train'], data_dict['val']
    # 根据 single_cls 的值设置类别数量。如果是单类别(single_cls 为 True),则类别数量为 1;否则从 data_dict 中获取
    nc = 1 if single_cls else int(data_dict['nc'])  # number of classes
    # 如果是单类别并且 data_dict 中的名称数量不是 1,则将名称设置为 {0: 'item'};否则使用 data_dict 中的名称列表。
    names = {
   
   0: 'item'} if single_cls and len(data_dict['names'
<think>好的,我现在要帮用户了解如何使用YOLOv5进行模型训练,包括模型配置和数据集准备。首先,我需要回忆YOLOv5的相关知识,并结合用户提供的三个引用内容来组织答案。 用户提到了引用1、2、3,其中引用1是关于从环境配置到模型部署的教程,引用2提到了使用预训练权重和训练参数,引用3涉及数据集划分和验证命令。需要整合这些信息,确保引用正确。 首先,环境配置是必须的步骤,引用1中提到了Windows环境配置,应该包括Python、PyTorch、CUDA等。然后数据集准备部分需要指导用户如何采集、标注和划分数据,引用3提到了数据集的划分和验证命令,这里需要强调数据集目录结构,比如images和labels文件夹,以及train、val、test子目录。 模型配置方面,YOLOv5有不同的预训练模型,如YOLOv5s、YOLOv5m等,引用2提到了使用YOLOv5m的预训练权重,这里需要说明如何选择模型,并修改对应的yaml文件,比如yolov5s.yaml。同时,用户需要创建自己的数据集配置文件,如data.yaml,设置类别和路径,引用3中的Helmet.yaml例子可以作为参考。 训练命令部分,引用2给出了示例命令,包括--weights、--cfg、--data等参数,需要详细说明每个参数的作用,以及如何调整epochs和batch-size。此外,引用3中的验证命令也需要提及,但用户当前的问题是训练,所以可能放在相关问题里更合适。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如数据集标注工具、参数调优、训练问题排查、模型评估和部署,引用1和3提到了部署和验证,可以作为相关问题的基础。 需要检查是否遵循了系统级指令,比如数学公式的格式是否正确,但这里可能用不到太多数学公式,主要涉及代码和命令行。同时,回答要结构清晰,分步骤说明,并正确添加引用标记。确保所有引用都对应正确的来源,比如引用1是环境配置,引用2是预训练权重和训练参数,引用3是数据集划分和验证。 现在,组织这些内容,确保每个步骤都有对应的引用,语言简洁明了,帮助用户逐步完成YOLOv5训练流程。</think>以下是使用YOLOv5进行模型训练的详细教程,包含环境配置、数据集准备和模型训练的关键步骤: ### 一、环境配置 1. **安装Python环境** 建议使用Python 3.8+,通过Anaconda创建虚拟环境: ```bash conda create -n yolov5 python=3.8 conda activate yolov5 ``` 2. **安装PyTorch和依赖库** 根据CUDA版本选择PyTorch安装命令(需提前安装NVIDIA显卡驱动): ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt # 从YOLOv5官方仓库下载的依赖文件 ``` 引用官方仓库地址:https://github.com/ultralytics/yolov5 [^1] --- ### 二、数据集准备 1. **数据标注规范** - 使用标注工具(如LabelImg)生成YOLO格式的标签文件(.txt) - 每张图片对应一个标签文件,格式:`类别索引 x_center y_center width height`(归一化数值) 2. **目录结构示例** ``` datasets/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 └── labels/ ├── train/ # 训练集标签 ├── val/ # 验证集标签 └── test/ # 测试集标签 ``` 3. **创建数据集配置文件** 新建`data.yaml`文件,内容示例: ```yaml train: datasets/images/train val: datasets/images/val nc: 2 # 类别数量 names: ['helmet', 'no_helmet'] # 类别名称 ``` 引用类似配置见安全帽检测案例[^3] --- ### 三、模型配置 1. **选择预训练模型** YOLOv5提供不同规模的模型(s/m/l/x),配置文件路径: ``` yolov5/models/yolov5s.yaml yolov5/models/yolov5m.yaml ``` 2. **自定义模型配置(可选)** 修改yaml文件的`nc`参数与数据集类别数一致: ```yaml # yolov5s.yaml nc: 2 # 修改为实际类别数 anchors: [ [10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326] ] ``` --- ### 四、启动训练 1. **基础训练命令** ```bash python train.py --img 640 --batch 16 --epochs 50 --data data.yaml --cfg yolov5s.yaml --weights yolov5s.pt ``` - `--weights`:加载预训练权重(推荐使用官方权重)[^2] - `--batch`:根据GPU显存调整批次大小(RTX 3090建议16-64) 2. **进阶参数** ```bash --device 0 # 指定GPU编号 --name exp_name # 自定义实验名称 --hyp data/hyps/hyp.scratch-low.yaml # 超参数配置文件 ``` --- ### 五、训练结果验证 训练完成后,在`runs/train/exp/`目录下查看: - `weights/best.pt`:最佳模型权重 - `results.png`:损失曲线和评估指标可视化 - 使用验证命令测试模型性能: ```bash python val.py --weights runs/train/exp/weights/best.pt --data data.yaml ``` 引用验证方法见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值