学习系列三:V8目标检测与分割自动化标注

2024-08-27 02:28

本文主要是介绍学习系列三:V8目标检测与分割自动化标注,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习系列三:YOLOv8目标检测与分割自动化标注

提示:本次文章主要介绍yolov8目标检测与自动化标注(较简单,通用性比较强,标签格式txt),yolov8实例分割与自动化标注(程序较复杂,自动化标注效果有待提升,标签格式txt),大家有更好的想法可以在评论区进行交流。


文章目录

  • 学习系列三:YOLOv8目标检测与分割自动化标注
  • 一、YOLOv8训练目标检测数据集
    • 1.1 数据集的划分
    • 1.2 目标检测训练脚本
  • 二、实例化推理检测函数
  • 三、目标检查自动化标注与标签生成(txt格式)
  • 四、YOLOv8训练实例分割数据集
  • 五、实例化推理检测函数
  • 六、自动化标注与标签生成


一、YOLOv8训练目标检测数据集

1.1 数据集的划分

在进行训练目标检测数据前,需要划分训练集、验证集和测试集,可以进行人工的划分,可以使用代码进行自主进行划分,这里主要讲述使用代码进行自主划分训练集、验证集和测试集。
在划分之前需要看一下数据集的格式:数据集文件夹(tuoluo-aug), 数据集图片文件夹(images),数据集标签文件夹(labels, txt格式标签文件)
在这里插入图片描述

代码进行自主划分训练集、验证集和测试集。这里可以自己定义训练集、验证集和测试集所占比例多少。

from ultralytics.data.utils import autosplitautosplit(path='/home/xiao/dataset/tuoluo-aug/images',weights=(0.8, 0.2, 0.00), # (train, validation, test) fractional splitsannotated_only=False     # split only images with annotation file when True
)

运行之后在 tuoluo-aug文件下会生成txt文件,如下:
在这里插入图片描述

1.2 目标检测训练脚本

针对YOLOv8这里我写一个简单的脚本训练目标检测数据集,放在工程ultralytics-xiao下面,脚本文件名称定义为tuoluo.py,代码如下:

from ultralytics import YOLOmodel = YOLO("/home/xiao/ultralytics-main/weights/yolov8n.pt") 
model.train(data="/home/xiao/ultralytics-main/ultralytics/cfg/datasets/bolt-detachment-aug.yaml",epochs=120,imgsz = 1280,device= [0],workers = 2,batch =8,patience=120)metrics = model.val()  # 在验证集上评估模型性能

在上述代码中数据集配置文件路径:“/home/xiao/ultralytics-main/ultralytics/cfg/datasets/bolt-detachment-aug.yaml”
配置文件内容为:

path: /home/xiao/dataset/tuoluo-aug/
train: autosplit_train.txt             
val: autosplit_val.txt                                           
test: autosplit_test.txt                                         names:0: detachmentnc : 1

上述完成后,运行tuoluo.py即可开启训练。(上述数据集标签为:detachment)

二、实例化推理检测函数

针对上述训练完成后,会生成对应最好的权重,试用该权重进行推理新的图片,代码如下(封装成类函数了):

from ultralytics import YOLO
import cv2
import numpy as np
import time
import os# 加载模型
model_file = './weight/best.pt'model = YOLO(model_file)
objs_labels = model.names
print(objs_labels)class yolo_demo:def __init__(self):self.model_file_1 = './weight/best.pt'self.model_1 = YOLO(self.model_file_1)self.objs_labels_1 = self.model_1.namesdef img_file_folder(self, img_folder):image_paths = []for image_name in os.listdir(img_folder):image_path = os.path.join(img_folder, image_name)if os.path.isfile(image_path) and image_name.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tif', '.tiff')):image_paths.append(image_path)return image_pathsdef main(self, img_folder):for i, img_path in enumerate(self.img_file_folder(img_folder)):# 获取图片文件名img_id = img_path.split(os.sep)[-1].split('.')[0]# bgrimage_bgr = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)result = list(self.model_1(image_bgr, stream=True, conf=0.7))[0]boxes = result.boxesboxes = boxes.cpu().numpy()for box in boxes.data:l, t, r, b = box[:4].astype(np.int32)conf, id = box[4:]if id == 0:# 绘制标签矩形框cv2.rectangle(image_bgr, (l, t), (r, b), (0, 255, 0), 1)label = "detachment"cv2.putText(image_bgr, label, (l, t - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)output_image_path = f"./output-v4/{img_id}.jpg"cv2.imwrite(output_image_path, image_bgr)if __name__ =="__main__":plate_demo = yolo_demo()img_path = r"./detachment-images"

三、目标检查自动化标注与标签生成(txt格式)

适用于已经使用少量数据集图片进行YOLOv8训练,得到权重并使用该权重对新的数据集图片进行自动标注,后期可人工进行检查标注的好坏,进行简单修改,相比较于从头进行标注节省了大量的时间。

"""
yolov8 自动标注, 后续需要手工进行修改校准
"""
from ultralytics import YOLO
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
import glob
import shutil
import tqdm# 加载模型
model_file = "./weights1to4/detachment.pt"
model = YOLO(model_file)
objs_labels = model.names
print(objs_labels)# 读取图片
images_list = glob.glob('./img-detachment-9/*.jpg')print(len(images_list))# 创建标签文件夹
if not os.path.exists('./detachment-labels'):os.mkdir('./detachment-labels')# 标注
def image_2_yolo():# 保存路径前缀savePathPrefix = "./detachment-labels/"# 遍历每张图片for img in images_list:# 获取图片文件名img_id = img.split(os.sep)[-1].split('.')[0]# 读取图片img_data = cv2.imread(img)# 检测result = list(model(img_data, stream=True, conf=0.5))[0]boxes = result.boxesboxes = boxes.cpu().numpy()yolo_boxes = []# 获取图片宽高img_h, img_w, _ = img_data.shape# 遍历每个框for box in boxes.data:l, t, r, b = box[:4].astype(np.int32)conf, id = box[4:]# 筛选出detachment类别, 转为yolo格式:类别id, x_center, y_center, width, height, 归一化到0-1, 保留6位小数if id == 0:class_label = int(id)x_center = round((l + r) / 2 / img_w, 6)y_center = round((t + b) / 2 / img_h, 6)width = round((r - l) / img_w, 6)height = round((b - t) / img_h, 6)yolo_boxes.append([class_label, x_center, y_center, width, height])# 写入txt文件# 生成yolo格式的标注文件yoloLabelFile = savePathPrefix + img_id + '.txt'with open(yoloLabelFile, 'w') as f:for yolo_box in yolo_boxes:f.write(' '.join([str(i) for i in yolo_box]) + '\n')if __name__ == '__main__':image_2_yolo()

四、YOLOv8训练实例分割数据集

from ultralytics import YOLOmodel = YOLO('/home/hxz/xiao/ultralytics-xiao/ultralytics/cfg/models/v8/yolov8-seg.yaml').load('/home/hxz/xiao/ultralytics-xiao/runs/segment/train6/weights/best.pt')model.train(data="/home/hxz/xiao/ultralytics-xiao/ultralytics/cfg/datasets/seg-bolt-line-cz933-weitiao.yaml",task="segment",mode="train",overlap_mask=False,batch=16,device=0,epochs=600,patience=600,imgsz=128)metrics = model.val(iou=0.7)try:a = metrics.box.map               # map50-95b = metrics.box.map50             # map50c = metrics.box.map75             # map75d = metrics.box.maps              # 返回一个列表,包含每个类别的mAP值(IoU在0.5到0.95)print("result:", a, b, c, d)except Exception as e:print('f{有一些问题}')

五、实例化推理检测函数

from ultralytics import YOLO# Load a model
model = YOLO("/home/hxz/xiao/ultralytics-xiao/runs/segment/train6/weights/best.pt")  # load a custom model# Predict with the model
source = "/home/hxz/xiao/ultralytics-xiao/test-img" # predict on an imageresults = model.predict(source, save=True)

六、自动化标注与标签生成

这部分是根据比较少的数据集训练得到的数据的权重,根据权重区预测新的图片,获得mask,根据mask读取坐标保存至txt文件。

from ultralytics import YOLO
import numpy as np
import cv2
import os
import matplotlib.pyplot as plt
import glob# 加载分割模型
model = YOLO("./weights/fks-seg.pt")  # 加载自定义模型# 预测源
image_folder = r"./fks-seg/images"# 获取文件夹中所有图片的路径
image_paths = glob.glob(os.path.join(image_folder, "*.jpg"))# 保存分割结果坐标点的目录
output_dir = "./fks-seg/txt_labels"
os.makedirs(output_dir, exist_ok=True)for image_path in image_paths:results = model.predict(image_path)base_name = os.path.basename(image_path).split('.')[0]# 创建输出文件路径txt_filename = os.path.join(output_dir, f"{base_name}.txt")for result in results:masks = result.masks  # 获取分割掩码classes = result.boxes.cls if result.boxes is not None else []  # 获取每个掩码的类别# 获取图像的宽度和高度以进行归一化height, width = result.orig_img.shape[:2]print(height, width)# 创建输出文件路径txt_filename = os.path.join(output_dir, f"{os.path.basename(result.path).split('.')[0]}.txt")with open(txt_filename, 'w') as f:if masks is not None:for i, mask in enumerate(masks.data):# 将 PyTorch 张量转换为 NumPy 数组并确保掩码是二值图像mask = mask.cpu().numpy().astype(np.uint8)contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 获取当前掩码对应的类别class_id = int(classes[i]) if i < len(classes) else -1# 准备一个列表来存储该类别的所有归一化坐标coordinates = []for contour in contours:# 将轮廓的坐标点进行归一化normalized_coordinates = []for point in contour:x, y = point[0]x_normalized = x / mask.shape[1]y_normalized = y / mask.shape[0]normalized_coordinates.append(f"{x_normalized:.6f} {y_normalized:.6f}")# 获取当前掩码对应的类别class_id = int(classes[i]) if i < len(classes) else -1# 写入 YOLO 格式的标签文件(类别 + 轮廓坐标)if normalized_coordinates:f.write(f"{class_id} " + " ".join(normalized_coordinates) + "\n")print(f"Saved YOLO segmentation coordinates to {txt_filename}")

将生成的txt文件转json后,把图片和生成的json文件放在同一个文件夹,可在lableme中查看自动标注的情况。

import os
import json
import cv2
import numpy as np
import globdef yolo_to_labelme(txt_file, img_file, class_names, output_json):if not os.path.exists(txt_file):print(f"File {txt_file} does not exist.")returnimg = cv2.imdecode(np.fromfile(img_file, dtype=np.uint8), -1)height, width = img.shape[:2]shapes = []with open(txt_file, 'r') as f:lines = f.readlines()for line in lines:parts = line.strip().split()class_id = int(parts[0])# 将归一化的坐标转换为非归一化的像素坐标points = [(float(parts[i]) * width, float(parts[i + 1]) * height) for i in range(1, len(parts), 2)]shape = {"label": class_names[class_id],"points": points,"group_id": None,"shape_type": "polygon","flags": {}}shapes.append(shape)labelme_data = {"version": "4.5.6","flags": {},"shapes": shapes,"imagePath": os.path.basename(img_file),"imageData": None,"imageHeight": height,"imageWidth": width}with open(output_json, 'w') as f:json.dump(labelme_data, f, indent=4)print(f"Saved JSON to {output_json}")def batch_process_yolo_to_labelme(image_folder, label_folder, output_folder, class_names):os.makedirs(output_folder, exist_ok=True)# 获取所有的图片文件image_files = glob.glob(os.path.join(image_folder, "*.jpg"))for img_file in image_files:# 获取对应的 txt 文件base_name = os.path.basename(img_file).split('.')[0]txt_file = os.path.join(label_folder, f"{base_name}.txt")# 输出的 JSON 文件路径output_json = os.path.join(output_folder, f"{base_name}.json")# 转换 YOLO 到 LabelMe 格式yolo_to_labelme(txt_file, img_file, class_names, output_json)# 示例使用
class_names = ["red"]  # 根据你的类别顺序填写
image_folder = r"./fks-seg/images"
label_folder = r"./fks-seg/txt_labels"
output_folder = r"./fks-seg/json_labels"batch_process_yolo_to_labelme(image_folder, label_folder, output_folder, class_names)

这篇关于学习系列三:V8目标检测与分割自动化标注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110365

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss