labelme标注的json转Yolo格式【ultralytics工具】

打印 上一主题 下一主题

主题 748|帖子 748|积分 2244

目次

问题形貌
labelme格式
YOLO格式
示例
注意事项
代码转换
目次格式




问题形貌

迩来在利用ultralytics举行目标检测训练的时候,预备数据集时候,碰到了一个坑。labelme标注的json格式不能直接用来训练。


labelme格式

原始labelme标注的json格式如下:
  1. {
  2.   "version": "5.4.1",
  3.   "flags": {},
  4.   "shapes": [
  5.     {
  6.       "label": "fire",
  7.       "points": [
  8.         [
  9.           943.5862068965517,
  10.           1849.9310344827586
  11.         ],
  12.         [
  13.           1305.6551724137933,
  14.           2160.2758620689656
  15.         ]
  16.       ],
  17.       "group_id": null,
  18.       "description": "",
  19.       "shape_type": "rectangle",
  20.       "flags": {},
  21.       "mask": null
  22.     },
  23.     {
  24.       "label": "fire",
  25.       "points": [
  26.         [
  27.           1764.2758620689656,
  28.           1394.7586206896551
  29.         ],
  30.         [
  31.           2109.103448275862,
  32.           1684.4137931034481
  33.         ]
  34.       ],
  35.       "group_id": null,
  36.       "description": "",
  37.       "shape_type": "rectangle",
  38.       "flags": {},
  39.       "mask": null
  40.     },
  41.     {
  42.       "label": "fire",
  43.       "points": [
  44.         [
  45.           2964.2758620689656,
  46.           722.3448275862067
  47.         ],
  48.         [
  49.           3288.4137931034484,
  50.           984.4137931034481
  51.         ]
  52.       ],
  53.       "group_id": null,
  54.       "description": "",
  55.       "shape_type": "rectangle",
  56.       "flags": {},
  57.       "mask": null
  58.     }
  59.   ],
  60.   "imagePath": "No002.jpg",
  61.   "imageData": "/9j/4AAQSkZJR9k=",
  62.   "imageHeight": 3024,
  63.   "imageWidth": 4032
  64. }
复制代码
要求的格式(YOLO格式)如下:


YOLO(You Only Look Once)是一种实时物体检测系统,YOLO格式指的是YOLO模子利用的标签文件格式,用于训练和推理时标注图像中的对象。YOLO格式的标签文件通常是一个纯文本文件,每个图像对应一个单独的文件,文件内容形貌了图像中每个对象的类别和位置信息。
YOLO格式


  • 文件名:每个图像对应一个同名的.txt文件。例如,假如图像名为image1.jpg,则对应的标签文件名应为image1.txt。
  • 文件内容:每行代表一个对象,格式如下:class x_center y_center width height
    其中:


  • class:对象的类别编号,必须是零起始的整数(即从0开始)。
  • x_center:对象边界框中央点的x坐标,相对于图像宽度举行归一化(从0到1)。
  • y_center:对象边界框中央点的y坐标,相对于图像高度举行归一化(从0到1)。
  • width:对象边界框的宽度,相对于图像宽度举行归一化(从0到1)。
  • height:对象边界框的高度,相对于图像高度举行归一化(从0到1)。

示例

假设有一个图像image1.jpg,尺寸为800x600像素,其中包罗两个对象。第一个对象是类别0(例如,人),位于图像的左上角,边界框中央点的坐标为(100, 200),宽度为50像素,高度为100像素。第二个对象是类别1(例如,车),位于图像的右下角,边界框中央点的坐标为(700, 500),宽度为150像素,高度为200像素。
对应的image1.txt文件内容如下:
  1. 0 0.125 0.333 0.0625 0.1667
  2. 1 0.875 0.833 0.1875 0.3333
复制代码
表明:


  • 对象1(类别0):x_center = 100/800 = 0.125,y_center = 200/600 = 0.333,width = 50/800 = 0.0625,height = 100/600 = 0.1667
  • 对象2(类别1):x_center = 700/800 = 0.875,y_center = 500/600 = 0.833,width = 150/800 = 0.1875,height = 200/600 = 0.3333
注意事项



  • 假如图像中没有对象,则不须要天生对应的.txt文件。
  • 所有坐标和尺寸必须归一化,值范围为0到1。
  • 类别编号从0开始,依次递增。
代码转换

  1. import json
  2. import os
  3. def convert_to_yolo_format(json_data):
  4.     # 从JSON数据中读取图像宽度和高度
  5.     image_width = json_data['imageWidth']
  6.     image_height = json_data['imageHeight']
  7.     shapes = json_data['shapes']
  8.     yolo_data = []
  9.     # 遍历所有标注形状
  10.     for shape in shapes:
  11.         # 假设标签 "fire" 对应类别ID 0
  12.         class_id = 0 if shape['label'] == 'fire' else -1  # 需要时调整以支持其他标签
  13.         # 如果类别ID为-1,表示该标签不处理,跳过
  14.         if class_id == -1:
  15.             continue
  16.         points = shape['points']
  17.         x_min = min(points[0][0], points[1][0])
  18.         y_min = min(points[0][1], points[1][1])
  19.         x_max = max(points[0][0], points[1][0])
  20.         y_max = max(points[0][1], points[1][1])
  21.         # 计算YOLO格式所需的中心坐标和宽度高度
  22.         x_center = (x_min + x_max) / 2.0 / image_width
  23.         y_center = (y_min + y_max) / 2.0 / image_height
  24.         width = (x_max - x_min) / image_width
  25.         height = (y_max - y_min) / image_height
  26.         # 将转换后的数据添加到列表中
  27.         yolo_data.append(f"{class_id} {x_center} {y_center} {width} {height}")
  28.     return yolo_data
  29. def save_yolo_format(yolo_data, output_path):
  30.     # 将YOLO格式的数据保存到指定文件中
  31.     with open(output_path, 'w') as file:
  32.         for line in yolo_data:
  33.             file.write(f"{line}\n")
  34. def process_json_files(input_directory):
  35.     # 遍历输入目录中的所有文件
  36.     for filename in os.listdir(input_directory):
  37.         if filename.endswith(".json"):
  38.             json_file_path = os.path.join(input_directory, filename)
  39.             with open(json_file_path, 'r') as file:
  40.                 data = json.load(file)
  41.             
  42.             yolo_format_data = convert_to_yolo_format(data)
  43.             
  44.             # 生成输出文件路径
  45.             image_basename = os.path.splitext(data['imagePath'])[0]
  46.             output_file_path = os.path.join(input_directory, image_basename + '.txt')
  47.             save_yolo_format(yolo_format_data, output_file_path)
  48.             print(f"YOLO格式数据已保存到 {output_file_path}")
  49. # 示例使用
  50. input_directory = 'path/to/your/json_files_directory'  # 修改为实际的JSON文件目录路径
  51. process_json_files(input_directory)
复制代码
目次格式







OK,大功告成!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表