可视化yolov5格式数据集(labelme json文件)

       在自己的项目中,常常会遇到数据集少的情况,但是网上有些标注好的数据,或多或少和自己的项目的标注要求有差别,又不想重新标注,只想微调一下,但是yolov5的原生格式修改起来不直观,这时候可以将yolov5格式的数据转成labelme的json格式,这样就方便对数据的标注进行微调,同时也不用花大心思去标注大数据,减少人工成本。

# -*- coding: utf-8 -*-
"""
Time:     2021.10.26
Author:   Athrunsunny
Version:  V 0.1
File:     yolotolabelme.py
Describe: Functions in this file is change the dataset format to labelme json file
"""
import base64
import io
import os
import numpy as np
import json
from glob import glob
import cv2
import shutil
import yaml
from tqdm import tqdm
import PIL.Image

ROOT_DIR = os.getcwd()
VERSION = '5.0.1'  # 根据labelme的版本来修改


def img_arr_to_b64(img_arr):
    img_pil = PIL.Image.fromarray(img_arr)
    f = io.BytesIO()
    img_pil.save(f, format="PNG")
    img_bin = f.getvalue()
    if hasattr(base64, "encodebytes"):
        img_b64 = base64.encodebytes(img_bin)
    else:
        img_b64 = base64.encodestring(img_bin)
    return img_b64


def process_point(points, cls):
    info = list()
    for point in points:
        shape_info = dict()
        if point is None:
            shape_info['label'] = ''
            shape_info['points'] = [[], []]
        else:
            shape_info['label'] = cls[int(point[0])]
            shape_info['points'] = [[point[1], point[2]],
                                    [point[3], point[4]]]
        shape_info['group_id'] = None
        shape_info['shape_type'] = 'rectangle'
        shape_info['flags'] = dict()
        info.append(shape_info)
    return info


def create_json(img, imagePath, filename, info):
    data = dict()
    data['version'] = VERSION
    data['flags'] = dict()
    data['shapes'] = info
    data['imagePath'] = imagePath
    height, width = img.shape[:2]
    data['imageData'] = img_arr_to_b64(img).decode('utf-8')
    data['imageHeight'] = height
    data['imageWidth'] = width
    jsondata = json.dumps(data, indent=4, separators=(',', ': '))
    f = open(filename, 'w')
    f.write(jsondata)
    f.close()


def read_txt(path):
    assert os.path.exists(path)
    with open(path, mode='r', encoding="utf-8") as f:
        content = f.readlines()
    content = np.array(content)
    res = []
    for index, item in enumerate(content):
        string = item.split(' ')
        res.append(list(map(np.float64, string)))
    # 防止重叠目标
    res = np.array(res)
    res = np.unique(res, axis=0)
    if len(res) == 0:
        return None
    return res


def load_dataset_info(path=ROOT_DIR):
    yamlpath = glob(path + "\\*.yaml")[0]
    with open(yamlpath, "r", encoding="utf-8") as f:
        data = yaml.load(f, Loader=yaml.FullLoader)
    return data


def reconvert_list(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[0] / dw
    w = box[2] / dw
    y = box[1] / dh
    h = box[3] / dh
    x1 = ((x + 1) * 2 - w) / 2.
    y1 = ((y + 1) * 2 - h) / 2.
    x2 = ((x + 1) * 2 + w) / 2.
    y2 = ((y + 1) * 2 + h) / 2.
    return x1, y1, x2, y2


def reconvert_np(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[:, :1] / dw
    w = box[:, 2:3] / dw
    y = box[:, 1:2] / dh
    h = box[:, 3:4] / dh
    box[:, :1] = ((x + 1) * 2 - w) / 2.
    box[:, 2:3] = ((x + 1) * 2 + w) / 2.
    box[:, 1:2] = ((y + 1) * 2 - h) / 2.
    box[:, 3:4] = ((y + 1) * 2 + h) / 2.
    return box


def txt2json(proctype, cls, path=ROOT_DIR):
    process_image_path = os.path.join(path, proctype, 'images')
    process_label_path = os.path.join(path, proctype, 'labels')

    externs = ['png', 'jpg', 'JPEG', 'BMP', 'bmp']
    imgfiles = list()
    for extern in externs:
        imgfiles.extend(glob(process_image_path + "\\*." + extern))

    createfile = os.path.join(ROOT_DIR, 'createjson')
    if not os.path.exists(createfile):
        os.makedirs(createfile)

    for image_path in tqdm(imgfiles):
        # print(image_path)
        frame = cv2.imread(image_path)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        height, width = frame.shape[:2]
        size = (width, height)

        imgfilename = image_path.replace("\\", "/").split("/")[-1]
        imgname = '.'.join(imgfilename.split('.')[:-1])
        jsonpath = os.path.join(createfile, imgname + '.json')

        txtpath = os.path.join(process_label_path, imgname + '.txt')
        label_and_point = read_txt(txtpath)
        if label_and_point is not None:
            label_and_point[:, 1:] = reconvert_np(size, label_and_point[:, 1:])
            info = process_point(label_and_point, cls)
        else:
            info = process_point([label_and_point], cls)
        create_json(frame, imgname, jsonpath, info)
        shutil.copy(image_path, createfile)


def yolotolabelme(path=ROOT_DIR):
    pathtype = list()
    if 'train' in os.listdir(path):
        pathtype.append('train')
    if 'valid' in os.listdir(path):
        pathtype.append('valid')
    if 'test' in os.listdir(path):
        pathtype.append('test')

    cls = load_dataset_info()['names']

    for file_type in pathtype:
        print("Processing image type {} \n".format(file_type))
        txt2json(file_type, cls)


if __name__ == "__main__":
    yolotolabelme()

        将以上代码命名为yolotolabelme.py并存放在数据集的根目录下

         在运行程序前先将上面代码中import的几个库安装一下,之后运行

         运行之后会在该路径下生成createjson文件夹

         转换的数据会根据train或valid生成在createjson文件夹下,之后可通过labelme打开

         由于我的test数据集是空的,所以转换后也是空的,使用labelme打开该train路径下的文件可以可以看到对应的标注

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 将Labelme标注的JSON文件转换为YoloV5格式,可以按照以下步骤进行操作: 1. 安装labelme2coco工具,该工具可以将Labelme标注的JSON文件转换为COCO格式的标注文件。可以使用以下命令进行安装: ``` pip install labelme2coco ``` 2. 使用labelme2coco工具将JSON文件转换为COCO格式的标注文件,可以使用以下命令进行转换: ``` labelme2coco input_dir output_file ``` 其中,input_dir为存放JSON文件的目录,output_file为输出的COCO格式标注文件名。 3. 安装yolov5工具,可以使用以下命令进行安装: ``` pip install yolov5 ``` 4. 使用yolov5工具将COCO格式的标注文件转换为YoloV5格式的标注文件,可以使用以下命令进行转换: ``` python -c "from yolov5.utils import convert_labels; convert_labels('path/to/coco/labels.json', 'path/to/yolov5/labels.yaml')" ``` 其中,'path/to/coco/labels.json'为COCO格式的标注文件路径,'path/to/yolov5/labels.yaml'为输出的YoloV5格式标注文件路径。 5. 将转换后的YoloV5格式标注文件与对应的图像文件一起放入训练集或测试集中即可。 ### 回答2: Labelme是一个用于标注图像、语义分割和实例分割的工具,可生成JSON格式的标注文件。而yolov5是一种神经网络,用于检测目标物体并对其分类。在深度学习中,我们经常需要将Labelme生成的JSON标注文件转换成yolov5所能识别的格式。下面我将介绍如何进行这样的转换。 1. 下载Labelme软件并标注所需的图像。标注完成后,Labelme会生成一个对应的JSON文件。 2. 安装Python3以及yolov5。 3. 运行如下Python代码: ``` import json with open('labelme.json', 'r') as f: data = json.load(f) annotations = data['annotations'] classes = ['class_name1', 'class_name2', 'class_name3'] # 更改为实际的类别名称 # 将注释转换为yolov5格式 for a in annotations: # 获取标签、坐标和大小信息 label = a['label'] x, y, w, h = a['points'][0] + a['points'][1] x = (x + w/2) / data['imageWidth'] y = (y + h/2) / data['imageHeight'] w /= data['imageWidth'] h /= data['imageHeight'] # 转换类别标签 try: c = classes.index(label) except ValueError: classes.append(label) c = len(classes) - 1 # 输出结果 print(f"{c} {x:.6f} {y:.6f} {w:.6f} {h:.6f}") ``` 这个代码将会读取Labelme生成的JSON文件,然后将注释转换成yolov5能够识别的格式。具体来说,它会遍历所有注释并获取标签、坐标和大小信息。然后,它会将标签转换为yolov5格式,并输出结果。 4. 将输出复制到yolov5要求的txt文件中。例如,如果您的标注文件名为“sample.jpg”,则应该创建一个名为“sample.txt”的文件,并将上面的输出粘贴到其中。 5. 开始训练您的yolov5模型。您可以使用yolov5提供的训练脚本来完成训练。例如: ``` python train.py --img 640 --batch 16 --epochs 30 --data data.yaml --cfg models/yolov5s.yaml --weights '' --name yolov5s_results ``` 其中,--data参数指定了包含类别信息的YAML文件的路径,--cfg参数指定了yolov5模型的结构,--weights参数指定了预训练权重的路径,--name参数指定了训练结果的名称。 总之,将Labelme生成的JSON文件转换为yolov5所能识别的格式需要以下几个步骤:读取JSON文件、转换注释、输出结果、将结果复制到txt文件中、开始训练yolov5模型。虽然这需要一些编程技能,但是这是一个非常有效的方法,可以帮助您快速地训练出高精度的目标检测模型。 ### 回答3: 要将Labelme JSON格式的标注文件转换成Yolov5格式,需要进行以下几个步骤: 1. 准备工作 首先需要准备以下工具: - Labelme软件 - Python编程环境 - yolov5官方代码库 2. 在Labelme中标注物体 使用Labelme软件标注图片和导出JSON文件。在标注时,需要在每个标注框的“properties”中添加一个“class”项,用于指定这个标注框属于哪类物体。 3. 定义类别和标签映射 使用Python编写脚本,将Labelme JSON文件中的标签映射为Yolov5格式的类别编号。这部分内容可以在yolov5代码库中的“data/coco.yaml”中找到。可以根据自己的需求进行修改。 4. 转换JSON格式 使用Python脚本读取JSON格式文件,按照Yolov5格式进行转换。具体过程如下: - 读取JSON文件,获取图片文件名和对应的标注信息。 - 根据类别映射表,将每个标注框的类别转换为对应的编号。 - 计算每个标注框的中心点坐标、宽度和高度,并归一化到0~1之间。 - 将每个标注框的中心点坐标、宽度、高度和类别编号保存到TXT文件中。每一行代表一个标注框。 5. 使用转换后的数据进行训练 将转换后的数据(TXT格式)放到yolov5代码库中的“datasets”文件夹中,根据具体需求修改训练参数,运行训练脚本进行训练。 总之,将Labelme JSON文件转换成Yolov5格式的过程包含了标注、类别映射、JSON格式转换等多个步骤。需要仔细处理每一步,确保转换后的数据可以被Yolov5代码库正确地读取和使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

athrunsunny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值