YOLOX训练自己的数据集(头铁出来的超详细教程)

这里写自定义目录标题

  • 1.YOLOX环境搭建
  • 1.1新建一个conda环境
  • 1.2安装代码依赖的库文件
  • 1.3通过setup.py安装一些库文件
  • 1.4下载apex文件
  • 1.4下载pycocotools
  • 2.创建自己的数据集
  • 2.1创建VOC格式数据集
  • 3.训练
  • 3.1修改文件代码
  • 3.2开始训练
  • 3.测试
  • 3.1测试自己的训练结果
  • 3.预测结果
  • 参考(侵删)
  • 1.YOLOX环境搭建

    首先,搭建YOLOX所需要的环境。这里我使用Anaconda来搭建的。在搭建环境之前,先附上YOLOX的官方代码: 官方代码链接.

    1.1新建一个conda环境

    conda create -n yolox python=3.8
    
    conda activate yolox   //进入环境
    

    如果你想用原有的环境来搭建,也ok,直接激活你的环境。

    1.2安装代码依赖的库文件

    用到你下载好的官方文件,在命令行中

    cd your/yolox-main/path
    
    pip install -r requirements.txt
    

    1.3通过setup.py安装一些库文件

    python3 setup.py develop
    

    1.4下载apex文件

    apex下载链接.
    下载好后cd到文件夹中并安装

    cd path/to/your/apex
    python3 setup.py install
    

    安装成功后会显示

    1.4下载pycocotools

    pip3 install cython
    pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
    

    2.创建自己的数据集

    2.1创建VOC格式数据集

    yolox可以跑两种格式的数据集voc和coco,这里我用voc举例。
    yolox的预训练模型 下载地址.我用yolox-s.pth举例

    这是目录格式要求,可以自己手动建立。

    其中,annotation用于存放xml格式的标签文件,JPEGimage用于存放原始图片。ImageSets/Main下的两个文件可以根据代码建立。

    # oding = utf-8
    # -*- coding:utf-8 -*-
    import os
    import random
    
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = r'E:\YOLOX-main\datasets\VOCdevkit\VOC2007\Annotations'
    txtsavepath = r'E:\YOLOX-main\datasets\VOCdevkit\VOC2007\ImageSets'
    total_xml = os.listdir(xmlfilepath)
    
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    
    ftest = open(r'E:\YOLOX-main\datasets\VOCdevkit\VOC2007\ImageSets\Main\test.txt', 'w')
    ftrain = open(r'\YOLOX-main\datasets\VOCdevkit\VOC2007\ImageSets\Main\trainval.txt', 'w')
    
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftest.write(name)
        else:
            ftrain.write(name)
    
    ftrain.close()
    ftest.close()
    
    
    
    

    运行此代码后会出现两个.txt文件。

    3.训练

    3.1修改文件代码

    修改 yolox/data/dataloading.py

    def get_yolox_datadir():
        """
        get dataset dir of YOLOX. If environment variable named `YOLOX_DATADIR` is set,
        this function will return value of the environment variable. Otherwise, use data
        """
        yolox_datadir = os.getenv("YOLOX_DATADIR", None)
        if yolox_datadir is None:
            import yolox
    
            yolox_path = os.path.dirname(os.path.dirname(yolox.__file__))
            
            //修改这里
            yolox_datadir = os.path.join(yolox_path, "datasets")
        
        return yolox_datadir
    

    其次,修改exps/example/yolox_voc/yolox_voc_s.py

    class Exp(MyExp):
        def __init__(self):
            super(Exp, self).__init__()
            self.num_classes = 10 #修改类别数目
            self.depth = 0.33
            self.width = 0.50
            self.warmup_epochs = 1
    

    然后,修改这里,这块复制就好了

            with wait_for_the_master(local_rank):
                dataset = VOCDetection(
                    data_dir=os.path.join(get_yolox_datadir(), "VOCdevkit"),
                    //修改这里
                    image_sets=[('2007', 'trainval')],#, ('2012', 'trainval')
                    img_size=self.input_size,
                    preproc=TrainTransform(
                        max_labels=50,
                        flip_prob=self.flip_prob,
                        hsv_prob=self.hsv_prob),
                    cache=cache_img,
                )
    

    修改yolox/data/datasets/voc_classes.py为自己的类别。

    VOC_CLASSES = (
        '1',
        '2',
        '3',
        '4',
        '5',
        '6',
        '7',
        '8',
        '9',
        '10',
    )
    

    最后,修改yolox/evaluators/voc_eval.py,添加root为annotation的绝对路径。

    #修改yolox/evaluators/voc_eval.py,添加root为annotation的绝对路径。
    root = r'E:\YOLOX-main\datasets\VOCdevkit\VOC2007\Annotations\\'
    def parse_rec(filename):
        """ Parse a PASCAL VOC xml file """
        tree = ET.parse(root + filename)
    

    3.2开始训练

    超参数设置:

    python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 4 --fp16  -c yolox_s.pth
    


    如果训练中断,开启,resume

    python3 tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 64 -c <last_epoch_ckpt.pth的路径> --resume
    

    3.测试

    3.1测试自己的训练结果

    修改yolox/data/datasets/下的init.py文件,添加:
    from .voc_classes import VOC_CLASSES

    之后在toos/demo.py文件中将COCO_CLASSES全部修改为VOC_CLASSES
    直接在此文件find下COCO_CLASSES然后全部修改为VOC_CLASSES就好了。

    python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s.py -c weights/best_ckpt.pth --path assets/class01.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu]
    

    -c 代表训练好的权重,-path 代表你要预测的图片存放的文件夹,
    若想进行视频预测,只需将下面的 image 更换为 video;
    若想预测整个文件夹,将.jpg去掉,只留 –path assets/

    3.预测结果

    跑了300个epoch训练了两个类,一个是飞机一个是油罐,感觉精度在280个epoch的时候明显上升,但是最终的结果不如v5好,不知道是因为我将.txt转xml出错了还是果真效果就是不太行,这个我还没分析。上图:

    上图是yolox-s的效果,我人麻了……

    上图是yolov5-x的效果。。。

    好了我继续trick了,感兴趣的小伙伴来一起交流
    持续更新中……

    参考(侵删)

    文献1.
    文献2.
    文献3.
    文献4.

    来源:IT little white

    物联沃分享整理
    物联沃-IOTWORD物联网 » YOLOX训练自己的数据集(头铁出来的超详细教程)

    发表评论