当前位置: 首页 > article >正文

YOLOv5 :训练自己的数据集

- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客**
- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)**

我们接着上一篇文章配置完YOLOv5需要的环境后,今天我们试着用YOLOv5训练自己的数据集

可供学习使用的数据集:Fruit Detection | Kaggle

一:准备好自己的数据

我的目录结构是这样的

  • fruit_data(自己创建一个文件夹,将数据放到这里)
  • annotations(放置我们的.xml文件)
  • images(放置图片文件)
  • ImageSets下创建Main(会在该文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集,验证集,测试集图片的名字)

annotations文件夹为xml文件,我的文件如下:

我images文件为.png格式,官方的为.jpg. 

二:运行split_train_val.py 文件

ImageSets文件夹下面有个Main子文件夹,其下面存放了train.txt,val.txt,test.txt和trainval.txt四个文件,他们是通过split_train_val.py 文件来生成的。

split_train_val.py 的内容如下:

import os
import random
import argparseparser = argparse.ArgumentParser()
#添加命令行参数,用于指定XML文件的路径,默认为annotations文件夹
parser.add_argument('--xml_path', type=str, default='/Users/brandom/Downloads/yolov5-master/fruit_data/annotations',help = 'input xml label path')
#添加命令行参数,用于指定输出txt标签文件的路径,默认为ImageSets/Main文件夹
parser.add_argument('--txt_path',type=str,default = '/Users/brandom/Downloads/yolov5-master/fruit_data/ImageSets/Main',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
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()

运行split_train_val.py文件后你将得到train.txt,val.txt.test.txt 和 trainval.txt四个文件

三:生成train.txt,test.txt,val.txt 文件

现在我们需要的是voc_label.py文件

import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val', 'test']
classes = ['apple', 'banana', 'orange', 'pear', 'peach', 'plum', 'strawberry', 'watermelon']
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-1y = (box[2] + box[3]) / 2.0-1w = box[1]-box[0]h = box[3]-box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef 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()filename = root.find('filename').textfilenameFormat = filename.split('.')[1]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').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_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 = bif b2 > w:b2 = wif b4 > h:b4 = hb=(b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')return filenameFormatwd = getcwd()
for image_set in sets:if not os.path.exists('./labels/'):os.makedirs('./labels/')ROOT = os.path.dirname(os.path.abspath(__file__))image_set_path = os.path.join(ROOT, 'ImageSets', 'Main', f'{image_set}.txt')with open(image_set_path) as f:image_ids = f.read().strip().split()#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:filenameFormat = convert_annotation(image_id)list_file.write(abs_path + '/images/%s.%s\n' % (image_id, filenameFormat))list_file.close()

运行之后你将得到上面截图中的三个文件

四:创建ab.yaml文件

文件名随意,我的文件路径在yolov5-master/data/ab.yaml

内容如下:

train: ./fruit_data/train.txt
val: ./fruit_data/val.txt
nc: 10
names:["apple","banana","orange","pear","peach","strawberry","grape","mango","pineapple","watermelon",]

五:开始用自己的数据集训练模型

调用GPU只需要将下面的--device mps 改为 --device '0'即可,我这边调用的是MacOs自带的mps进行加速

python train.py --img 900 --batch 2 --epoch 100 --data data/ab.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --device mps

就可以直接训练我们的数据集啦,运行部分代码如下:

http://www.lryc.cn/news/2397022.html

相关文章:

  • flutter项目迁移空安全
  • vue element日期范围选择器只能选择指定天数内的
  • 从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
  • MySql(十二)
  • 51c视觉~3D~合集3
  • windows11安装编译QtMvvm
  • 【2025年电工杯数学建模竞赛A题】光伏电站发电功率日前预测问题+完整思路+paper+源码
  • OpenCv高阶(十九)——dlib关键点定位
  • BUUCTF之[ACTF2020 新生赛]BackupFile
  • 头歌之动手学人工智能-Pytorch 之autograd
  • OIer常用的软件
  • Centos7.x内网环境Jenkins前端打包环境配置
  • Kafka集成Flume/Spark/Flink(大数据)/SpringBoot
  • Scratch节日 | 拯救屈原 | 端午节
  • rabbitmq Direct交换机简介
  • Git实战--基于已有分支克隆进行项目开发的完整流程
  • MapReduce(期末速成版)
  • 鸿蒙OSUniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器#三方框架 #Uniapp
  • C3、C2f、C3K2、C2PSA的具体结构
  • 2_MCU开发环境搭建-配置MDK兼容Keil4和C51
  • 通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?
  • 百度golang研发一面面经
  • TC3xx学习笔记-启动过程详解(一)
  • Scratch节日 | 六一儿童节抓糖果
  • 系统调用与程序接口的关系
  • 从线性方程组角度理解公式 s=n−r(3E−A)
  • 通信算法之280:无人机侦测模块知识框架思维导图
  • 【Doris基础】Apache Doris中的Coordinator节点作用详解
  • 软考 系统架构设计师之考试感悟3
  • 【Kubernetes-1.30】--containerd部署