使用labelme构建自己的数据集

上篇文章介绍了labelme的简单的标注操作,这篇文章在上一篇文章的基础上,介绍如何用labelme构建一个自己的数据集。

本篇文章将会以yolo格式的数据集为例。

假设我们现在有一个未标注的数据集如下图所示:

因为我们是以yolo格式为例,所以提前分割成测试集,训练集,验证集这样的格式。

然后我们要开始进行第一步,就是对自己的数据集进行标注,这里以训练集中图片为例:

这里标注完以后,要记住修改对应的保存路径:点击文件  >>  更改输出路径 >>新建一个train目录下的labels文件夹。

全部标注完就可以开始下一步:

因为这里保存的标签文件时jason格式,所以要转换成对应的txt格式文件:

感谢https://blog.csdn.net/weixin_53159002?type=blog

给的代码

# -*- coding: utf-8 -*-
import json
import os
import argparse
from tqdm import tqdm
 
 
def convert_label_json(json_dir, save_dir, classes):
    """
    将标注文件从 JSON 格式转换为 YOLO 格式的文本文件,并进行坐标归一化。
    :param json_dir: 包含 JSON 文件的目录路径
    :param save_dir: 保存转换后文本文件的目录路径
    :param classes: 类别名称列表,用逗号分隔
    """
    # 获取目录中所有 JSON 文件的路径
    json_paths = os.listdir(json_dir)
    # 将类别字符串转换为列表
    classes = classes.split(',')
 
    # 遍历所有 JSON 文件
    for json_path in tqdm(json_paths):
        # 构建 JSON 文件的完整路径
        path = os.path.join(json_dir, json_path)
 
        # 打开并读取 JSON 文件
        with open(path, 'r', encoding='utf-8') as load_f:
            json_dict = json.load(load_f)
 
        # 获取图像的高度和宽度
        h, w = json_dict['imageHeight'], json_dict['imageWidth']
 
        # 构建保存 TXT 文件的路径
        txt_path = os.path.join(save_dir, json_path.replace('json', 'txt'))
        with open(txt_path, 'w') as txt_file:
            # 遍历每个形状(标注)
            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)
 
                # 构建 YOLO 格式的标签字符串
                label_str = str(label_index) + ' ' + points_nor_str + '\n'
                # 写入到 TXT 文件
                txt_file.writelines(label_str)
 
 
if __name__ == "__main__":
    """
    命令行用法示例:
    python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir                         
    my_datasets/color_rings/txts --classes "cat,dog"
    """
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(description='json 转换为 txt 参数')
    parser.add_argument('--json-dir', type=str, default="\path\json", help='JSON 文件所在目录')
    parser.add_argument('--save-dir', type=str, default="\path\labels", help='转换后 TXT 文件保存目录')
    parser.add_argument('--classes', type=str, default='name1,name2...', help='类别列表,逗号分隔')
 
    # 解析命令行参数
    args = parser.parse_args()
    json_dir = args.json_dir
    save_dir = args.save_dir
    classes = args.classes
 
    # 调用转换函数
    convert_label_json(json_dir, save_dir, classes)

记住txt文件也是保存到刚才的labels文件夹中。

最后一步,写yolo的配置文件data.yaml:

train: ../train/images
val: ../valid/images
test: ../test/images

nc: 71
names: ['airplane', 'apple', 'backpack', 'baseball bat', 'baseball glove', 'bed', 'bench', 'bicycle', 'bird', 'boat', 'book', 'bottle', 'bowl', 'broccoli', 'bus', 'cake', 'car', 'carrot', 'cell phone', 'chair', 'clock', 'couch', 'cow', 'cup', 'dining table', 'dog', 'donut', 'elephant', 'fire hydrant', 'fork', 'frisbee', 'giraffe', 'handbag', 'horse', 'hot dog', 'keyboard', 'kite', 'knife', 'laptop', 'microwave', 'motorcycle', 'mouse', 'orange', 'oven', 'parking meter', 'person', 'pizza', 'potted plant', 'refrigerator', 'remote', 'sandwich', 'scissors', 'sink', 'skateboard', 'skis', 'snowboard', 'spoon', 'sports ball', 'suitcase', 'surfboard', 'teddy bear', 'tennis racket', 'tie', 'toilet', 'traffic light', 'train', 'truck', 'tv', 'vase', 'wine glass', 'zebra']

这样一个完整的数据集就做好了:

参考内容:https://blog.csdn.net/weixin_53159002/article/details/140128386?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172464130016800188550740%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172464130016800188550740&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-140128386-null-null.142^v100^pc_search_result_base2&utm_term=yolo%E6%95%B0%E6%8D%AE%E9%9B%86%E5%88%B6%E4%BD%9C&spm=1018.2226.3001.4187

COCO数据集是一个广泛使用的计算机视觉数据集,其中包含了各种各样的物体类别和场景,是用于目标检测、图像分割和关键点检测等任务的重要资源。而LabelMe是一种常用的图像标注工具,可以用来为图像数据集生成语义标签。 要制作COCO数据集labelme标注,首先我们需要将COCO数据集的图像导入到LabelMe中。在LabelMe中,我们可以手动创建标注框或者分割区域,并为其添加相应的类别标签。对于目标检测任务,我们需要使用矩形标注工具绘制物体的边界框,并为每个边界框添加相应的物体类别。而对于图像分割任务,我们则需要使用分割标注工具手动绘制每个物体的轮廓,并为其添加相应的语义标签。 完成标注后,LabelMe会自动将标注信息保存为JSON格式的文件,并与原始图像进行关联。这些JSON文件包含了图像的路径、尺寸信息以及每个标注框或分割区域的位置、宽度、高度等信息。此外,JSON文件还包含了标签类别和颜色编码等额外信息。 使用LabelMe标注COCO数据集的好处之一是它的图像可视化界面友好,并且可以灵活地绘制不同形状的标注区域。此外,LabelMe还支持多用户标注、标注数据的半自动导出等功能,方便我们进行标签标注和数据管理。 当我们完成使用LabelMe标注COCO数据集后,我们可以将生成的JSON文件转换为COCO数据集所需的标注格式。通过分析和处理JSON文件中的标注信息,我们可以生成对应的物体边界框、分割区域等标签信息,并与图像数据一起构建COCO数据集,用于训练和评估各种计算机视觉任务的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值