跑通yolox-s官方源码(可与yolov5s做对比试验)

news2024/9/23 11:14:11

目录

  • (一)一些参考链接
  • (二)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

  1. 修改exps/example/yolox_voc/yolox_voc_s.py中的self.num_classes
  1. 修改yolox/exp/yolox_base.py中的self.num_classes

2. 修改训练集信息

  1. 修改exps/example/yolox_voc/yolox_voc_s.py中的VOCDetection
  1. 修改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. 修改验证集信息

  1. 修改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中的不同网络调用方式一样。

  1. 为了统一不同的网络结构,修改exps/example/yolox_voc/yolox_voc_s.py中的,self.depthself.width
  1. 修改yolox/exp/yolox_base.py中的,self.depthself.width

5. 修改其他相关

  1. 删除year等信息

因为自有数据集中,没有year信息,所以需要删除。

即修改yolox/data/datasets/voc.py中,_get_voc_results_file_template函数

训练过程中,在原始的head数据集中,会生成一个results的文件夹,保存历史信息。

  1. 修改验证epoch的数量

目前代码中是训练迭代10个epoch,再对验证集做1次验证。做以下修改设置为每迭代一个epoch,就使用验证集验证一次。

yolox/exp/yolox_base.pyclass Exp中,按住快捷键Ctrl+F搜索定位到self.print_interval处,做以下两处修改:


  1. 修改验证时的相关信息

主要对读取验证信息的相关代码进行调整,代码在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.

有毒,还是不行!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quartus 实例应用(2)——创建设计工程

Quartus II 简易教程一、概念回顾二、创建设计工程2.1 创建工程2.2 新建HDL文件三、编译工程四、下载一、概念回顾 什么是综合?什么是设计? 答:综合就是编译,设计就是布局布线。 二、创建设计工程 2.1 创建工程 打开Quartus I…

用vuex对token/refresh_token 进行管理以及处理token过期问题

这里介绍对token的处理 问题1:token数据或者其他数据,存在vuex仓库中,刷新会丢失状态 。 问题2:数据只存在本地,数据变化了,相关的视图并不会更新。 Vuex 容器中的数据只是为了方便在其他任何地方能方便的获…

【EC200U】 基站定位

EC200U 基站定位什么是基站基站定位cellLocator - 基站定位调用获取坐标token 秘钥申请运行测试我们之前玩了GPS了【EC200U】GPS定位 GPS 精度高,但比较费电,首次搜索卫星定位时间比较长,当卫星信号覆盖不好,比如室内,…

gdb-dashboard的简单使用

问题描述 众所周知,随着IDE的普及,越来越多的人不习惯命令行调试,但是Linux开发又绕不开GDB,所以有大佬开发了程序用来显示常见的一些调试参数,gdb-dashboard是比较热门的程序之一。附链接。 使用参考 神仙GDB调试工…

Golang入门笔记(7)—— 函数 func

函数是什么? 函数:为完成某一功能的程序的语句指令的集合。 感觉重头戏逐渐到来了,让我们好好的,认真对待它吧!为什么要使用函数? 为了提高代码的复用,减少代码的冗余,提高代码维护性…

前端框架 React 学习总结

目录 一、React在HTML里的运用 二、React框架的常用操作 1、JSX基础语法规则 2、state数据的使用 3、生命周期 4、数据的双向绑定与Ref 5、PropTypes验证规则 6、React里的插槽 7、错误边界 8、直接操作refs元素 9、高阶组件的运用案例 10、性能优化 11、Hook生命…

Linux中安装mysql8

一、下载MySQL到 /usr/local/src 1、打开官网下载界面 MySQL :: Download MySQL Community Server (Archived Versions) 2、选择某个版本的下载地址 以https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz这个地址作为例子 …

Kubernetes 系统化学习之 持久存储篇(五)

1. ConfigMap ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性…

day07 Elasticsearch搜索引擎3

day07 Elasticsearch搜索引擎3 1、数据聚合 聚合(aggregations)可以让我们极其方便的实现对文档数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售…

java设计模式之观察者模式

一:观察者模式 1.什么是观察者模式? 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 观察者模式的基本介绍 又被称为发布-订阅(Publish/Subscribe&#xff09…

从阿里云容器攻防矩阵API安全生命周期,看如何构建金融安全云原生平台

【编者按】云原生技术正在助力银行通过差异化业务进行创新,却也带来了由于研发/运维人员对新架构不熟悉所导致的基础设施风险、业务风险及数据暴露风险。如何在飞速更迭的技术环境下保持业务持续发展,同时保证业务整体的安全性,满足不断增强的…

设计模式-装饰器模式

装饰器模式也称为包装模式是指在不改变原有对象的基础上,将功能附加到对象上,提供比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式 装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态的扩展类的功能 装饰器模式通用UML类图 主要角…

培训学校管理系统之家校管理

近年来,伴随着信息技术的进步。除了不少学校开展了数字化校园的建设,一些培训机构也在使用数字化系统进行管理。同时,由于招生数量的不断增长,如何解决学生、教师、家长三者之间的联系沟通问题,促进教学管理任务的有效…

排序(详解)

排序排序的概念常见的排序算法直接插入排序希尔排序(缩小增量排序)选择排序堆排序冒泡排序快排(递归)霍尔版本挖坑法前后指针法快排(非递归)归并排序(递归)归并排序(非递…

区块链动态化监管方案

前言 监控运维模块是区块链BaaS的核心模块之一,我们针对联盟链、主机和系统等多个监控对象提供丰富的监控指标。通过BaaS提供的综合监控大屏,用户可直观洞悉区块链业务全局,实现7*24小时监控全覆盖。 但随着BaaS业务的扩展,对监…

jsp教师教学信息管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目

一、源码特点 JSP 教师教学信息管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库文,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008…

微服务拆分总结(一)

微服务要解决的问题: 1、可以快速迭代; 2、解决三高问题(高并发,高可用,高性能) 什么时候拆分微服务,拆分的时机是什么? 提交频繁代码冲突; 模块之间耦合严重&#…

RocketMQ 重试机制详解及最佳实践

作者:斜阳 引言 本文主要介绍在使用 RocketMQ 时为什么需要重试与兜底机制,生产者与消费者触发重试的条件和具体行为,如何在 RocketMQ 中合理使用重试机制,帮助构建弹性,高可用系统的最佳实践。 RocketMQ 的重试机制…

[附源码]java毕业设计静谧空间自习室预订系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

服务器部署Vue2脚手架的PIXI游戏项目-知识点注意

文章目录安装PIXI框架方式一(安装)方式二(引入)javaScript代码位置initPixi方法组件挂载完毕后调用注意文件导入使用import一个个导入并命名使用setTimeout()方法使用一般方法调用表达式使用安装PIXI框架 方式一(安装…