首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

YOLO11 实例分割 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签

  • 25-02-19 04:01
  • 2943
  • 6087
blog.csdn.net

本文分享使用YOLO11进行实例分割时,实现模型推理预标注、自动标注、标签格式转换、以及使用Labelme手动校正标签等功能。

目录

1、预训练权重

2、生成预标注

3、生成json标注文件

4、手动校正标签

5、Labelme的json转为YOLO的txt

6、迭代优化模型(可选)


1、预训练权重

首先我们去官网下载,YOLO11实例分割的预训练权重,如下表格式所示:

下载地址:https://github.com/ultralytics/ultralytics

Modelsize
(pixels)
mAPbox
50-95
mAPmask
50-95
Speed
CPU ONNX
(ms)
Speed
T4 TensorRT10
(ms)
params
(M)
FLOPs
(B)
YOLO11n-seg64038.932.065.9 ± 1.11.8 ± 0.02.910.4
YOLO11s-seg64046.637.8117.6 ± 4.92.9 ± 0.010.135.5
YOLO11m-seg64051.541.5281.6 ± 1.26.3 ± 0.122.4123.3
YOLO11l-seg64053.442.9344.2 ± 3.27.8 ± 0.227.6142.2
YOLO11x-seg64054.743.8664.5 ± 3.215.8 ± 0.762.1319.0

然后基于预训练权重,准备自己的数据集,进行模型训练

最终,得到效果更好的模型权重(xxx.pt或xxx.onnx)

2、生成预标注

前面得到了效果更好的模型权重,这里用它来对新的图片,进行推理,同时生成实例分割的信息。

模型推理的代码,如下所示:

  1. from ultralytics import YOLO
  2. # 加载预训练的YOLOv11n模型
  3. model = YOLO(r"runs/segment/train3/weights/best.pt")
  4. # 对指定的图像文件夹进行推理,并设置各种参数
  5. results = model.predict(
  6. source="datasets/seg_20241013/images/", # 新的图片,待标注的图片
  7. conf=0.45, # 置信度阈值
  8. iou=0.6, # IoU 阈值
  9. imgsz=640, # 图像大小
  10. half=False, # 使用半精度推理
  11. device=None, # 使用设备,None 表示自动选择,比如'cpu','0'
  12. max_det=300, # 最大检测数量
  13. vid_stride=1, # 视频帧跳跃设置
  14. stream_buffer=False, # 视频流缓冲
  15. visualize=False, # 可视化模型特征
  16. augment=False, # 启用推理时增强
  17. agnostic_nms=False, # 启用类无关的NMS
  18. classes=None, # 指定要检测的类别
  19. retina_masks=False, # 使用高分辨率分割掩码
  20. embed=None, # 提取特征向量层
  21. show=False, # 是否显示推理图像
  22. save=True, # 保存推理结果
  23. save_frames=False, # 保存视频的帧作为图像
  24. save_txt=True, # 保存检测结果到文本文件
  25. save_conf=False, # 保存置信度到文本文件
  26. save_crop=False, # 保存裁剪的检测对象图像
  27. show_labels=True, # 显示检测的标签
  28. show_conf=True, # 显示检测置信度
  29. show_boxes=True, # 显示检测框
  30. line_width=None # 设置边界框的线条宽度,比如2,4
  31. )
  • 需要修改model = YOLO(r"runs/segment/train3/weights/best.pt")中的权重路径,替换为自己训练的
  • 同时需要修改source="datasets/seg_20241013/images/", 这里是指新的图片,即待标注的图片
  • 其他推理参数,根据任务情况,自行修改了;比如:置信度conf、iou、图像大小imgsz等等。

推理完成后,会保留实例分割的结果图像、标签信息文件夹(labels),它们是同一级文件夹的

- runs/segment/predict/

        - labels(这个文件夹是存放推理的分割信息,作为预标注的标签信息)

        - picture1.jpg

        - picture2.jpg

                .....

        - pictureN.jpg

3、生成json标注文件

在实例分割中,我们使用Labelme工具进行标注,选择“创建多边形”,对物体进行分割信息标注。

生成JSON标注文件,是因为这样能使用Labelme,可视化检查预标注的结果,方便人工手动修正标签

示例1,类别数量比较少,可以直接定义的:

  1. import os
  2. import json
  3. import cv2
  4. # 定义类别标签映射
  5. LABELS = ["class1", "class2"]
  6. def yolo11_to_labelme(txt_file, img_file, save_dir, labels):
  7. """
  8. 将YOLO11格式的分割标签文件转换为Labelme格式的JSON文件。
  9. 参数:
  10. - txt_file (str): YOLO11标签的txt文件路径。
  11. - img_file (str): 对应的图像文件路径。
  12. - save_dir (str): JSON文件保存目录。
  13. - labels (list): 类别标签列表。
  14. """
  15. # 读取图像,获取图像尺寸
  16. img = cv2.imread(img_file)
  17. height, width, _ = img.shape
  18. # 创建Labelme格式的JSON数据结构
  19. labelme_data = {
  20. "version": "4.5.9",
  21. "flags": {},
  22. "shapes": [],
  23. "imagePath": os.path.basename(img_file),
  24. "imageHeight": height,
  25. "imageWidth": width,
  26. "imageData": None # 可以选择将图像数据转为base64后嵌入JSON
  27. }
  28. # 读取YOLO11标签文件
  29. with open(txt_file, "r") as file:
  30. for line in file.readlines():
  31. data = line.strip().split()
  32. class_id = int(data[0]) # 类别ID
  33. points = list(map(float, data[1:])) # 获取多边形坐标
  34. # 将归一化坐标转换为实际像素坐标
  35. polygon = []
  36. for i in range(0, len(points), 2):
  37. x = points[i] * width
  38. y = points[i + 1] * height
  39. polygon.append([x, y])
  40. # 定义多边形区域
  41. shape = {
  42. "label": labels[class_id], # 使用直接定义的类别名称
  43. "points": polygon,
  44. "group_id": None,
  45. "shape_type": "polygon", # 分割使用多边形
  46. "flags": {}
  47. }
  48. labelme_data["shapes"].append(shape)
  49. # 保存为labelme格式的JSON文件
  50. save_path = os.path.join(save_dir, os.path.basename(txt_file).replace(".txt", ".json"))
  51. with open(save_path, "w") as json_file:
  52. json.dump(labelme_data, json_file, indent=4)
  53. def convert_yolo11_to_labelme(txt_folder, img_folder, save_folder):
  54. """
  55. 读取文件夹中的所有txt文件,将YOLO11标签转为Labelme的JSON格式。
  56. 参数:
  57. - txt_folder (str): 存放YOLO11 txt标签文件的文件夹路径。
  58. - img_folder (str): 存放图像文件的文件夹路径。
  59. - save_folder (str): 保存转换后的JSON文件的文件夹路径。
  60. """
  61. labels = LABELS # 直接使用定义好的标签
  62. if not os.path.exists(save_folder):
  63. os.makedirs(save_folder)
  64. for txt_file in os.listdir(txt_folder):
  65. if txt_file.endswith(".txt"):
  66. txt_path = os.path.join(txt_folder, txt_file)
  67. img_file = txt_file.replace(".txt", ".png") # 假设图像为.png格式
  68. img_path = os.path.join(img_folder, img_file)
  69. # 检查图像文件是否存在
  70. if os.path.exists(img_path):
  71. yolo11_to_labelme(txt_path, img_path, save_folder, labels)
  72. print(f"已成功转换: {txt_file} -> JSON文件")
  73. else:
  74. print(f"图像文件不存在: {img_path}")
  75. # 使用示例
  76. txt_folder = r"labels_txt" # YOLO11标签文件夹路径
  77. img_folder = r"point-offer-datasetsv2" # 图像文件夹路径
  78. save_folder = r"labels_json" # JSON文件保存路径
  79. convert_yolo11_to_labelme(txt_folder, img_folder, save_folder)

首先修改类别映射,比如:

  1. # 定义类别标签映射
  2. LABELS = ["person", "bicycle", "car"]

然后修改一下代码中的参数:

  1. txt_folder = r"./datasets/seg-datasetsv2/labels" # YOLO11标签文件夹路径
  2. img_folder = r"./datasets/seg-datasetsv2/images" # 图像文件夹路径
  3. save_folder = r"labels_json" # JSON文件保存路径

运行代码,会生成用于YOLO11分割的JSON标签文件。

示例2,类别数量比较多,需要用yaml文件指定类别映射情况

示例代码如下所示:

  1. import os
  2. import json
  3. import yaml # 用于解析yaml文件
  4. import cv2
  5. def load_labels_from_yaml(yaml_file):
  6. """
  7. 从YAML文件中加载类别标签。
  8. 参数:
  9. - yaml_file (str): YAML文件的路径。
  10. 返回值:
  11. - labels (list): 类别标签列表。
  12. """
  13. # 指定文件编码为utf-8
  14. with open(yaml_file, "r", encoding="utf-8") as file:
  15. yaml_content = yaml.safe_load(file)
  16. # 提取类别名称并转换为列表形式
  17. labels = [label for _, label in yaml_content['names'].items()]
  18. return labels
  19. def yolo11_to_labelme(txt_file, img_file, save_dir, labels):
  20. """
  21. 将YOLO11格式的分割标签文件转换为Labelme格式的JSON文件。
  22. 参数:
  23. - txt_file (str): YOLO11标签的txt文件路径。
  24. - img_file (str): 对应的图像文件路径。
  25. - save_dir (str): JSON文件保存目录。
  26. - labels (list): 类别标签列表。
  27. """
  28. # 读取图像,获取图像尺寸
  29. img = cv2.imread(img_file)
  30. height, width, _ = img.shape
  31. # 创建Labelme格式的JSON数据结构
  32. labelme_data = {
  33. "version": "4.5.9",
  34. "flags": {},
  35. "shapes": [],
  36. "imagePath": os.path.basename(img_file),
  37. "imageHeight": height,
  38. "imageWidth": width,
  39. "imageData": None # 可以选择将图像数据转为base64后嵌入JSON
  40. }
  41. # 读取YOLO11标签文件
  42. with open(txt_file, "r") as file:
  43. for line in file.readlines():
  44. data = line.strip().split()
  45. class_id = int(data[0]) # 类别ID
  46. points = list(map(float, data[1:])) # 获取多边形坐标
  47. # 将归一化坐标转换为实际像素坐标
  48. polygon = []
  49. for i in range(0, len(points), 2):
  50. x = points[i] * width
  51. y = points[i + 1] * height
  52. polygon.append([x, y])
  53. # 定义多边形区域
  54. shape = {
  55. "label": labels[class_id], # 使用从yaml加载的类别名称
  56. "points": polygon,
  57. "group_id": None,
  58. "shape_type": "polygon", # 分割使用多边形
  59. "flags": {}
  60. }
  61. labelme_data["shapes"].append(shape)
  62. # 保存为labelme格式的JSON文件
  63. save_path = os.path.join(save_dir, os.path.basename(txt_file).replace(".txt", ".json"))
  64. with open(save_path, "w") as json_file:
  65. json.dump(labelme_data, json_file, indent=4)
  66. def convert_yolo11_to_labelme(txt_folder, img_folder, save_folder, yaml_file):
  67. """
  68. 读取文件夹中的所有txt文件,将YOLO11标签转为Labelme的JSON格式。
  69. 参数:
  70. - txt_folder (str): 存放YOLO11 txt标签文件的文件夹路径。
  71. - img_folder (str): 存放图像文件的文件夹路径。
  72. - save_folder (str): 保存转换后的JSON文件的文件夹路径。
  73. - yaml_file (str): YAML文件的路径,用于读取类别标签。
  74. """
  75. # 从YAML文件中加载类别标签
  76. labels = load_labels_from_yaml(yaml_file)
  77. if not os.path.exists(save_folder):
  78. os.makedirs(save_folder)
  79. for txt_file in os.listdir(txt_folder):
  80. if txt_file.endswith(".txt"):
  81. txt_path = os.path.join(txt_folder, txt_file)
  82. img_file = txt_file.replace(".txt", ".jpg") # 假设图像为.jpg格式
  83. img_path = os.path.join(img_folder, img_file)
  84. # 检查图像文件是否存在
  85. if os.path.exists(img_path):
  86. yolo11_to_labelme(txt_path, img_path, save_folder, labels)
  87. print(f"已成功转换: {txt_file} -> JSON文件")
  88. else:
  89. print(f"图像文件不存在: {img_path}")
  90. # 使用示例
  91. txt_folder = r"./datasets/coco8-seg/labels/val" # YOLO11标签文件夹路径
  92. img_folder = r"./datasets/coco8-seg/images/val" # 图像文件夹路径
  93. save_folder = r"./datasets/coco8-seg/labels_json/val" # JSON文件保存路径
  94. yaml_file = r"coco8-seg.yaml" # YAML文件路径
  95. convert_yolo11_to_labelme(txt_folder, img_folder, save_folder, yaml_file)

修改一下代码中的参数:

  1. txt_folder = r"./datasets/coco8-seg/labels/val" # YOLO11标签文件夹路径
  2. img_folder = r"./datasets/coco8-seg/images/val" # 图像文件夹路径
  3. save_folder = r"./datasets/coco8-seg/labels_json/val" # JSON文件保存路径
  4. yaml_file = r"coco8-seg.yaml" # YAML文件路径

示例xxx.yaml文件内容,如下所示:

  1. # Ultralytics YOLO ?, AGPL-3.0 license
  2. path: ../datasets/coco8-seg # dataset root dir
  3. train: images/train # train images
  4. val: images/val # val images
  5. # Classes
  6. names:
  7. 0: person
  8. 1: bicycle
  9. 2: car
  10. 3: motorcycle
  11. 4: airplane
  12. 5: bus
  13. 6: train
  14. 7: truck
  15. 8: boat
  16. 9: traffic light
  17. 10: fire hydrant

4、手动校正标签

生成了JSON文件后,把图像和JSON文件放在同一个文件夹中

然后打开Labelme工具,选择“编辑多边形”,对物体进行分割信息修改

修改完成后,点击“Save"保存修正后的标注信息

5、Labelme的json转为YOLO的txt

这里把Labelme的json转为YOLO的txt,是因为用修正后数据,作为新的数据,加入旧数据中;

重新训练之前的模型权重,这样模型会学得更好,迭代优化模型。

 首先了解YOLO11的分割标签格式,如下所示:

  ...

  • 说明:这个格式不但适用于YOLO11、YOLOv8、YOLOv5,还适用于ultralytics工程中其他版本的YOLO。  

下面详细分析一下分割标签格式:

 这是目标对象的类别索引,用于表示当前对象属于哪个类别。

  • 格式:整数值,代表特定的目标类别。通常是在数据集中为每个类别分配的唯一编号。
  • 例如:0 代表“汽车”、1 代表“行人”、2 代表“交通灯”。

...   这些是多边形顶点的归一化坐标,用于描述目标对象的分割掩膜。

  • 格式:一对一对的浮点数,表示多边形顶点的 x 和 y 坐标。坐标是归一化的,即值范围在 [0, 1] 之间,分别表示相对于图像的宽度和高度。
  • :多边形的第一个顶点,x1 表示该顶点的横坐标,y1 表示该顶点的纵坐标。
  • :多边形的第二个顶点,依次类推。
  • :多边形的第 n 个顶点。

示例数据:0 0.15 0.20 0.35 0.25 0.30 0.40 0.10 0.30

这个示例中,假设有一个目标,它的类别索引是 0(表示某个物体,比如汽车),并且它的分割掩膜有 4 个顶点,归一化坐标。

了解YOLO11的分割标签txt文件后,通过下面代码,把Labelme的json转为YOLO的txt

  1. import json
  2. import os
  3. '''
  4. 任务:实例分割,labelme的json文件, 转txt文件
  5. Ultralytics YOLO format
  6. ...
  7. '''
  8. # 类别映射表,定义每个类别对应的ID
  9. label_to_class_id = {
  10. "class_1": 0,
  11. "class_2": 1,
  12. "class_3": 2,
  13. # 根据需要添加更多类别
  14. }
  15. # json转txt
  16. def convert_labelme_json_to_yolo(json_file, output_dir, img_width, img_height):
  17. with open(json_file, 'r') as f:
  18. labelme_data = json.load(f)
  19. # 获取文件名(不含扩展名)
  20. file_name = os.path.splitext(os.path.basename(json_file))[0]
  21. # 输出的txt文件路径
  22. txt_file_path = os.path.join(output_dir, f"{file_name}.txt")
  23. with open(txt_file_path, 'w') as txt_file:
  24. for shape in labelme_data['shapes']:
  25. label = shape['label']
  26. points = shape['points']
  27. # 根据类别映射表获取类别ID,如果类别不在映射表中,跳过该标签
  28. class_id = label_to_class_id.get(label)
  29. if class_id is None:
  30. print(f"Warning: Label '{label}' not found in class mapping. Skipping.")
  31. continue
  32. # 将点的坐标归一化到0-1范围
  33. normalized_points = [(x / img_width, y / img_height) for x, y in points]
  34. # 写入类别ID
  35. txt_file.write(f"{class_id}")
  36. # 写入多边形掩膜的所有归一化顶点坐标
  37. for point in normalized_points:
  38. txt_file.write(f" {point[0]:.6f} {point[1]:.6f}")
  39. txt_file.write("\n")
  40. if __name__ == "__main__":
  41. json_dir = "json_labels" # 替换为LabelMe标注的JSON文件目录
  42. output_dir = "labels" # 输出的YOLO格式txt文件目录
  43. img_width = 640 # 图像宽度,根据实际图片尺寸设置
  44. img_height = 640 # 图像高度,根据实际图片尺寸设置
  45. # 创建输出文件夹
  46. if not os.path.exists(output_dir):
  47. os.makedirs(output_dir)
  48. # 批量处理所有json文件
  49. for json_file in os.listdir(json_dir):
  50. if json_file.endswith(".json"):
  51. json_path = os.path.join(json_dir, json_file)
  52. convert_labelme_json_to_yolo(json_path, output_dir, img_width, img_height)

首先修改类别映射,比如

  1. # 类别映射表,定义每个类别对应的ID
  2. label_to_class_id = {
  3. "person": 0,
  4. "bicycle": 1,
  5. "car": 2,
  6. # 根据需要添加更多类别
  7. }

然后修改一下代码中的参数: 

  • 需要修改json_dir 的路径,它用来存放 LabelMe标注的JSON文件
  • 需要修改output_dir 的路径,输出的YOLO格式txt文件目录
  • img_width 和 img_height,默认是640,分别指图片的宽度和高度,根据实际图片尺寸修改即可

运行代码,会生成用于YOLO11分割的txt标签文件。

6、迭代优化模型(可选)

然后,可以迭代优化模型。用修正后数据,作为新的数据,加入旧数据中;

重新训练之前的模型权重,这样模型会学得更好,迭代优化模型。

YOLO11实例分割-训练模型参考我这篇文章:

http://iyenn.com/rec/1657174.html?spm=1001.2014.3001.5501

 YOLO11相关文章推荐:

一篇文章快速认识YOLO11 | 关键改进点 | 安装使用 | 模型训练和推理-CSDN博客

一篇文章快速认识 YOLO11 | 实例分割 | 模型训练 | 自定义数据集-CSDN博客

YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测-CSDN博客

YOLO11模型训练 | 目标检测与跟踪 | 实例分割 | 关键点姿态估计-CSDN博客

分享完成~

注:本文转载自blog.csdn.net的一颗小树x的文章"https://guo-pu.blog.csdn.net/article/details/142895716"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top