CV -- YOLOv8 图像分割(GPU环境)

目录

参考视频:

标注

JSON转为TXT

训练

验证


参考视频:

使用 Yolov8 自定义数据集进行图像分割_哔哩哔哩_bilibili

标注

 数据集:

我使用的是一些苹果数据集,可以在我的csdn资源中下载:

https://download.csdn.net/download/2403_83182682/90405543?spm=1001.2014.3001.5503

这里标注使用的 labelme 标注软件,下载和使用都很简单,下载需要打开 cmd 控制台,输入下载代码:

pip install labelme
labelme

输入 labelme 打开软件页面:

中文版的自己玩玩就会了,常用按钮如下

点击【打开目录】,输入苹果文件夹,点击【创建多边形】,绘制多边形,点击保存,然后继续绘制下一张

标记完成后是这样的

需要将 jpg 文件和 json文件分别放入文件夹中,方便后面数据转换。

JSON转为TXT

通过 LabelMe 工具绘制多边形标注后生成的 JSON 文件是一种结构化的数据文件,它遵循了一定的格式来存储图像标注信息。但是 yolov8 官方规定需要的是标注文件,即 .txt 文件,我这里提供一段 json 转 txt  文件的 Python 代码:

# -*- coding: utf-8 -*-
from tqdm import tqdm
import shutil
import random
import os
import argparse
from collections import Counter
import yaml
import jsondef mkdir(path):if not os.path.exists(path):os.makedirs(path)def convert_label_json(json_dir, save_dir, classes):json_paths = os.listdir(json_dir)classes = classes.split(',')mkdir(save_dir)for json_path in tqdm(json_paths):# for json_path in json_paths:path = os.path.join(json_dir, json_path)with open(path, 'r') as load_f:json_dict = json.load(load_f)h, w = json_dict['imageHeight'], json_dict['imageWidth']# save txt pathtxt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))txt_file = open(txt_path, 'w')for shape_dict in json_dict['shapes']:label = shape_dict['label']label_index = classes.index(label)points = shape_dict['points']points_nor_list = []for point in points:points_nor_list.append(point[0] / w)points_nor_list.append(point[1] / h)points_nor_list = list(map(lambda x: str(x), points_nor_list))points_nor_str = ' '.join(points_nor_list)label_str = str(label_index) + ' ' + points_nor_str + '\n'txt_file.writelines(label_str)def get_classes(json_dir):'''统计路径下 JSON 文件里的各类别标签数量'''names = []json_files = [os.path.join(json_dir, f) for f in os.listdir(json_dir) if f.endswith('.json')]for json_path in json_files:with open(json_path, 'r') as f:data = json.load(f)for shape in data['shapes']:name = shape['label']names.append(name)result = Counter(names)return resultdef main(image_dir, json_dir, txt_dir, save_dir):# 创建文件夹mkdir(save_dir)images_dir = os.path.join(save_dir, 'images')labels_dir = os.path.join(save_dir, 'labels')img_train_path = os.path.join(images_dir, 'train')img_val_path = os.path.join(images_dir, 'val')label_train_path = os.path.join(labels_dir, 'train')label_val_path = os.path.join(labels_dir, 'val')mkdir(images_dir)mkdir(labels_dir)mkdir(img_train_path)mkdir(img_val_path)mkdir(label_train_path)mkdir(label_val_path)# 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改train_percent = 0.90val_percent = 0.10total_txt = os.listdir(txt_dir)num_txt = len(total_txt)list_all_txt = range(num_txt)  # 范围 range(0, num)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)train = random.sample(list_all_txt, num_train)# 在全部数据集中取出trainval = [i for i in list_all_txt if not i in train]# 再从val_test取出num_val个元素,val_test剩下的元素就是test# val = random.sample(list_all_txt, num_val)print("训练集数目:{}, 验证集数目:{}".format(len(train), len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = os.path.join(image_dir, name + '.jpg')srcLabel = os.path.join(txt_dir, name + '.txt')if i in train:dst_train_Image = os.path.join(img_train_path, name + '.jpg')dst_train_Label = os.path.join(label_train_path, name + '.txt')shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)elif i in val:dst_val_Image = os.path.join(img_val_path, name + '.jpg')dst_val_Label = os.path.join(label_val_path, name + '.txt')shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)obj_classes = get_classes(json_dir)classes = list(obj_classes.keys())# 编写yaml文件classes_txt = {i: classes[i] for i in range(len(classes))}  # 标签类别data = {'path': os.path.join(os.getcwd(), save_dir),'train': "images/train",'val': "images/val",'names': classes_txt,'nc': len(classes)}with open(save_dir + '/segment.yaml', 'w', encoding="utf-8") as file:yaml.dump(data, file, allow_unicode=True)print("标签:", dict(obj_classes))if __name__ == "__main__":"""python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dogs""""classes_list = 'apple'  # 类名parser = argparse.ArgumentParser(description='json convert to txt params')parser.add_argument('--image-dir', type=str, default='D:\OneDrive\桌面\yolov8-segment\datasets\segment\images', help='图片地址')parser.add_argument('--json-dir', type=str, default='D:\OneDrive\桌面\yolov8-segment\datasets\segment\json', help='json地址')parser.add_argument('--txt-dir', type=str, default='D:\OneDrive\桌面\yolov8-segment\datasets\segment\\txt', help='保存txt文件地址')parser.add_argument('--save-dir', default='D:\OneDrive\桌面\yolov8-segment\datasets\segment\seg', type=str, help='保存最终分割好的数据集地址')parser.add_argument('--classes', type=str, default=classes_list, help='classes')args = parser.parse_args()json_dir = args.json_dirtxt_dir = args.txt_dirimage_dir = args.image_dirsave_dir = args.save_dirclasses = args.classes# json格式转txt格式convert_label_json(json_dir, txt_dir, classes)# 划分数据集,生成yaml训练文件main(image_dir, json_dir, txt_dir, save_dir)

第 90 行左右可以修改数据集划分比例,默认是 90% 训练集,10%验证集。

第147到150行依次为图片地址、json文件地址、保存txt文件地址、分割好的数据集地址

我的项目创建目录如下(都是可以自己修改的):

运行代码

运行成功,训练集是19张图片,验证集是3张,检测到的标签总数量为 53。

运行成功后会帮您创建 Yolov8 训练所需的文件格式,并且将 txt文件放入正确的位置:

训练

训练环境使用的GPU,需要配置的可以看我前文:

CV -- 基于GPU版显卡CUDA环境+Pycharm YOLOv8 检测-CSDN博客

训练代码如下:

from torch.cuda import devicefrom ultralytics import YOLOmodel = YOLO('D:\OneDrive\桌面\yolov8-segment\weights\yolov8n-seg.pt')model.train(data='D:\OneDrive\桌面\yolov8-segment\datasets\segment\seg\segment.yaml',epochs=300, #训练轮次imgsz=640,  #输入图片尺寸(会转换为该尺寸)batch=4,  #每次训练的批量device='cuda:0',  #使用GPU训练workers=0  #windows GPU训练需加上该参数,否则会报错)
print("训练结束!")

这里使用的是预训练模型,yolov8n-seg.pt,大家可以在我的资源中获取到:

https://download.csdn.net/download/2403_83182682/90405472?spm=1001.2014.3001.5503

训练结束后会生成一些图表:

输出文件说明:
F1-置信度曲线 (BoxF1_curve.png)
观察方法: F1分数是模型准确度的度量,结合了精确度和召回率。在这个图表中,您应该寻找F1分数最高的点,该点对应的置信度阈值通常是模型最佳的工作点。


精确度-置信度曲线 (BoxP_curve.png)
观察方法: 精确度代表了模型预测为正类的样本中实际为正类的比例。在该曲线中,应关注随置信度增加,精确度如何提高,以及在哪个置信度水平上精确度开始下降,这有助于确定阈值设定。


精确度-召回率曲线 (BoxPR_curve.png)
观察方法: 该曲线展示了精确度与召回率之间的权衡。理想的模型应在高精确度和高召回率处达到平衡。通常查看曲线下面积来评估模型整体性能。


召回率-置信度曲线 (BoxR_curve.png)
观察方法: 召回率是指所有正类中模型正确预测的比例。这个图表中,召回率通常随着置信度阈值的降低而增加。理想的置信度阈值通常是召回率较高,但置信度不过低的点。


混淆矩阵 (confusion_matrix.png)
观察方法: 查看矩阵的对角线,对角线上的数值越高表示分类结果越准确。同时观察非对角线元素,了解哪些类别容易被误分类。


标准化混淆矩阵 (confusion_matrix_normalized.png)
观察方法: 与非标准化混淆矩阵类似,但通过标准化可以更容易地比较不同类别之间的分类准确率,特别是在类别样本量不均匀的情况下。


标签分布 (labels.jpg)
观察方法: 柱状图部分显示了每个类别的实例数量,有助于了解数据集中各类别的分布情况。散点图部分可以显示样本的位置分布,有助于了解样本在输入空间的分布特性。


标签相关图 (labels_correlogram.jpg)
观察方法: 相关图显示了数据标签之间的相关性,深色的格子表示较高的正相关,浅色表示较低的相关或负相关。这有助于了解不同类别之间的关系。


掩膜F1-置信度曲线 (MaskF1_curve.png)
观察方法: 类似于F1-置信度曲线,但特别用于评估模型在像素级分类或分割任务中的性能。寻找曲线中F1得分最高的点来确定最佳的置信度阈值。


精确度-召回率曲线 (Precision-Recall Curve) (MaskPR_curve.png)
如何观察理解: 此图表展示了在不同召回率水平上模型精确度的变化。蓝色的线表示所有类别的平均精确度。曲线下的面积(AUC)越大,模型性能越好。理想状态是曲线靠近右上角,即高召回率和高精确度。


召回率-置信度曲线 (Recall-Confidence Curve) (MaskR_curve.png)
如何观察理解: 该图标展示了模型在不同置信度阈值下召回率的变化。您应关注在召回率保持高的同时,置信度阈值的选择。最佳操作点通常是召回率开始显著下降之前的置信度值。


训练和验证指标图 (results.png)
如何观察理解: 这张图显示了多个指标的训练和验证过程,其中包括损失函数的变化和性能指标如精确度和mAP。下降的损失和上升的性能指标通常表明模型在学习过程中正在改进。平滑的曲线有助于识别趋势。


损失和性能指标图
如何观察理解: 类似于上一个图表,这个可能包含了不同的损失和性能指标。每个小图标展示了训练过程中的具体方面,如框体损失、分割损失、分类损失等。这有助于诊断模型在哪些方面表现良好,在哪些方面可能需要进一步优化。


Weights文件:这是一个模型权重文件,通常以.pt(PyTorch模型)格式保存。它包含了经过训练的神经网络的所有参数和权重。这个文件是模型训练过程的直接产物,用于后续的图像识别和分析任务。

Args.yaml文件:这个文件通常包含了模型训练时使用的配置参数。它详细记录了训练过程中使用的所有设置,如学习率、批大小、训练轮数等。这个文件的目的是为了提供一个清晰的训练配置概览,使得训练过程可以被复现或调整。

左半部分是损失函数图,损失函数下降,可能并不能说明训练结果很好,但如果损失函数上升,那训练结果一定不好,说明你的数据可能出现了很大的错误,或者一些其他不好的事情正在发生。

通过对测试数据的详细分析,我们可以观察到原始标注与模型预测的掩膜之间存在差异很小,这实际上体现了模型具备出色的语义分割能力。具体而言,尽管在某些局部细节上可能存在细微偏差,但模型整体能够准确捕捉并区分不同对象的边界和区域,展示了其在复杂场景下对图像内容的强大理解能力。这种高水平的分割精度不仅验证了模型训练的有效性,还为其在实际应用中的性能提供了有力保障。

验证

可以使用我们训练好的模型,对苹果图片进行图像分割,训练好的模型的权重文件中有两个模型文件,第一个是最好的模型,第二个是最后一次训练的模型,一般使用第一个模型。

训练代码:

from ultralytics import YOLO
import cv2
import numpy as np# 模型路径和图像路径
model_path = 'D:/OneDrive/桌面/yolov8-segment/runs/segment/train8/weights/best.pt'
image_path = 'D:/OneDrive/桌面/apple2.jpg'# 加载模型并进行预测
model = YOLO(model_path,task='segment')
results = model.predict(source=image_path,save=True,show=True)

成功运行后就能得到分割图片:

可以看见分割效果是有的,但也有点瑕疵,把杯子也识别成 apple 了,可能是因为数据集太少或者标注问题。

当然,也可使用代码将各个 apple 的掩膜提取出来:

from ultralytics import YOLO
import cv2
import numpy as np# 模型路径和图像路径
model_path = 'D:/OneDrive/桌面/yolov8-segment/runs/segment/train8/weights/best.pt'
image_path = 'D:/OneDrive/桌面/apple2.jpg'# 加载模型并进行预测
model = YOLO(model_path,task='segment')
results = model.predict(source=image_path,save=True,show=True)# 读取图像
img = cv2.imread(image_path)
H, W, _ = img.shape
print(img.shape)# # 遍历每个结果中的掩码
for i, result in enumerate(results):for j, mask in enumerate(result.masks.data):# 将mask从GPU移动到CPU,并转换为numpy数组mask = mask.cpu().numpy()# 如果mask是多维的,选择第一个通道(假设单通道)if len(mask.shape) > 2:mask = mask[0]# 归一化到0-255范围,并转换为uint8类型mask = (mask * 255).astype(np.uint8)# 调整大小以匹配原图尺寸mask_resized = cv2.resize(mask, (W, H))# 保存掩码图像output_path = f'./mask_{i}_{j}.png'cv2.imwrite(output_path, mask_resized)print(f"Saved {output_path}")

得到各个掩膜的 png 文件:

这些掩膜文件在某些时候非常有用。

感谢您的三连!!!

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

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

相关文章

从函数到神经网络

所有一切的前提是,你要相信这个世界上的所有逻辑和知识,都可以用一个函数来表示。Functions describe the world ! 比如输入物体的质量和加速度,根据牛顿第二定律,就可以得到物体施加的力,这就是人工智能早期的思路&am…

Token Embedding(词嵌入)和Positional Encoding(位置编码)的矩阵形状关系及转换过程

在从零开始构建一个小型字符级语言模型时,简化的实现步骤是:数据准备→模型架构设计→训练→评估与生成。模型架构设计阶段的流程如下: 图1 模型架构设计阶段的流程 包含了输入层、嵌入层、解码器层和输出层。其中在嵌入层中包括了Token Embedding(词嵌入)和Positional En…

Bigemap Pro如何设置经纬网出图网格设置

第一步:打开bigemap pro软件,单击顶部网格选项第二栏,弹出经纬网设置对话框,如下图: 按作图需求自定义设置后,点击应用如下图: 第二步:设置好经纬网之后,进行作图&#x…

代码辅助工具

爱聚合 爱聚合包含各种AI工具 Fitten Code Fitten Code 小浣熊 小浣熊 Inscode InsCode 可以完整的创建一个应用并实现在线部署。而且可以更新需求一步一步实现代码。

JAVA中常用类型

一、包装类 1.1 包装类简介 java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包…

原生稀疏注意力机制(NSA):硬件对齐且可原生训练的稀疏注意力机制-论文阅读

摘要 长上下文建模对于下一代语言模型至关重要,但标准注意力机制的高计算成本带来了巨大的计算挑战。稀疏注意力提供了一种在保持模型能力的同时提高效率的有前途的方向。本文提出了一种名为 NSA(原生可训练稀疏注意力机制) 的方法&#xff…

DeepSeek联网搜索

deepseek 0、前言1、未联网2、联网2.1 SerpAPI2.2 SerpAPIDeepseek 0、前言 为获取最新消息,需给deepseek联网 1、未联网 from dotenv import load_dotenv from langchain_deepseek import ChatDeepSeekload_dotenv()# 1、模型 model ChatDeepSeek(model"d…

MySQL 的存储引擎简介

使用show engines可以查看安装的MySQL的引擎相关信息 MySQL 的引擎不止这么多,这只是安装的这个版本有的引擎。可以看到,只有 InnoDB 支持事务,其他的引擎都是不支持事务的。 说几个我了解的比较多的引擎: InnoDB InnoDB 是MyS…

DeepBI助力跨境电商打破流量垄断:AI驱动的亚马逊广告投放新打法

#亚马逊广告优化# 亲爱的亚马逊跨境电商卖家们,是否曾因亚马逊的广告打法不清晰,或是纠结于亚马逊广告费用过高,或是为亚马逊电商广告怎么投放合适的问题而苦恼?在竞争激烈的亚马逊市场中,广告投放效果平平&#xff0…

保护大数据的最佳实践方案

在当今数字化时代,保障大数据安全的重要性再怎么强调也不为过。 随着科技的迅猛发展以及对数据驱动决策的依赖日益加深,企业必须将保护其宝贵信息置于首位。 我们将深入探讨保障大数据安全的流程,并讨论关键原则、策略、工具及技术&#xf…

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断(数据来源:Gartner 2025)。当竞品在凌晨3点自动发布「智能家居安装指南」时,你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…

DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列一DeepSeek核心算法解析:如何…

山石网科×阿里云通义灵码,开启研发“AI智造”新时代

近日,山石网科正式宣布全面接入阿里云通义灵码企业专属版,这标志着山石网科在研发智能化、自动化领域迈出重要一步,为研发工作注入强大的AI动力,实现多维度的效率飞跃。 此次合作,阿里云通义灵码依托强大的AI能力&…

Linux部署DeepSeek r1 模型训练

之前写过一篇windows下部署deepseekR1的文章,有小伙伴反馈提供一篇linux下部署DeepSeek r1 模型训练教程,在 Linux 环境下,我找了足够的相关资料,花费了一些时间,我成功部署了 DeepSeek R1 模型训练任务,结…

学习kafka和flink

kafka kafka安装一套流程 方法一:启动需安装zookeeper和kafka 【Kafka】Windows下安装Kafka(图文记录详细步骤) 安装Tzq2018写的上面链接安装的,一切很顺利,除了zookeeper的环境变量不管如何配置都不管用&#xff0…

安装海康威视相机SDK后,catkin_make其他项目时,出现“libusb_set_option”错误的解决方法

硬件:雷神MIX G139H047LD 工控机 系统:ubuntu20.04 之前运行某项目时,处于正常状态。后来由于要使用海康威视工业相机(型号:MV-CA013-21UC),便下载了并安装了该相机的SDK,之后运行…

K8s 之端口暴露(The Port of K8s is Exposed)

K8s 之端口暴露 Kubernetes 是一个用于管理容器化应用程序的流行工具。然而,关于它的工作原理存在一些误解。最常见的误解之一是关于 Kubernetes Pod 中的端口暴露。本文将解释 Kubernetes 中端口暴露的真相。 1 误解 像许多 Kubernetes 新手一样,我最…

科普:Docker run的相关事项

一、镜像名(含标签)太长 如,通过如下命令行: docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名(及标签)太长,可以通过改名的方法变短。 在 Docker 中&…

Windows服务器搭建时间同步服务

一、配置NTP服务器 1、在局域网内找一台时间可靠的计算机或服务器做为NTP服务器,例IP:209.209.209.2 2、在NTP服务器上运行 regedit 打开注册表 3、在注册表中展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpSer…

【Hugging Face系列篇】01初步介绍:“AI界的GitHub”

Hugging Face 是一个开源机器学习平台,专注于自然语言处理(NLP)和人工智能,提供模型、数据集、工具及协作社区支持,被誉为“AI界的GitHub”。 目录 一、历史发展 二、核心价值 三、核心功能与工具 四、适用人群与场景 五、优势与竞争力 六、使用方法(以情感分析为例…