前言
在安装YOLOX的过程中,可能会遇到一些问题,这些问题可能不是特别好找,现在就直接开整吧,记录一下配置YOLOX的全过程。
主要写了一下一些内容:
- 配置YOLOX,并自定义数据集进行训练、验证和测试
- 给YOLOX增加了P、R、F1指标
- 增加了一个训练过程的验证结果的输出,并保存验证的结果为csv表格
这里参考了一些文章: 超详细!手把手教你使用YOLOX进行物体检测(附数据集)
1,配置YOLOX
基本按照官方文档readme.md,但是有一些细节部分没有提到,这里也整体过一遍。
git clone git@github.com:Megvii-BaseDetection/YOLOX.git
选择文件路径,打开命令行,输入以上内容,下载YOLOX。(如果没有Git需要自己安装)
或者直接去Github官网下载YOLOX: https://github.com/Megvii-BaseDetection/YOLOX
cd YOLOX
pip install -r requirements.txt
然后执行
python setup.py install
pip3 install -v -e . # or python3 setup.py develop
两者任意选择一个就行,官方使用第二条,第二条也有两种写法,注意e后边的空格加·
安装apex
git clone https://github.com/NVIDIA/apex
或手动下载apex到本地,我选择下载到YOLOX的目录中:https://github.com/NVIDIA/apex
cd apex
pip install -r requirements.txt
python setup.py install
安装pycocotools
pip install pycocotools
下载与训练权重,放在YOLOX的根目录下:
https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth
执行以下命令验证:
python tools/demo.py image -f exps/default/yolox_s.py -c ./yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu
如果报错,没有tools/demo.py文件,则将tools/demo.py文件复制到根目录下,再执行:
python demo.py image -f exps/default/yolox_s.py -c ./yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu
运行成功,看到保存的图片,则基本配置完成。
2,配置个人数据集
作者这里提供了两种读取数据集的方式:COCO、VOC
我这里先使用VOC格式进行读取。
首先准备好图片和标签数据,放在同一个文件夹中。
使用如下代码生成训练、验证的数据集的文件名集合的txt文件。
import os
import random
random.seed(0)
xmlfilepath = r'D:\DATA\datas\voc\car\Annotations' # xml文件存放地址,在训练自己数据集的时候,改成自己的数据路径
saveBasePath = r"D:\DATA\datas\voc\car\ImageSets\new" # 存放test.txt,train.txt,trainval.txt,val.txt文件路径
# ----------------------------------------------------------------------#
# 根据自己的需求更改trainval_percent和train_percent的比例
# ----------------------------------------------------------------------#
trainval_percent = 0.9
train_percent = 1
if not os.path.exists(saveBasePath):
os.mkdir(saveBasePath)
temp_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()
只需要修改地址、训练集验证集的比例即可,会在相应的保存目录下生成一个文件夹。
然后将所有的文件按照以下方式排列:
|-- VOCdevkit
|-- VOC2007
|-- Annotations
|-- ***.xml
|-- ImageSets
|-- Main
|-- test.txt
|-- train.txt
|-- trainval.txt
|-- val.txt
|-- JPEGImages
|-- ***.jpg
然后放在yolox的根目录下的datasets文件夹中。
修改个人数据集配置
在 yolox/exp/yolox_base.py 中,改文件为最基本的YOLOX的相关配置,exps/example/yolox_voc/yolox_voc_s.py 继承了yolox_base.py,所以一般来说,还是修改yolox_voc_s.py
包括__init__中的基础设置,或者重新定义yolox_base的一些属性,比如self.max_epoch=2、self.no_aug_epochs = 1(方便我们调试,测试整个网络的运行是否有问题):
self.num_classes = 自定义数据集的类别
yolox/data/datasets/voc_classes.py
VOC_CLASSES = (
‘car’,
)
自定义数据集类别名称,别忘记加上逗号
修改读取数据目录:yolox_voc_s.py
45行和104行附近
dataset = VOCDetection(
data_dir=os.path.join(get_yolox_datadir(), "VOCdevkit"),
# data_dir='./datasets/VOCdevkit',
image_sets=[('2007', 'trainval')],
img_size=self.input_size,
preproc=TrainTransform(
删去image_sets的 2012 train_val,如果使用第一个data_dir不能获取数据,则手动改成第二种(一般情况下应该没问题,测试过了)
然后修改voc.py文件中的第316行:
annopath = os.path.join(rootpath, “Annotations”, “{}.xml”)
删去":s",不然在最终验证的时候可能读不到文件。
到此,基本的配置已经完成。
3,训练
打开train.py,配置训练参数,修改完成后执行:
python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp16 -c yolox_s.pth
还是那个建议,如果运行报错,没有找到train.py,就复制到根目录下执行。
4,验证
同样,打开val.py,修改验证参数,执行:
python tools/val.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp16 -c best.pth
5,保存训练过程结果
打算再写一点保存训练过程的数据,另存为csv格式,就等下次再补上吧 [doge]