def E(level=1): if level == 0: from common import level1 as P P = partial(P, FOnly=True) # high order function, here we only test LEVEL-1 F CNN elif level == 1: from level import level1 as P elif level == 2: from level import level2 as P else: from level import level3 as P data = getDataFromTxt(TXT) error = np.zeros((len(data), 5)) for i in range(len(data)): imgPath, bbox, landmarkGt = data[i] img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert(img is not None) logger("process %s" % imgPath) landmarkP = P(img, bbox) plot_point[i] = landmarkP # real landmark landmarkP = bbox.reprojectLandmark(landmarkP) landmarkGt = bbox.reprojectLandmark(landmarkGt) error[i] = evaluateError(landmarkGt, landmarkP, bbox) return error
def E(): data = getDataFromTxt(TXT) error = np.zeros((len(data), 3)) for i in range(len(data)): imgPath, bbox, landmarkGt = data[i] landmarkGt = landmarkGt[:3, :] img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert (img is not None) logger("process %s" % imgPath) landmarkP = EN(img, bbox) # real landmark landmarkP = bbox.reprojectLandmark(landmarkP) landmarkGt = bbox.reprojectLandmark(landmarkGt) error[i] = evaluateError(landmarkGt, landmarkP, bbox) return error
def E(): data = getDataFromTxt(TXT) error = np.zeros((len(data), 3)) for i in range(len(data)): imgPath, bbox, landmarkGt = data[i] landmarkGt = landmarkGt[:3, :] img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert(img is not None) logger("process %s" % imgPath) landmarkP = EN(img, bbox) # real landmark landmarkP = bbox.reprojectLandmark(landmarkP) landmarkGt = bbox.reprojectLandmark(landmarkGt) error[i] = evaluateError(landmarkGt, landmarkP, bbox) return error
def generate(ftxt, mode, argument=False): """ Generate Training Data for LEVEL-2 mode = train or test """ data = getDataFromTxt(ftxt) trainData = defaultdict(lambda: dict(patches=[], landmarks=[])) for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert (img is not None) logger("process %s" % imgPath) landmarkPs = randomShiftWithArgument(landmarkGt, 0.05) if not argument: landmarkPs = [landmarkPs[0]] for landmarkP in landmarkPs: for idx, name, padding in types: patch, patch_bbox = getPatch(img, bbox, landmarkP[idx], padding) patch = cv2.resize(patch, (15, 15)) patch = patch.reshape((1, 15, 15)) trainData[name]['patches'].append(patch) _ = patch_bbox.project(bbox.reproject(landmarkGt[idx])) trainData[name]['landmarks'].append(_) for idx, name, padding in types: logger('writing training data of %s' % name) patches = np.asarray(trainData[name]['patches']) landmarks = np.asarray(trainData[name]['landmarks']) patches = processImage(patches) shuffle_in_unison_scary(patches, landmarks) with h5py.File('train/2_%s/%s.h5' % (name, mode), 'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) with open('train/2_%s/%s.txt' % (name, mode), 'w') as fd: fd.write('train/2_%s/%s.h5' % (name, mode))
def generate(ftxt, mode, argument=False): """ Generate Training Data for LEVEL-2 mode = train or test """ data = getDataFromTxt(ftxt) trainData = defaultdict(lambda: dict(patches=[], landmarks=[])) for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert(img is not None) logger("process %s" % imgPath) landmarkPs = randomShiftWithArgument(landmarkGt, 0.05) if not argument: landmarkPs = [landmarkPs[0]] for landmarkP in landmarkPs: for idx, name, padding in types: patch, patch_bbox = getPatch(img, bbox, landmarkP[idx], padding) patch = cv2.resize(patch, (15, 15)) patch = patch.reshape((1, 15, 15)) trainData[name]['patches'].append(patch) _ = patch_bbox.project(bbox.reproject(landmarkGt[idx])) trainData[name]['landmarks'].append(_) for idx, name, padding in types: logger('writing training data of %s'%name) patches = np.asarray(trainData[name]['patches']) landmarks = np.asarray(trainData[name]['landmarks']) patches = processImage(patches) shuffle_in_unison_scary(patches, landmarks) with h5py.File('train/2_%s/%s.h5'%(name, mode), 'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) with open('train/2_%s/%s.txt'%(name, mode), 'w') as fd: fd.write('train/2_%s/%s.h5'%(name, mode))
def generate_hdf5(ftxt, output, fname, argument=False): data = getDataFromTxt(ftxt) F_imgs = [] F_landmarks = [] for (imgPath, landmarkGt, bbox) in data: img = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE) assert (img is not None) logger("process %s" % imgPath) # plt.imshow(img) # plt.show() f_face = img[int(bbox[0]):int(bbox[2]), int(bbox[1]):int(bbox[3])] plt.imshow(f_face) plt.show() f_face = cv2.resize(f_face, (39, 39)) f_face = f_face.reshape((1, 39, 39)) f_landmark = landmarkGt.reshape((10)) F_imgs.append(f_face) F_landmarks.append(f_landmark) F_imgs, F_landmarks = np.asarray(F_imgs), np.asarray(F_landmarks) F_imgs = processImage(F_imgs) shuffle_in_unison_scary(F_imgs, F_landmarks) # full face base = join(OUTPUT, '1_F') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = F_imgs.astype(np.float32) h5['landmark'] = F_landmarks.astype(np.float32)
padding, mode='constant', constant_values=(padval, padval)) # tile the filters into an image data = data.reshape((n, n) + data.shape[1:]).transpose( (0, 2, 1, 3) + tuple(range(4, data.ndim + 1))) data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:]) plt.figure() #新的绘图区 plt.imshow(data) plt.savefig('/home/yhb-pc/CNN_Face_keypoint/log/%s.png' % name) if __name__ == '__main__': data = getDataFromTxt(TXT, with_landmark=False) imgPath, bbox = data[18] img = cv2.imread(imgPath) assert (img is not None) imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) logger("process %s" % imgPath) net = level1_Forward(imgGray, bbox).cnn for i in range(4): feat = net.blobs['conv%s' % str(i + 1)].data vis_square(feat[0], 'conv%s' % str(i + 1), padval=1) feat = net.blobs['pool2'].data vis_square(feat[0], 'pool2', padval=1) for i in range(4): filters = net.params['conv%s' % str(i + 1)][0].data vis_square(filters.reshape(
# force the number of filters to be square n = int(np.ceil(np.sqrt(data.shape[0]))) padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3) data = np.pad(data, padding, mode='constant', constant_values=(padval, padval)) # tile the filters into an image data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1))) data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:]) plt.figure() #新的绘图区 plt.imshow(data) plt.savefig('/home/yhb-pc/CNN_Face_keypoint/log/%s.png'%name) if __name__ == '__main__': data = getDataFromTxt(TXT, with_landmark=False) imgPath, bbox = data[18] img = cv2.imread(imgPath) assert(img is not None) imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) logger("process %s" % imgPath) net = level1_Forward(imgGray, bbox).cnn for i in range(4): feat = net.blobs['conv%s'%str(i+1)].data vis_square(feat[0], 'conv%s'%str(i+1), padval=1) feat = net.blobs['pool2'].data vis_square(feat[0], 'pool2', padval=1) for i in range(4): filters = net.params['conv%s'%str(i+1)][0].data vis_square(filters.reshape(len(filters)*len(filters[0]),len(filters[0,0])
def generateData(ftxt,data_path,net,augmentation=True): if net == "PNet": size = 12 elif net == "RNet": size = 24 elif net == "ONet": size = 48 else: print('Net type error') return image_id = 0 f=open(os.path.join(output,"landmark_%s_aug.txt"%(size)),'w') # get image path , bounding box, and landmarks from file 'ftxt' data=getDataFromTxt(ftxt,data_path=data_path) idx=0 for (imagePath,bbox,landmarkGt) in data: images=[] landmarks=[] img=cv2.imread(imagePath) img_h,img_w,img_c=img.shape #原图所在的坐标 if bbox.right<bbox.left or bbox.bottom<bbox.top: continue gt_box = np.array([bbox.left,bbox.top,bbox.right,bbox.bottom]) f_face = img[bbox.top:bbox.bottom+1,bbox.left:bbox.right+1] #cv2.imshow("face",f_face) #cv2.waitKey(0) f_face=cv2.resize(f_face,(size,size)) landmark=np.zeros((5,2)) #normalize land mark by dividing the width and height of the ground truth bounding box # landmakrGt is a list of tuples for index,one in enumerate(landmarkGt): # (( x - bbox.left)/ width of bounding box, (y - bbox.top)/ height of bounding box rv = ((one[0]-gt_box[0])/(gt_box[2]-gt_box[0]), (one[1]-gt_box[1])/(gt_box[3]-gt_box[1])) landmark[index]=rv images.append(f_face) landmarks.append(landmark.reshape(10)) landmark=np.zeros((5,2)) if augmentation: idx+=1 if idx%100==0: print(idx,"images done") x1,y1,x2,y2=gt_box gt_w=x2-x1+1 gt_h=y2-y1+1 #长宽太小得人脸就不做变换了 if max(gt_w,gt_h)<40 or x1<0 or y1<0: continue #random shift for i in range(10): bbox_size=random.randint(int(min(gt_w, gt_h) * 0.8), np.ceil(1.25 * max(gt_w, gt_h))) delta_x = random.randint(int(-gt_w * 0.2), int(gt_w * 0.2)) delta_y = random.randint(int(-gt_h * 0.2), int(gt_h * 0.2)) nx1 = int(max(x1+gt_w/2-bbox_size/2+delta_x,0)) ny1 = int(max(y1+gt_h/2-bbox_size/2+delta_y,0)) nx2 = nx1 + bbox_size ny2 = ny1 + bbox_size if nx2 > img_w or ny2 > img_h: continue crop_box = np.array([nx1,ny1,nx2,ny2]) cropped_im = img[ny1:ny2+1,nx1:nx2+1,:] resized_im = cv2.resize(cropped_im, (size, size)) #cal iou iou = IoU(crop_box, np.expand_dims(gt_box,0)) if iou>0.65: images.append(resized_im) #normalize for index, one in enumerate(landmarkGt): rv = ((one[0]-nx1)/bbox_size, (one[1]-ny1)/bbox_size) landmark[index] = rv landmarks.append(landmark.reshape(10)) landmark=np.zeros((5,2)) _landmark=landmarks[-1].reshape(-1,2) bbox=BBox([nx1,ny1,nx2,ny2]) #mirror if random.choice([0,1])>0: face_flipped,landmark_flipped=flip(resized_im,_landmark) face_flipped=cv2.resize(face_flipped,(size,size)) images.append(face_flipped) landmarks.append(landmark_flipped.reshape(10)) #rotate逆时针旋转 if random.choice([0,1])>0: #reprojectLandmark将归一化的landmark恢复至原始坐标 face_rotated,landmark_rotated=rotate(img,bbox,bbox.reprojectLandmark(_landmark),5) #重新归一化旋转后的landmark landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated=cv2.resize(face_rotated,(size,size)) images.append(face_rotated) landmarks.append(landmark_rotated.reshape(10)) #flip face_flipped, landmark_flipped = flip(face_rotated, landmark_rotated) face_flipped = cv2.resize(face_flipped, (size, size)) images.append(face_flipped) landmarks.append(landmark_flipped.reshape(10)) #顺时针rotate if random.choice([0,1])>0: #reprojectLandmark将归一化的landmark恢复至原始坐标 face_rotated,landmark_rotated=rotate(img,bbox,bbox.reprojectLandmark(_landmark),-5) #重新归一化旋转后的landmark landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated=cv2.resize(face_rotated,(size,size)) images.append(face_rotated) landmarks.append(landmark_rotated.reshape(10)) #flip face_flipped, landmark_flipped = flip(face_rotated, landmark_rotated) face_flipped = cv2.resize(face_flipped, (size, size)) images.append(face_flipped) landmarks.append(landmark_flipped.reshape(10)) images,landmarks=np.asarray(images),np.asarray(landmarks) print(images) print(np.shape(landmarks)) for i in range(len(images)): if np.sum(np.where(landmarks[i] <= 0, 1, 0)) > 0: continue if np.sum(np.where(landmarks[i] >= 1, 1, 0)) > 0: continue #保存图片 cv2.imwrite(os.path.join(dstdir,'%d.jpg'%(image_id)),images[i]) landmark=map(str,list(landmarks[i])) f.write(os.path.join(dstdir,'%d.jpg'%(image_id))+" -2 "+" ".join(landmark)+"\n") image_id+=1 f.close() return images,landmarks
def generate_hdf5_data(filelist, output, fname, argument=False): data = getDataFromTxt(filelist) F_imgs = [] F_landmarks = [] EN_imgs = [] EN_landmarks = [] NM_imgs = [] NM_landmarks = [] for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert (img is not None) logger("process %s" % imgPath) # Paper Table2 jitter F-layer f_bbox = bbox.subBBox(-0.05, 1.05, -0.05, 1.05) f_face = img[f_bbox.top:f_bbox.bottom + 1, f_bbox.left:f_bbox.right + 1] ## data argument if argument and np.random.rand() > -1: ### flip face_flipped, landmark_flipped = flip(f_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) ### rotation +5 degrees if np.random.rand() > 0.5: face_rotated_by_alpha, landmark_rotated = rotate(img, f_bbox, \ bbox.reprojectLandmark(landmarkGt), 5) landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated_by_alpha = cv2.resize(face_rotated_by_alpha, (39, 39)) F_imgs.append(face_rotated_by_alpha.reshape((1, 39, 39))) F_landmarks.append(landmark_rotated.reshape(10)) ### flip with rotation face_flipped, landmark_flipped = flip(face_rotated_by_alpha, landmark_rotated) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) ### rotation -5 degrees if np.random.rand() > 0.5: face_rotated_by_alpha, landmark_rotated = rotate(img, f_bbox, \ bbox.reprojectLandmark(landmarkGt), -5) landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated_by_alpha = cv2.resize(face_rotated_by_alpha, (39, 39)) F_imgs.append(face_rotated_by_alpha.reshape((1, 39, 39))) F_landmarks.append(landmark_rotated.reshape(10)) ### flip with rotation face_flipped, landmark_flipped = flip(face_rotated_by_alpha, landmark_rotated) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) f_face = cv2.resize(f_face, (39, 39)) en_face = f_face[:31, :] nm_face = f_face[8:, :] f_face = f_face.reshape((1, 39, 39)) f_landmark = landmarkGt.reshape((10)) F_imgs.append(f_face) F_landmarks.append(f_landmark) ## data argument for EN if argument and np.random.rand() > 0.5: ### flip face_flipped, landmark_flipped = flip(en_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (31, 39)).reshape( (1, 31, 39)) landmark_flipped = landmark_flipped[:3, :].reshape((6)) EN_imgs.append(face_flipped) EN_landmarks.append(landmark_flipped) en_face = cv2.resize(en_face, (31, 39)).reshape((1, 31, 39)) en_landmark = landmarkGt[:3, :].reshape((6)) EN_imgs.append(en_face) EN_landmarks.append(en_landmark) ## data argument for NM if argument and np.random.rand() > 0.5: ### flip face_flipped, landmark_flipped = flip(nm_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (31, 39)).reshape( (1, 31, 39)) landmark_flipped = landmark_flipped[2:, :].reshape((6)) NM_imgs.append(face_flipped) NM_landmarks.append(landmark_flipped) nm_face = cv2.resize(nm_face, (31, 39)).reshape((1, 31, 39)) nm_landmark = landmarkGt[2:, :].reshape((6)) NM_imgs.append(nm_face) NM_landmarks.append(nm_landmark) #Convert the list to array F_imgs, F_landmarks = np.asarray(F_imgs), np.asarray(F_landmarks) EN_imgs, EN_landmarks = np.asarray(EN_imgs), np.asarray(EN_landmarks) NM_imgs, NM_landmarks = np.asarray(NM_imgs), np.asarray(NM_landmarks) ### normalize the data and shu F_imgs = processImage(F_imgs) shuffle_in_unison_scary(F_imgs, F_landmarks) EN_imgs = processImage(EN_imgs) shuffle_in_unison_scary(EN_imgs, EN_landmarks) NM_imgs = processImage(NM_imgs) shuffle_in_unison_scary(NM_imgs, NM_landmarks) # full face base = join(OUTPUT, '1_F') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = F_imgs.astype(np.float32) h5['landmark'] = F_landmarks.astype(np.float32) # eye and nose base = join(OUTPUT, '1_EN') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = EN_imgs.astype(np.float32) h5['landmark'] = EN_landmarks.astype(np.float32) # nose and mouth base = join(OUTPUT, '1_NM') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = NM_imgs.astype(np.float32) h5['landmark'] = NM_landmarks.astype(np.float32)
def generate_hdf5_data(filelist, output, fname, argument=False): data = getDataFromTxt(filelist) F_imgs = [] F_landmarks = [] EN_imgs = [] EN_landmarks = [] NM_imgs = [] NM_landmarks = [] for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.CV_LOAD_IMAGE_GRAYSCALE) assert(img is not None) logger("process %s" % imgPath) # Paper Table2 jitter F-layer f_bbox = bbox.subBBox(-0.05, 1.05, -0.05, 1.05) f_face = img[f_bbox.top:f_bbox.bottom+1,f_bbox.left:f_bbox.right+1] ## data argument if argument and np.random.rand() > -1: ### flip face_flipped, landmark_flipped = flip(f_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) ### rotation +5 degrees if np.random.rand() > 0.5: face_rotated_by_alpha, landmark_rotated = rotate(img, f_bbox, \ bbox.reprojectLandmark(landmarkGt), 5) landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated_by_alpha = cv2.resize(face_rotated_by_alpha, (39, 39)) F_imgs.append(face_rotated_by_alpha.reshape((1, 39, 39))) F_landmarks.append(landmark_rotated.reshape(10)) ### flip with rotation face_flipped, landmark_flipped = flip(face_rotated_by_alpha, landmark_rotated) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) ### rotation -5 degrees if np.random.rand() > 0.5: face_rotated_by_alpha, landmark_rotated = rotate(img, f_bbox, \ bbox.reprojectLandmark(landmarkGt), -5) landmark_rotated = bbox.projectLandmark(landmark_rotated) face_rotated_by_alpha = cv2.resize(face_rotated_by_alpha, (39, 39)) F_imgs.append(face_rotated_by_alpha.reshape((1, 39, 39))) F_landmarks.append(landmark_rotated.reshape(10)) ### flip with rotation face_flipped, landmark_flipped = flip(face_rotated_by_alpha, landmark_rotated) face_flipped = cv2.resize(face_flipped, (39, 39)) F_imgs.append(face_flipped.reshape((1, 39, 39))) F_landmarks.append(landmark_flipped.reshape(10)) f_face = cv2.resize(f_face, (39, 39)) en_face = f_face[:31, :] nm_face = f_face[8:, :] f_face = f_face.reshape((1, 39, 39)) f_landmark = landmarkGt.reshape((10)) F_imgs.append(f_face) F_landmarks.append(f_landmark) ## data argument for EN if argument and np.random.rand() > 0.5: ### flip face_flipped, landmark_flipped = flip(en_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (31, 39)).reshape((1, 31, 39)) landmark_flipped = landmark_flipped[:3, :].reshape((6)) EN_imgs.append(face_flipped) EN_landmarks.append(landmark_flipped) en_face = cv2.resize(en_face, (31, 39)).reshape((1, 31, 39)) en_landmark = landmarkGt[:3, :].reshape((6)) EN_imgs.append(en_face) EN_landmarks.append(en_landmark) ## data argument for NM if argument and np.random.rand() > 0.5: ### flip face_flipped, landmark_flipped = flip(nm_face, landmarkGt) face_flipped = cv2.resize(face_flipped, (31, 39)).reshape((1, 31, 39)) landmark_flipped = landmark_flipped[2:, :].reshape((6)) NM_imgs.append(face_flipped) NM_landmarks.append(landmark_flipped) nm_face = cv2.resize(nm_face, (31, 39)).reshape((1, 31, 39)) nm_landmark = landmarkGt[2:, :].reshape((6)) NM_imgs.append(nm_face) NM_landmarks.append(nm_landmark) #Convert the list to array F_imgs, F_landmarks = np.asarray(F_imgs), np.asarray(F_landmarks) EN_imgs, EN_landmarks = np.asarray(EN_imgs), np.asarray(EN_landmarks) NM_imgs, NM_landmarks = np.asarray(NM_imgs),np.asarray(NM_landmarks) ### normalize the data and shu F_imgs = processImage(F_imgs) shuffle_in_unison_scary(F_imgs, F_landmarks) EN_imgs = processImage(EN_imgs) shuffle_in_unison_scary(EN_imgs, EN_landmarks) NM_imgs = processImage(NM_imgs) shuffle_in_unison_scary(NM_imgs, NM_landmarks) # full face base = join(OUTPUT, '1_F') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = F_imgs.astype(np.float32) h5['landmark'] = F_landmarks.astype(np.float32) # eye and nose base = join(OUTPUT, '1_EN') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = EN_imgs.astype(np.float32) h5['landmark'] = EN_landmarks.astype(np.float32) # nose and mouth base = join(OUTPUT, '1_NM') createDir(base) output = join(base, fname) logger("generate %s" % output) with h5py.File(output, 'w') as h5: h5['data'] = NM_imgs.astype(np.float32) h5['landmark'] = NM_landmarks.astype(np.float32)