YOLOX训练环境搭建问题总结

训练代码我已经上传到GitHub(无数据集):
https://github.com/Elsa-zlt/YOLOX-Training-Code

一、环境:

OS:Windows 10
显卡:GeForce RTX 3070 Laptop GPU,8G

CUDA:11.1(30系显卡需要高版本的CUDA和对应的cudnn)

cudnn:8.0

二、YOLOX环境配置:

1、安装pytorch
在Anaconda上,我使用torch_G作为环境名:

conda create -n torch_G python=3.8

安装成功后激活torch_G环境:

conda activate torch_G

在所创建的pytorch环境下安装pytorch版本, 执行命令:
这里需要注意:
我的CUDA版本是11.1,但是我在Pytorch官网的conda(https://pytorch.org/get-started/locally/)下载上面发现:
现在最新版的pytorch1.10版本不支持CUDA11.1的版本:

所以只能在网页的之前的版本里下载之前的pytorch1.8.0版本:
https://pytorch.org/get-started/previous-versions/

# CUDA 11.1
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge

这里,不要改变它的命令,如果改变了,它就安装不了这个环境,比如把pytorch==1.8.0改成pytorch==1.9,就无法下载和安装。
除此之外,我们在下载这个pytorch的时候,最好还是使用自己的手机来开热点来下载,虽然费流量,但是能够下载下来,如果不这样的话,可能需要下载很长时间,我也不知道为啥,而且中途如果断网,就需要重新下载了,我昨天晚上就是连接了宿舍的WiFi,下载了一个晚上都没能下载成功。
2、下载YOLOX:
下载成功之后,需要将YOLOX的项目克隆和安装:
YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX

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

在官网上面直接下载压缩包再来解压也是一样的:

下载之后,需要在新建的pytorch环境下到YOLOX目录下执行:

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py develop

3、安装apex

git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

4、安装pycocotools

pip install cython
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py install --user

5、安装测试

python tools/demo.py image -n yolox-s -c weights/yolox_s.pth.tar --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result

三、训练自己的模型

我使用的是VOC格式的数据集,在dataset目录下:
训练命令:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -d 1 -b 16 --fp16 -o -c weights/yolox_s.pth

我的电脑如果输入了如下命令,将会报这个错误:

RuntimeError: CUDA out of memory. 
Tried to allocate 5.58 GiB (GPU 0; 8.00 GiB total capacity; 
43.62 MiB already allocated; 6.40 GiB free;
8.00 GiB allowed; 64.00 MiB reserved in total by PyTorch)

直接OOM了,我这些天在这个问题上面搞了很长时间。
我那天写了一篇博文:
https://blog.csdn.net/ELSA001/article/details/120876656?spm=1001.2014.3001.5501
但没有人来帮我解决这个问题,我在QQ群里面问了一下一些大佬,他们说是操作系统的问题,但我依然还是想着在Windows上面折腾。
我看了很多解决方法,在昨天看到这个解决方法:
发现需要把--fp16 -o这个命令去掉就行了,这个命令是使用混合精度训练的,去掉之后就不会OOM了,我搞了好久啊。
https://blog.csdn.net/zhangdaoliang1/article/details/119377620

解决方法的训练命令:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -d 1 -b 4  -c weights/yolox_s.pth

解决之后,我在训练的时候又遇到了一个问题:

oserror: [winerror 1455] 页面文件太小,无法完成操作。

这个问题我从来没有遇到过,在网上找了下解决方法:
说需要修改虚拟内存大小,而且要改成很大的,我不敢去改这个,怕电脑出问题,于是我改了num_workers,我找了很久如何改num_workers,最后在./yolox/exp目录下,修改yolox_base.py文件:

将27行的self.data_num_workers改成0,然后再来输入这个训练命令:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s_bm.py -d 1 -b 4  -c weights/yolox_s.pth

就可以训练了。
然后我现在又遇到了一个问题:
AP=0

还有这个文件没有找到:

但问题是我的文件里面有的呀:

完整报错信息如下:

2021-10-23 10:19:46 | ERROR    | yolox.core.launch:98 - An error has been caught in function 'launch', process 'MainProcess' (44024), thread 'MainThread' (540):
Traceback (most recent call last):

  File "tools\train.py", line 125, in <module>
    launch(
    └ <function launch at 0x0000026C80EE7550>

> File "e:\yolox\yolox\core\launch.py", line 98, in launch
    main_func(*args)
    │          └ (╒══════════════════╤════════════════════════════════════════════════════════════════════════════════════════════════════════...
    └ <function main at 0x0000026C82F6F3A0>

  File "tools\train.py", line 110, in main
    trainer.train()
    │       └ <function Trainer.train at 0x0000026C822CFC10>
    └ <yolox.core.trainer.Trainer object at 0x0000026C83007A30>

  File "e:\yolox\yolox\core\trainer.py", line 72, in train
    self.train_in_epoch()
    │    └ <function Trainer.train_in_epoch at 0x0000026C82F3D550>
    └ <yolox.core.trainer.Trainer object at 0x0000026C83007A30>

  File "e:\yolox\yolox\core\trainer.py", line 82, in train_in_epoch
    self.after_epoch()
    │    └ <function Trainer.after_epoch at 0x0000026C82F4BB80>
    └ <yolox.core.trainer.Trainer object at 0x0000026C83007A30>

  File "e:\yolox\yolox\core\trainer.py", line 207, in after_epoch
    self.evaluate_and_save_model()
    │    └ <function Trainer.evaluate_and_save_model at 0x0000026C82F4BE50>
    └ <yolox.core.trainer.Trainer object at 0x0000026C83007A30>

  File "e:\yolox\yolox\core\trainer.py", line 302, in evaluate_and_save_model
    ap50_95, ap50, summary = self.exp.eval(
                             │    │   └ <function Exp.eval at 0x0000026C82F6F9D0>
                             │    └ ╒══════════════════╤═════════════════════════════════════════════════════════════════════════════════════════════════════════...
                             └ <yolox.core.trainer.Trainer object at 0x0000026C83007A30>

  File "e:\yolox\yolox\exp\yolox_base.py", line 284, in eval
    return evaluator.evaluate(model, is_distributed, half)
           │         │        │      │               └ False
           │         │        │      └ False
           │         │        └ YOLOX(
           │         │            (backbone): YOLOPAFPN(
           │         │              (backbone): CSPDarknet(
           │         │                (stem): Focus(
           │         │                  (conv): BaseConv(
           │         │                    (conv): ...
           │         └ <function VOCEvaluator.evaluate at 0x0000026C82F3DC10>
           └ <yolox.evaluators.voc_evaluator.VOCEvaluator object at 0x0000026C8E4A9A00>

  File "e:\yolox\yolox\evaluators\voc_evaluator.py", line 128, in evaluate
    eval_results = self.evaluate_prediction(data_list, statistics)
                   │    │                   │          └ tensor([ 0.6692,  1.2153, 30.0000], device='cuda:0')
                   │    │                   └ {0: (tensor([[ 65.5363, 148.8881, 314.1370, 348.9427],
                   │    │                             [102.8350, -30.9026, 548.5400, 365.2217],
                   │    │                             [ 46.0711, -...
                   │    └ <function VOCEvaluator.evaluate_prediction at 0x0000026C82F3DD30>
                   └ <yolox.evaluators.voc_evaluator.VOCEvaluator object at 0x0000026C8E4A9A00>

  File "e:\yolox\yolox\evaluators\voc_evaluator.py", line 205, in evaluate_prediction
    mAP50, mAP70 = self.dataloader.dataset.evaluate_detections(
                   │    │          │       └ <function VOCDetection.evaluate_detections at 0x0000026C82F4B670>
                   │    │          └ <yolox.data.datasets.voc.VOCDetection object at 0x0000026C8E4A9B20>
                   │    └ <torch.utils.data.dataloader.DataLoader object at 0x0000026C8E4A99D0>
                   └ <yolox.evaluators.voc_evaluator.VOCEvaluator object at 0x0000026C8E4A9A00>

  File "e:\yolox\yolox\data\datasets\voc.py", line 271, in evaluate_detections
    mAP = self._do_python_eval(output_dir, iou)
          │    │               │           └ 0.5
          │    │               └ 'C:\\Users\\ASUS\\AppData\\Local\\Temp\\tmp3b5fh8xp'
          │    └ <function VOCDetection._do_python_eval at 0x0000026C82F4B820>
          └ <yolox.data.datasets.voc.VOCDetection object at 0x0000026C8E4A9B20>

  File "e:\yolox\yolox\data\datasets\voc.py", line 335, in _do_python_eval
    rec, prec, ap = voc_eval(
                    └ <function voc_eval at 0x0000026C82F3DE50>

  File "e:\yolox\yolox\evaluators\voc_eval.py", line 93, in voc_eval
    recs[imagename] = parse_rec(annopath.format(imagename))
    │    │            │         │        │      └ 'yumi102'
    │    │            │         │        └ <method 'format' of 'str' objects>
    │    │            │         └ '{:s}.xml'
    │    │            └ <function parse_rec at 0x0000026C82F3D700>
    │    └ 'yumi102'
    └ {}

  File "e:\yolox\yolox\evaluators\voc_eval.py", line 17, in parse_rec
    tree = ET.parse(filename)
           │  │     └ 'yumi102.xml'
           │  └ <function parse at 0x0000026C80DE3C10>
           └ <module 'xml.etree.ElementTree' from 'E:\\Anaconda3\\envs\\torch_G\\lib\\xml\\etree\\ElementTree.py'>

  File "E:\Anaconda3\envs\torch_G\lib\xml\etree\ElementTree.py", line 1202, in parse
    tree.parse(source, parser)
    │    │     │       └ None
    │    │     └ 'yumi102.xml'
    │    └ <function ElementTree.parse at 0x0000026C80DDACA0>
    └ <xml.etree.ElementTree.ElementTree object at 0x0000026C8CE359A0>

  File "E:\Anaconda3\envs\torch_G\lib\xml\etree\ElementTree.py", line 584, in parse
    source = open(source, "rb")
                  └ 'yumi102.xml'

FileNotFoundError: [Errno 2] No such file or directory: 'yumi102.xml'

我解决了这个问题:
https://github.com/Megvii-BaseDetection/YOLOX/issues/741


按照这样改就可以啦:


训练好了yolox_s模型后,我使用如下命令来测试模型:

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s_bm.py -c YOLOX_outputs/yolox_voc_s_bm/best_ckpt.pth --path testfiles/img1.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device cpu

效果如下:

也算是成功预测出来了玉米,但是我使用的是中文标签,我看看怎么改这个打开文件的字符编码格式为utf-8。
不过我刚刚我训练yolox_nano模型的时候有有了新的问题:

ImportError: exps/example/yolox_voc/yolox_voc_nano.py doesn't contains class named 'Exp'

我在exps/example/yolox_voc/新建了一个文件yolox_voc_nano.py(不知道我这样做对不对):
是根据exps\default\nano.py和exps/example/yolox_voc/yolox_voc.py基础上修改的:
就是把nano.py的__init__函数替换成yolox_voc.py的__init__函数函数,然后再加上nano.py的get_model函数,其他都是yolox_voc.py文件的内容。
然后我的训练命令是这样的:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_nano.py -d 1 -b 4 -c weights/yolox_nano.pth

yolox_nano.pth我是下载官网的,应该没啥大问题,就是我不知道应该怎么修改这个新建yolox_voc_nano.py来进行训练呢

问题已解决:
只需要在yolox_voc.py的基础上改变一点点就可以训练:

把这个文件改名成yolox_voc_nano.py,然后加上nano模型的预训练权重文件:yolox_nano.pth(加上训练效果会好很多)

python tools/train.py -f exps/example/yolox_voc/yolox_voc_nano.py -d 1 -b 4 -c weights/yolox_nano.pth


我把nano模型训练好啦
测试命令:

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_nano.py -c YOLOX_outputs/yolox_voc_nano/best_ckpt.pth --path testfiles/img1.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device cpu

效果如下:

这个博客一直更新,如果有问题或者问题解决了,就来更新一下!

来源:钟良堂

物联沃分享整理
物联沃-IOTWORD物联网 » YOLOX训练环境搭建问题总结

发表评论