最近被yolox爆屏,加上自己对于yolo系列有太多的情节之前还尝试过yolof,现在出现的yolox还有openvino推理,刚好自己会需要这部分内容,现在就尝试进行对其初步探索。
一、基础配置
cuda 10.1
二、环境搭建
1、安装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
在运行第四行pip3 install -v -e . # or python3 setup.py develop会出现错误:
解决这个需要在setup.py文件中修改第50行,如下:
2、安装apex
APEX是英伟达开源的,完美支持PyTorch框架,用于改变数据格式来减小模型显存占用的工具。其中最有价值的是amp(Automatic Mixed Precision),将模型的大部分操作都用Float16数据类型测试,一些特别操作仍然使用Float32。并且用户仅仅通过三行代码即可完美将自己的训练代码迁移到该模型。实验证明,使用Float16作为大部分操作的数据类型,并没有降低参数,在一些实验中,反而由于可以增大Batch size,带来精度上的提升,以及训练速度上的提升。
我没有按照官方的教程安装apex,因为按照那个方法出现了错误,我的安装步骤如下:
① 下载apex到本地并解压
下载地址 https://github.com/NVIDIA/apex
② 将解压好的文件放到自己的环境中
我使用的anconda环境找到环境名/Lib/site-packages
③进入环境中的apex文件
pip install -r requirements.txt
④ 安装apex
python setup.py install
3、安装pycocotools
又是一个没按照官方的操作
① pip install cython
② 安装前提是有vc++
下载cocoapi
下载地址https://github.com/cocodataset/cocoapi
③进入pythonapi目录
cd PythonAPI
④ 执行安装命令
python setup.py install
安装报错:
无效的数值参数“/Wno-cpp
解决:
编辑setup.py文件,删除如下图
三、运行demo
运行demo测试安装环境
1、下载预训练模型
2、执行以下指令
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 gpu
-n 是模型的名字
-c 为权重文件地址
–path是测试的图片路径
–conf 置信度阈值
–nms nms的iou阈值
–tsize 测试图片大小
–save_result 是否保存推理结果
只要环境能按照上面部分的搭建这部分是不会出错的。
注:torch 和torchvision版本一定要匹配,以及torch版本要大于等于1.7
后面我会放自己各个包的版本信息
四、训练自己的数据集
1、数据集准备
官方使用的coco数据集,我就采用了voc数据集,voc数据集的格式如下:
├── data
│ ├── VOCdevkit
│ │ ├── VOC2007
│ │ │ ├── Annotations #xml文件
│ │ │ ├── JPEGImages #图片
│ │ │ ├── ImageSets
│ │ │ │ ├── Main
│ │ │ │ │ ├── test.txt
│ │ │ │ │ ├── trainval.txt
1
数据划分代码:
import os
import random
trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = './Exp/Annotations/'
txtsavepath = './Exp/images/'
total_xml = os.listdir(xmlfilepath)
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)
os.makedirs('./data/VOCdevkit/VOC2007/ImageSets', exist_ok=True)
ftest = open('./data/VOCdevkit/VOC2007/ImageSets/test.txt', 'w')
os.makedirs('./data/VOCdevkit/VOC2007/ImageSets', exist_ok=True)
ftrain = open('./data/VOCdevkit/VOC2007/ImageSets/trainval.txt', 'w')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftest.write(name)
else:
ftrain.write(name)
ftrain.close()
ftest.close()
2、修改代码
修改exps/example/yolox_voc/yolox_voc_s.py改文件具体如下:
这个地放修改为自己的实际类别数量,不加背景即背景不算一类
修改yolox/data/datasets/voc_classes.py文件,修改为自己的类别名:
3、执行命令进行训练
python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 16 --fp16 -o -c weights/yolox_s.pth
-d 使用多少张显卡训练
-b 批次大小
–fp16 是否开启半精度训练
期间遇到错误如下:
①:
`Original Traceback (most recent call last):
File "E:\Anaconda3\envs\yolox\lib\site-packages\torch\utils\data\_utils\worker.py", line 198, in _worker_loop
data = fetcher.fetch(index)
File "E:\Anaconda3\envs\yolox\lib\site-packages\torch\utils\data\_utils\fetch.py", line 44, in fetch
data = [self.dataset[idx] for idx in possibly_batched_index]
File "E:\Anaconda3\envs\yolox\lib\site-packages\torch\utils\data\_utils\fetch.py", line 44, in <listcomp>
data = [self.dataset[idx] for idx in possibly_batched_index]
File "d:\code\yolox-main\yolox\data\datasets\datasets_wrapper.py", line 121, in wrapper
ret_val = getitem_fn(self, index)
File "d:\code\yolox-main\yolox\data\datasets\mosaicdetection.py", line 91, in __getitem__
img, _labels, _, _ = self._dataset.pull_item(index)
File "d:\code\yolox-main\yolox\data\datasets\voc.py", line 145, in pull_item
target = self.load_anno(index)
File "d:\code\yolox-main\yolox\data\datasets\voc.py", line 126, in load_anno
target = self.target_transform(target)
File "d:\code\yolox-main\yolox\data\datasets\voc.py", line 64, in __call__
label_idx = self.class_to_ind[name]
KeyError: '1'`
这部分是以为自己在标记数据的时候对其命名为1,而在上面修改类别名的时候是其它类别名,故出错,在YOLOv5中就没有出现这个问题,具体原因下面说。
②:
修改yolox.data.get_yolox_datadir()函数
③:RuntimeError: DataLoader worker (pid(s) 17496, 8068, 18732, 8452) exited unexpectedly
修改exp下的yolox_base.py文件中的self.data_num_workers将其设置为0
基本上是没有什么大的问题了。
五、总结
1、对于环境搭建,自己没有出现太多的问题,因为环境是基础肯定会有问题,只要你耐心去解决就好了。
2、对于训练自己的数据集,在这部分中出现的问题是比较多的,个人感觉仅仅个人感觉,代码是比较混乱的,比如对于coco,voc数据集的处理这部分没有必要强求按照他的那个代码风格来,可以让用户自行处理成相应的格式,或许他是为了更好的让初学者接触,我感觉这大大增大了其烦恼。究其原因是因为代码对其规范要求的比较严格。
3、对于这个效果,个人还没有验证,工程和学术不同的是落地,其效果咋样有待考究,一上午的时间结束稍微终结一下,为后面自己学习部署希望有帮助,希望这个可以很好,属实有点卷了,现在连部署都要告知了。
告辞各位,且行且珍惜。