目录
- (一)一些参考链接
- (二)YOLOX训练自己的数据集,修改相应代码
- 0. 自己的数据集文件夹排布
- 1. 修改类别标签和数量
- 1.1 修改类别标签 yolox/data/datasets/voc_classes.py
- 1.2 修改类别数量 exps/example/yolox_voc/yolox_voc_s.py
- 2. 修改训练集信息
- 3. 修改验证集信息
- 4. 修改不同的网络结构
- 5. 修改其他相关
- (三)开始训练
- 1. 终端命令示例
- 2. 训练结果位置
- 3. 用于验证的命令
- (四)跑代码过程中遇到的问题
- 1. 终端键入训练命令跑不起来 No module named 'yolox'
- 2. 训练几轮开始进行验证时报下面的错
- 2.1 AttributeError: 'NoneType' object has no attribute 'text'
- 2.2 FileNotFoundError: [Errno 2] No such file or directory: '000001.xml'
- 3. 修改num_works
- 4. 验证的时候报错(就是还有个数据集位置没有改到)
- 5. 运行demo.py想要进行测试时报错
(一)一些参考链接
- 官方源码:https://github.com/Megvii-BaseDetection/YOLOX
- YOLOX训练自己的数据集(超详细)
- 这个文章应该是直接跟着江大白的文章操作的。江大白的原文链接是:深入浅出Yolox之自有数据集训练超详细教程👈这篇博客的步骤会更加详细一些!
- 然后博客中一直说的阅读原文就是这个文章,可以在这个文章中去下载需要的资源:Yolov3、v4、v5、Yolox模型权重及网络结构图资源下载
- 目标检测新手如何阅读YOLOX的源代码呢? - 3D视觉开发者社区的回答 - 知乎
- 点击下载预训练权重yolox_s.pth
(二)YOLOX训练自己的数据集,修改相应代码
就是跟着这个教程一步步改的:江大白-知乎-深入浅出Yolox之自有数据集训练超详细教程,主要从原文中的3.3
开始参考!
0. 自己的数据集文件夹排布
前提:自己的数据集文件夹排布是这样的:(可参考江大白知乎文章去划分)
训练准备:开始修改训练配置参数👇
1. 修改类别标签和数量
1.1 修改类别标签 yolox/data/datasets/voc_classes.py
因此前面自有的数据集只有一个类别,head。
将yolox/data/datasets/voc_classes.py
中的标签信息,进行修改(我改成了如下4个类别)
注意:每个类别后面都要加逗号,例如“head”后面加了一个逗号“,”。
1.2 修改类别数量 exps/example/yolox_voc/yolox_voc_s.py
- 修改
exps/example/yolox_voc/yolox_voc_s.py
中的self.num_classes
- 修改
yolox/exp/yolox_base.py
中的self.num_classes
2. 修改训练集信息
- 修改
exps/example/yolox_voc/yolox_voc_s.py
中的VOCDetection
- 修改
yolox/data/datasets/voc.py
中,VOCDetection
类的初始化函数__init__
中的读取txt文件部分
for name in image_sets:
rootpath = self.root # 数据集根目录
for line in open(
os.path.join(rootpath, 'ImageSets', 'Main', name + '.txt')
):
self.ids.append((rootpath, line.strip()))
#-----------------------------------附加-------------------------------------------#
用于我自己的数据集的一个附加修改:(同样是在voc.py
中做的修改)
因为我的数据集没有很乖的像【0.数据集分布】那样分布,而是images下面分了train、val、test单独的文件夹了
G:.
├─Annotations: 包含了所有的xml文件
├─ImageSets
│ ├─Main: 图像的划分情况 我的划分比例是 -> train: val: test = (9:1):1
├─JPEGImages: 包含了所有图像 我的是png格式
-----------------------------------------------------------------------------------
以上是标准的voc数据集格式,但是yolov5的格式是像下面这样直接分成了train、val、test文件夹
下面是我已经上传到AutoDL中的数据集分布,图像体积可大了,8个G,所以我不可能再重新把它们放到同一个文件夹上传一边,因此就如上图,对voc.py里面指明图像位置的代码进行了修改
-----------------------------------------------------------------------------------
├─A_data_samewithautol911
│ ├─images
│ │ ├─test
│ │ ├─train
│ │ └─val
│ ├─labels
│ │ ├─test
│ │ ├─train
│ │ └─val
#------------------------------------------------------------------------------------#
3. 修改验证集信息
- 修改
exps/example/yolox_voc/yolox_voc_s.py
中的get_eval_loader
函数
4. 修改不同的网络结构
以Yolox_s网络为例,比如在exps/default/yolox_s.py
中,self.depth=0.33, self.width=0.5
。和Yolov5中的不同网络调用方式一样。
- 为了统一不同的网络结构,修改
exps/example/yolox_voc/yolox_voc_s.py
中的,self.depth
和self.width
- 修改
yolox/exp/yolox_base.py
中的,self.depth
和self.width
5. 修改其他相关
- 删除year等信息
因为自有数据集中,没有year信息,所以需要删除。
即修改yolox/data/datasets/voc.py
中,_get_voc_results_file_template
函数
在训练过程中,在原始的head数据集中,会生成一个results的文件夹,保存历史信息。
- 修改验证epoch的数量
目前代码中是训练迭代10个epoch,再对验证集做1次验证。做以下修改设置为每迭代一个epoch,就使用验证集验证一次。
在yolox/exp/yolox_base.py
的class Exp
中,按住快捷键Ctrl+F
搜索定位到self.print_interval
处,做以下两处修改:
- 修改验证时的相关信息
主要对读取验证信息的相关代码进行调整,代码在yolox/data/datasets/voc.py
中_do_python_eval
函数中。
① 因为自有数据集没有year信息,所以将其中的rootpath和name:
总共做了以下5处更改,改为相同的即可:
上图中的④作用是:在训练过程中,在原始的head数据集中,会生成一个annotations_cache的文件夹,保存历史信息:
(三)开始训练
1. 终端命令示例
将下载好的yolox_s.pth
放到YOLOX文件夹中,打开终端,在终端中输入:
python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 64 -c yolox_s.pth
2. 训练结果位置
训练的结果存放在train.py
所在目录下的YOLOX_outputs
文件夹中,也就是在G:\pycharmprojects\YOLOX-main\tools\YOLOX_outputs
,如下图所示:
注意:这个yolox不想yolov5那样,可以自己新建新的训练结果存放文件夹,所以每次训练的结果都会全部存放在上图的文件夹中。记得及时备份。(不知道在哪里改,害)
3. 用于验证的命令
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
(四)跑代码过程中遇到的问题
1. 终端键入训练命令跑不起来 No module named ‘yolox’
解决方式:直接将YOLOX-main/tools/train.py
复制粘贴到根目录下,即YOLOX-main/train.py
(这是解决方法之一,但是建议使用下面的方法)
以下两个问题及解决方法参考链接:YOLOX训练自己的数据集
- 问题1:
No module named 'yolox'
解决方法:在YOLOX-main/tools/train.py中将路添加进来:
import sys
sys.path.append(r'content/YOLOX-main')
- 问题2:
No such file or directory:VOC2012
解决方法:由于本次使用的数据集格式为VOC2007,故在
YOLOX-main/exps/example/yolox_voc/yolox_voc_s.py的46行将image_sets中2012括号里的内容全部删除
2. 训练几轮开始进行验证时报下面的错
2.1 AttributeError: ‘NoneType’ object has no attribute ‘text’
类似找不到'pose'
的,还会出现找不到'truncated'
、'difficult'
,尝试了很多次之后,我自己在YOLOX-main\yolox\evaluators\voc_eval.py
文件中进行了如下更改就可以成功运行了:
obj_struct["pose"] = obj.find("pose").text if obj.find('pose') else 'Unspecified'
obj_struct["truncated"] = int(obj.find("truncated").text) if obj.find('truncated') else 0
obj_struct["difficult"] = int(obj.find("difficult").text) if obj.find('difficult') else 0
2.2 FileNotFoundError: [Errno 2] No such file or directory: ‘000001.xml’
3. 修改num_works
4. 验证的时候报错(就是还有个数据集位置没有改到)
按照提示,去到指出的错误位置进行更改:
5. 运行demo.py想要进行测试时报错
参考了B导这个的issue及回答,突然醒悟过来,是目标类别
不匹配!
因为我使用的是原始yolox.pth,所以对应的应该是voc的原始20种类别
,但是我已经改为了自己将要检测的4个类别名
,所以就报错咯!(阿这,改了还是报上面的错,不管了!)
啊,我知道了,还有类别数量没有改回20
!
类别名和数量的更改,参考(二)1.
有毒,还是不行!