yolov5自动训练/预测-小白教程

news2024/11/29 8:44:06

文章目录

  • 引言
  • 一、配置参数设置
    • 1、数据参数配置
    • 2、模型训练参数配置
    • 3、模型预测参数配置
  • 二、一键训练/预测的sh介绍
    • 1、训练sh文件(train.sh)介绍
    • 2、预测sh文件(detect.sh)介绍
  • 三、本文训练main代码解读
    • 1、训练main函数解读
    • 2、数据加工与参数替换
  • 四、本文预测main代码解读
    • 1、训练main函数解读
    • 2、参数替换
    • 3、自动生成xml文件
  • 五、模型展示
    • 1、模型架构展示
    • 2、训练效果展示
    • 3、预测效果展示

引言

本文章基于客户一键训练与测试需求,我将yolov5模型改成较为保姆级的一键操作的训练/预测方式,也特别适合新手或想偷懒转换数据格式的朋友们。本文一键体现只需图像文件与xml文件,调用train.sh与detect.sh可完成模型的训练与预测。而为完成该操作,模型内嵌入xml转yolov5的txt格式、自动分配训练/验证集、自动切换环境等内容。接下来,我将介绍如何操作,并附修改源码。

源码链接:我已上传个人资源,请自行下载!

一、配置参数设置

该文件是yolo数据的文件,被我修改满足一键训练与测试文件的配置参数,主要包含数据参数配置、训练参数配置与检测参数配置。

1、数据参数配置

数据参数配置为图像与xml路径配置、转换yolov5数据格式保存路径、训练/验证/测试比列分配、对应yolov5数据文件参数配置,详情如下:

# 设置img与xml的文件路径,也可为同一个文件,按照xml选择img
img_path: /home/auto_yolo/data/example_data
xml_path: /home/auto_yolo/data/example_data

# 设置数据集训练与验证集测试的比率,和小于1,通常test比率不设置为0
train_rate: 0.8
val_rate: 0.2
test_rate:
# 设置转换数据保存路径
path: /home/auto_yolo/data/yolo_data
train: images/train
val: images/val
test:  
# Classes
nc: 3
names: ['car', 'moto', 'person'] 

2、模型训练参数配置

模型训练相关设置,若需要设置则对应相应值,否则不填,使用默认设置,其详情如下:

# 训练模型选择参数设置
imgsz:
batch_size: 2
epochs: 
resume: False
device:
workers:
model_scale: s  #模型型号参数,s表示yolov5s模型

3、模型预测参数配置

模型预测相关设置,若需要设置则对应相应值,否则不填,使用默认设置,其详情如下:
特别说明:auto_xml参数表示是否生成xml标签数据


#detect测试参数设置,无需关心上面所有参数
weights: /home/hncy/Project/tj/auto_try/yolov5-6.0/yolov5s.pt
source: /home/hncy/Project/tj/auto_yolo/data/example_data

#测试模型选择参数设置
detect_imgsz:
conf_thres:
iou_thres:
auto_xml: True  # 模型预测自动生成有标注框的xml文件


二、一键训练/预测的sh介绍

1、训练sh文件(train.sh)介绍

训练文件为sh文件,只需通过以下命令,实现训练。

sh train.sh

该文件包含虚拟环境切换与自动调用模型训练,其详情如下:


# train.sh

echo -e "\n"train time $(date "+%Y-%m-%d")"\n"

# 更换虚拟环境

__conda_setup="$('/home/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
	        eval "$__conda_setup"
		    else
			                if [ -f "/home/anaconda3/etc/profile.d/conda.sh" ]; then
						                    . "/home/anaconda3/etc/profile.d/conda.sh"
								                        else
												                            export PATH="/home/anaconda3/bin:$PATH"
															                                fi
fi
unset __conda_setup
conda activate torch1.8

cur_dir=$(cd `dirname $0`;pwd)  # 获得当前路径
echo -e  "\ncur_dir:"${cur_dir}"\n"

yaml_dir=$cur_dir/coco128_auto.yaml
echo -e  "\nyaml_dir:"${yaml_dir}"\n"

save_dir=$cur_dir/runs/train
echo -e "\nsave_dir:"$save_dir"\n"

if [ -d ${save_dir} ];then
	    echo "save_dir 文件存在"
    else
	    echo "save_dir文件不存在-->创建文件"
	    mkdir -p  $save_dir
fi

model_dir=/home/auto_try/yolov5-6.0

cd ${model_dir}

ls


echo -e "\n\n\n\t\t\t start train  ... \n\n\n"

python  train_auto.py  --data $yaml_dir  



2、预测sh文件(detect.sh)介绍

预测文件为sh文件,只需通过以下命令,实现训练。

sh detect.sh

该文件包含虚拟环境切换与自动调用模型预测,其详情如下:


# detect.sh

echo -e "\n"detect time $(date "+%Y-%m-%d")"\n"


# 更换虚拟环境

__conda_setup="$('/home/hncy/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
	        eval "$__conda_setup"
		    else
			                if [ -f "/home/anaconda3/etc/profile.d/conda.sh" ]; then
						                    . "/home/anaconda3/etc/profile.d/conda.sh"
								                        else
												                            export PATH="/home/anaconda3/bin:$PATH"
															                                fi
fi
unset __conda_setup
conda activate torch1.8

cur_dir=$(cd `dirname $0`;pwd)  # 获得当前路径
echo -e  "\ncur_dir:"${cur_dir}"\n"

yaml_dir=$cur_dir/coco128_auto.yaml
echo -e  "\nyaml_dir:"${yaml_dir}"\n"

save_dir=$cur_dir/runs/detect
echo -e "\nsave_dir:"$save_dir"\n"


if [ -d ${save_dir} ];then
	    echo "save_dir 文件存在"
    else
	    echo "save_dir文件不存在-->创建文件"
	    mkdir -p  $save_dir
fi

model_dir=/home/auto_try/yolov5-6.0

cd ${model_dir}

ls


echo -e "\n\n\n\t\t\t start detect  ... \n\n\n"

python  detect_auto.py  --data $yaml_dir  

三、本文训练main代码解读

1、训练main函数解读

可看出训练main函数多了replace_parameter(opt)函数,该函数为数据加工处理。

if __name__ == "__main__":

    opt = parse_opt()
    opt=replace_parameter(opt)
    main(opt)

2、数据加工与参数替换

数据转换主要将xml文件转成txt文件格式,可参考我的博客,xml转txt博客点击这里
。另一个是模型参数更换,其代码如下:


def replace_parameter(opt):
    cfg_yaml=product_yolo_dataset(opt.data)

    if cfg_yaml['imgsz'] is not None: opt.imgsz=cfg_yaml['imgsz']
    if cfg_yaml['batch_size'] is not None: opt.batch_size = cfg_yaml['batch_size']
    if cfg_yaml['epochs'] is not None: opt.epochs = cfg_yaml['epochs']
    if cfg_yaml['resume'] is not None: opt.resume = cfg_yaml['resume']

    if cfg_yaml['model_scale'] =='n':
        opt.weights = ROOT / 'yolov5n.pt'
    elif cfg_yaml['model_scale'] =='s':
        opt.weights = ROOT / 'yolov5s.pt'
    elif cfg_yaml['model_scale'] =='m':
        opt.weights = ROOT / 'yolov5m.pt'

    yaml_parent=Path(opt.data).parent
    opt.project=os.path.join(yaml_parent,'runs','train')

    return opt

四、本文预测main代码解读

1、训练main函数解读

可看出训练main函数多了replace_detect_parameter(opt)函数,该函数为数据加工处理。

if __name__ == "__main__":
    opt = parse_opt()
    opt = replace_detect_parameter(opt)
    main(opt)

2、参数替换

该函数是替换模型预测参数,我将不在介绍,其代码如下:


def replace_detect_parameter(opt):
    cfg_yaml=read_yaml(opt.data)


    if cfg_yaml['weights'] is  None :
        raise FileExistsError("lacking weights path")
    if cfg_yaml['source'] is  None:
        raise FileExistsError("lacking source path")


    opt.weights = cfg_yaml['weights']
    opt.source = cfg_yaml['source']
    opt.auto_xml = True if cfg_yaml['auto_xml'] else False
    if cfg_yaml['detect_imgsz'] is not None : opt.imgsz=cfg_yaml['detect_imgsz']
    if cfg_yaml['iou_thres'] is not None : opt.iou_thres=cfg_yaml['iou_thres']
    if cfg_yaml['conf_thres'] is not None: opt.conf_thres = cfg_yaml['conf_thres']

    yaml_parent=Path(opt.data).parent
    opt.project=os.path.join(yaml_parent,'runs','detect')
    del opt.data
    print_args(FILE.stem, opt)
    return opt

3、自动生成xml文件

我想说预测代码的自动生成xml方法,该部分在检测文件的run函数中,添加内容如下:

if auto_xml:
    create_xml_by_predect_xml(det, im0s.copy(), names, hide_conf, hide_labels, video_num, save_path)
    video_num+=1

我将预测结果生成xml标注,无论预测视频或预测图像均可实现该目的,我不在介绍,读者可查看代码,其调用函数如下:

def create_xml_by_predect_xml(det,img,names,hide_conf,hide_labels,video_num,save_path):

    save_xml = Path(save_path)
    save_xml_parent = save_xml.parent
    save_xml_path = build_dir(os.path.join(save_xml_parent, 'xml_dir'))
    if save_xml.suffix in ['.jpg', '.png', '.bmp']:
        write_img_name = save_xml.name
        save_xml_name = write_img_name.replace(save_xml.suffix, '.xml')
    else:
        write_img_name = 'video_' + str(video_num) + '.jpg'
        save_xml_name = write_img_name.replace('.jpg', '.xml')
    save_xml_img_path = os.path.join(save_xml_path, write_img_name)
    save_xml_xml_path = os.path.join(save_xml_path, save_xml_name)

    bboxes_lst=[]
    cat_lst=[]
    for *xyxy, conf, cls in reversed(det):
        c = int(cls)  # integer class
        label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}')

        box = [int(xyxy[0]), int(xyxy[1]), int(xyxy[2]), int(xyxy[3])]
        cat=label.split(' ')[0]
        if cat is not None and box is not None:
            cat_lst.append(cat)
            bboxes_lst.append(box)

    if cat_lst !=[]:
        tree, xml_name = product_xml(write_img_name, bboxes_lst, cat_lst, img=img)
        tree.write(save_xml_xml_path)
        cv2.imwrite(save_xml_img_path,img)

五、模型展示

1、模型架构展示

在这里插入图片描述

2、训练效果展示

在这里插入图片描述

3、预测效果展示

在这里插入图片描述

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

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

相关文章

MFC扩展库BCGControlBar Pro v33.6亮点 - 流程图、Ribbon Bar功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.6已正式发布了,此版本包含了对图表组件的改进、带隐藏标签的单类功能区栏…

数据结构--7.1散列表(哈希表)查找

散列表查找 我们要在a[ ] 中查找key关键字的记录: ——顺序表查找:挨个儿查找 ——有序表查找:二分法查找 ——散列表查找 记录的存储位置 f(关键字) 散列技术是在记录的存储位置和它的关键字之间建立一个确定的…

shell脚本命令

Shell命令是在类Unix操作系统中使用的命令行解释器(shell)中执行的命令。Shell命令可以用于执行系统命令、操作文件、进行文本处理、管理进程等。以下是一些常见的Shell命令: 1. ls:列出当前目录下的文件和文件夹。 2. cd&#x…

泡泡玛特加速海外布局,泰国首店开业吸引超千名粉丝排队

自2022年起,泡泡玛特全球门店布局加速,在包括英国、美国、新西兰欧美国家均开设新店面,2022年7月,泡泡玛特全球首家旗舰店落地首尔。泡泡玛特自2018年年底开始规划出海,截至目前,在全球已经拥有50多家门店&…

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 1( Props )

本章带领大家理解组件、props、emits、slots、providers/injects,Vue 插件 等Vue组件使用的基础知识。 5.1 组件注册5.2 Props5.2.1 组件之间如何传值5.2.2 参数绑定 v-bind5.2.3 参数类型5.2.4 props 默认与必填5.2.5 验证设置5.2.6 useAttrs 属性设置 第一章 Vue3…

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm,生成了桌面图标并信任,可以新建文件,但是软件无法打开。在终端执行如下命令,用命令行启动wps: cd /opt/kingsoft/wps-office/office6/ ./…

深度学习修炼(二)全连接神经网络 | Softmax,交叉熵损失函数 优化AdaGrad,RMSProp等 对抗过拟合 全攻略

文章目录 1 多层感知机(全连接神经网络)1.1 表示1.2 基本概念1.3 必要组成—激活函数1.4 网络结构设计 2 损失函数2.1 SOFTMAX操作2.2 交叉熵损失函数 3 优化3.1 求导计算过于复杂?3.2 链式法则导致的问题?3.3 梯度下降算法的改进…

自定义协议、序列化与反序列化

在编写TCP和UDP程序的时候,我们很自然的就使用了读取的函数对数据进行获取,对于UDP来说提供的是无连接的以数据报的形式进行传输,对于TCP来说是面向数据流的,在之前的程序中我们只是进行了读取的操作,但是并没有对读取…

通讯网关软件008——利用CommGate X2Mysql实现OPC数据转储Mysql

本文介绍利用CommGate X2MYSQL实现从OPC Server读取数据并转储至MYSQL数据库。CommGate X2MYSQL是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从OPC Server读取数据并转储至MYSQL数据…

Go语言进化之路:泛型的崛起与复用的新篇章

一、引言 泛型编程在许多编程语言中都是一项非常强大的特性,它可以使程序更加通用、具有更高的重用性。然而,Go语言在很长一段时间内一直没有提供泛型功能。在过去的一些版本中,Go语言开发者试图引入泛型,但最终都因为各种原因被…

分布式系统——分布式系统知识脑图

摘要 本博文主要介绍分布式系统知识脑图,帮助大家更好的快速的了解分布式系统相关知识。同时也是为大家在工作中应对分布式系统设计提供相关参考。 一、分布式系统知识脑图 博文参考

origin自定义颜色

点击图例,然后点击菜单栏的颜色右边的三角形。选择自定义颜色 在红绿蓝里输入自己想要的颜色配比。点击确定 如图,定义好五组颜色。我这里用的是比较经典的五色配图 蓝:1,86,153 黄:250,192,15 橙:243,118,74 浅蓝…

mysql workbench常见问题

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一:双击你要使用的库 方法二:USE 数据库名 2、复制表名,字段名 3、保存链接

【PostgreSQL内核学习(十一)—— (CreatePortal)】

CreatePortal 概述CreatePortal 函数GetPortalByName 函数PortalHashTableLookup 函数 MemoryContextAllocZero 函数 AllocSetContextCreate 函数ResourceOwnerCreatePortalHashTableInsert总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们…

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域,大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域,例如自然语言处理、图像识别和语音识别等,表现出高度准确和广泛的泛化能力。伴随…

2023-9

内核向应用层发送netlink单播消息: nlmsg_unicast -> netlink_unicast -> netlink_sendskb -> __netlink_sendskb -> 把skb链入struct sock 的 sk_receive_queue 链表中,再调用sk->sk_data_ready(sk); -> sock_def_readable -> wak…

排序算法:归并排序(递归和非递归)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关排序算法的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通…

关于使用API接口获取商品数据的那些事(使用API接口获取商品数据的步骤和注意事项。)

随着电商行业的不断发展,越来越多的企业和个人需要获取各大电商平台上的商品数据。而最常用的方法是使用API接口获取商品数据。本文将为您介绍使用API接口获取商品数据的步骤和注意事项。 一、选择API接口 首先需要了解各大电商平台提供的API接口,目前…

算法通关村第14关【黄金】| 数据流的中位数

思路:使用一个小根堆一个大根堆来找中位数 小根堆保存较大的一半数字,大根堆保存较小的一半数字 奇数queMin的队头即为中位数,偶数queMin和queMax队头相加/2为中位数 初始状态: queMin: [] queMax: [] 添加数字 1: …

【Java 基础篇】Java 进程详解:从基础到实践

Java 是一种广泛应用于各种类型的软件开发的编程语言,而与 Java 紧密相关的一个概念就是进程。本篇博客将从基础开始,详细介绍 Java 进程的概念、创建、管理以及一些实际应用场景。无论您是初学者还是有一定经验的开发者,都能从本文中获取有关…