前言

最近想跑一下旷世开源的YOLOX,本想着属于YOLO系列,代码大致都和YOLOv5差不多,没想到代码整体差异还是挺大的,跑通的过程中踩了不少坑,这篇就来记录一下整个流程。

官方源码:https://github.com/Megvii-BaseDetection/YOLOX

项目整体框架


项目框架和YOLOv6比较相似,训练、测试、检测三个核心函数都封装在tools文件夹中。
另外项目里有个dataset文件夹用来专门存放数据集,对于源码不熟悉建议先把数据集放在这个文件夹下。

数据预处理

官方的tutorials包含了CoCo和VOC两个经典数据集的训练方式,本篇主要采用的是VOC数据集的训练方式。
首先,需要将自己的数据集按照VOC的格式进行放置,注意文件名不要变化。

之后,在Main文件夹下新建下面两个txt文件。

运行下面的脚本[2],按照9:1的比例划分训练验证集和测试集。

import os
import randomtrainval_percent = 0.1
train_percent = 0.9
xmlfilepath = r'C:\Users\xy\Desktop\Work\YOLOX\datasets\VOC\VOCdevkit\VOC2007\Annotations'
txtsavepath = r'C:\Users\xy\Desktop\Work\YOLOX\datasets\VOC\VOCdevkit\VOC2007\ImageSets'
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)ftest = open(r'C:\Users\xy\Desktop\Work\YOLOX\datasets\VOC\VOCdevkit\VOC2007\ImageSets\Main\test.txt', 'w')
ftrain = open(r'C:\Users\xy\Desktop\Work\YOLOX\datasets\VOC\VOCdevkit\VOC2007\ImageSets\Main\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()

修改配置文件

首先修改yolox/data/dataloading.py文件:

再修改exps/example/yolox_voc/yolox_voc_s.py文件:

修改数据集类别个数:

修改训练验证集路径:

修改测试集路径:

然后,修改yolox/data/datasets/voc_classes.py
这里修改成自己数据集的类别:

接着,修改yolox/evaluators/voc_eval.py

该文件用于读取xml标签信息

然后,修改yolox\exp\yolox_base.py

这里包含了很多训练的超参数(很奇怪开发者为什么不按照惯例把它写在train.py中)

其中,我主要修改这几个量:

  • self.max_epoch = 300:指定训练epoch
  • self.print_interval = 10:每经过10个batch打印一次
  • self.eval_interval = 1:每训练一次进行验证
  • self.data_num_workers = 0 :只使用主线程

最后,修改主程序tools/train.py

主要修改这三个量:

下面也可以修改"-c", "--ckpt"来指定官方提供的预训练模型,不指定则从0开始训练。

运行train.py就可以成功开始训练了。

如果还遇到一些报错,可以尝试在文件根目录下运行python setup.py install来更新一些依赖。

检测

训练完之后,保存的模型会存放在tools/YOLOX_outputs/yolox_voc_s/best_ckpt.pth

注意检测前还需要修改类别标签,YOLOX和YOLOv6一样,类别标签并不保存在模型之中,而是在检测时再进行映射,猜测这么做可能是可以减小模型体积,加快推理速度。

yolox/data/datasets/__init__.py中添加from .voc_classes import VOC_CLASSES


然后在demo.py中,将所有COCO_CLASSES替换成VOC_CLASSES

检测图片

python tools/demo.py --save_result -f exps/example/yolox_voc/yolox_voc_s.py  -c tools/YOLOX_outputs/yolox_voc_s/best_ckpt.pth --device gpu --tsize 640 --path assets/dog.jpg

检测视频

python tools/demo.py --save_result -f exps/example/yolox_voc/yolox_voc_s.py  -c tools/YOLOX_outputs/yolox_voc_s/best_ckpt.pth --device gpu --tsize 640 --demo video --path C:\Users\xy\Desktop\sucai\wangzhe\zhuge.mp4

拓展:添加帧率显示

对于视频,如果需要显示帧率,可以进行如下操作:
visual函数中添加:

def visual(self, output, img_info, cls_conf=0.35):ratio = img_info["ratio"]img = img_info["raw_img"]if output is None:return imgoutput = output.cpu()bboxes = output[:, 0:4]# preprocessing: resizebboxes /= ratiocls = output[:, 6]scores = output[:, 4] * output[:, 5]vis_res = vis(img, bboxes, scores, cls, cls_conf, self.cls_names)# 添加帧率检测cv2.putText(img, "FPS:{:.1f}".format(1. / (time.time() - self.tt)), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2,(225, 221, 156), 4)self.tt = time.time()return vis_res

Predictor中添加self.tt = time.time()

class Predictor(object):def __init__(self,model,exp,cls_names=VOC_CLASSES,trt_file=None,decoder=None,device="cpu",fp16=False,legacy=False,):self.model = modelself.cls_names = cls_namesself.decoder = decoderself.num_classes = exp.num_classesself.confthre = exp.test_confself.nmsthre = exp.nmsthreself.test_size = exp.test_sizeself.device = deviceself.fp16 = fp16self.preproc = ValTransform(legacy=legacy)self.tt = time.time()

结果展示

我使用网络上搜集到的王者荣耀数据集进行训练,再检测自己的一局对局视频,和YOLOv5/YOLOv7/YOLOR进行对比,效果如下

YOLOv5/YOLOv7/YOLOX/YOLOR对比测试

B站Link:https://www.bilibili.com/video/BV1zU4y1C7Kn

数据集从网络搜集:https://aistudio.baidu.com/aistudio/datasetdetail/165546

总结

从各算法的对比检测效果来看,YOLOX的帧率是最快的,但是这里面也需要考虑到YOLOX未渲染中文带来的影响。不过,从视觉上看,YOLOX的检测精度不如其它算法,这也可能是数据集较少导致的。

YOLOX的学习成本比YOLOv5要高,里面需要修改的参数太多,可能是企业更多考虑了技术的版权问题或是单纯地在秀技,总之,写成这样,对于初学者真不友好。

References

[1]https://zhuanlan.zhihu.com/p/460677014
[2]https://blog.csdn.net/weixin_44123583/article/details/124194355

【目标检测】YOLOX训练王者荣耀数据集相关推荐

  1. 深度学习实战(七)——目标检测API训练自己的数据集(R-FCN数据集制作+训练+测试)

    TensorFlow提供的网络结构的预训练权重:https://cloud.tencent.com/developer/article/1006123 将voc数据集转换成.tfrecord格式供te ...

  2. 目标检测--RFBNet训练自己制作数据集出现loss=nan问题的解决方法

    之前用RFBNet进行目标检测,采用的数据集是VOC2007和VOC2012.最近用在自己的数据集进行训练,由于我的数据集格式跟VOC格式不一样,根据网上的经验,我就开始将自己的数据集制作成VOC格式 ...

  3. paddledet 训练旋转目标检测 ppyoloe-r 训练自己的数据集

    1.数据转换 labelme2coco,原来是labelme标注的points 通过opencv转为4个坐标 # encoding=utf-8 import argparse import colle ...

  4. YOLO目标检测,训练自己的数据集(识别海参)

    向AI转型的程序员都关注了这个号

  5. [数据集][VOC][目标检测]河道垃圾水面漂浮物数据集目标检测可用yolo训练-1304张介绍

    数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1304 标注数量(xml文件个数):130 ...

  6. YOLOV3目标检测模型训练实例

    YOLOV3目标检测 从零开始学习使用keras-yolov3进行图片的目标检测,比较详细地记录了准备以及训练过程,提供一个信号灯的目标检测模型训练实例,并提供相关代码与训练集. DEMO测试 YOL ...

  7. 基于mmdetection 旋转目标检测(OBB detection)+DOTA数据集自定义数据集+配docker

    这两周得益于组里的任务需求,肝了一个遥感类的飞机旋转框目标检测,在给定的4096*4096的大尺度分辨率图片上去识别检测飞机. 经过模型检测后输出结果图如下图所示: 可以看到最终的结果还是不错的,通过 ...

  8. 目标检测任务中常用的数据集格式(voc、coco、yolo)

    在目标检测任务中,常见的数据集格式有三种,分别为voc(xml).coco(json).yolo(txt). 一.Pascal VOC Pascal VOC数据集是目标检测的常用的大规模数据集之一,从 ...

  9. WIN10使用YOLOX训练自己的数据集(图解超详细)

    文章目录 WIN10使用YOLOX训练自己的数据集(图解超详细) 下载YOLOX源码 配置环境,修改源码 添加权重文件 建立VOCdevkit文件夹 添加数据集 划分训练集和测试集 修改 类别 为自己 ...

最新文章

  1. python中常见的运行时错误_17个常见Python运行时错误
  2. windows 命令行创建用户
  3. Java中常见的集合框架
  4. php一对一模型关联,通过实例学习Laravel模型中的一对一关联关系
  5. linux-查找某目录下包含关键字内容的文件
  6. 精品软件 推荐 DiskGenius专业版 磁盘管理软件 4.7 注册版本分享
  7. 关于前几周项目进行的一些感受
  8. Adobe携手微软、世纪互联在中国推多种云服务
  9. 用大数据感知美德的力量
  10. 推荐:小众软件——各类软件的精品
  11. 40种让孩子爱上阅读的好方法!转给家长
  12. 容联云发送短信验证码
  13. 动态图 vs 静态图
  14. 计算机二级无忧软件mysql_无忧考吧全国计算机二级MS Office模拟软件
  15. 图片怎么修改成750x750像素?
  16. css html 对错号,HTML_DIV+CSS编码时易犯的错误,CSS+DIV是网站标准(或称“WEB - phpStudy...
  17. 【题解】慈溪中学-8.14-T1
  18. Windows下的Autorun程序
  19. 十个 C++ 运算符重载示例,看完不懂打我...
  20. [Python]profile优化实践(基于A*算法) 1

热门文章

  1. python 实现字典_Python字典实现
  2. 记忆术有用吗?记忆术有什么用?过来人告诉你
  3. php调用rpc,远程调用RPC
  4. Excel宏操作绘制学生成绩曲线图
  5. 闲谈Redis客户端Lettuce
  6. 大学作业java考试系统_教学辅助之作业批改考试系统
  7. C# Cookies设置和读取
  8. Java自动装箱与自动拆箱
  9. SAP财务常用数据源概览
  10. Xshell通过ssh上传文件到服务器