文章目录


(一)YOLOX 训练 Objects365_172

(1)数据集预处理
<1> 数据集格式
1
2
3
4
5
6
7
├─datasets
│ └─VOCdevkit
│ └─VOC2007
│ ├─Annotations
│ ├─ImageSets
│ │ └─Main
│ └─JPEGImages
<2> 数据集抽取
  • 从 Objects365 中抽取指定 172 类并转为 VOC 数据集类型 xml

obj365_main.py

链接: https://pan.baidu.com/s/1ePq7KB1Ho5R-uNXK-XOa-Q 提取码: 8008

  • 根据抽取的标签获取图片列表

img_list_txt.py

链接: https://pan.baidu.com/s/1IyP7yEibYzR1UL_fZfbccg 提取码: mgk3

  • 根据图片列表抽取源数据

    img_list_txt.py

链接:https://pan.baidu.com/s/10C0TULHWCQ1YkjkVzY6jaQ 提取码:ju1j

  • 生成 ImageSets 文件夹,切分 train、val、test、trainval

VOC_ImageSets_Main_txt.py

链接: https://pan.baidu.com/s/1hHLI3-30nXb-kqEsNLnHEQ 提取码: om41

(2)YOLOX 训练
<1> 文件修改

(1) yolox/data/datasets/voc_classes.py

1
2
3
4
VOC_CLASSES = (
"panda",
"tiger",
)

(2) yolox/exp/yolox_base.py

1
2
3
4
5
6
7
(self.num_classes可以不用修改,因为后面的exps/example/yolox_voc/yolox_voc_s.py会对self.num_classes进行重载)

可选修改 self.num_classes修改为自己的类别数

可选修改 self.inputsize, self.random_size 改变训练尺寸大小

可选修改 self.test_size 改变测试的尺寸大小

(3) yolox/data/datasets/voc.py

  • _do_python_eval() 方法

    1
    2
    3
    annopath = os.path.join(rootpath, "Annotations", "{:s}.xml")
    修改为
    annopath = os.path.join(rootpath, "Annotations", "{}.xml")

(4) exps/example/yolox_voc/yolox_voc_s.py

  • 全局超参数

    1
    修改 self.num_classes = 172   # 自定义的类别数
  • get_data_loder 方法

    1
    2
    修改VOCDetection下的 image_sets=[('2007', 'trainval'), ('2012', 'trainval')],
    修改为 image_sets=[('2007', 'train')]
  • get_eval_loader 方法

    1
    2
    修改VOCDetection下的 image_sets=[('2007', 'test')],
    修改为 image_sets=[('2007', 'val')]

(5) tools/train.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
设置 default="Animals", 训练后结果就会保存在 tools/YOLOX_outputs/Animals下
parser.add_argument("-expn", "--experiment-name", type=str, default=None)

设置 model_name,我也不太清楚这是不是必须项 (我觉得不是)
parser.add_argument("-n", "--name", type=str, default="yolox-s", help="model name")

设置 batch_size
parser.add_argument("-b", "--batch-size", type=int, default=64, help="batch size")

设置gpu,因为我只有一张卡,所以设 default=0
parser.add_argument(
"-d", "--devices", default=0, type=int, help="device for training"
)

设置你的数据配置的路径,default="../exps/example/yolox_voc/yolox_voc_s.py"
parser.add_argument(
"-f",
"--exp_file",
default="../exps/example/yolox_voc/yolox_voc_s.py",
type=str,
help="plz input your expriment description file",
)

设置权重路径, default="../weights/yolox_s.pth"
parser.add_argument("-c", "--ckpt", default="../weights/yolox_s.pth", type=str, help="checkpoint file")

(6) tools/demo.py

  • 由于 demo.py 默认调用的是 COCO_CLASSES,所以想要正确显示结果,就要把 yolox/data/datasets/coco_classes.py 下的 COCO_CLASSES 改成你的数据类别

  • 或者如果想修改为调用 VOC_CLASSES

    • yolox/data/datasets/__init__.py 里将 from .voc import VOCDetection 修改为 from .voc import VOCDetection, VOC_CLASSES

    • tools/demo.py

      1
      2
      3
      from yolox.data.datasets import COCO_CLASSES 
      修改为
      from yolox.data.datasets import COCO_CLASSES, VOC_CLASSES
    • tools/demo.py 里所有用到 COCO_CLASSES 的地方全部改为 VOC_CLASSES 即可

<2> 模型训练
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 单GPU训练
python tools/train.py -n yolox-s -d 1 -b 16 --fp16 -c yolox/weights/yolox_s.pth -o [--cache]

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 16 -c yolox/weights/yolox_s.pth

# 多GPU训练
python tools/train.py -f exps/example/yolox_voc/yolox_voc_nano.py -d 4 -b 64 --fp16 -c yolox/weights/yolox_nano.pth


#* -d: number of gpu devices

#* -b: total batch size, the recommended number for -b is num-gpu * 8

#* --fp16: mixed precision training

#* --cache: caching imgs into RAM to accelarate training, which need large system RAM.
<3> 模型推理
1
2
3
python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s.py -c YOLOX_outputs/yolox_s/best_ckpt.pth --path TestFiles/testimg1.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device cpu

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_nano.py -c YOLOX_outputs/yolox_voc_nano/latest_ckpt.pth --path TestFiles/testimg1.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device cpu

(二)注意事项:

(1)多 GPU 训练问题(可选)
  • 多 GPU 训练模型时,需将 os.environ [‘CUDA_VISIBLE_DEVICES’] 修改为实际需要的
1
2
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
(2)训练中生成临时标签文件报错问题
  • YOLOX 训练过程中出现验证生成临时标签 txt 文件时,因文件名中包含 “/”, 而无法生成临时标签 txt 文件的问题
    • 解决方法:重新生成标签文件,将 “/” 修改为 “_”
      • 生成标签文件时将 object365_dict.txt 文件中对应标签的 “/” 修改为 “_”
      • /YOLOX/yolox/data/dataset/voc_classes.py 中的 VOC_CLASSES 类别中的 “/” 修改为 “_”
× 请我吃糖~
打赏二维码