"""
数据集转换脚本,包含以下内容
1、json文件转txt文件
2、对数据集进行划分,并存放至相应目录
注意:
1、将此程序放置yolov5工程目录下的data文件夹下
2、图像和标签文件夹的名字和我的文件名称改为一致
"""
import json
import os
import cv2
import shutil
import random
json_file_path = './Annotations/'
img_folder_path = './SourceImages/'
label_mapping = {
"nicaishenmeyisi":0,
"jiushiwaner": 1,
}
train_percent = 0.7
val_percent = 0.2
test_percent = 0.1
if not os.path.exists('./temp_labels/'):
os.makedirs('./temp_labels/')
txt_folder_path = './temp_labels/'
def convert(size, box):
dw = 1. / size[0]
dh = 1. / size[1]
x = (box[0] + box[1]) / 2.0
y = (box[2] + box[3]) / 2.0
w = abs(box[1] - box[0])
h = abs(box[3] - box[2])
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def absolute_coordinate_txt(img_name,json_d,img_path):
src_img=cv2.imread(img_path)
h,w = src_img.shape[:2]
txt_name = img_name.split(".")[0]+".txt"
txt_path = os.path.join(txt_folder_path,txt_name)
with open(txt_path,'w') as f:
for item in json_d["shapes"]:
point=item['points']
x1 = point[0][0]
y1 = point[0][1]
x2 = point[1][0]
y2 = point[1][1]
b = (float(x1), float(x2), float(y1), float(y2))
bb = convert((w, h), b)
f.write(str(label_mapping[item['label']]) + " " + " ".join([str(a) for a in bb]) + '\n')
for jsonfile in os.listdir(json_file_path):
temp_path=os.path.join(json_file_path,jsonfile)
jsonfile_path=temp_path
with open(jsonfile_path, "r", encoding='utf-8') as f:
json_d = json.load(f)
img_name = jsonfile[:-4]+"jpg"
img_path=os.path.join(img_folder_path,img_name)
absolute_coordinate_txt(img_name,json_d,img_path)
def create_dir():
if not os.path.exists('./images/'):
os.makedirs('./images/')
if not os.path.exists('./labels/'):
os.makedirs('./labels/')
if not os.path.exists('./images/train/'):
os.makedirs('./images/train')
if not os.path.exists('./images/val/'):
os.makedirs('./images/val/')
if not os.path.exists('./images/test/'):
os.makedirs('./images/test/')
if not os.path.exists('./labels/train/'):
os.makedirs('./labels/train/')
if not os.path.exists('./labels/val/'):
os.makedirs('./labels/val/')
if not os.path.exists('./labels/test/'):
os.makedirs('./labels/test/')
return
print("************************************************************************")
create_dir()
total_txt = os.listdir(txt_folder_path)
num_txt = len(total_txt)
list_all_txt = range(num_txt)
num_train = int(num_txt * train_percent)
num_val = int(num_txt * val_percent)
num_test = num_txt - num_train - num_val
train = random.sample(list_all_txt, num_train)
val_test = [i for i in list_all_txt if not i in train]
val = random.sample(val_test, num_val)
print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
for i in list_all_txt:
name = total_txt[i][:-4]
srcImage = img_folder_path + name + '.jpg'
srcLabel = txt_folder_path + name + '.txt'
if i in train:
dst_train_Image = './images/train/' + name + '.jpg'
dst_train_Label = './labels/train/' + name + '.txt'
shutil.copyfile(srcImage, dst_train_Image)
shutil.copyfile(srcLabel, dst_train_Label)
elif i in val:
dst_val_Image = './images/val/' + name + '.jpg'
dst_val_Label = './labels/val/' + name + '.txt'
shutil.copyfile(srcImage, dst_val_Image)
shutil.copyfile(srcLabel, dst_val_Label)
else:
dst_test_Image = './images/test/' + name + '.jpg'
dst_test_Label = './labels/test/' + name + '.txt'
shutil.copyfile(srcImage, dst_test_Image)
shutil.copyfile(srcLabel, dst_test_Label)
shutil.rmtree(txt_folder_path)