yolov5训练自己的数据集 以训练yolov5识别香烟为例

news2024/12/25 12:32:10

创建数据集目录

在YOLOv5根目录下创建mydata文件夹(名字可以自定义),目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下
mydata
…images # 存放图片
…xml # 存放图片对应的xml文件
…dataSet #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字(无后缀.jpg)
示例如下:
mydata文件夹下内容如下:
在这里插入图片描述

使用脚本划分训练集、验证集、测试集

dataSet 文件夹下面存放训练集、验证集、测试集的划分,通过脚本生成,在项目的根目录创建一个split_train_val.py文件,代码内容如下:

# coding:utf-8
 
import os
import random
import argparse

#通过argparse模块创建一个参数解析器。该参数解析器可以接收用户输入的命令行参数,用于指定xml文件的路径和输出txt文件的路径。
parser = argparse.ArgumentParser()
# 指定xml文件的路径
parser.add_argument('--xml_path', default='mydata/xml', type=str, help='input xml label path')
# 设置输出txt文件的路径
parser.add_argument('--txt_path', default='mydata/dataSet', type=str, help='output txt label path')
opt = parser.parse_args()
# 训练集与验证集 占全体数据的比例 
trainval_percent = 1.0
# 训练集 占训练集与验证集总体 的比例
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
# 获取到xml文件的数量
total_xml = os.listdir(xmlfilepath)
#判断txtsavepath是否存在,若不存在,则创建该路径。
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

# 统计xml文件的个数,即Image标签的个数
num = len(total_xml)
list_index = range(num)
# tv (训练集和测试集的个数) = 数据总数 * 训练集和数据集占全体数据的比例
tv = int(num * trainval_percent)
# 训练集的个数
tr = int(tv * train_percent)
# 按数量随机得到取训练集和测试集的索引
trainval = random.sample(list_index, tv)
# 打乱训练集 
train = random.sample(trainval, tr)
# 创建存放所有图片数据路径的文件
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
# 创建存放所有测试图片数据的路径的文件
file_test = open(txtsavepath + '/test.txt', 'w')
# 创建存放所有训练图片数据的路径的文件
file_train = open(txtsavepath + '/train.txt', 'w')
# 创建存放所有测试图片数据的路径的文件
file_val = open(txtsavepath + '/val.txt', 'w')

# 遍历list_index列表,将文件名按照划分规则写入相应的txt文件中
for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)
 
file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行如上代码,成功划分数据集

使用脚本将训练集,测试集,验证集生成label标签

即将每个xml标注提取bbox信息为txt格式,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。格式如下:

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd
 
sets = ['train', 'val', 'test']
classes = ['smoke']   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)
 
def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h
 
def convert_annotation(image_id):
    in_file = open('mydata/xml/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('mydata/label/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
 
wd = getcwd()
for image_set in sets:
    if not os.path.exists('mydata/label/'):
        os.makedirs('mydata/label/')
    image_ids = open('mydata/dataSet/%s.txt' % (image_set)).read().strip().split()
    list_file = open('mydata/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/mydata/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

这段代码是一个用于将XML格式的图像注释信息转换为YOLO格式的标签的脚本。主要包括以下几个步骤:

  1. 导入相关模块和库。
  2. 定义训练集、测试集和验证集的名称(在这里只有训练集)。
  3. 定义所需的物体类别(这里只有一个类别,即’smoke’)。
  4. 定义一个函数convert,用于将图像的边界框坐标转换为YOLO格式的相对坐标。
  5. 定义一个函数convert_annotation,用于将单个图像的注释信息转换为YOLO格式的标签。
  6. 获取当前工作路径,并打印输出。
  7. 针对每个数据集(训练集、测试集和验证集),创建保存标签的目录。
  8. 依次处理每个图像,将图像路径写入列表文件,并调用convert_annotation函数将图像的注释信息转换为YOLO格式的标签。
  9. 关闭列表文件。

在mydata中创建配置文件

命名为:smoke.yaml

# 图片路径
train: mydata/train.txt
val: mydata/val.txt
test: mydata/test.txt

# numbers of classes 我这个数据集只标注了香烟,所以类别为1
nc: 1

# class names
names: ['smoke']

下载yolov5的权重

链接:https://pan.baidu.com/s/1vlTmjNofB5kD3BOaSy4SnA
提取码:gr8v

在根目录创建weights文件夹
把下载好的权重放进去
在这里插入图片描述

我的预训练使用yolov5m,修改该文件的类别个数

在这里插入图片描述

打开pycharm的terminal,运行如下命令

python train.py --data mydata/smoke.yaml --cfg models/yolov5m.yaml --weights weights/yolov5m.pt --epochs 100 --batch-size 16

报错

Failed to initialize: Bad git executable.
The git executable must be specified in one of the following ways:
- be included in your $PATH
- be set via $GIT_PYTHON_GIT_EXECUTABLE
- explicitly set via git.refresh()

All git commands will error until this is rectified.

This initial warning can be silenced or aggravated in the future by setting the
$GIT_PYTHON_REFRESH environment variable. Use one of the following values:
- quiet|q|silence|s|none|n|0: for no warning or exception
- warn|w|warning|1: for a printed warning
- error|e|raise|r|2: for a raised exception

Example:
export GIT_PYTHON_REFRESH=quiet

#出错原因:git环境变量设置问题
#简便解决办法:在train.py的导入包的上方增加以下代码
import os
os.environ["GIT_PYTHON_REFRESH"] = "quiet"

再次运行

python train.py --data mydata/smoke.yaml --cfg models/yolov5m.yaml --weights weights/yolov5m.pt --epochs 100 --batch-size 16

成功开始训练

找到训练好的参数

参考文献:

YOLOv5训练自己的数据集(超详细)
https://blog.csdn.net/qq_40716944/article/details/118188085

YOLOV5训练自己的数据集(踩坑经验之谈)https://blog.csdn.net/a_cheng_/article/details/111401500

yolov5 报错解决记录
https://blog.csdn.net/Sickas/article/details/129459630

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

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

相关文章

JAVA毕业设计091—基于Java+Springboot+Vue的宠物领养系统(源代码+数据库+14000字论文)

基于JavaSpringbootVue的宠物领养系统(源代码数据库14000字论文)091 一、系统介绍 本项目前后端分离 本系统分为管理员、用户两种角色 用户角色包含以下功能: 登录、注册、首页、宠物喂养、流浪宠物救助、宠物喂养点、丢失宠物查看、流浪宠物救助站、宠物论坛、…

Appium+python自动化(二十五)-获取控件ID(超详解)

简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获取控件的坐…

实战项目——基于多设计模式下的同步异步日志系统

系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 目录 系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 前言 一、项目介绍 二、开发环境 三、核心技…

企业博客资讯如何高效运营起来?

运营一个高效的企业博客资讯需要综合考虑多个因素,包括内容策划、发布频率、优化推广、互动反馈等。下面将从这些方面介绍如何高效运营企业博客资讯。 如何高效运营企业博客资讯 内容策划 首先,需要制定一个明确的内容策略。确定博客的定位和目标受众…

亚马逊云科技纽约峰会,充分释放数据价值和生成式AI的潜力

生成式AI将深刻改变每个公司的运营方式,标志着人工智能技术发展的新转折点。亚马逊云科技昨日在纽约峰会上宣布,推出七项生成式AI新功能,进一步降低了生成式AI的使用门槛,让无论是业务用户还是开发者都能从中受益。借助这些新功能…

Packet Tracer – 使用 CDP 映射网络

# Packet Tracer – 使用 CDP 映射网络 ## 地址分配表 设备 接口 IP 地址 子网掩码 本地接口和互联邻居 Edge1 G0/0 192.168.1.1 255.255.255.0 G0/1 - S1 S0/0/0 S0/0/0 - ISP Branch-Edge S0/0/1 209.165.200.10 255.255.255.252 S0/0/1 – ISP Branch…

window下运行sh脚本/Linux命令

安装Git 首先找到git安装官方网址,Git的官方网址如下所示 https://git-scm.com/download/win 选择合适的Git版本安装即可。 一般一直点击install即可,注意环境变量的environment path的复选框点击。具体操作以及成果标志如下博客所示。 Windows 命令…

「VS」常见提示图标含义

✨博客主页何曾参静谧的博客📌文章专栏「VS」Visual Studio📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「算法」数据结构与算法「File」数据文件格式 目录 VS官网…

深入了解HTTP代理在网络爬虫与SEO实践中的角色

随着互联网的不断发展,搜索引擎优化(SEO)成为各大企业和网站重要的推广手段。然而,传统的SEO方法已经难以应对日益复杂和智能化的搜索引擎算法。在这样的背景下,HTTP代理爬虫作为一种重要的工具,正在逐渐被…

金蝶云星空对接打通管易云物料查询接口与商品新增接口

金蝶云星空对接打通管易云物料查询接口与商品新增接口 数据源系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”,旨在…

java实现简单的购物车

文章目录 包含的功能增加商品删除商品修改商品购买数量展示商品 源代码Item.javaShoppingCart.java 包含的功能 增加商品 private static void addItem(ArrayList<Item> shoppingCartList, Scanner sc) {String id null;while(true){System.out.println("请输入商…

HTML <picture> 标签

实例 如何使用 <picture> 标签: <picture><source media="(min-width:650px)" srcset="/i/photo/flower-4.jpg"><source media="(min-width:465px)" srcset="/i/photo/tulip.jpg"><img src="/i/ph…

难道真是小年?24浙大MBA项目报考形势研判:避开锋芒,逆势而行

还有几天时间&#xff0c;七月就过去了&#xff01;今年浙大MBA项目提前批面试还有最后六个批次&#xff1a; 但如果把区域便利性因素考虑进去&#xff0c;对于多数考生来说只有不超过三个批次的申请机会&#xff01;随着前面批次的面试完成&#xff0c;其实看得出来今年…

机器学习01 -Hello World(对鸢尾花(Iris Flower)进行训练及测试)

什么是机器学习&#xff1f; 机器学习是一种人工智能&#xff08;AI&#xff09;的子领域&#xff0c;它探索和开发计算机系统&#xff0c;使其能够从数据中学习和改进&#xff0c;并在没有明确编程指令的情况下做出决策或完成任务。 传统的程序需要程序员明确编写指令来告诉…

《Python高并发与高性能编程:原理与实践》——小解送书第六期

目录 书籍介绍 抽奖 书籍介绍 Python成为时下技术革新的弄潮儿&#xff0c;全民Python的发展趋势让人们不再满足于简单地运行Python程序&#xff0c;逐步探索其更为广泛的日常应用和高性能设计。以ChatGPT为代表的大模型产品对初级程序开发人员提出了挑战&#xff0c;要想在开…

目前主流的平面设计工具都有哪些?

对于初学者来说&#xff0c;图形设计看起来非常复杂。其实&#xff0c;只要选择合适的平面图设计软件&#xff0c;小白就能很快做出引人注目的平面图设计作品。在下面的文章中&#xff0c;将附上市场上流行的8款平面图设计软件的详细介绍&#xff0c;供设计师选择合适的平面图设…

异地远程访问连接家里的群晖NAS【内网穿透】

文章目录 异地远程访问连接家里的群晖NAS【内网穿透】 异地远程访问连接家里的群晖NAS【内网穿透】 在现代企业中&#xff0c;协同办公和数据共享的作用已经受到广泛认可&#xff0c;而群晖作为小型数据处理中心&#xff0c;也已经进入很多公司&#xff0c;并成为局域网内的数…

【智能可视化---02】艺术数据可视化:释放Python AI中Matplotlib的力量!寻觅AI里的Matplotlib,这两篇就够了!

如果对面太得寸进尺,请反思一下是不是自己太怂,这个世界上的恶人都是被怂人惯出来的。——拿破仑 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博…

excel要如何自动累加某个单元格上方的所有单元格?

输入公式 SUM(INDIRECT("A1:A"&ROW()-1)) 运行实例如下图 注意图中b4&#xff0c;和b5单元格都输入相同的公式。 此方法可以避免写vba&#xff0c;以前此类问题的解决都是通过vba代码进行处理 对函数进行解析 主要使用了 INDIRECT() 2、公式说明&#xff1a;…

0基础学习VR全景平台篇 第72篇:VR直播-直播模板

直播模板是指直播间的模板样式&#xff0c;目前有两种&#xff0c;分别是经典模本和极简模板。 经典模板即默认的模板&#xff0c;极简模板则是一种更简单的模板样式&#xff0c;只有背景图、直播窗口和活动介绍&#xff0c;无菜单、公告、广告、互动开关等功能。点击“极简模板…