使用YOLOv5练自己的数据集

news2025/1/12 10:04:54

说明

上次使用学习了如何运行yolov5检测自己的数据,这次学习yolov5如何训练自己的数据集
本次记录如何使用yolov5训练自己的数据集以及遇到报错解决方案

数据

使用数据:水果数据集

数据包含了png图片和相应的标注文件

切分数据

代码如下:
其中trainval_percent 和train_percent 代表划分比例
trainval_percent = 1
train_percent = 0.9
代表训练集和验证集为100%,不划分测试集
训练集和验证集为9:1

# coding;utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
#xm1文件的地址,根据自己的数据进行修改 xm1一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='Imagesets/Main', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)
num = len(total_xml)
list_index = range(num)
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')

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()

处理标注文件

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["banana", "snake fruit", "dragon fruit", "pineapple"]
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('./annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('./labels/%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('./labels/'):
        os.makedirs('./labels/')
    image_ids = open('./ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('./%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/images/%s.png\n' % (image_id)) # 注意你的图片格式,如果是.jpg记得修改
        convert_annotation(image_id)
    list_file.close()

运行会生成训练集、验证集、测试集的数据索引文件train.txt,val.txt,test.txt,并归一化标注信息(labels文件夹下)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编辑xx.yaml文件

内置训练集、验证集的索引文件路径,并且写入数据集所有的类别

train: E:\\pythonProject\\y2_data\\train.txt
val:  E:\\pythonProject\\y2_data\\val.txt
nc: 4 # number of classes
names: ['banana','snake fruit','dragon fruit','pineapple'] # 改成自己的类别

在这里插入图片描述

开始训练自己的数据

这里依旧使用的是Anaconda Prompt

python  C:\Users\hepei\dl\yolov5-master\train.py --img 720 --batch 2 --epoch 60 --data C:\Users\hepei\dl\yolov5-master\data\test.yaml --cfg  C:\Users\hepei\dl\yolov5-master\models\yolov5s.yaml --weights weights/yolov5s.pt

报错1

ImportError: Bad git executable.

在这里插入图片描述
按照报错信息找到git下的cmd文件,添加下方代码

os.environ['GIT_PYTHON_REFRESH'] = 'quiet'

在这里插入图片描述
问题解决

报错2

AssertionError: train: All labels empty in E:\pythonProject\y2_data\train.cache, can not start training. See https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

原因时因为voc_label没有正常生成标签

罪魁祸首是大小写问题,类别开头大写就无法生成标签,labels中的txt文件都是空的,改称小写就好了

classes = ["banana", "snake fruit", "dragon fruit", "pineapple"]

报错3

ImportError: The _imagingft C module is not installed

或者

ImportError: cannot import name 'Image' from 'PIL' (unknown location)

重装pillow:

pip uninstall pillow

pip install pillow

可以解决问题

成功运行

训练过程

在这里插入图片描述

训练结果

在这里插入图片描述

根据保存位置找到结果文件

在这里插入图片描述

看一看效果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[ vulhub漏洞复现篇 ] solr 远程命令执行(CVE-2019-0193)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Kubernetes的基础概念

一、Kubernetes的介绍 用于自动部署、扩展和管理"容器化(containerized)应用程序"的开源系统 可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一个生态极其丰富的容器编排框架工具 …

【现场问题】zookeeper的集群,其中两台起来了,但是另外一台就是起不来,或者起来也是standalone

zookeeper问题现象集群的配置zookeeper的启动以及状态查看问题报错点问题现象 1、总共三台机器,node92,node93,node94 其中node92做了拉起,但是node93(leader)和node94(follower)&a…

浅谈MVVM ——Model-View-View-Model

浅谈MVVM ——Model-View-View-Model 前言: 笔者最近接到这样一个机器人项目,接入他们的机器人平台做二次开发,开发自己的opk移植到机器人上做医院展示使用。opk是必须使用机器人厂家提供的经过一定封装过的,该opk的架构是MVVM。…

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

Java基础这个东西,无论在哪个公司都被看得尤为重要,而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重,当你的基础打牢了,其他的也就没有那么重要了。 说到基础,无外乎操作系统,网络&#xf…

pikachu-CSRF-SSRF-RCE速通

pikachu-CSRF-SSRF-RCE速通 目录pikachu-CSRF-SSRF-RCE速通CSRFCSRF(get)CSRF(post)CSRF TokenSSRFSSRF(curl)SSRF(file_get_content)RCEexec "ping"RCE exec "eval"CSRF 跨站请求伪造,说的通俗一点就是攻击者构造出某个网站的数据包请求并部署…

p3.第一章 基础入门 -- Python编程基本概念 (三)

1.2.2 Python语言 1.2.2.1 Python发展 1989年圣诞节期间,为了打发无聊的时间,荷兰人Guido van Rossum(吉多范罗苏姆)(数学、计算机双硕士,2005年加入Google,2013年加入DropBox)&am…

JavaUUID的理解

可笑,你竟然不知道 Java 如何生成 UUID - 沉默王二博客 UUID是通用唯一标识符的意思,就是唯一不重复的一串字符。 UUID的用途: 随机生成的文件名;Java Web 应用程序的 sessionID;数据库表的主键;事务 ID&…

EMQ 助力阿里云洛神云网络构建新一代“亿级并发、百万级吞吐”NLB 网络型负载均衡系统

万物智联的数字化时代,我们正走在从“数据量变”到“连接质变”的道路上。在日益丰富的物联网应用场景中,实现海量设备与云端之间双向通信连接,分析并从中获得实时洞察成了打造成功物联网解决方案的核心推动因素。EMQ 映云科技(以下简称“EMQ”)作为全球领先的开源物联网基础设…

UE在TextRender上显示中文文本

文章目录 1.实现目标2.实现过程2.1 添加字体2.2 创建字体材质2.3 将字体应用到TextRender3.参考资料1.实现目标 UE的UMG可以正常支持中文,但是TextRender并不支持中文,因此需要添加本地离线中文字体库,使TextRender显示中文。 2.实现过程 2.1 添加字体 (1)选择User Int…

day6bom操作浏览器

apis-day6bom-操作浏览器 文章目录apis-day6bom-操作浏览器1、window对象1.1BOM(浏览器对象模型1.2定时器-延时函数1.3JS执行机制(重要)1.4 location对象1.5 navigator对象1.6histroy对象(用的少)2、swiper插件3、本地存储&#x…

当前的数字化,CIO 们到底需要什么?

“做数字化,没人、没钱、没资源,但还要做效果,该怎么办?” 这是很多 CIO 当下都面临的困境。 那么,对于不同企业来说,到底该如何有效探索数字化转型之路呢? 数字化转型的三个阶段 Gartner 把…

简易黑客初级教程:黑客技术,分享教学

前言 第一节,伸展运动。这节操我们要准备道具,俗话说:“工欲善其事,必先利其器”(是这样吗?哎!文化低……)说得有道理,我们要学习黑客技术,一点必要的工具必不可少。 1,一台属于自己的可以上…

【面试题】2023 中级前端面试题

前言 从前端学习到找一份合适的工作,大大小小的面试必不可少,所以我对初级前端面试题进行了初步整理,也方便自己查阅,也希望对小伙伴们有所帮助! 给大家推荐一个实用面试题库 1、前端面试题库 (面试必备&…

C语言——内存中数据存储的详解(整型与浮点型)

文章目录1.数据类型的详细介绍1.1数据类型介绍1.2类型的基本归类整型类型浮点类型构造类型指针类型空类型2.整型在内存中的存储2.1原码、反码、补码2.2大小端存储大小端存储存在的意义编写一个程序判断当前机器的存储方式是大端存储还是小端存储2.3经典习题练习一练习二练习三c…

Prometheus部署Prometheus Server、Pushgateway、Node exporter、AlertManager

目录1. 安装Prometheus Server1.1 下载解压1.2 修改配置文件prometheus.yml1.3 启动Prometheus Server2. 安装Pushgateway2.1 下载解压2.2 启动Pushgateway3. 安装Node Exporter3.1 下载解压3.2 启动Node Exporter4. 安装Alertmanager4.1 下载解压4.2 启动Alertmanager1. 安装P…

CS5518 MIPI转LVDS转换方案芯片|DSI转LVDS转换方案芯片

CS5518 是一款MIPI DSI 至 LVDS 转换器方案芯片。 Capstone CS5518是一款MIPI DSI输入、LVDS输出转换芯片。MIPI DSI 支持多达4个局域网,每条通道以最大 1Gbps 的速度运行。LVDS支持18位或24位像素,25Mhz至154Mhz,采用VESA或JEIDA格式。它只…

CMake中target_sources的使用

CMake中的target_sources命令用于将源添加到target&#xff0c;其格式如下&#xff1a; target_sources(<target><INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) # general formtarget_sources(<target>[<…

网络安全之反序列化漏洞分析

简介 FastJson是alibaba的一款开源JSON解析库&#xff0c;可用于将Java对象转换为其JSON表示形式&#xff0c;也可以用于将JSON字符串转换为等效的Java对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONString()有多个重载…

LSTM反向传播原理——LSTM从零实现系列(2)

一、LSTM反向传播介绍 LSTM的反向传播过程相对复杂&#xff0c;主要因为其对应的控制门较多&#xff0c;而对于每一个控制门我们都需要求导&#xff0c;所以工作量较大。 首先我们根据LSTM结构图分析一下每个控制门的求导过程。在讲解反向传播之前&#xff0c;先了解一些要用到…