[fd9ef4]: / datasets / CCPG / organize_ccpg.py

Download this file

102 lines (94 with data), 4.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
import os
import pickle
import numpy as np
import cv2
from tqdm import tqdm
import argparse
T_W = 64
T_H = 64
def cut_img(img):
# A silhouette contains too little white pixels
# might be not valid for identification.
# Get the top and bottom point
y = img.sum(axis=1)
y_top = (y != 0).argmax(axis=0)
y_btm = (y != 0).cumsum(axis=0).argmax(axis=0)
img = img[y_top:y_btm + 1, :]
# As the height of a person is larger than the width,
# use the height to calculate resize ratio.
_r = img.shape[1] / img.shape[0]
_t_w = int(T_H * _r)
img = cv2.resize(img, (_t_w, T_H), interpolation=cv2.INTER_AREA)
# Get the median of x axis and regard it as the x center of the person.
sum_point = img.sum()
sum_column = img.sum(axis=0).cumsum()
x_center = -1
for i in range(sum_column.size):
if sum_column[i] > sum_point / 2:
x_center = i
break
if x_center < 0:
return None
h_T_W = int(T_W / 2)
left = x_center - h_T_W
right = x_center + h_T_W
if left <= 0 or right >= img.shape[1]:
left += h_T_W
right += h_T_W
_ = np.zeros((img.shape[0], h_T_W))
img = np.concatenate([_, img, _], axis=1)
img = img[:, left:right]
return img.astype('uint8')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='CCPG dataset Preprocessing.')
parser.add_argument('--sil_path', default='', type=str,
help='Root path of raw silhouette dataset.')
parser.add_argument('--rgb_path', default='', type=str,
help='Root path of raw RGB dataset.')
parser.add_argument('-o', '--output_path', default='',
type=str, help='Output path of pickled dataset.')
args = parser.parse_args()
RGB_SIZE = (128, 128)
for _id in tqdm(sorted(os.listdir(args.sil_path))):
for _type in sorted(os.listdir(os.path.join(args.rgb_path, _id))):
for _view in sorted(os.listdir(os.path.join(args.rgb_path, _id, _type))):
imgs = []
segs = []
ratios = []
aligned_segs = []
for img_file in sorted(os.listdir(os.path.join(args.rgb_path, _id, _type, _view))):
seg_file = img_file.split(".")[0]+".png"
img_path = os.path.join(
args.rgb_path, _id, _type, _view, img_file)
seg_path = os.path.join(
args.rgb_path, _id, _type, _view, seg_file)
if not os.path.exists(seg_path):
print("Not Found: "+seg_path)
continue
img = cv2.imread(img_path)
seg = cv2.imread(seg_path, cv2.IMREAD_GRAYSCALE)
ratio = img.shape[1]/img.shape[0]
aligned_seg = cut_img(seg)
img = np.transpose(cv2.cvtColor(cv2.resize(
img, RGB_SIZE), cv2.COLOR_BGR2RGB), (2, 0, 1))
imgs.append(img)
segs.append(cv2.resize(
seg, RGB_SIZE))
aligned_segs.append(aligned_seg)
ratios.append(ratio)
if len(imgs) > 0:
output_path = os.path.join(
args.output_path, _id, _type, _view)
os.makedirs(output_path, exist_ok=True)
pickle.dump(np.asarray(imgs), open(os.path.join(
output_path, _view+"-rgbs.pkl"), "wb"))
pickle.dump(np.asarray(segs), open(os.path.join(
output_path, _view+"-sils.pkl"), "wb"))
pickle.dump(np.asarray(ratios), open(os.path.join(
output_path, _view+"-ratios.pkl"), "wb"))
pickle.dump(np.asarray(aligned_segs), open(os.path.join(
output_path, _view+"-aligned-sils.pkl"), "wb"))
else:
print("No imgs Found: " +
os.path.join(args.rgb_path, _id, _type, _view))
continue