YOLOX训练代码分析1-COCO与VOC训练

14 篇文章 20 订阅
10 篇文章 1 订阅

1. YOLOX的网络结构图与代码YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)_YMilton的专栏-CSDN博客​​​​​(icon-default.png?t=N7T8https://blog.csdn.net/YMilton/article/details/120268832?spm=1001.2014.3001.5502

 (1) 网络结构图

(2) yolox代码URL:

https://github.com/Megvii-BaseDetection/YOLOX.git

 2. yolox如何训练coco数据

(1) 第一步(参数理解):yolox训练数据的入口为YOLOX-main/tools/train.py。main函数中通过get_exp获取训练过程相关的超参数。

其中train.py中的make_parser函数的参数解析如下:

-expn: 训练过程数据保存的位置,默认位置是tools/YOLOX_outputs中的目录,如果指定-expn xxx,则tools/YOLOX_outputs/xxx

-n: 指定训练过程的模型名称,如yolox-s,yolox-m,yolox-l,yolox-x,yolox-tiny等

-b: 训练过程中的batch size大小

-d: 指定训练过程中使用的设备

-f: 设置训练过程中数据加载的python文件,如exps/example/yolox_voc/yolox_voc_s.py

-c: 设置预训练权重文件

-e: 开始训练的周期数

--fp16: 是否允许Apex的混合精度加速,使得训练时间缩短。代码实现如下:

from apex import amp
model, optimizer = amp.initialize(model, optimizer, opt_level="O1") # 这里是“欧一”,不是“零一”
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward()

混合精度训练(Mixed Precision的精髓在于“在内存中用 FP16 做储存和乘法从而加速计算,用 FP32 做累加避免舍入误差”。混合精度训练的策略有效地缓解了舍入误差的问题。

-o: 是否首先占用GPU内存进行训练

opts: 通过命令行的形式修改训练过程的超参数

(2) 第二步(数据加载):训练过程中如果指定为VOC数据,则通过

-f exps/example/yolox_voc/yolox_voc_s.py

完整的训练语句:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 8 -b 64 --fp16 -o -c /path/to/yolox_s.pth 

 其中训练的时候VOC数据需要解压到datasets中,如图

训练过程中如果是指定COCO数据集(COCO数据集不在YOLOX-main/datasets中),需要在example中自己创建yolox_coco_s.py文件(从yolox_voc_s.py中复制内容到yolox_coco_s.py中),训练的语句

python tools/train.py -f ../exps/example/yolox_coco/yolox_coco_s.py -b 8 -o --fp16

本文中COCO数据集在E:/DataSets/COCO中,其中yolox_coco_s.py文件的配置主要包括网络大小构建(Exp的构造函数)、训练数据集获取(get_data_loader)与验证数据集获取(get_eval_loader)。代码解释如下:

1) 构造函数中的self.depth与self.width控制yolox网络的大小,其中网络大小包括s、m、l、x,不同网络的depth与width不同,s: depth=0.33,width=0.50;m: depth=0.67,width=0.75;l:depth=1.0,width=1.0;x: depth=1.33,width=1.25。其中self.input_size控制网络输入的大小。构造函数如下:

def __init__(self):
    super(Exp, self).__init__()
    self.num_classes = 80
    self.depth = 0.33  #控制网络的深度与宽度
    self.width = 0.50
    self.input_size=(416,416) # 网络输入大小
    self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

2) 加载训练数据集,需要修改VOCDetection为COCODataset,data_dir指定训练数据集的路径,json_file指定训练集标签的json文件,name指定训练的名称,其他的不变。修改如下

# COCO数据的加载
dataset = COCODataset(data_dir='E:/DataSets/COCO', json_file='instances_train2014.json', name='train2014',img_size=self.input_size, preproc=TrainTransform(rgb_means=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_labels=50))

 3) 加载验证数据集,同样需要修改VOCDetection为COCODataset对象,data_dir指定验证集路径,json_file指定标注json文件。

# 验证数据集加载
valdataset = COCODataset(data_dir='E:/DataSets/COCO', json_file='instances_val2014.json', img_size=self.test_size, preproc=ValTransform(rgb_means=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225)))

 最终的网络加载、COCO训练数据集加载、COCO验证数据集加载的整个代码如下:

# encoding: utf-8
import os

import torch
import torch.distributed as dist

from yolox.exp import Exp as MyExp  # Exp:为yolox.exp中的文件yolox_base.py的类Exp


class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.num_classes = 80
        self.depth = 0.33  #控制网络的深度与宽度
        self.width = 0.50
        self.input_size=(416,416) # 网络输入大小
        self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

    # 加载COCO训练数据集
    def get_data_loader(self, batch_size, is_distributed, no_aug=False):
        from yolox.data import (COCODataset, TrainTransform, YoloBatchSampler, DataLoader, InfiniteSampler,
                                MosaicDetection)
        # COCO数据的加载
        dataset = COCODataset(data_dir='E:/DataSets/COCO', json_file='instances_train2014.json', name='train2014',
                              img_size=self.input_size, preproc=TrainTransform(rgb_means=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_labels=50))
        # Mosaic的处理
        dataset = MosaicDetection(dataset, mosaic=not no_aug, img_size=self.input_size,
                                  preproc=TrainTransform(rgb_means=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_labels=120),
                                  degrees=self.degrees, translate=self.translate,scale=self.scale, shear=self.shear,
                                  perspective=self.perspective, enable_mixup=self.enable_mixup)

        self.dataset = dataset

        if is_distributed:
            batch_size = batch_size // dist.get_world_size()

        sampler = InfiniteSampler(len(self.dataset), seed=self.seed if self.seed else 0)

        batch_sampler = YoloBatchSampler(sampler=sampler, batch_size=batch_size, drop_last=False, input_dimension=self.input_size, mosaic=not no_aug)

        dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
        dataloader_kwargs["batch_sampler"] = batch_sampler
        train_loader = DataLoader(self.dataset, **dataloader_kwargs)

        return train_loader

    # 加载COCO验证数据集
    def get_eval_loader(self, batch_size, is_distributed, testdev=False):
        from yolox.data import COCODataset, ValTransform

        valdataset = COCODataset(
            data_dir='E:/DataSets/COCO',
            json_file='instances_val2014.json',
            img_size=self.test_size,
            preproc=ValTransform(rgb_means=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225))
        )

        if is_distributed:
            batch_size = batch_size // dist.get_world_size()
            sampler = torch.utils.data.distributed.DistributedSampler(valdataset, shuffle=False)
        else:
            sampler = torch.utils.data.SequentialSampler(valdataset)

        dataloader_kwargs = {"num_workers": self.data_num_workers,"pin_memory": True,"sampler": sampler}
        dataloader_kwargs["batch_size"] = batch_size
        val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

        return val_loader

    def get_evaluator(self, batch_size, is_distributed, testdev=False):
        from yolox.evaluators import COCOEvaluator

        val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
        evaluator = COCOEvaluator(dataloader=val_loader, img_size=self.test_size, confthre=self.test_conf,
                                  nmsthre=self.nmsthre, num_classes=self.num_classes)
        return evaluator

训练结果输出

训练过程中会在tools/YOLOX_outputs/yolox_coco_s中生成训练过程存储的日志文件。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 首先,需要下载VOC2007数据集并解压缩。然后,需要安装Darknet框架并进行配置。接着,需要在Darknet中创建一个新的数据集配置文件,并将VOC2007数据集的路径添加到该文件中。然后,需要将VOC2007数据集的标签转换为Darknet格式。接下来,需要在Darknet中创建一个新的网络配置文件,并将其与数据集配置文件关联。最后,可以使用Darknet中的命令行工具开始训练yolov7模型。具体步骤可以参考Darknet官方文档或相关教程。 ### 回答2: YOLOv7是目标检测算法YOLO的升级版本,在训练VOC2007数据集的步骤如下: 1. 数据准备:下载VOC2007数据集并解压,得到Annotations(包含标注信息的XML文件)、ImageSets/Main(包含训练、验证和测试集信息的txt文件)、JPEGImages(包含图像文件)三个文件夹。 2. 数据标注:使用标注工具(如LabelImg)对JPEGImages文件夹中的图像进行标注,生成每个图像对应的XML标注文件,将这些文件放入Annotations文件夹中。 3. 数据划分:在ImageSets/Main文件夹中,使用trainval.txt文件列表划分训练和验证集。可以将数据按照一定比例划分,比如将80%的数据作为训练集,20%的数据作为验证集。可以自定义训练集和验证集的txt文件,比如train.txt和val.txt。 4. 创建类别文件:在YOLOv7的训练过程中,需要一个包含所有类别名的txt文件。可以根据VOC2007数据集的类别来创建一个包含类别名的classes.txt文件。 5. 配置文件:在YOLOv7的cfg文件夹中,可以根据具体需要选择对应的配置文件。可以根据数据集的类别数、输入图像尺寸和训练参数进行调整。比如使用yolov7-voc.cfg作为基础配置文件。 6. 修改配置文件:修改cfg文件夹中的yolov7-voc.cfg文件,主要是修改以下参数:classes(设置为数据集中的类别数)、filters(根据类别数做计算)、train、valid、names(数据集的类别文件路径)、backup(模型权重保存的路径)等。 7. 训练网络:在终端中使用命令行进入YOLOv7的路径下,运行指令`python train.py`进行模型训练训练过程中会每隔一段时间显示训练的loss值。训练时间会根据数据集的大小和计算机性能而有所不同。 8. 保存权重:训练完成后,YOLOv7会自动保存训练好的权重文件。默认保存路径是cfg文件夹下的weights子文件夹。 9. 模型评估:使用验证集对训练好的模型进行评估,可以使用命令行运行指令`python test.py`来进行评估。评估的结果将在终端显示。 以上就是使用YOLOv7训练VOC2007数据集的详细步骤,通过这些步骤可以得到在VOC2007上训练好的目标检测模型。 ### 回答3: 训练YOLOv7模型使用VOC2007数据集的详细步骤如下: 1. 准备数据集:首先,下载并解压VOC2007数据集,该数据集包含图像和对应的标注文件(XML格式)。将数据集划分为训练集和验证集,通常按照70%的比例划分。确保数据集中每个类别的目标都有足够数量的样本。 2. 数据标注:使用标注工具(如LabelImg)手动标注每个图像中的目标,并将标注信息保存为XML文件,其中包含目标类别、边界框位置和尺寸等信息。 3. 数据转换:将VOC2007数据集的XML标注文件转换为YOLOv7可识别的格式。可以使用脚本(如convert.py)将每个XML文件中的目标转换为YOLOv7所需的格式(类别索引,归一化的边界框坐标等)并保存为txt文件。 4. 配置模型:下载YOLOv7的代码仓库,然后根据具体需求,修改相应的超参数和配置文件。在配置文件中设置类别数量和类别名称等参数,确保与VOC2007数据集相符。 5. 数据增强:为了增加数据集的多样性和模型的泛化能力,可以对训练集数据进行增强操作,如随机旋转、缩放和裁剪等。这样可以生成更多的训练样本。 6. 模型训练:使用训练脚本(train.py)以及配置好的模型和数据集,开始训练模型。根据需要可以定义训练的迭代次数、学习率和批量大小等参数。在训练过程中,模型会不断地学习目标的特征和边界框预测。 7. 模型评估:当模型训练完成后,使用验证集对模型进行评估。在评估过程中,模型会生成目标类别的预测和边界框,然后与真实标注进行比较,计算精度、召回率和平均准确率等指标。 8. 推理测试:使用训练好的模型对新的图像进行目标检测测试。模型会输出检测到的目标类别和边界框,并可视化展示。 通过以上步骤,可以使用YOLOv7模型对VOC2007数据集进行训练,并得到一个能够进行目标识别的模型。训练过程可能需要较长时间和较大的计算资源,同时需要合理调参和优化,以获得更好的检测效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值