今天在处理数据的时候遇到给coco数据集随机分成train,val,test的问题,在网上搜索后看见有博主使用paddleX方法划分。使用后发现存在一个问题:
使用该方法方法划分json时没有同时给image文件夹进行划分
因此我写了一个脚本根据上述方法产生的json文件对图片进行划分
import os
import json
from tqdm import tqdm
import argparse
import shutil
parser = argparse.ArgumentParser()
#这里根据自己的json文件位置,换成自己的就行
parser.add_argument('--origin_path', default='D:/1/yolov7-main/MyDataset/train/JPEGImages',type=str, help="input:image origin path")
parser.add_argument('--json_path1', default='D:/1/yolov7-main/MyDataset/train/annotations/val.json',type=str, help="input: coco format(json)")
parser.add_argument('--json_path2', default='D:/1/yolov7-main/MyDataset/train/annotations.json',type=str, help="input: coco format(json)")
parser.add_argument('--save_path', default='D:/1/yolov7-main/MyDataset/train/val', type=str, help="specify where to save the output dir of labels")
arg = parser.parse_args()
if __name__ == '__main__':
json_file1 = arg.json_path1 # COCO Object Instance 类型的标注
json_file2 = arg.json_path2
save_path = arg.save_path # 保存的路径
origin_path=arg.origin_path
data1 = json.load(open(json_file1, 'r'))
data2 = json.load(open(json_file2, 'r'))
if not os.path.exists(save_path):#如果没有该文件夹存在 创建
os.makedirs(save_path)
annos = data1["annotations"]
images2 = data2["images"]
for j in range(len(annos)):#循环并加上进度条
img_id=annos[j]['image_id']
f_name=images2[img_id-1]['file_name']
if not os.path.exists(os.path.join(save_path, str(img_id)+'jpg')):
shutil.copy(os.path.join(origin_path, f_name), os.path.join(save_path, str(img_id)+'.jpg'))
print(j)