OS:Windows 10
显卡:GeForce RTX 3070 Laptop GPU,8G
CUDA:11.1(30系显卡需要高版本的CUDA和对应的cudnn)
cudnn:8.0
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
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
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
这个博客一直更新,如果有问题或者问题解决了,就来更新一下!