数据集格式转换

TXT 格式转json格式代码

import json
import os
import cv2
import pandas as pd



# 根路径,里面包含images(图片文件夹),annos.txt(bbox标注),classes.txt(类别标签),以及annotations文件夹(如果没有则会自动创建,用于保存最后的json)
root_path = r'D:\Users\Administrator.Micro-2020NXFYQ\Desktop\reinforcement_json'
# 用于创建训练集或验证集
phase = 'val'



data = pd.read_csv(r'D:\Users\Administrator.Micro-2020NXFYQ\Desktop\reinforcement_json\train_labels.csv', encoding='utf-8')

with open(r'D:\Users\Administrator.Micro-2020NXFYQ\Desktop\reinforcement_json\train_labels.txt','a+', encoding='utf-8') as f:
    for line in data.values:
        f.write((str(line[0])+'\t'+str(line[1])+'\n'))



# 打开类别标签
with open(os.path.join(root_path, 'classes.txt')) as f:
    classes = f.read().strip().split()

# dataset用于保存所有数据的图片信息和标注信息
dataset = {'categories': [], 'annotations': [], 'images': []}

# 建立类别标签和数字id的对应关系
for  cls in enumerate(classes, 1):
    dataset['categories'].append({'id': 1, 'name': cls, 'supercategory': 'mark'})




# 读取images文件夹的图片名称
indexes = [f for f in os.listdir(os.path.join(root_path, 'images'))]


with open(os.path.join(root_path, 'val.txt')) as train:
    indexes1 = train.readlines()



#     for j, indexes1 in enumerate(indexes1):
#         name = indexes1.strip().split()




# # 判断是建立训练集还是验证集
# if phase == 'train':
#     indexes = [line for i, line in enumerate(_indexes) if i <= split]
# elif phase == 'val':
#     indexes = [line for i, line in enumerate(_indexes) if i > split]

# 读取Bbox信息
with open(os.path.join(root_path, 'train_labels.txt')) as tr:
    annos = tr.readlines()



    for k, index in enumerate(indexes):
        # 用opencv读取图片,得到图像的宽和高
        im = cv2.imread(os.path.join(root_path, 'images/') + index)
        height, width, _ = im.shape

        for j, indexes_1 in enumerate(indexes1):
            name = indexes_1.strip().split()

            # 判断图像的名称和分出来的训练集的名称对上
            if name[0] == index:


                # 添加图像的信息到dataset中
                dataset['images'].append({'file_name': index,
                                          'id': k,
                                          'width': width,
                                          'height': height})



                for i, anno in enumerate(annos):
                    parts = anno.strip().split()

                    # 如果图像的名称和标记的名称对上,则添加标记
                    if parts[0] == index:
                        # 类别
                        cls_id = 1
                        # x_min
                        x1 = float(parts[1])
                        # y_min
                        y1 = float(parts[2])
                        # x_max
                        x2 = float(parts[3])
                        # y_max
                        y2 = float(parts[4])
                        width = max(0, x2 - x1)
                        height = max(0, y2 - y1)
                        dataset['annotations'].append({
                            'area': width * height,
                            'bbox': [x1, y1, width, height],
                            'category_id': int(cls_id),
                            'id': i,
                            'image_id': k,
                            'iscrowd': 0,
                            # mask, 矩形是从左上角点按顺时针的四个顶点
                            'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]]
                        })







# 保存结果的文件夹
folder = os.path.join(root_path, 'annotations')
if not os.path.exists(folder):
  os.makedirs(folder)
json_name = os.path.join(root_path, 'annotations/{}.json'.format(phase))
with open(json_name, 'w') as f:
  json.dump(dataset, f)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值