【yolov5】训练自己的数据集-实践笔记

news2024/11/26 5:53:21

【yolov5】训练自己的数据集-实践笔记

使用yolov5训练自己的数据集,以RSOD数据集为例,图像数量976,一共四类。
yolov5源码:https://github.com/ultralytics/yolov5

官网的代码会一直更新,相关依赖环境也会变,这里给出我下载的源码,yolov5v7.0。

文章目录

    • 【yolov5】训练自己的数据集-实践笔记
    • 1.环境配置
    • 2.数据集准备
      • 2.1 划分训练/验证集
      • 2.2 标签格式转换
      • 2.3 创建配置文件,
    • 3.训练
    • 4.测试

1.环境配置

使用Anaconda
(1)创建虚拟环境并激活,要求python最低版本为3.7

conda create -n yolov5 python==3.7
activate yolov5

(2)安装包
先切换到项目路径

切换盘: cd+盘名
进入盘: 盘名
进入盘内路径:cd+路径

cd E:
E:
cd E:/YOLO/yolov5-master

执行安装:

 pip install -r requirements.txt

查看了一下,都安装成功了,

(3)测试,执行detect.py。测试时会自动下载预训练模型,若不进行测试,可以直接下载预训练模型到yolov5-master下。

报错ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with 'OpenSSL 1.1.0h
从报错中看到原因是urllib3的2.0版本知识OpenSSL1.1.1版本以上,我的OpenSSL版本太老了,于是先卸载urllib3,再查看当前可以安装这个包什么版本(pip install urllib3==),安装1.24.1版本成功。

pip uninstall urllib3
pip install urllib3==1.24.1

继续,运行报错
在这里插入图片描述
原因:anaconda的虚拟环境python版本是3.7,typing这个文件缺乏一些模块,但是pytoch的1.13.0版本的torchvision模块里面需要从typing中导入OrderedDict。

解决方法:安装补丁包,typing_extensions

pip install typing_extensions

进入报错的路径,修改

#from typing import Any, Callable, List, Optional, OrderedDict, Sequence, Tupl
from typing_extensions import Any,Callable,Dict, Mapping, Optional, Sequence, Tuple,List

detect.py执行成功,,模型自动下载yolov5s.pt并对./data/images中的图像进行预测,结果保存在runs路径下:
在这里插入图片描述

2.数据集准备

yolov5需要的数据集格式为voc格式,j将图片和标签文件保存于images、annotations两个文件夹中,其中annotations中存放xml格式的标签文件。

path/ROSD
–annotations
–images

2.1 划分训练/验证集

运行下列代码,划分训练集、验证集。
修改xmlFilePath,saveBasePath为自己的数据集路径,第二个路径若不存在会自己创建。

import os
import random

random.seed(10)  # 设置随机数种子,复现随机场景所必须的

xmlFilePath = r'E:/Dataset/ROSD/annotations'
saveBasePath = r"E:/Dataset/ROSD/ImageSets/Main/"

trainval_percent = 1  # trainval_percent=0.9# 表示余下的百分之十用于test,为1则不划分测试集
train_percent = 0.8  # train_percent=1 # 表示训练集中用于训练,没有用于验证

temp_xml = os.listdir(xmlFilePath)  # 获得一个列表,每个元素是一个文件名
total_xml = []  # 用于保存所有xml文件的文件名
for xml in temp_xml:  # 遍历文件夹下所有文件
    if xml.endswith(".xml"):  # 判断文件名是否以.xml结尾
    #if xml.endswith(".txt"):  # 判断文件名是否以.txt结尾
        total_xml.append(xml)
if not os.path.exists(saveBasePath):
    os.makedirs(saveBasePath)
    
num = len(total_xml)  # 所有xml文件的总数
indices = list(range(num))  # 获得迭代类型,0 ~ (num-1)
tv = int(num * trainval_percent)  # 用于训练和验证的数量
tr = int(tv * train_percent)  # 用于训练的数量
trainval = random.sample(indices, tv)  # 用于训练和验证的样本的索引
train = random.sample(trainval, tr)  # 用于训练的样本的索引

print("train and validation set size:", tv)  # 训练样本和验证样本的总数
print("train set size:", tr)  # 训练样本的数量
ftrainval = open(saveBasePath+'trainval.txt','w')  # 依次打开4个文件
ftest = open(saveBasePath+'test.txt', 'w')
ftrain = open(saveBasePath+'train.txt', 'w')
fval = open(saveBasePath+'val.txt', 'w')

for i in indices:
    name = total_xml[i][:-4] + '\n'  # 文件名+'\n',其中文件名不含.xml
    if i in trainval:  # 训练集和验证集的索引
        ftrainval.write(name)  # 写入训练和验证的文件中
        if i in train:  # 训练集的索引
            ftrain.write(name)  # 写入训练的文件中
        else:
            fval.write(name)  # 写入验证的文件中
    else:
        ftest.write(name)  # 否则归于测试集,写入测试的文件中

ftrainval.close()  # 依次关闭4个文件
ftrain.close()
fval.close()
ftest.close()

运行完成,在数据集下ImagesSets/Main下生成trainval.txt、train.txt,、val.txt、test.txt等文件,里面存放不带后缀的图片名。
在这里插入图片描述

2.2 标签格式转换

yolo要求的标签文件格式为txt,内容为

class_id x_center,y_center,w,h

将xml转为yolo所需的txt文件,代码来自参考链接2

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

sets = ['train', 'val', 'test']
classes = ["aircraft", "oiltank","overpass",'playground']  # 改成自己的类别
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('E:/dataset/ROSD/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('E:/dataset/ROSD//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
        # 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('E:/dataset/ROSD/labels/'):
        os.makedirs('E:/dataset/ROSD/labels/')
    image_ids = open('E:/dataset/ROSD/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()

    if not os.path.exists('E:/dataset/ROSD/dataSet_path/'):
        os.makedirs('E:/dataset/ROSD/dataSet_path/')

    list_file = open('E:/dataset/ROSD/dataSet_path/%s.txt' % (image_set), 'w')
    # 这行路径不需更改,这是相对路径
    for image_id in image_ids:
        list_file.write('E:/dataset/ROSD/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

运行完成后在/ROSD/labels/下生成txt文件,每个txt对应一张图像,里面存放图像的标签信息。
在这里插入图片描述

2.3 创建配置文件,

在项目的data文件夹下新建自己的数据集配置文件ROSD.yaml,内容如下,路径为自己的数据集路径,设置类别数,类别名称。注意此处的names和标签格式转换部分的代码中的classes要保持一致

train: E:/dataset/ROSD/dataSet_path/train.txt
val: E:/dataset/ROSD/dataSet_path/val.txt

# number of classes
nc: 4

# class names
names: ["aircraft", "oiltank","overpass",'playground']

3.训练

(1)修改配置
直接在train.pyd的函数parse_opt中修改
修改epochs,batch–size,根据自己的配置来,若报内存溢出就把batch–size调小一点,一般为2的倍数
修改weights为预训练文件路径,修改data为自己的数据集配置yaml文件路径,为了防止出错建议全部使用绝对路径
在这里插入图片描述
(2)训练。
在这里插入图片描述
注:也可以使用命令行直接训练

python train.py --data ROSD.yaml --epochs 100 --weights 'yolov5s.pt' --cfg models/yolov5s.yaml  --data ROSD.yaml--batch-size 16

训练好的文件保存在runs/train/expx/weights中,也可以修改保存路径
在这里插入图片描述
这个数据集比较简单,在我设置的如上参数下,训练了十几个epoch,IoU=0.5时的mAP达到了92

4.测试

修改detect.py,parse_opt中,修改weights为训练得到的权重路径,修改source为要用来预测的图片文件路径,data为数据集yaml文件路径,预测得到的图片保存路径为project,也可以修改。run。
在这里插入图片描述
在这里插入图片描述
同样可以使用命令行预测:

python detect.py --weights runs/train/exp/weights/best.pt --source E:/dataset/ROSD/test --data data/ROSD.yaml

预测结果:
在这里插入图片描述

在这里插入图片描述

参考:
1.ImportError: cannot import name ‘OrderedDict‘ from ‘typing‘
2.Yolov5训练自己的数据集(详细完整版)
3.史上最详细yolov5环境配置搭建+配置所需文件

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

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

相关文章

嵌套和递归使用模板类

嵌套和递归使用模板类 模板栈模板数组栈中嵌套数组数组中嵌套栈数组中嵌套数组 模板栈 #pragma once #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template<class DataType> class mystack2 { private:Data…

Java面向对象程序开发——文件与流

文章目录 前言File类IO字符流与字节流字符流字节流打印流缓冲流 前言 File类 是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 方法有三类&#xff1a;1获取、2判断、3创建或删除 public String getAbsolutePath() &#xff1a;返回…

ELK部署安装

目录 一、环境准备 1.准备三台服务器&#xff08;带图形化的linuxCentOS7&#xff0c;最小化缺少很多环境&#xff09; 2.修改主机名 3.关闭防火墙 4.elk-node1、elk-node2 用系统自带的java 5.上传软件包到node1和node2 二、部署elasticsearch 1、node1、node2操作 2.no…

《华尔街幽灵》的三大交易规则

规则1&#xff1a;只持有正确的仓位 如果你下单后经过一段时间&#xff0c;市场没有证明你的交易是正确的&#xff0c;那么应该立即平仓。交易者在每次建仓后&#xff0c;首先应关注保护本金&#xff0c;及早平掉不正确的仓位&#xff0c;而不是过多考虑盈利金额。 如何判断交…

生命在于学习——风险评估

风险评估的目录 一、网络安全风险评估概述1、概念2、意义3、步骤4、基本原则5、评估要素6、网络安全风险评估方法 二、网络安全风险评估方法三、网络安全风险评估方案1、确定评估范围和目标2、收集信息3、评估威胁和漏洞4、评估安全控制5、评估风险和制定建议6、报告和沟通 四、…

匿名苏丹的网络攻击仍在继续: 继微软之后拳头游戏成为最新目标

黑客组织 "匿名苏丹 "声称&#xff0c;它对美国视频游戏开发商和出版商Riot Games发起了分布式拒绝服务&#xff08;DDoS&#xff09;攻击。 据称匿名苏丹的目标是Riot Games的登录门户&#xff0c;该组织在Telegram帖子中宣布&#xff0c;这次攻击持续了30分钟至1小…

《随便测测》做UI测试

目录 前排提示 使用playwright录制ui操作 创建UI模板 运行用例 查看报告 再次编辑代码 再次查看报告 selenoid服务搭建 配置selenoid服务地址 总结 前排提示 1.使用playwright[selenoid]&#xff0c;可选的远程浏览器执行用例 2.没有采用 PageObjectModule&#xff0…

展示与处理复杂JSON数据——gradio库的JSON模块详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

从小白到大神之路之学习运维第54天--------ELK技术堆栈---

第三阶段基础 时 间&#xff1a;2023年7月6日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; ELK技术堆栈 目录 服务器设置&#xff1a; 部署elasticsearch集群&#xff1a; 配置elasticsearch集群&#xff…

Vue2中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…

【数据分析 - 基础入门之NumPy②】Jupyter Notebook安装及使用

知识目录 前言一、Jupyter Notebook安装使用1.1 Jupyter Notebook的三种打开方式1、点击Anaconda Prompt打开2、点击Jupyter Notebook打开3、使用Powershell打开 1.2 Jupyter Notebook的两种键盘输入模式1、编辑模式2、命令模式 二、Jupyter Notebook魔法命令2.1 查看帮助文档2…

2023-07-06:RabbitMQ中的AMQP是什么?

2023-07-06&#xff1a;RabbitMQ中的AMQP是什么&#xff1f; 答案2023-07-06&#xff1a; AMQP AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;是一个应用层协议的开放标准&#xff0c;旨在设计面向消息的中间件。基于AMQP协议的客户端和消息中间件可以自由…

Mysql中IP地址如何在数据库中存储

用无符号的32位整数存储&#xff0c;不要用字符串存储ip 为什么呢&#xff1f; 在Mysql中&#xff0c;当存储ipv4地址的时候&#xff0c;应该使用32位的无符号&#xff08;int unsigned&#xff09;来存储ip地址&#xff0c;而不是使用字符串&#xff0c;用int unsigned类型存…

4-Spring cloud之搭建Ribbon负载均衡——服务器上实操(下)

4-Spring cloud之搭建Ribbon负载均衡——服务器上实操&#xff08;下&#xff09; 1. 前言1.1 Ribbon负载均衡架构图 2. Ribbon自带的负载均衡2.1 Ribbon自带的负载均衡算法2.2 自带负载均衡之间的切换 3. Ribbon自定义负载均衡3.1 自定义Ribbon负载均衡&#xff08;简单试用&a…

【IMX6ULL - LOGO替换】根文件系统主机名logo替换教程

1、修改linux主机的配置文件/etc/hostname里的主机名 2、重启 reboot

2023电商购物网站有哪些知名和靠谱的?

最近几年&#xff0c;人们的消费方式发生了极大的改变&#xff0c;在这种趋势之下&#xff0c;很多企业都开始着手搭建自己的网购平台&#xff0c;下面是小编盘点的国内市场上较为出名的网购平台&#xff0c;大家可以借鉴其运营模式! 1、淘宝网 在中国&#xff0c;淘宝网可以说…

推荐这10款好用的产品设计软件,轻松提效

在现代技术飞速发展的时代&#xff0c;产品设计是创新和成功的关键。本文将向您推荐10款顶级产品设计软件&#xff0c;为您的设计过程增添灵感和效率。 1、即时设计 即时设计是一个基于云的产品设计协作一体化工具&#xff0c;具有很强的功能和灵活性&#xff0c;它提供了全面…

详细解读Sui Gas运作机制和其他你不知道的细节

Sui的Gas费模型使链上交互费用变得可预测而且更低廉&#xff0c;这两个关键特征对面向全球范围内的娱乐和实用apps的基础设施十分关键。区块链的Gas费是指处理事务需要支付的价格&#xff0c;用于补偿和奖励支持网络运行的服务商。 通常&#xff0c;用户支付Gas费来执行网络上…

Webpack打包ts文件

安装依赖包&#xff1a; npm i -D webpack webpack-cli typescript ts-loader 配置webpack配置文件&#xff08;webpack.config.js&#xff09;&#xff1a; //webpack中所有的配置文件信息都得写在module.exports中 module.exports{//指定入口文件entry:./src/index.ts//指定…

terminal 终端Ctrl+Shfit+E键与搜狗输入法冲突Linux

下载完搜狗输入法后&#xff0c;发现CtrlShfitE不能在终端分屏了&#xff0c;原因是和搜狗的快捷键冲突了&#xff0c;把搜狗的禁用了或者换成其它快捷键即可 界面右上角打开搜狗拼音&#xff0c;点击属性设置 把勾去掉或者换其它快捷键