作者 | JuLec@知乎(已授权)

来源 | https://zhuanlan.zhihu.com/p/402210371

编辑 | 极市平台

导读

Yolo系列因为其灵活性,一直是目标检测热门算法。无奈用它训练自己的数据集有些不好用,于是有空就搞了一下,训练自己的数据集。

代码:https://github.com/Megvii-BaseDetection/YOLOX

论文:https://arxiv.org/abs/2107.08430

Yolo系列因为其灵活性,一直是目标检测热门算法。无奈用它训练自己的数据集有些不好用,于是有空就搞了一下,训练自己的数据集。

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 cython; pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

2.下载预训练权重

https://github.com/Megvii-BaseDetection/YOLOX/blob/main/exps/default/yolox_s.py

3.准备自己的Voc数据集

-----datasets------VOCdevkit------DATA_NAME   #  你自己存储数据集的文件夹名称------JPEGImages------000000000000000.jpg------Annotations------000000000000000.xml------ImageSets-------Main------trainval.txt------test.txt

4.配置文件编辑(config.yaml)

CLASSES:
- person             # 数据集的标签,本教程只检测人
CLASSES_NUM: 1       # 待检测的类别个数
SUB_NAME: 'custom'   #  上一步中的DATA_NAME

5.修改yolox文件,适配自己的数据集

5.1

首先在exps/example/yolox_voc/yolox__voc_s.py文件最前面写入下面的代码,主要是采用yaml解析config.yaml获得SUB_NAME

import sys
sys.path.insert(1,"../../")
# parseYaml库是自己编写的用于解析yaml
import parseYaml
cfg = parseYaml.get_config("./config.yaml")DATA_NAME = cfg.SUB_NAME

注:parseYaml脚本如下:

import yaml
import os
from easydict import EasyDict as edict
class YamlParser(edict):""" This is yaml parser based on EasyDict."""def __init__(self, cfg_dict=None, config_file=None):if cfg_dict is None:cfg_dict = {}if config_file is not None:assert(os.path.isfile(config_file))with open(config_file, 'r') as fo:cfg_dict.update(yaml.load(fo.read(),Loader=yaml.FullLoader))super(YamlParser, self).__init__(cfg_dict)def merge_from_file(self, config_file):with open(config_file, 'r') as fo:self.update(yaml.load(fo.read()))def merge_from_dict(self, config_dict):self.update(config_dict)def get_config(config_file=None):return YamlParser(config_file=config_file)

5.2 修改voc_classes.py

cfg = parseYaml.get_config("./config.yaml")
if cfg.CUSTOM:VOC_CLASSES = cfg.CLASSES
else:VOC_CLASSES = ("person","aeroplane","bicycle","bird","boat","bus","bottle","car","cat","chair","cow","diningtable","dog","horse","motorbike","pottedplant","sheep","sofa","train","tvmonitor",)

5.3

修改Exp类的_init__方法,主要是采用yaml解析获得CLASS__NUM

def __init__(self):super(Exp, self).__init__()self.num_classes = cfg.CLASSES_NUM    # 获得检测的类别个数self.depth = 0.33self.width = 0.50self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

5.4 修改数据加载过程

dataset = VOCDetection(data_dir=os.path.join(get_yolox_datadir(), "VOCdevkit"),# image_sets=[('2007', 'trainval'), ('2012', 'trainval')],image_sets=[(DATA_NAME, 'trainval')],      # 适配自己的数据集名称img_size=self.input_size,preproc=TrainTransform(rgb_means=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),max_labels=50,),custom=True,                                # 新增custom参数)

5.5

根据5.3中的custom参数,修改voc.py中的VOCDetection的_init_方法

class VOCDetection(Dataset):def __init__(self,data_dir,image_sets=[('2007', 'trainval'), ('2012', 'trainval')],img_size=(416, 416),preproc=None,target_transform=AnnotationTransform(),dataset_name="VOC0712",custom = True                      # 新增):super().__init__(img_size)self.root = data_dirself.image_set = image_setsself.img_size = img_sizeself.preproc = preprocself.target_transform = target_transformself.name = dataset_nameself._annopath = os.path.join("%s", "Annotations", "%s.xml")self._imgpath = os.path.join("%s", "JPEGImages", "%s.jpg")self._classes = VOC_CLASSESself.ids = list()self.custom = customif self.custom:            # 处理自己的数据集self.base_dir,self.custom_name = image_sets[0]    # DATA_NAMErootpath = os.path.join(self.root, self.base_dir)for line in open(os.path.join(rootpath, "ImageSets", "Main", self.custom_name + ".txt")):self.ids.append((rootpath, line.strip()))else:                     # 处理默认的Voc数据集for (year, name) in image_sets:self._year = yearrootpath = os.path.join(self.root, "VOC" + year)for line in open(os.path.join(rootpath, "ImageSets", "Main", name + ".txt")):self.ids.append((rootpath, line.strip()))

5.6 修改get_eval_loader方法

valdataset = VOCDetection(data_dir=os.path.join(get_yolox_datadir(), "VOCdevkit"),# image_sets=[('2007', 'test')],image_sets=[(DATA_NAME, 'test')],img_size=self.test_size,preproc=ValTransform(rgb_means=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),),custom=True,)

6.执行训练

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -expn TEST -d 4 -b 64 --fp16 -o -c weights/yolox_s.pth

7.执行推理验证

python tools/demo.py image/video/webcam -f exps/example/yolox_voc/yolox_voc_s.py -c YOLOX_outputs/yolox_voc_s/best_ckpt.pth.tar --path img/1.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu# if choose webcam--camid 0/"rtsp:"

本文仅做学术分享,如有侵权,请联系删文。

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

实践教程|如何用YOLOX训练自己的数据集?相关推荐

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

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

  2. YOLOX训练自己的数据集(VOC)

    代码 :GitHub 论文 :arxiv 参考: 训练coco格式数据 文章解析 https://www.zhihu.com/question/473350307 https://zhuanlan.z ...

  3. 【目标检测】YOLOX训练王者荣耀数据集

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

  4. YOLOX训练自己标注的数据集

    参考原作者:YOLOX训练自己的数据集(超详细)_AI小白一枚的博客-CSDN博客_yolox训练自己的数据集 YOLOX是旷视提出来的,研究者将解耦头.数据增强.无锚点以及标签分类等目标检测领域的优 ...

  5. YOLO | 用YOLOv7训练自己的数据集(超详细版)

    一.环境设置 本文环境设置:Ubuntu (docker) pytorch-gpu 1.远程Ubuntu新建一个新的docker 容器 以下命令是创建一个名称为torch_yolo的gpu容器.如果没 ...

  6. mmsegmentation 训练自己的数据集

    open-mmlab有许多非常实用的框架,其中目标检测的话mmdetection确实很实用.但语义分割的话当属mmsegmentation,这篇博客就是介绍如何用mmsegmentation训练自己的 ...

  7. 用yolo训练自己的数据集(以车牌为例)

    我看了网上很多yolo教程,可能是因为电脑环境和配置的不一样,所以我并没有完全通过网上教程成功训练自己的数据集,接下来我将我自己完全亲自测试并且最后成功训练数据集的教程记录如下: 训练自己的数据集有如 ...

  8. Yolov5训练自己的数据集(详细完整版)

    最近在网上看到有与本博客一模一样的,连图片都一样. 特此声明:这是原版,转载请附原文链接,谢谢. 这次我将大部分图片添加了水印 文章目录 一. 环境(不能含有中文路径) 二. 准备工作(文件夹及视频转 ...

  9. 实践教程|YOLOX目标检测ncnn实现

    作者 | 唐超@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/391788686 编辑丨极市平台 导读 本文将YOLOX训练的模型转到ncnn进行推理加速. YOLO ...

最新文章

  1. 《Swift 权威指南》——第6章,第6.7节常量和变量参数
  2. java 获取当前ip_不停机还能替换代码?6年的 Java程序员表示不可思议
  3. 为什么从前那些.NET开发者都不写单元测试呢?
  4. python正则表达式修饰符_python正则表达式,看完这篇文章就够了...
  5. 读《构建之法》的心得体会
  6. 在项目中使用fastreport_如何在项目管理中使用里程碑
  7. CVE-2013-3346Adobe Reader和Acrobat 内存损坏漏洞分析
  8. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)
  9. [课程设计]任务进度条开发日志目录
  10. python asyncio tcp转发_asyncio不通过tcp发送整个图像数据
  11. 西安石油大学计算机学院于晓,西安石油大学计算机学院2009届本科毕业设计答辩.doc...
  12. c# mysql datetime 判断为空 dbnull_转:SqlServer中的datetime类型的空值和c#中的DateTime的空值的研究...
  13. 火山安卓文件读写操作演示
  14. 叮铃铃~:前端铃声组件easy-ring 1.0版本文档
  15. 香橙派装ubuntu系统
  16. Express 报错:Failed to lookup view error in views directory 处理
  17. What are default and maximum values of dev_loss_tmo in Red Hat Enterprise Linux 6
  18. NOIP 2015 d1t2 信息传递
  19. 计算机网络的社会环境分析_计算机网络的功能和应用
  20. 前端项目review之修改element-ui全局主题颜色配置element-theme-chalk和gulp

热门文章

  1. 如何给“物联网小白”讲清楚什么是无线通信模块?很简单,会打电话就行~
  2. 漫谈 REST 架构风格
  3. 一次插拔U盘引发的学案
  4. ES权威指南[官方文档学习笔记]-57 Analysis and analyzers
  5. Ubuntu下修改DNS重启也能用的方法
  6. [征求意见]关于增加Java技术区
  7. 记一次单机系统的性能优化:最后竟是 TCP 的锅
  8. 小米数据管理与应用实践
  9. 原来你离进大厂,只差这些面试题!
  10. 初探可编程网关 Pipy