实例分割 | yolov11训练自己的数据集

前言

因工作要求使用的都是yolov5系列的模型,今天学习一下最先进的yolov11,记录一下环境配置及训练过程。

1.项目下载及环境安装

源码位置:yolov11
在这里插入图片描述
可以看到,这里要求python版本大于等于3.8,我这里安装python3.10.

conda create -n yolov11 python=3.10
conda activate yolov11
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

2.标注自己的数据集

标注实例分割数据集的工具有很多,这里建议labelme和AnyLabeling任意选一个。
如图所示,标注后的数据集是json格式的:
在这里插入图片描述
我们需要将其转成yolo系列需要的txt格式。
json转txt格式转化代码:

# json2txt.py
import cv2
import os
import json
import glob
import numpy as npdef convert_json_label_to_yolov_seg_label():json_path = "F:/Desktop/hand/labels"  # 本地json路径json_files = glob.glob(json_path + "/*.json")print(json_files)# 指定输出文件夹output_folder = "F:/Desktop/hand/labels_txt"  # txt存放路径if not os.path.exists(output_folder):os.makedirs(output_folder)for json_file in json_files:print(json_file)with open(json_file, 'r') as f:json_info = json.load(f)img = cv2.imread(os.path.join(json_path, json_info["imagePath"]))height, width, _ = img.shapenp_w_h = np.array([[width, height]], np.int32)txt_file = os.path.join(output_folder, os.path.basename(json_file).replace(".json", ".txt"))with open(txt_file, "w") as f:for point_json in json_info["shapes"]:txt_content = ""np_points = np.array(point_json["points"], np.int32)norm_points = np_points / np_w_hnorm_points_list = norm_points.tolist()txt_content += "0 " + " ".join([" ".join([str(cell[0]), str(cell[1])]) for cell in norm_points_list]) + "\n"f.write(txt_content)convert_json_label_to_yolov_seg_label()

转换后是这样的:
在这里插入图片描述
分割数据集,我们需要将转化成txt的数据集分割成训练集、验证集和测试集,这是分割代码:

# txt_split.py
# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os# 原始路径
image_original_path = "hhh/images/"
label_original_path = "hhh/labels_txt/"cur_path = os.getcwd()
#cur_path = 'D:/image_denoising_test/denoise/'
# 训练集路径
train_image_path = os.path.join(cur_path, "datasets/images/train/")
train_label_path = os.path.join(cur_path, "datasets/labels/train/")# 验证集路径
val_image_path = os.path.join(cur_path, "datasets/images/val/")
val_label_path = os.path.join(cur_path, "datasets/labels/val/")# 测试集路径
test_image_path = os.path.join(cur_path, "datasets/images/test/")
test_label_path = os.path.join(cur_path, "datasets/labels/test/")# 训练集目录
list_train = os.path.join(cur_path, "datasets/train.txt")
list_val = os.path.join(cur_path, "datasets/val.txt")
list_test = os.path.join(cur_path, "datasets/test.txt")train_percent = 0.8
val_percent = 0.1
test_percent = 0.1def del_file(path):for i in os.listdir(path):file_data = path + "\\" + ios.remove(file_data)def mkdir():if not os.path.exists(train_image_path):os.makedirs(train_image_path)else:del_file(train_image_path)if not os.path.exists(train_label_path):os.makedirs(train_label_path)else:del_file(train_label_path)if not os.path.exists(val_image_path):os.makedirs(val_image_path)else:del_file(val_image_path)if not os.path.exists(val_label_path):os.makedirs(val_label_path)else:del_file(val_label_path)if not os.path.exists(test_image_path):os.makedirs(test_image_path)else:del_file(test_image_path)if not os.path.exists(test_label_path):os.makedirs(test_label_path)else:del_file(test_label_path)def clearfile():if os.path.exists(list_train):os.remove(list_train)if os.path.exists(list_val):os.remove(list_val)if os.path.exists(list_test):os.remove(list_test)def main():mkdir()clearfile()file_train = open(list_train, 'w')file_val = open(list_val, 'w')file_test = open(list_test, 'w')total_txt = os.listdir(label_original_path)num_txt = len(total_txt)list_all_txt = range(num_txt)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# train从list_all_txt取出num_train个元素# 所以list_all_txt列表只剩下了这些元素val_test = [i for i in list_all_txt if not i in train]# 再从val_test取出num_val个元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = image_original_path + name + '.jpg'srcLabel = label_original_path + name + ".txt"if i in train:dst_train_Image = train_image_path + name + '.jpg'dst_train_Label = train_label_path + name + '.txt'shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)file_train.write(dst_train_Image + '\n')elif i in val:dst_val_Image = val_image_path + name + '.jpg'dst_val_Label = val_label_path + name + '.txt'shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)file_val.write(dst_val_Image + '\n')else:dst_test_Image = test_image_path + name + '.jpg'dst_test_Label = test_label_path + name + '.txt'shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)file_test.write(dst_test_Image + '\n')file_train.close()file_val.close()file_test.close()if __name__ == "__main__":main()

3.编写训练代码并训练

我这里习惯使用代码训练,还有命令训练,如果感兴趣的朋友可以去官网了解。

# train.py
from ultralytics import YOLOif __name__ == '__main__':model = YOLO(r'ultralytics/cfg/models/11/yolo11-seg.yaml')  model.train(data=r'config.yaml',imgsz=640,epochs=800,single_cls=True,  batch=16,workers=10,device='0',)

配置文件:

# config.yaml
path: ../datasets/images  # 数据集所在路径
train: train  # 数据集路径下的train.txt
val: val  # 数据集路径下的val.txt
test: test  # 数据集路径下的test.txt# Classes
names:0: class1_name1: class2_name2: class3_name3: class4_name4: class5_name

这里的path改成你的数据集位置,如果txt_split.py在项目根目录下运行则不需要修改路径,只需要修改类别即可。
修改之后,只需要python train.py运行即可。

测试代码:

# test.py
from ultralytics import YOLO
# 加载训练好的模型,改为自己的路径
model = YOLO('runs/train/exp22/weights/best.pt')  #修改为训练好的路径
source = '11.jpg' #修改为自己的图片路径及文件名
# 运行推理,并附加参数
model.predict(source, save=True, imgsz=640)

参考

语义分割:YOLOv11的分割模型训练自己的数据集(从代码下载到实例测试)

总结

因为项目还没完成,主要精力在此项目中,过程写的有点仓促,后面会慢慢优化文章质量,补全没完成的部分。

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

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

相关文章

【MongoDB】在Windows11下安装与使用

官网下载链接:Download MongoDB Community Server 官方参考文档:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型,其他默认 注意,此选…

【prometheus】Pushgateway安装和使用

目录 一、Pushgateway概述 1.1 Pushgateway简介 1.2 Pushgateway优点 1.3 pushgateway缺点 二、测试环境 三、安装测试 3.1 pushgateway安装 3.2 prometheus添加pushgateway 3.3 推送指定的数据格式到pushgateway 1.添加单条数据 2.添加复杂数据 3.SDk-prometheus-…

Python中文自然语言处理库SnowNLP

SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库,专为处理中文文本而设计。它受到 TextBlob 的启发,但与 TextBlob 不同的是,SnowNLP 没有使用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字…

windows共享文件夹到麒麟桌面操作系统操作步骤

此文档是将windows的共享文件夹在麒麟桌面操作系统里实现访问。该文档是以windows11+kylinos-2303为例编写。 1、在windows上新建文件夹 2、右击myshare文件夹,点击属性,在属性窗口中点击【共享】页签,点击【共享】 3、点击文本框后边的向下箭头,选择Everyone,后点击…

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…

JavaWeb基础专项复习6(2)——AJAX补充

目录 1、load(url, [data], [callback]) 1.1 语法 1.2概述 1.3参数 url,[data,[callback]]String,Map/String,CallbackV1.0 1.4示例 HTML 代码: jQuery 代码: 2、get(url, [data], [callback], [type]) 2.1 语法 2.2 概述 2.3 参数 url,[data],[callback],[type]St…

稀疏数组学习

稀疏数组(Sparse Array) 是一种用于压缩存储大量默认值(通常是 0)的数组的数据结构。它通过只存储非默认值的元素及其位置来节省空间。稀疏数组常用于存储矩阵或二维数组,尤其是当数组中大部分元素为默认值时。 稀疏数…

一、Vscode、Git、Github账号及个人访问令牌

一、Vscode下载、安装 1.Vscode 下载地址 2. Vscode安装 3.Vscode 配置C 安装插件 中文插件(安装后重启生效) C 扩展包 MinGw下载 MinGw蓝奏云下载链接,密码:64xamingw-64 官网—>下载时需要访问Github,需要挂梯子 配…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …

Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 3 部分

附件下载 联系工作人员获取附件 在 OpticStudio 中使用 RCWA 工具为增强现实(AR)系统设置出瞳扩展器(EPE)的示例中,首先解释了 k空间中光栅的规划,并详细讨论了设置每个光栅的步骤。 介绍 本文是四篇文…

Acwing 哞叫时间II

6134. 哞叫时间II - AcWing题库 题目大意:统计数组中子序列abb的数量: 做法:从右往左枚举倒数第二个b,查前面出现过多少次a,查的方法(开一个数组left[x]来统计当前及前面出现过多少次x,cnt记录不同x的数量…

PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下

PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…

基于 Ray 构建的机器学习平台

在当今的人工智能和机器学习领域,构建一个高效、可扩展且易于管理的机器学习平台是许多企业和研究机构面临的重大挑战。随着数据量的不断增长和模型复杂度的提高,传统的机器学习平台往往难以满足现代 AI 应用的需求。Ray,作为一个强大的分布式计算框架,为解决这些问题提供了…

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 sizeof关键字 浮点型(实型) 有效位数保留七位,带小数点。 这个是保…

梯度下降法(Gradient Descent) -- 现代机器学习的血液

梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧,用三维可视化案例和代码实现揭示其内在逻辑,为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…

VS Code 如何搭建CC++开发环境

VS Code 如何搭建C/C开发环境 文章目录 VS Code 如何搭建C/C开发环境1. VS Code是什么2. VS Code的下载和安装2.1 下载和安装2.2 环境的介绍 3. VS Code配置C/C开发环境3.1 下载和配置MinGW-w64编译器套件3.2 安装C/C插件3.3 重启VS Code 4. 在VS Code上编写C语言代码并编译成功…

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

Python正则

1.正则表达式 1.1含义:记录文本规则的代码,字符串处理工具 注意:需要导入re模块 1.2特点: 1.语法比较负杂,可读性较差 2.通用性很强,适用于多种编程语言 1.3步骤: 1.导入re模块 import…

网络安全虚拟化组成

网络安全虚拟化组成是指利用虚拟技术对网络安全功能进行集成、管理和提供的过程。在当今数字化时代,网络安全已经成为企业以及个人信息安全的重要组成部分。而华为作为一家全球知名的通信技术解决方案提供商,在网络安全领域拥有着丰富的经验和技术积累。…