EasyData标注结果格式转换
131*****988 发布于2021-05 浏览:6189 回复:6
1
收藏

直接将 EasyData 标注好的数据导入 AI Studio 中,标注文件是单张图片对应的 .json 格式,如何转换成 Pascal VOC 或 COCO 格式,有没有现成的脚本呢?

收藏
点赞
1
个赞
共6条回复 最后由192******42回复于2023-10
#10192******42回复于2023-10

0
#6只为卿狂与疯回复于2021-08

是直接可以在Easydata里面标注图片音频吗

0
#5O国殇O回复于2021-07

点赞

0
#4O国殇O回复于2021-07

专业

0
#3131*****988回复于2021-05

从 EasyData 中导入的原数据集文件组织结构为:

├── dataset       
│ ├── 1.jpeg
│ ├── 1.json
│ ├── 2.jpeg
│ ├── 2.json
│ ├── 3.jpeg
│ ├── 3.json
│ | ...

其中 .json 的信息如下:

{"labels": [{"name": "label1", "x1": 125, "y1": 724, "x2": 469, "y2": 1076, "size": {"height": 1080, "width": 1920}}, {"name": "label1", "x1": 740, "y1": 115, "x2": 890, "y2": 438, "size": {"height": 1080, "width": 1920}}, {"name": "label2", "x1": 345, "y1": 203, "x2": 485, "y2": 381, "size": {"height": 1080, "width": 1920}}]}

2
#2131*****988回复于2021-05

第一步:生成 images 和 annotations 文件夹

import os
import json
import codecs
import shutil

DATAROOT = '/home/aistudio/work/dataset'
files = os.listdir(DATAROOT)

os.mkdir(DATAROOT + '/images')
os.mkdir(DATAROOT + '/annotations')
os.mkdir(DATAROOT + '/jsons')

images_path = os.path.join(DATAROOT, 'images')
annotations_path = os.path.join(DATAROOT, 'annotations')
jsons_path = os.path.join(DATAROOT, 'jsons')

for file in files:
    if file.endswith('.json'):
        shutil.move(os.path.join(DATAROOT, file), jsons_path)
    if file.endswith('.jpeg'):
        shutil.move(os.path.join(DATAROOT, file), images_path)

json_files = os.listdir(jsons_path)
for json_file in json_files:
    json_path = os.path.join(jsons_path, json_file)

    names, xmins, ymins, xmaxs, ymaxs = [], [], [], [], []
    height, width = 0, 0
    with open(json_path, 'r', encoding='utf-8') as f:
        set = json.load(f)
        result = set['labels']
        num = len(result)
        for n in range(num):
            if n == 0:
                shape = dict['size']
                height = shape['height']
                width = shape['width']

            dict = result[n]
            name = dict['name']
            xmin = dict['x1']
            ymin = dict['y1']
            xmax = dict['x2']
            ymax = dict['y2']

            names.append(name)
            xmins.append(xmin)
            ymins.append(ymin)
            xmaxs.append(xmax)
            ymaxs.append(ymax)

        # print(names, xmins, ymins, xmaxs, ymaxs, height, width)        


    file_id = json_file.split('.')[0]
    xml_path =  os.path.join(annotations_path, file_id + '.xml')

    xml = codecs.open(xml_path, 'w', encoding='utf-8')
    xml.write('\n')
    xml.write('\t' + 'VOC2007' + '\n')
    xml.write('\t' + file_id + '.jpeg\n')    # 1.jpg
    xml.write('\t\n')
    xml.write('\t\tThe VOC 2007 Database\n')
    xml.write('\t\tPascal VOC2007\n')
    xml.write('\t\tflickr\n')
    xml.write('\t\tNULL\n')
    xml.write('\t\n')
    xml.write('\t\n')
    xml.write('\t\t' + str(width) + '\n')
    xml.write('\t\t' + str(height) + '\n')
    xml.write('\t\t3\n')
    xml.write('\t\n')
    xml.write('\t\t0\n')
    
    for i in range(len(names)):
        xml.write('\t\n')
        xml.write('\t\t' + names[i] + '\n')
        xml.write('\t\tUnspecified\n')
        xml.write('\t\t0\n')
        xml.write('\t\t0\n')
        xml.write('\t\t\n')
        xml.write('\t\t\t' + str(xmins[i]) + '\n')
        xml.write('\t\t\t' + str(ymins[i]) + '\n')
        xml.write('\t\t\t' + str(xmaxs[i]) + '\n')
        xml.write('\t\t\t' + str(ymaxs[i]) + '\n')
        xml.write('\t\t\n')
        xml.write('\t\n')

    xml.write('')

此时文件组织结构如下:

├── annotations
│ ├── 1.xml
│ ├── 2.xml
│ ├── 3.xml
│ | ...
├── images
│ ├── 1.jpeg
│ ├── 2.jpeg
│ ├── 3.jpeg
│ | ...

 

第二步:将数据划分为训练集和测试集

# 进入当前路径
%cd /home/aistudio/work/dataset

# 生成 label_list.txt 文件
!echo "label1\label2" > label_list.txt

# 生成 train.txt、valid.txt和test.txt列表文件
!ls images/*.jpeg | shuf > all_image_list.txt
!awk -F"/" '{print $2}' all_image_list.txt | awk -F".jpeg" '{print $1}'  | awk -F"\t" '{print "images/"$1".jpeg annotations/"$1".xml"}' > all_list.txt

# 训练集、验证集、测试集比例分别约80%、10%、10%。
!head -n 297 all_list.txt > test.txt
!head -n 595 all_list.txt | tail -n 298 > valid.txt
!tail -n 2380 all_list.txt > train.txt

# 删除不用文件
!rm -rf all_image_list.txt all_list.txt

最终数据集文件组织结构为:

├── annotations
│ ├── 1.xml
│ ├── 2.xml
│ ├── 3.xml
│ | ...
├── images
│ ├── 1.jpeg
│ ├── 2.jpeg
│ ├── 3.jpeg
│ | ...
├── label_list.txt
├── test.txt
├── train.txt
└── valid.txt

3
快速回复
TOP
切换版块