Skip to content

Commit 0aad3e6

Browse files
committed
add preprocess and postprocess
1 parent 8bf8dd7 commit 0aad3e6

File tree

3 files changed

+206
-0
lines changed

3 files changed

+206
-0
lines changed

mat2yolo.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import h5py
2+
import numpy as np
3+
import argparse
4+
import os
5+
from PIL import Image
6+
7+
8+
parser=argparse.ArgumentParser()
9+
parser.add_argument('--data-root',type=str, default='/eva_data/zchin/vrdl_hw2_data',help='data root dir')
10+
args=parser.parse_args()
11+
12+
13+
def get_img_name(f, name_col,idx=0):
14+
img_name = ''.join(map(chr, f[name_col[idx][0]][()].flatten()))
15+
return(img_name)
16+
17+
18+
def get_img_boxes(f, bbox_col,idx=0):
19+
"""
20+
get the 'height', 'left', 'top', 'width', 'label' of bounding boxes of an image
21+
:param f: h5py.File
22+
:param idx: index of the image
23+
:return: dictionary
24+
"""
25+
bbox_prop = ['height', 'left', 'top', 'width', 'label']
26+
meta = { key : [] for key in bbox_prop}
27+
28+
box = f[bbox_col[idx][0]]
29+
for key in box.keys():
30+
if box[key].shape[0] == 1:
31+
meta[key].append(int(box[key][0][0]))
32+
else:
33+
for i in range(box[key].shape[0]):
34+
meta[key].append(int(f[box[key][i][0]][()].item()))
35+
36+
return meta
37+
38+
def yolo_annot(bbox,img_path,annot_path):
39+
annot_f=open(annot_path,'w')
40+
41+
img=Image.open(img_path)
42+
w,h=img.size
43+
44+
label_cnt=len(bbox['label'])
45+
for i in range(label_cnt):
46+
label,height,left,top,width=bbox['label'][i],bbox['height'][i],bbox['left'][i],bbox['top'][i],bbox['width'][i]
47+
if label==10:
48+
label=0
49+
50+
x_center=left+width/2
51+
y_center=top+height/2
52+
x_center_norm=x_center/w
53+
y_center_norm=y_center/h
54+
55+
width_norm=width/w
56+
height_norm=height/h
57+
58+
annot_f.write(f'{label} {x_center_norm} {y_center_norm} {width_norm} {height_norm}\n')
59+
annot_f.close()
60+
61+
62+
63+
if __name__=='__main__':
64+
annot_dir=os.path.join(args.data_root,'labels/all_train')
65+
if not os.path.isdir(annot_dir):
66+
os.makedirs(annot_dir)
67+
68+
mat_f=os.path.join(args.data_root,'train/digitStruct.mat')
69+
mat = h5py.File(mat_f)
70+
71+
data_size=mat['/digitStruct/name'].shape[0]
72+
print(f'Data size: {data_size}')
73+
74+
name_col=mat['/digitStruct/name']
75+
bbox_col=mat['/digitStruct/bbox']
76+
77+
for idx in range(data_size):
78+
img_name=get_img_name(mat,name_col,idx)
79+
bbox=get_img_boxes(mat,bbox_col,idx)
80+
print(img_name, bbox)
81+
annot_f=os.path.join(annot_dir,f'{img_name[:-3]}txt')
82+
img_path=os.path.join(args.data_root,'train',img_name)
83+
yolo_annot(bbox,img_path,annot_f)

train_valid_split.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import glob
2+
import argparse
3+
import math
4+
import random
5+
import os
6+
import shutil
7+
8+
9+
parser=argparse.ArgumentParser()
10+
parser.add_argument('--data-root',type=str,default='/eva_data/zchin/vrdl_hw2_data',help='trainig image saving directory')
11+
parser.add_argument('--ratio',type=float,default=0.2,help='validation data ratio')
12+
parser.add_argument('--data-dir',type=str,default='./data',help='directory to save train valid split results')
13+
args=parser.parse_args()
14+
15+
if __name__=='__main__':
16+
# if not os.path.isdir(args.data_dir):
17+
# os.makedirs(args.data_dir)
18+
19+
src_img_dir=os.path.join(args.data_root,'train')
20+
data_size = len(glob.glob1(src_img_dir,"*.png"))
21+
valid_size=math.floor(data_size*args.ratio)
22+
23+
img_list=[]
24+
for img_path in glob.glob(f'{src_img_dir}/*.png'):
25+
img_list.append(img_path)
26+
27+
idx=random.sample(range(data_size),valid_size)
28+
29+
# train_rec_path=os.path.join(args.data_dir,'train.txt')
30+
# valid_rec_path=os.path.join(args.data_dir,'validation.txt')
31+
# train_rec=open(train_rec_path,'w')
32+
# valid_rec=open(valid_rec_path,'w')
33+
34+
dest_img_dir=os.path.join(args.data_root,'images')
35+
train_img_dir=os.path.join(dest_img_dir,'train')
36+
valid_img_dir=os.path.join(dest_img_dir,'valid')
37+
src_label_dir=os.path.join(args.data_root,'labels/all_train')
38+
train_label_dir=src_label_dir.replace('all_train','train')
39+
valid_label_dir=src_label_dir.replace('all_train','valid')
40+
if not os.path.isdir(dest_img_dir):
41+
os.mkdir(dest_img_dir)
42+
os.mkdir(train_img_dir)
43+
os.mkdir(valid_img_dir)
44+
os.mkdir(train_label_dir)
45+
os.mkdir(valid_label_dir)
46+
47+
48+
for i in range(data_size):
49+
if i in idx:
50+
src_img=img_list[i]
51+
dest_img=src_img.replace('train','images/valid')
52+
shutil.copy(src_img,dest_img)
53+
src_label=src_img.replace('train','labels/all_train').replace('png','txt')
54+
dest_label=src_label.replace('all_train','valid')
55+
shutil.copyfile(src_label,dest_label)
56+
else:
57+
src_img=img_list[i]
58+
dest_img=src_img.replace('train','images/train')
59+
shutil.copy(src_img,dest_img)
60+
src_label=src_img.replace('train','labels/all_train').replace('png','txt')
61+
dest_label=src_label.replace('all_train','train')
62+
shutil.copyfile(src_label,dest_label)
63+
64+
train_size=len(glob.glob1(train_img_dir,"*.png"))
65+
valid_size=len(glob.glob1(valid_img_dir,"*.png"))
66+
print(f'train size: {train_size}\tvalid size: {valid_size}')

yolo2coco.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import argparse
2+
import os
3+
import cv2
4+
import json
5+
6+
7+
parser=argparse.ArgumentParser()
8+
parser.add_argument('--yolo-path',type=str,default='yolov5/runs/detect/exp/labels')
9+
parser.add_argument('--data-root',type=str,default='/eva_data/zchin/vrdl_hw2_data')
10+
args=parser.parse_args()
11+
12+
13+
if __name__=='__main__':
14+
img_dir=os.path.join(args.data_root,'test')
15+
data_listdir=os.listdir(img_dir)
16+
data_listdir.sort(key = lambda x: int(x[:-4]))
17+
18+
result_to_json=[]
19+
for img_name in data_listdir:
20+
img_path=os.path.join(img_dir,img_name)
21+
img=cv2.imread(img_path)
22+
h,w,_=img.shape
23+
24+
image_id=int(img_name[:-4])
25+
label_path=os.path.join(args.yolo_path,img_name.replace('png','txt'))
26+
if not os.path.exists(str(label_path)):
27+
continue
28+
label=open(label_path,'r')
29+
lines=label.readlines()
30+
31+
32+
for line in lines:
33+
det_box_info={}
34+
35+
det_box_info['image_id']=image_id
36+
line=line.strip().split()
37+
x_center,y_center,width,height=float(line[1]),float(line[2]),float(line[3]),float(line[4])
38+
39+
x_center*=w
40+
y_center*=h
41+
width*=w
42+
height*=h
43+
min_x=x_center-width/2
44+
min_y=y_center/2
45+
46+
det_box_info['bbox']=(tuple((min_x,min_y,width,height)))
47+
det_box_info['score']=float(line[5])
48+
det_box_info['category_id']=int(line[0])
49+
result_to_json.append(det_box_info)
50+
51+
label.close()
52+
53+
# Write the list to answer.json
54+
json_object = json.dumps(result_to_json, indent=4)
55+
56+
with open("answer.json", "w") as outfile:
57+
outfile.write(json_object)

0 commit comments

Comments
 (0)