YOLOX-COCO训练教程+权重使用
0. 配置好你的YOLOX环境
如果不知道如何在windows下配置,请查看我的上一篇文章。
1. 准备好你的数据
- 根据YOLOX官方引导,已经提供了miniCOCO下载链接,存储在GoogleDrive上的。下载成功后解压,得到树状目录如下:
─coco128
├─annotations
├─train2017
└─val2017
- 将此文件夹直接复制粘贴进你的yolox目录下的datasets。读取annotations下instances_train2017.json文件,查找到categories字段,根据id判断知道共有71类。读取json并格式化输出脚本如下:
import json
f=open(r"D:\Coding\AnacondaProject\YOLOX-main-1\datasets\coco128\annotations\instances_train2017.json")# 替换成你自己的路径
json_dict=json.load(f)
print(type(json_dict))
js = json.dumps(json_dict, sort_keys=True, indent=4, separators=(',', ':'))
print(js)
2. 开始训练
官方引导的训练脚本是基于VOC数据集的,我们这里使用的是COCO。
python tools/train.py -f exps/example/custom/yolox_s.py -d 1 -b 8 --fp16 -o -c premodel/yolox_s.pth
-
注意,我们这里是直接使用的exps/example/custom/yolox_s.py这个脚本,请不要根据其他教程去改动:exps/default目录下的脚本,父类也不要改动。
如果你需要定制自己的脚本,请在exps/example/custom/目录下新建你的脚本文件,并模仿其他脚本一样,继承MyExp父类,增添你的代码,或重载代码。
custom/yolox_s.py脚本代码如下:
class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 0.33
self.width = 0.50
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
# Define yourself dataset path
self.data_dir = "datasets/coco128"
self.train_ann = "instances_train2017.json"
self.val_ann = "instances_val2017.json"
# 改成coco128的类别
self.num_classes = 71
# 最大epoch数默认300
self.max_epoch = 300
self.data_num_workers = 4
self.eval_interval = 1
可以看到此脚本已经示范了一次如何简单定制自己的模型,你可以根据自己的需求去改写你的数据集路径,但是目录结构要保证不变,annotations目录名也要保证不变,具体目录结构应该怎么建,之前coco128解压之后的目录结构是最好的说明。
在这个脚本中,你还需要重载父类属性self.num_classes = 71
,因为父类里面self.num_classes = 80
。而coco128只有71类。
-
premodel/yolox_s.pth是我自己在yolox目录下创建的,yolox_s.pth是在github上下载的预训练模型,由于这个预训练模型是80类,所以等会儿在训练的时候会出现warning。不用管这个警告,YOLOX会来处理head维数不同的问题。
-
运行脚本,等待训练
-
如果在训练时报错:‘numpy.float64’ object cannot be interpreted as an integer,去修改pycocotools里面的cocoeval.py。改源码不太合适,但是这是目前已知唯一解决办法。
-
训练完成后会将权重保存在./YOLOX_outputs/yolox_s/目录下,选择best_ckpt.pth。
3. 使用权重进行推理
- 训练完成后,有点辣鸡??…
- 使用训练好权重的脚本进行推理
python tools/demo.py image -f exps/example/custom/yolox_s.py -c ./YOLOX_outputs/yolox_s/best_ckpt.pth --path datasets/coco128/train2017/000000000001.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu
结果图:什么也没训练出来的…
意思是这个意思,完整的训练+权重使用应该就是这个流程