def geneDataTxt(imgPath,landmarkREF,mode = 'test'): imgTxt = 'dataset/data/testImageList.txt' data = getDataFromTxt(imgTxt,False,False) #image_path,bbox testData = defaultdict(lambda:dict(landmarks=[],patches=[],label=[])) logger("generate 25 positive samples and 500 negative samples for per landmark") testData = generateSamples(testData,data,landmarkREF) for idx,name in types: patches = np.asarray(testData[name]['patches']) landmarks = np.asarray(testData[name]['landmarks']) #label = np.asarray(testData[name]['label']) patches = processImage(patches) shuffle_in_unison_scary(patches,landmarks) createDir('dataset/test/%s' % imgPath[-7:-4]) with h5py.File('dataset/test/%s/%s.h5' % (imgPath[-7:-4],name),'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) #h5['label'] = label.astype(np.uint8) with open('dataset/test/%s/%s.txt' % (imgPath[-7:-4],name),'w') as fd: fd.write('dataset/test/%s/%s.h5'% (imgPath[-7:-4],name)) '''with open('dataset/test/%s.txt' % (name),'w') as fd:
def geneDataTxt(imgPath, landmarks): imgTxt = 'dataset/data/testImageList.txt' data = getDataFromTxt(imgTxt, False, False) #image_path,bbox trainData = defaultdict(lambda: dict(landmarks=[], patches=[], label=[])) logger( "generate 25 positive samples and 500 negative samples for per landmark" ) trainData = generateSamples(trainData, data, landmarks) arr = [] for idx, name in types: patches = np.asarray(trainData[name]['patches']) landmarks = np.asarray(trainData[name]['landmarks']) label = np.asarray(trainData[name]['label']) arr1 = landmarks.reshape(1, -1) arr.append(arr1) patches = processImage(patches) shuffle_in_unison_scary(patches, landmarks, label) with open('test/%s.txt' % (name), 'w') as fd: fd.append(landmarks.astype(np.float32)) fd.append(patches.astype(np.float32)) fd.append(label.astype(np.uint8))
def load_all_shoes(): conn = MongoClient(databaseUri) db = conn.getter shoes = [] labels = [] ids = [] docs = db.items.find( { "detail.images": { "$elemMatch": { "_id": { "$exists": True } } } }, { "detail": 1 }).limit(shoe_limit) fs = [] for doc in docs: if len(doc["detail"]["images"]) == 7: for image in doc["detail"]["images"]: if 'z' in image and image[ "z"] == 90 and 'y' in image and image["y"] == 0: info = { "f": image_source + image["path"], "cat": doc["detail"]["categories"][ len(doc["detail"]["categories"]) - 1], "image_id": image["_id"] } try: fs.append(info) except: print info print doc["_id"]["_id"] counter = 0 for i in fs: # cat = doc["shoe"]["categories"][len(doc["shoe"]["categories"]) - 1] # f = "/getter_data/images/" + str(image["_id"]) + contentTypeExtension[image["content-type"]] print "Processing file [%d / %d] \r" % (counter, len(fs)) counter += 1 print i shoes.append(processImage(i["f"], auto_crop, SZ)) labels.append(shoeCategory[i["cat"]]) ids.append(i["image_id"]) # except Exception, e: # print 'action=processingFile,_id=%s,file=%s,error=%s' % (doc["_id"]["_id"], f, e) # raise e # print "datasetSize=%d" % (len(shoes)) return np.array(shoes), np.array(labels), np.array(ids)
def getResult(img,bbox): # F F,EN,NM = getCNNs(level = 1) 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] f_face = cv2.resize(f_face, (39, 39)) en_face = f_face[:31, :] nm_face = f_face[8:, :] f_face = f_face.reshape((1, 1, 39, 39)) f_face = processImage(f_face) f = F.forward(f_face) # EN # en_bbox = bbox.subBBox(-0.05, 1.05, -0.04, 0.84) # en_face = img[en_bbox.top:en_bbox.bottom+1,en_bbox.left:en_bbox.right+1] en_face = cv2.resize(en_face, (31, 39)).reshape((1, 1, 31, 39)) #en_landmark = (landmarkGt[:3, :] - landmark_pre[:3,:]).reshape((6)) en_face = processImage(en_face) en = EN.forward(en_face) #EN_imgs.append(en_face) #EN_landmarks.append(en_landmark) # NM # nm_bbox = bbox.subBBox(-0.05, 1.05, 0.18, 1.05) # nm_face = img[nm_bbox.top:nm_bbox.bottom+1,nm_bbox.left:nm_bbox.right+1] nm_face = cv2.resize(nm_face, (31, 39)).reshape((1, 1, 31, 39)) #nm_landmark = (landmarkGt[2:, :] - landmark_pre[2:,:]).reshape((6)) nm_face = processImage(nm_face) nm = NM.forward(nm_face) #NM_imgs.append(nm_face) #NM_landmarks.append(nm_landmark) landmark = np.zeros((5, 2)) landmark[0] = (f[0]+en[0]) / 2 landmark[1] = (f[1]+en[1]) / 2 landmark[2] = (f[2]+en[2]+nm[0]) / 3 landmark[3] = (f[3]+nm[1]) / 2 landmark[4] = (f[4]+nm[2]) / 2 return landmark
def load_all_shoes(): conn = MongoClient(databaseUri) db = conn.getter shoes = [] labels = [] ids = [] docs = db.items.find({ "detail.images": { "$elemMatch" : { "_id": { "$exists": True } } } }, { "detail": 1 } ).limit(shoe_limit) fs = [] for doc in docs: if len(doc["detail"]["images"]) == 7: for image in doc["detail"]["images"]: if 'z' in image and image["z"] == 90 and 'y' in image and image["y"] == 0: info = { "f": image_source + image["path"], "cat": doc["detail"]["categories"][len(doc["detail"]["categories"]) - 1] , "image_id": image["_id"] } try: fs.append(info) except: print info print doc["_id"]["_id"] counter = 0; for i in fs: # cat = doc["shoe"]["categories"][len(doc["shoe"]["categories"]) - 1] # f = "/getter_data/images/" + str(image["_id"]) + contentTypeExtension[image["content-type"]] print "Processing file [%d / %d] \r" % (counter, len(fs)) counter += 1 print i shoes.append(processImage(i["f"], auto_crop, SZ)) labels.append(shoeCategory[i["cat"]]) ids.append(i["image_id"]) # except Exception, e: # print 'action=processingFile,_id=%s,file=%s,error=%s' % (doc["_id"]["_id"], f, e) # raise e # print "datasetSize=%d" % (len(shoes)) return np.array(shoes), np.array(labels), np.array(ids)
def NM(img, bbox): """ LEVEL-1, NM img: gray image bbox: bounding box of face """ bbox = bbox.expand(0.05) face = img[bbox.top:bbox.bottom + 1, bbox.left:bbox.right + 1] face = cv2.resize(face, (39, 39)).reshape((1, 1, 39, 39)) face = processImage(face) F, EN, NM = getCNNs(level=1) # TODO more flexible load needed. landmark = NM.forward(face[:, :, 8:, :]) return landmark
def NM(img, bbox): """ LEVEL-1, NM img: gray image bbox: bounding box of face """ bbox = bbox.expand(0.05) face = img[bbox.top:bbox.bottom+1,bbox.left:bbox.right+1] face = cv2.resize(face, (39, 39)).reshape((1, 1, 39, 39)) face = processImage(face) F, EN, NM = getCNNs(level=1) # TODO more flexible load needed. landmark = NM.forward(face[:, :, 8:, :]) return landmark
def generate(ftxt, mode, argument=False): ''' 第二阶段数据源制作 :param ftxt: 数据源文件位置和label :param mode: 训练或测试 :param argument: :return: ''' data = getDataFromTxt(ftxt) trainData = defaultdict(lambda: dict(patches=[], landmarks=[])) for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.IMREAD_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( '/python/face_key_point/data_hdf5/train/2_%s/%s.h5' % (name, mode), 'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) with open( '/python/face_key_point/data_hdf5/train/2_%s/%s.txt' % (name, mode), 'w') as fd: fd.write('/python/face_key_point/data_hdf5/train/2_%s/%s.h5' % (name, mode))
def getResult(img,bbox): # F F,EN,NM = getCNNs(level = 1) 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] f_face = cv2.resize(f_face, (39, 39)) en_face = f_face[:31, :] nm_face = f_face[8:, :] f_face = f_face.reshape((1, 1, 39, 39)) f_face = processImage(f_face) f = F.forward(f_face) return f
def generate(ftxt, mode, argument=False): """ Generate Training Data for LEVEL-3 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.01) 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( '/home/tyd/下载/deep_landmark/mydataset/mytrain/3_%s/%s.h5' % (name, mode), 'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) with open( '/home/tyd/下载/deep_landmark/mydataset/mytrain/3_%s/%s.txt' % (name, mode), 'w') as fd: fd.write( '/home/tyd/下载/deep_landmark/mydataset/mytrain/3_%s/%s.h5' % (name, mode))
def generate_hdf5(): labelfile =readdata('../data/my_alige_landmark.txt') F_imgs = [] F_landmarks = [] for i,l in enumerate(labelfile): imgpath='../data/'+l[0] img=cv2.imread(imgpath) maxx=max(img.shape[0],img.shape[1]) img=sqrtimg(img)#把输入图片填充成正方形,因为我们要训练的图片的大小是正方形的图片255*255 img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#图片转为灰度图像 f_face=cv2.resize(img,(39,39))#把图片缩放成255*255的图片 # F plt.imshow(f_face,cmap='gray') f_face = f_face.reshape((1, 39, 39)) f_landmark =np.asarray(l[1:],dtype='float') F_imgs.append(f_face) #归一化人脸特征点标签,因为上面height等于width,这里比较懒,直接简写 f_landmark=f_landmark/maxx #归一化到0~1之间 print f_landmark 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)#打乱数据 #生成h5py格式 with h5py.File(os.getcwd()+ '/train_data.h5', 'w') as f: f['data'] = F_imgs.astype(np.float32) f['landmark'] = F_landmarks.astype(np.float32) #因为caffe的输入h5py不是直接使用上面的数据,而是需要调用.txt格式的文件 with open(os.getcwd() + '/train.txt', 'w') as f: f.write(os.getcwd() + '/train_data.h5\n') print i
def generate(txt, mode, N): """ generate Training Data for LEVEL-2: patches around landmarks mode: train or validate """ assert (mode == 'train') #从txt文件中获取数据 data = getDataFromTxt(txt, True, True) #return [(image_path,landmarks,bbox)] #用defaultdict存储数据 trainData = defaultdict(lambda: dict(landmarks=[], patches=[], label=[])) logger( "generate 25 positive samples and 500 negative samples for per landmark" ) #产生正负训练样本 trainData = generateSamples(trainData, data) print 'All data:' + str(len(trainData)) #print trainData['L1'] #arr = [] for idx, name in types: #19个点 logger('writing training data of %s' % name) patches = np.asarray(trainData[name]['patches']) landmarks = np.asarray(trainData[name]['landmarks']) label = np.asarray(trainData[name]['label']) #arr1 = landmarks.reshape(1,-1) #arr.append(arr1) patches = processImage(patches) shuffle_in_unison_scary(patches, landmarks, label) #将训练数据保存为hdf5格式 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) h5['label'] = label.astype(np.uint8) with open('train/2_%s/%s.txt' % (name, mode), 'w') as fd: fd.write('train/2_%s/%s.h5' % (name, mode)) #暂时只产生一个点的数据 if idx == 1: break
def generate(ftxt, mode, argument=False): """ Generate Training Data for LEVEL-3 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.01) 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/3_%s/%s.h5'%(name, mode), 'w') as h5: h5['data'] = patches.astype(np.float32) h5['landmark'] = landmarks.astype(np.float32) with open('train/3_%s/%s.txt'%(name, mode), 'w') as fd: fd.write('train/3_%s/%s.h5'%(name, mode))
def generate_hdf5(ftxt, output, fname, argument=False): data = getDataFromTxt(ftxt) F_imgs = [] F_landmarks = [] EN_imgs = [] EN_landmarks = [] NM_imgs = [] NM_landmarks = [] for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE) #读取灰度图 assert (img is not None) logger("process %s" % imgPath) # F 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))) #caffe要求输入的格式 ['batch_size','channel','height','width'] F_landmarks.append(landmark_flipped.reshape(10)) #把10个关键坐标点值变成一维向量 ### rotation # 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 # 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) # EN # en_bbox = bbox.subBBox(-0.05, 1.05, -0.04, 0.84) # en_face = img[en_bbox.top:en_bbox.bottom+1,en_bbox.left:en_bbox.right+1] ## data argument 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) # NM # nm_bbox = bbox.subBBox(-0.05, 1.05, 0.18, 1.05) # nm_face = img[nm_bbox.top:nm_bbox.bottom+1,nm_bbox.left:nm_bbox.right+1] ## data argument 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) #imgs, landmarks = process_images(ftxt, output) 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) 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) #D:.\deep_landmark\dataset\train\1_F\train.h5 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(ftxt, output, fname, argument=False): data = getDataFromTxt(ftxt) 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) # F 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 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 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) # EN # en_bbox = bbox.subBBox(-0.05, 1.05, -0.04, 0.84) # en_face = img[en_bbox.top:en_bbox.bottom+1,en_bbox.left:en_bbox.right+1] ## data argument 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) # NM # nm_bbox = bbox.subBBox(-0.05, 1.05, 0.18, 1.05) # nm_face = img[nm_bbox.top:nm_bbox.bottom+1,nm_bbox.left:nm_bbox.right+1] ## data argument 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) #imgs, landmarks = process_images(ftxt, output) 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) 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(ftxt, output, fname, argument=False): ''' 生成hdf5 :param ftxt: 图片路径对应人脸框和左眼睛、右眼睛、鼻子、左嘴角、右嘴角对应坐标 :param output: hdf5存放位置 :param fname: 保存名称 :param argument: :return: ''' data = getDataFromTxt(ftxt) # 全局图片 F_imgs = [] # 全局坐标 F_landmarks = [] # 只包含了eye nose的图片 EN_imgs = [] # 只包含了eye nose的坐标 EN_landmarks = [] # 只包含nose mouth的图片 NM_imgs = [] # 只包含了nose mouth的坐标 NM_landmarks = [] for (imgPath, bbox, landmarkGt) in data: img = cv2.imread(imgPath, cv2.IMREAD_GRAYSCALE) assert(img is not None) logger("process %s" % imgPath) # 人脸框有点小,扩大一点 f_bbox = bbox.subBBox(-0.05, 1.05, -0.05, 1.05) # 人脸框里面的图像 f_face = img[int(f_bbox.top):int(f_bbox.bottom+1),int(f_bbox.left):int(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)) # 1表示通道 F_imgs.append(face_flipped.reshape((1, 39, 39))) # 5*2的关键点转换为一位数组 F_landmarks.append(landmark_flipped.reshape(10)) ### rotation 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 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) # EN # en_bbox = bbox.subBBox(-0.05, 1.05, -0.04, 0.84) # en_face = img[en_bbox.top:en_bbox.bottom+1,en_bbox.left:en_bbox.right+1] ## data argument 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) # NM # nm_bbox = bbox.subBBox(-0.05, 1.05, 0.18, 1.05) # nm_face = img[nm_bbox.top:nm_bbox.bottom+1,nm_bbox.left:nm_bbox.right+1] ## data argument 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) #imgs, landmarks = process_images(ftxt, output) 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) 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(ftxt, output, fname, argument=False): data = getDataFromTxt(ftxt) 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) # F 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 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 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) # EN # en_bbox = bbox.subBBox(-0.05, 1.05, -0.04, 0.84) # en_face = img[en_bbox.top:en_bbox.bottom+1,en_bbox.left:en_bbox.right+1] ## data argument 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) # NM # nm_bbox = bbox.subBBox(-0.05, 1.05, 0.18, 1.05) # nm_face = img[nm_bbox.top:nm_bbox.bottom+1,nm_bbox.left:nm_bbox.right+1] ## data argument 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) #imgs, landmarks = process_images(ftxt, output) 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) 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)