相关链接
- yolox 代码:GitHub - Megvii-BaseDetection/YOLOX: YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/
- yolox 论文:https://arxiv.org/abs/2107.08430
- yolox 中的一些基本组件:yolox中的一些基本组件【network_blocks】_乐亦亦乐的博客-CSDN博客
- VOC 数据集标注:使用labelimg制作数据集_乐亦亦乐的博客-CSDN博客_labelimg数据集
环境配置
参考yolox Github代码中的readme 进行配置:
Step1. Install YOLOX.
git clone git@github.com:Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip3 install -U pip && pip3 install -r requirements.txt
pip3 install -v -e . # or python3 setup.py develop
Step2. Install pycocotools.
pip3 install cython;
pip3 install'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
注意:如果缺少其他包,使用pip安装即可!
运行Demo
下载相关模型
![](https://img.php1.cn/3cd4a/1eebe/cd5/6789f68dabde0aed.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
以YOLOX_s为例:
python tools/demo.py image -n yolox-s -c /path/to/your/yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu]
其余可以阅读yolox github readme;或者官方文档:Welcome to YOLOX’s documentation! — YOLOX 0.1.0 documentation
VOC标注数据处理
1、本文使用VOC格式进行训练。
2、训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
3、训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
4、在训练前利用voc2yolo3.py文件生成对应的txt;
5、将VOCdekit 放到YOLOX/datasets文件夹下;
![](https://img.php1.cn/3cd4a/1eebe/cd5/2d903861d5ad779c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_6,color_FFFFFF,t_70,g_se,x_16)
其中:
VOCdekit具体目录结构:
--VOCdevkit
----VOC2007
------Annotations
------JPEGImages
------ImageSets
--------Main
----------test.txt
-----------train.txt
![](https://img.php1.cn/3cd4a/1eebe/cd5/8be1ccb5166feb93.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_8,color_FFFFFF,t_70,g_se,x_16)
voc2yolo3.py 代码如下:
import os
import random
random.seed(0)xmlfilepath = r'datasets/VOCdevkit/VOC2007/Annotations'
saveBasePath = r"datasets/VOCdevkit/VOC2007/ImageSets/Main"trainval_percent = 0.8
train_percent = 1temp_xml = os.listdir(xmlfilepath)
total_xml = []
for xml in temp_xml:if xml.endswith(".xml"):total_xml.append(xml)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)print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'val.txt'), 'w')for i in list:name = total_xml[i][:-4]+'\n'if i in trainval:ftrainval.write(name)if i in train:ftrain.write(name)else:fval.write(name)else:ftest.write(name)ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
到此为止,已经处理好要训练的数据集了!接下来修改yolox相关代码!
修改代码及配置文件
VOC数据集的配置文件所在路径:YOLOX/exps/example/yolox_voc/yolox_voc_s.py
a)修改 line14 ,num_classes 为自己的数据集的类别,这里以2为例。
![](https://img.php1.cn/3cd4a/1eebe/cd5/8be1ccb5166feb93.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_18,color_FFFFFF,t_70,g_se,x_16)
b) 修改训练集和测试集目录 image_sets
![](https://img.php1.cn/3cd4a/1eebe/cd5/5b97d3b808d031e2.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img.php1.cn/3cd4a/1eebe/cd5/bdd1ca32a69bc8b2.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
c)修改类别voc_classes;文件所在路径:YOLOX/yolox/data/datasets/voc_classes.py
![](https://img.php1.cn/3cd4a/1eebe/cd5/4283cd4bbba41b87.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_16,color_FFFFFF,t_70,g_se,x_16)
d) 修改YOLOX/yolox/exp/yolox_base.py 中num_classes;
![](https://img.php1.cn/3cd4a/1eebe/cd5/4fae50aeee651818.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_16,color_FFFFFF,t_70,g_se,x_16)
e)修改YOLOX/yolox/data/datasets/voc.py 文件下的_do_python_eval 函数;
![](https://img.php1.cn/3cd4a/1eebe/cd5/fb32005f2115b419.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
f)训练模型,本文训练模型使用yolox-s;首先下载预训练模型;将下载的模型放在YOLOX/weights/yolox_s.pth 路径下。
下载好的一些预训练权重:
![](https://img.php1.cn/3cd4a/1e618/c5a/d5d40da532c3a782.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
g) 可在YOLOX/yolox/exp/yolox_base.py 文件中配置相关训练参数。
![](https://img.php1.cn/3cd4a/1eebe/cd5/617c1173853af4b6.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
h) 开始训练,训练命令:
python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 8 --fp16 -o -c weights/yolox_s.pth
训练:
![](https://img.php1.cn/3cd4a/1eebe/cd5/d84f9786330d9e41.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
训练的模型权重以及训练日志存在路径:YOLOX/YOLOX_outputs/yolox_voc_s/
![](https://img.php1.cn/3cd4a/1eebe/cd5/5287a7b3296ea13e.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_18,color_FFFFFF,t_70,g_se,x_16)
使用tensorboard 查看训练过程:
在路径YOLOX_outputs/yolox_voc_s/ 下,执行:
tensorboard --logdir ./
测试训练好的模型
首先在YOLOX/yolox/data/datasets/__init__.py 里需要加入voc 类别
需要更改测试YOLOX/tools/demo.py:
![](https://img.php1.cn/3cd4a/1eebe/cd5/ff61bfdd3c0af92e.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img.php1.cn/3cd4a/1eebe/cd5/ddcc574beb16294e.jpeg?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img.php1.cn/3cd4a/1e618/c5a/d5d40da532c3a782.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
测试代码:
python tools/demo.py image -n yolox-s -c YOLOX_outputs/yolox_voc_s/best_ckpt.pth --path assets/1_169.jpg --conf 0.3 --nms 0.1 --tsize 640 --save_result
完美运行!!
常见问题
训练过程出现如下情况:
![](https://img.php1.cn/3cd4a/1eebe/cd5/3e641eb5f5c8cd90.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_20,color_FFFFFF,t_70,g_se,x_16)
训练前需要将VOCdevkit2007中annotations_cache的缓存删掉。
![](https://img.php1.cn/3cd4a/1eebe/cd5/780a3060eeed6a4e.webp?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LmQ5Lqm5Lqm5LmQ,size_18,color_FFFFFF,t_70,g_se,x_16)