制作自己的coco数据集

一、整体文件夹形式

在这里插入图片描述data_annotated:将原图以及原图生成的json文件都复制进该文件夹。
data_dataset_coco:运行labelme2coco.py后生成的文件夹,运行前需要把该文件夹删了
labelme2coco.py:将自己数据集转化成coco数据集的脚本。
labels.txt:写分类的种类,有固定格式:

__ignore__
_background_
dog # 这里填写分类的种类
tv/monitor

二、labelme标注数据集

在数据图片中将物体的轮廓标注出来
在这里插入图片描述这里标注完会生成与图片同名的json文件,我们这里把原图和对应的json文件放在同一文件夹中

二、labelme2coco.py代码

#!/usr/bin/env python

import argparse
import collections
import datetime
import glob
import json
import os
import os.path as osp
import sys
import uuid

import imgviz # pip3 install imgviz安装
import numpy as np

import labelme

try:
    import pycocotools.mask
except ImportError:
    print("Please install pycocotools:\n\n    pip install pycocotools\n")
    sys.exit(1)


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument("--input_dir", default='data_annotated')
    parser.add_argument("--output_dir", default='data_dataset_coco')
    parser.add_argument("--labels", default='labels.txt')
    parser.add_argument(
        "--noviz", help="no visualization", action="store_true"
    )
    args = parser.parse_args()

    if osp.exists(args.output_dir):
        print("Output directory already exists:", args.output_dir)
        sys.exit(1)
    os.makedirs(args.output_dir)
    os.makedirs(osp.join(args.output_dir, "JPEGImages"))
    if not args.noviz:
        os.makedirs(osp.join(args.output_dir, "Visualization"))
    print("Creating dataset:", args.output_dir)

    now = datetime.datetime.now()

    data = dict(
        info=dict(
            description=None,
            url=None,
            version=None,
            year=now.year,
            contributor=None,
            date_created=now.strftime("%Y-%m-%d %H:%M:%S.%f"),
        ),
        licenses=[dict(url=None, id=0, name=None,)],
        images=[
            # license, url, file_name, height, width, date_captured, id
        ],
        type="instances",
        annotations=[
            # segmentation, area, iscrowd, image_id, bbox, category_id, id
        ],
        categories=[
            # supercategory, id, name
        ],
    )

    class_name_to_id = {}
    for i, line in enumerate(open(args.labels).readlines()):
        class_id = i - 1  # starts with -1
        class_name = line.strip()
        if class_id == -1:
            assert class_name == "__ignore__"
            continue
        class_name_to_id[class_name] = class_id
        data["categories"].append(
            dict(supercategory=None, id=class_id, name=class_name,)
        )

    out_ann_file = osp.join(args.output_dir, "annotations.json")
    label_files = glob.glob(osp.join(args.input_dir, "*.json"))
    for image_id, filename in enumerate(label_files):
        print("Generating dataset from:", filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]
        out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")

        img = labelme.utils.img_data_to_arr(label_file.imageData)
        imgviz.io.imsave(out_img_file, img)
        data["images"].append(
            dict(
                license=0,
                url=None,
                file_name=osp.relpath(out_img_file, osp.dirname(out_ann_file)),
                height=img.shape[0],
                width=img.shape[1],
                date_captured=None,
                id=image_id,
            )
        )

        masks = {}  # for area
        segmentations = collections.defaultdict(list)  # for segmentation
        for shape in label_file.shapes:
            points = shape["points"]
            label = shape["label"]
            group_id = shape.get("group_id")
            shape_type = shape.get("shape_type", "polygon")
            mask = labelme.utils.shape_to_mask(
                img.shape[:2], points, shape_type
            )

            if group_id is None:
                group_id = uuid.uuid1()

            instance = (label, group_id)

            if instance in masks:
                masks[instance] = masks[instance] | mask
            else:
                masks[instance] = mask

            if shape_type == "rectangle":
                (x1, y1), (x2, y2) = points
                x1, x2 = sorted([x1, x2])
                y1, y2 = sorted([y1, y2])
                points = [x1, y1, x2, y1, x2, y2, x1, y2]
            else:
                points = np.asarray(points).flatten().tolist()

            segmentations[instance].append(points)
        segmentations = dict(segmentations)

        for instance, mask in masks.items():
            cls_name, group_id = instance
            if cls_name not in class_name_to_id:
                continue
            cls_id = class_name_to_id[cls_name]

            mask = np.asfortranarray(mask.astype(np.uint8))
            mask = pycocotools.mask.encode(mask)
            area = float(pycocotools.mask.area(mask))
            bbox = pycocotools.mask.toBbox(mask).flatten().tolist()

            data["annotations"].append(
                dict(
                    id=len(data["annotations"]),
                    image_id=image_id,
                    category_id=cls_id,
                    segmentation=segmentations[instance],
                    area=area,
                    bbox=bbox,
                    iscrowd=0,
                )
            )

        if not args.noviz:
            # print('mask:{}'.format(masks))
            labels, captions, masks = zip(
                *[
                    (class_name_to_id[cnm], cnm, msk)
                    for (cnm, gid), msk in masks.items()
                    if cnm in class_name_to_id
                ]
            )
            viz = imgviz.instances2rgb(
                image=img,
                labels=labels,
                masks=masks,
                captions=captions,
                font_size=15,
                line_width=2,
            )
            out_viz_file = osp.join(
                args.output_dir, "Visualization", base + ".jpg"
            )
            imgviz.io.imsave(out_viz_file, viz)

    with open(out_ann_file, "w") as f:
        json.dump(data, f)


if __name__ == "__main__":
    main()

三、data_dataset_coco解读

文件夹内:
在这里插入图片描述
JPEGImages:里面是原图
Visualization:生成的带mask的图片
annotations.json:annotations字段是包含多个annotation实例的一个数组,annotation类型本身又包含了一系列的字段,如这个目标的category id和segmentation mask。segmentation格式取决于这个实例是一个单个的对象(即iscrowd=0,将使用polygons格式)还是一组对象(即iscrowd=1,将使用RLE格式)

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
制作 COCO 数据集通常涉及以下步骤: 1. 数据收集:收集与你的目标任务相关的图像和注释。可以通过网络上的图像库、已有的数据集或者自主收集来获取数据。 2. 标注数据:对收集到的图像进行标注,以便训练模型。COCO 数据集的常见标注包括对象边界框、类别标签、关键点、分割掩码等信息。 3. 创建 JSON 文件:使用脚本将图像和标注的信息整合到 COCO 数据集的标准 JSON 格式中。JSON 文件包含图像和标注的详细信息,如文件名、图像大小、类别标签、边界框坐标等。 4. 数据划分:根据需求将数据集划分为训练集、验证集和测试集,确保每个集合中的图像和注释都均匀分布。 5. 数据预处理:根据需要进行数据预处理,例如调整图像大小、归一化、增强等操作,以提高模型的性能和泛化能力。 6. 数据验证:对数据集进行验证,确保图像和注释的完整性和准确性。可以使用 COCO 提供的工具进行数据验证和可视化,如 COCO API。 7. 数据发布:将制作好的数据集发布并分享给其他研究者或开发者使用。可以将数据集上传到相应的平台或分享到数据集库中。 请注意,制作 COCO 数据集需要一定的专业知识和技能,并且涉及到大量的时间和精力投入。建议在开始制作之前详细了解 COCO 格式和标注要求,并使用合适的工具和方法进行数据处理和验证。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值