制作COCO格式数据集

这篇具有很好参考价值的文章主要介绍了制作COCO格式数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

研一上学期要跑一个yoloe,需要用自己的数据集去跑,实验室没有合适的coco格式的数据集,于是需要自己制作数据集,防止以后需要在做的时候忘记,现在把整个操作流程记录下来。

一.利用几个代码来创建VOC格式数据集

  1. 利用代码创建VOC格式文件夹或者自己手动创建。

# 创建VOC格式文件夹

import os
def make_voc_dir():
    os.makedirs('E:\B501\zhizuoshujuji\VOC2100/Annotations')
    os.makedirs('E:\B501\zhizuoshujuji\VOC2100/ImageSets')
    os.makedirs('E:\B501\zhizuoshujuji\VOC2100/ImageSets/Main')
    # os.makedirs('E:\B501\zhizuoshujuji\VOCVOC/ImageSets/Layout')
    # os.makedirs('E:\B501\zhizuoshujuji\VOCVOC/ImageSets/Segmentation')
    os.makedirs('E:\B501\zhizuoshujuji\VOC2100/JPEGImages')
    # os.makedirs('E:\B501\zhizuoshujuji\VOC/SegmentationClass')
    # os.makedirs('E:\B501\zhizuoshujuji\VOC/SegmentationObject')
if __name__ == '__main__':
    make_voc_dir()

因为我做的只是检测,不需要其他任务,所以注释掉了部分,只保留我需要的。

制作COCO格式数据集

然后把图片数据集放在上一级目录,对图片文件进行重命名。然后将重命名后的图片放在JPEGImages中,png格式的图片也可以。

2.图片重命名

#图片重命名
import os
path = 'E:\B501\zhizuoshujuji\images2100'
num= 1
for file in os.listdir(path):
    os.rename(os.path.join(path,file),os.path.join(path,str(num)+'.png'))
    num+=1
制作COCO格式数据集

二.制作VOC数据集

1.创建虚拟环境labelimg,安装labelimg,然后使用labelimg去做标注。

制作COCO格式数据集

安装成功后输入指令labelimg打开软件

制作COCO格式数据集

选择打开图片文件以及保存xml的文件夹

制作COCO格式数据集
制作COCO格式数据集
制作COCO格式数据集

然后进行标注即可,标注完成文件夹如图所示:

制作COCO格式数据集

然后利用几个代码继续制作数据集。

2.生成ImageSet下的Main

# 4make_imagesets
import os
import random

xmlfilepath = r'E:\B501\zhizuoshujuji\VOC2100\Annotations/'  # xml文件的路径
saveBasePath = r'E:\B501\zhizuoshujuji\VOC2100\ImageSets/'  # 生成的txt文件的保存路径

trainval_percent = 0.9  # 训练验证集占整个数据集的比重(划分训练集和测试验证集)
train_percent = 0.8  # 训练集占整个训练验证集的比重(划分训练集和验证集)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

print("train and val size", tv)
print("traub suze", tr)
ftrainval = open(os.path.join(saveBasePath, 'Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath, 'Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath, 'Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath, 'Main/val.txt'), 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
制作COCO格式数据集

然后VOC格式数据集创建完毕。

三.VOC格式数据集转COCO格式数据集

用一个代码转换即可,首先在VOC数据集同级目录放代码以及labels.txt

制作COCO格式数据集

其中labels.txt放几类都可以,我只有一个fish类别,所以我只放了fish。

制作COCO格式数据集

然后开始运行代码

1.json格式的标签文件转换程序

import os
import argparse
import json
import xml.etree.ElementTree as ET
from typing import Dict, List
import re


def get_label2id(labels_path: str) -> Dict[str, int]:
    """id is 1 start"""
    with open(labels_path, 'r') as f:
        labels_str = f.read().split()
    labels_ids = list(range(1, len(labels_str) + 1))
    return dict(zip(labels_str, labels_ids))


def get_annpaths(ann_dir_path: str = None,
                 ann_ids_path: str = None,
                 ext: str = '',
                 annpaths_list_path: str = None) -> List[str]:
    # If use annotation paths list
    if annpaths_list_path is not None:
        with open(annpaths_list_path, 'r') as f:
            ann_paths = f.read().split()
        return ann_paths

    # If use annotaion ids list
    ext_with_dot = '.' + ext if ext != '' else ''
    with open(ann_ids_path, 'r') as f:
        ann_ids = f.read().split()
    ann_paths = [os.path.join(ann_dir_path, aid + ext_with_dot) for aid in ann_ids]
    return ann_paths


def get_image_info(annotation_root, extract_num_from_imgid=True):
    path = annotation_root.findtext('path')
    if path is None:
        filename = annotation_root.findtext('filename')
    else:
        filename = os.path.basename(path)
    img_name = os.path.basename(filename)
    img_id = os.path.splitext(img_name)[0]
    if extract_num_from_imgid and isinstance(img_id, str):
        img_id = int(re.findall(r'\d+', img_id)[0])

    size = annotation_root.find('size')
    width = int(size.findtext('width'))
    height = int(size.findtext('height'))

    image_info = {
        'file_name': filename,
        'height': height,
        'width': width,
        'id': img_id
    }
    return image_info


def get_coco_annotation_from_obj(obj, label2id):
    label = obj.findtext('name')
    assert label in label2id, f"Error: {label} is not in label2id !"
    category_id = label2id[label]
    bndbox = obj.find('bndbox')
    xmin = int(bndbox.findtext('xmin')) - 1
    ymin = int(bndbox.findtext('ymin')) - 1
    xmax = int(bndbox.findtext('xmax'))
    ymax = int(bndbox.findtext('ymax'))
    assert xmax > xmin and ymax > ymin, f"Box size error !: (xmin, ymin, xmax, ymax): {xmin, ymin, xmax, ymax}"
    o_width = xmax - xmin
    o_height = ymax - ymin
    ann = {
        'area': o_width * o_height,
        'iscrowd': 0,
        'bbox': [xmin, ymin, o_width, o_height],
        'category_id': category_id,
        'ignore': 0,
        'segmentation': []  # This script is not for segmentation
    }
    return ann


def convert_xmls_to_cocojson(annotation_paths: List[str],
                             label2id: Dict[str, int],
                             output_jsonpath: str,
                             extract_num_from_imgid: bool = True):
    output_json_dict = {
        "images": [],
        "type": "instances",
        "annotations": [],
        "categories": []
    }
    bnd_id = 1  # START_BOUNDING_BOX_ID, TODO input as args ?

    for a_path in annotation_paths:
        # Read annotation xml
        ann_tree = ET.parse(a_path)
        ann_root = ann_tree.getroot()

        img_info = get_image_info(annotation_root=ann_root,
                                  extract_num_from_imgid=extract_num_from_imgid)
        img_id = img_info['id']
        output_json_dict['images'].append(img_info)

        for obj in ann_root.findall('object'):
            ann = get_coco_annotation_from_obj(obj=obj, label2id=label2id)
            ann.update({'image_id': img_id, 'id': bnd_id})
            output_json_dict['annotations'].append(ann)
            bnd_id = bnd_id + 1

    for label, label_id in label2id.items():
        category_info = {'supercategory': 'none', 'id': label_id, 'name': label}
        output_json_dict['categories'].append(category_info)

    with open(output_jsonpath, 'w') as f:
        output_json = json.dumps(output_json_dict)
        f.write(output_json)
    print('Convert successfully !')


def main():
    parser = argparse.ArgumentParser(
        description='This script support converting voc format xmls to coco format json')
    parser.add_argument('--ann_dir', type=str, default='./Annotations')
    parser.add_argument('--ann_ids', type=str, default='./ImageSets/Main/train.txt')
    parser.add_argument('--ann_paths_list', type=str, default=None)
    parser.add_argument('--labels', type=str, default='./labels.txt')
    parser.add_argument('--output', type=str, default='./output/annotations/train.json')
    parser.add_argument('--ext', type=str, default='xml')
    args = parser.parse_args()
    label2id = get_label2id(labels_path=args.labels)
    ann_paths = get_annpaths(
        ann_dir_path=args.ann_dir,
        ann_ids_path=args.ann_ids,
        ext=args.ext,
        annpaths_list_path=args.ann_paths_list
    )
    convert_xmls_to_cocojson(
        annotation_paths=ann_paths,
        label2id=label2id,
        output_jsonpath=args.output,
        extract_num_from_imgid=True
    )


if __name__ == '__main__':
    if not os.path.exists('./output/annotations'):
        os.makedirs('./output/annotations')
    main()

其中124行和127行需要转换3次,分别改成train.txt,train.json;test.txt,test.json;val.txt,val.json。运行三次得到结果如下:

制作COCO格式数据集

2.然后将对应的图像文件转换至对应文件夹中。

import os
import shutil

images_file_path = './JPEGImages/'
split_data_file_path = './ImageSets/Main/'
new_images_file_path = './output/'

if not os.path.exists(new_images_file_path + 'train'):
    os.makedirs(new_images_file_path + 'train')
if not os.path.exists(new_images_file_path + 'val'):
    os.makedirs(new_images_file_path + 'val')
if not os.path.exists(new_images_file_path + 'test'):
    os.makedirs(new_images_file_path + 'test')

dst_train_Image = new_images_file_path + 'train/'
dst_val_Image = new_images_file_path + 'val/'
dst_test_Image = new_images_file_path + 'test/'

total_txt = os.listdir(split_data_file_path)
for i in total_txt:
    name = i[:-4]
    if name == 'train':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.png'
            dstImage = dst_train_Image + line + '.png'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    elif name == 'val':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.png'
            dstImage = dst_val_Image + line + '.png'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    elif name == 'test':
        txt_file = open(split_data_file_path + i, 'r')
        for line in txt_file:
            line = line.strip('\n')
            line = line.strip('\r')
            srcImage = images_file_path + line + '.png'
            dstImage = dst_test_Image + line + '.png'
            shutil.copyfile(srcImage, dstImage)
        txt_file.close()
    else:
        print("Error, Please check the file name of folder")

代码中的png根据自己的图片后缀进行更改,比如改成jpg。至此COCO格式数据集制作完毕。

制作COCO格式数据集

以上voc转coco代码转自博客:https://blog.csdn.net/a18838956649/article/details/124457462文章来源地址https://www.toymoban.com/news/detail-425317.html

到了这里,关于制作COCO格式数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通信调制信号及时频图数据集制作(MATLAB)

    实现平台:MATLAB2022b         首先产生调制信号,包括八种数字调制类型和三种模拟调制类型: 二相相移键控 (BPSK) 四相相移键控 (QPSK) 八相相移键控 (8-PSK) 十六相正交幅值调制 (16-QAM) 六十四相正交幅值调制 (64-QAM) 四相脉冲幅值调制 (PAM4) 高斯频移键控 (GFSK) 连续相位频移

    2024年02月08日
    浏览(44)
  • 使用KITTI数据集的激光雷达数据(数据预处理+数据集制作+训练)

    目录 1.前言 2. 数据集简介 2.1采集区域 2.2采集平台 3. 激光雷达数据位置 4. 激光雷达数据标签含义 5. 数据预处理与训练 5.1配置openpcdet 5.2数据预处理 5.2.1数据集目录整理 5.2.2数据集格式转化 5.3训练 做激光雷达感知相关工作离不开数据集,激光雷达数据标注价格较高,可选的开

    2024年02月09日
    浏览(54)
  • yolov8-pose姿态估计数据集制作(一)

    最近在搞yolo-pose姿态识别算法,现成的模型已经挺好用了,但是在某些特定的场景下,还是识别不准。所以想着自己搞搞数据,查了网上相关的博客,基本思路都是先按照coco格式来标,然后再转化成yolo格式。不废话,直接说咋干。 这里推荐使用CVAT,好用,没啥说。GitHub链接

    2024年02月11日
    浏览(43)
  • 【GAN】pix2pix算法的数据集制作

    以代码在pycharm中运行为例: 点击上图中的“编辑配置”,如下图: 编辑上图中画红线地方Parameters:

    2024年02月10日
    浏览(37)
  • 【深度学习】YOLOv5实例分割 数据集制作、模型训练以及TensorRT部署

    yolov5-seg:官方地址:https://github.com/ultralytics/yolov5/tree/v6.2 TensorRT:8.x.x 语言:C++ 系统:ubuntu18.04 前言:由于yolo仓中提供了标准coco的json文件转txt代码,因此需要将labelme的json文件转为coco json. labelme JSON 转COCO JSON 使用labelme的CreatePolygons按钮开始绘制多边形,然后保存为json格式。

    2024年02月06日
    浏览(60)
  • 【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

    Follow A-SDF 的 Data Generation 部分: We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ(本人认为是1-2之间需要进行的重要的过渡部分) (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf for generating sampled points and sdf values. follow这个github: ANSCH 在 global_info.py 中,主要修改

    2024年02月08日
    浏览(55)
  • python实现视频抽帧,文件批量操作,文件批量处理(数据集制作的工具箱)

    环境准备 数据集制作 文件批量重命名 文件批量移动 将文件批量按照一定格式进行重命名 修改xml文件内容的方法 Pathlib库的常用接口 在计算机视觉项目中,文件批量操作和文件批量预处理是必不可少的步骤。它们涉及处理大量的图像文件,包括读取、处理、保存和预处理。

    2024年02月09日
    浏览(72)
  • win11系统AVA2.1数据集制作、训练、测试、本地视频验证(完整已跑通)

    本文参照杨帆老师的博客,根据自己的需要进行制作,杨帆老师博客原文链接如下: 自定义ava数据集及训练与测试 完整版 时空动作/行为 视频数据集制作 yolov5, deep sort, VIA MMAction, SlowFast-CSDN博客 文章浏览阅读2.2w次,点赞31次,收藏165次。前言这一篇博客应该是我花时间最多

    2024年02月19日
    浏览(53)
  • YOLOv5训练大规模的遥感实例分割数据集 iSAID从切图到数据集制作及训练

    最近想训练遥感实例分割,纵观博客发现较少相关 iSAID数据集的切分及数据集转换内容,思来想去应该在繁忙之中抽出时间写个详细的教程。 iSAID数据集链接 下载上述数据集。 百度网盘中的train和val中包含了实例和语义分割标签。 上述过程只能下载标签,原始图像为DOTA,

    2024年02月04日
    浏览(67)
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

    由于本人水平有限,难免出现错漏,敬请批评改正。 更多精彩内容,可点击进入YOLO系列专栏或我的个人主页查看 YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制 YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层 YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU YOLOv7训练自己的数据集(口罩检测)

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包