YOLOv8训练自己的数据集,通过LabelImg

记录下labelImg标注数据到YOLOv8训练的过程,其中容易遇到labelImg的坑

数据集处理

首先在mydata下创建4个文件夹

在这里插入图片描述
images文件夹下存放着所有的图片,包括训练集和测试集等。后续会根据代码进行划分。
json文件夹里存放的是labelImg标注的所有数据。需要注意的是,json文件的命名应与images文件夹中的图片一一对应。labels文件夹是空的,后续会根据代码将json转化为YOLOv8支持的训练数据集。接下来需要创建一个 split_train_val.py 文件,放在mydata目录下,用于将images文件夹中的图片划分为训练集和测试集。代码如下:

import os
import json
import random
import argparseclass DatasetSplitter:def __init__(self, json_path, txt_path):self.json_path = json_pathself.txt_path = txt_pathself.trainval_percent = 1.0self.train_percent = 0.9self.total_json = os.listdir(json_path)self.num = len(self.total_json)self.list_index = list(range(self.num))if not os.path.exists(txt_path):os.makedirs(txt_path)def split_dataset(self):tv = int(self.num * self.trainval_percent)tr = int(tv * self.train_percent)trainval = random.sample(self.list_index, tv)train = random.sample(trainval, tr)file_trainval = open(os.path.join(self.txt_path, 'trainval.txt'), 'w')file_test = open(os.path.join(self.txt_path, 'test.txt'), 'w')file_train = open(os.path.join(self.txt_path, 'train.txt'), 'w')file_val = open(os.path.join(self.txt_path, 'val.txt'), 'w')for i in self.list_index:name = self.total_json[i][:-5] + '\n'  # Assuming filenames end with '.json'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()if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument('--json_path', default='json', type=str, help='input json label path')parser.add_argument('--txt_path', default='dataSet', type=str, help='output txt label path')opt = parser.parse_args()dataset_splitter = DatasetSplitter(opt.json_path, opt.txt_path)dataset_splitter.split_dataset()

运行后会在dataSet生成四个文件.
如图所示
然后前往mydata目录的上一级目录,例如我这里是test目录下,创建voc_label.py文件.用于将labelImg标注的json数据转化为txt文本数据.

请注意,YULO的标注框中的x和y表示矩形框的左上角,而labelImg中的(x,y,w,h)可能表示矩形框的中心点坐标。在使用时需要确认,以免训练出来的YOLO存在偏差。
可以通过以下代码draw_picture_by_json.py进行绘图测试,以下我是默认labelImg的格式是(x_center,y_center,w,h)的格式进行绘制.

from typing import Dict
from PIL import Image, ImageDraw
import jsondef draw_pic_by_raw_data(image_path:str, output_path:str, json_data: Dict):data = json_dataimg = Image.open(image_path)draw = ImageDraw.Draw(img)# Load JSON file with bounding box information# Iterate through bounding boxes and draw them on the imageannotations = data[0]["annotations"]for bbox in annotations:label = bbox["label"]x_center, y_center, width, height = (bbox["coordinates"]["x"],bbox["coordinates"]["y"],bbox["coordinates"]["width"],bbox["coordinates"]["height"])#FIXME TODO 从中心坐标x,y LabelImg 计算左上角坐标x, y = x_center - width / 2, y_center - height / 2# Draw bounding boxdraw.rectangle([x, y, x+width, y+height], outline="red", width=2)# Draw labeldraw.text((x, y-15), label, fill="red")# Save the resultimg.save(output_path)img.show()if __name__ == "__main__":test_img_path = "3157.jpg"test_json_path = "3157.json"output_path = "out.jpg"with open(test_json_path, 'r') as f:data = json.load(f)draw_pic_by_raw_data(test_img_path, output_path, data)

通过以上代码,如果矩形框正确,则验证了labelImg的x、y、w和h坐标应该是x_center、y_center、w和h的情况。需要在将json转换为txt文本时进行处理。这里给出voc_label.py的代码如下:请注意修改classes中的类别,修改为和mydata.yaml的顺序一致,否则会导致标签错误。

代码运行前请在mydata目录的上一级,也就是我这里的test目录下创建一个paper_data文件夹,用于等会在mydata.yaml中指定路径.

import os
import json
from os import getcwdsets = ['train', 'val', 'test']
classes = ["A", "B", "C", "D", "E"]  # 请根据您的实际类别进行修改 对齐yaml文件中的names
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('mydata/json/%s.json' % (image_id), 'r', encoding='UTF-8')out_file = open('mydata/labels/%s.txt' % (image_id), 'w')data = json.load(in_file)for obj in data[0]["annotations"]:w = obj["coordinates"]["width"]h = obj["coordinates"]["height"]difficult = 0  # JSON数据中没有difficult字段,设为0cls = obj["label"]if cls not in classes or difficult == 1:continuecls_id = classes.index(cls)##注意:这里的box是左上角和右下角的坐标,而不是中心点坐标x_center = obj["coordinates"]["x"]y_center = obj["coordinates"]["y"]width = obj["coordinates"]["width"]height = obj["coordinates"]["height"]x, y = x_center - width / 2, y_center - height / 2b = x, x + width, y, y + height# b = obj["coordinates"]["x"], obj["coordinates"]["x"] + obj["coordinates"]["width"], \#     obj["coordinates"]["y"], obj["coordinates"]["y"] + obj["coordinates"]["height"]b1, b2, b3, b4 = b# 标注越界修正if 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')wd = getcwd()
for image_set in sets:if not os.path.exists('mydata/labels/'):os.makedirs('mydata/labels/')image_ids = open('mydata/dataSet/%s.txt' % (image_set)).read().strip().split()list_file = open('paper_data/%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()

yaml文件配置

截止到这里数据preprocess处理完毕.接下来进行训练前的yaml文件配置.
修改为刚才创建的paper_data的绝对路径
如上配置

并进行names的配置,注意顺序和数量需要与voc_label.py里面的列表顺序一致.

最后修改yolov8.yaml文件配置

yolov8.yaml的路径一般在ultralytics/ultralytics/cfg/models/v8目录下
修改nc为names中的类别数量
在这里插入图片描述

训练模型

yolo task=detect mode=train model=yolov8s.yaml data=mydata.yaml epochs=25 batch=16

这些模型可以支持多种尺寸,包括小(n)、中(s)、中大(m)、大(l)和超大(x)。模型的尺寸参数越大,所需的显存和训练时间也越多。要切换模型尺寸,只需在"model=yolov8"后面加上相应的尺寸参数(n、s、m、l、x),然后再加上.yaml即可。另外,epochs设置为25,batch大小为16。epochs表示训练的轮数, batch为每个批次的样本数量为16.

推理

训练结束后可以通过以下代码进行测试.

yolo predict model=xxxx/weights/best.pt source=xxxx/mydata/testvedio.mp4 imgsz=1280

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu findfont: Font family ‘SimHei‘ not found.

matplotlib中文乱码显示 当我们遇到这样奇怪的问题时, 结果往往很搞笑 尝试1不行 Stopping Jupyter Installing font-manager: sudo apt install font-manager Cleaning the matplotlib cache directory: rm ~/.cache/matplotlib -fr Restarting Jupyter. 尝试2 This work fo…

Spring Boot 中的外部化配置

Spring Boot 中的外部化配置 一、配置文件基础1.配置文件格式(1)YAML 基本语法规则(2)YAML 支持三种数据结构 2.application 文件3.application.properties 配置文件4.application.yml 配置文件5.Environment6.组织多文件7.多环境…

HTTP动态代理的原理及其对网络性能的影响

HTTP动态代理是一种通过代理服务器来转发HTTP请求和响应数据的网络技术,它可以优化网络性能、提高网络安全性,并解决跨域请求的问题。本文将详细介绍HTTP动态代理的原理及其对网络性能的影响。 一、HTTP动态代理的原理 HTTP动态代理的基本原理是在客户…

微信小程序(十四)分包和分包预加载

注释很详细,直接上代码 上一篇 新增内容: 1.分包的配置 2.分包预加载的写法 先说说为什么需要分包: 小程序追求小而快,主包的大小控制是小程序上线的硬性要求,分包有利于小程序优化加载速度 分包的注意事项&#xff1a…

大模型+自动驾驶

论文:https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起,它们基于广泛的数据集进行训练,正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式,并在不同任务中有效地执行,从…

数字图像处理(实践篇)三十一 Raw图像数据转为RGB图像实践

目录 1 Raw图像和RGB图像 2 Raw图像的排布方式 3 方案 4 实践 5 其他 1 Raw图像和RGB图像 Raw图片是未经压缩的,没有任何数据损失,Raw图片保留了从图像传感器捕获的每个像素的原始信息,因此可以实现更高的图像质量。

用C语言实现贪吃蛇游戏!!!(破万字)

前言 大家好呀,我是Humble,不知不觉在CSND分享自己学过的C语言知识已经有三个多月了,从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容,也希望这些内容可以帮助到各位正在阅读的小伙伴…

Flink实现数据写入MySQL

先准备一个文件里面数据有: a, 1547718199, 1000000 b, 1547718200, 1000000 c, 1547718201, 1000000 d, 1547718202, 1000000 e, 1547718203, 1000000 f, 1547718204, 1000000 g, 1547718205, 1000000 h, 1547718210, 1000000 i, 1547718210, 1000000 j, 154771821…

基于51单片机智能电子秤

实物显示效果: https://www.bilibili.com/video/BV1Wb4y1A7Aw/?vd_source6ff7cd03af95cd504b60511ef9373a1d 功能介绍: (1)用键盘设计单价; (2)称重后同时显示该物品的重量、单价和总额&…

记签名机制

签名过程: 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

【精选推荐】3款强大的API渗透测试工具

1免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测。 2前言 给大家介绍三款优秀的…

智能GPT图书管理系统(SpringBoot2+Vue2)、接入GPT接口,支持AI智能图书馆

☀️技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库,绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强,浏览器适配3.8.3swiper轮播图插件(快速实…

VR拍摄+制作

1.VR制作需要的图片宽高是2:1,需要360✖️180的图片,拍摄设备主要有两种: 1)通过鱼眼相机拍摄,拍摄一组图片,然后通过PTGui来合成(拍摄复杂) 2)全景相机,一键拍摄直接就能合成需要的…

C# Graphics对象学习

Graphics对象用于进行绘制; 从哪个对象获取的Graphics,然后进行绘制,就绘制到该对象上; 从位图获取Graphics,然后进行绘制,绘制到该位图上; 从某个控件获取Graphics,然后绘制&…

智慧文旅:提升旅游体验与推动经济发展的新动力

一、智慧文旅的定义与意义 智慧文旅,即智慧文化旅游,是一种以当地特色文化元素为核心驱动,利用现代科技手段实现旅游景区全面智慧升级的旅游模式。其意义在于为游客提供高效便捷的旅游信息化服务,提升旅游体验,同时推…

蓝桥杯备战——6.串口通讯

1.分析原理图 由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。 另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。 2.配置串口 由于比赛时间紧,我们最好不要去现场查寄存器手册&#x…

Unity应用在车机上启动有概率黑屏的解决方案

问题描述 最近将游戏适配到车机上(Android系统),碰到了一个严重bug,启动的时候有概率会遇到黑屏,表现就是全黑,无法进入Unity的场景。 经过查看LogCat日志,也没有任何报错,也没有任…

Python网络爬虫分步走之 – 第一步:什么是网络爬虫?

Python网络爬虫分步走之第一步:什么是网络爬虫? Web Scraping in Python Step by Step – 1st Step, What is Web Crawler? By JacksonML 1. 什么是网络爬虫? 在能够使用Google搜索引擎的场合,你是否尝试过简单搜索&#xff…

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样,根据《YOLO目标检测》(ISBN:9787115627094)一书,在不脱离YOLOv3的大部分核心理念的前提下,重构一款较新的YOLOv3检测器,来对YOLOv3有…

Go 命令行解析 flag 包之快速上手

本篇文章是 Go 标准库 flag 包的快速上手篇。 概述 开发一个命令行工具,视复杂程度,一般要选择一个合适的命令行解析库,简单的需求用 Go 标准库 flag 就够了,flag 的使用非常简单。 当然,除了标准库 flag 外&#x…