print('Skipping ' + image_path + ' file path too short')
			continue
		image_path = image_path[:-1]
		print("> Prepare image "+image_path + ":")
		imname = ntpath.basename(image_path)
		#imname = imname[:-4]
		imname = imname.split(imname.split('.')[-1])[0][0:-1]
		img = cv2.imread(image_path)
		## If we have input landmarks
		if len(landmarkDir) > 0:
			lms = np.loadtxt(landmarkDir + '/' + imname + '.pts')
			img2 = cv2.copyMakeBorder(img,0,0,0,0,cv2.BORDER_REPLICATE)
			nLM = lms.shape[0]
			for i in range(0,nLM):
				cv2.circle(img2, (lms[i,0], lms[i,1]), 5, (255,0,0))
			img, lms = utils.cropByInputLM(img, lms, img2)
		else:
			dlib_img = io.imread(image_path)
			img2 = cv2.copyMakeBorder(img,0,0,0,0,cv2.BORDER_REPLICATE)
			dets = detector(img, 1)
			print(">     Number of faces detected: {}".format(len(dets)))
			if len(dets) == 0:
				print('> Could not detect the face, skipping the image...' + image_path)
				continue
			if len(dets) > 1:
				print("> Process only the first detected face!")
			detected_face = dets[0]
			## If we are using landmarks to crop
			shape = predictor(dlib_img, detected_face)
			nLM = shape.num_parts
			for i in range(0,nLM):
     print('Skipping ' + image_path + ' file path too short')
     continue
 image_path = image_path[:-1]
 print("> Prepare image " + image_path + ":")
 imname = ntpath.basename(image_path)
 #imname = imname[:-4]
 imname = imname.split(imname.split('.')[-1])[0][0:-1]
 img = cv2.imread(image_path)
 ## If we have input landmarks
 if len(landmarkDir) > 0:
     lms = np.loadtxt(landmarkDir + '/' + imname + '.pts')
     img2 = cv2.copyMakeBorder(img, 0, 0, 0, 0, cv2.BORDER_REPLICATE)
     nLM = lms.shape[0]
     for i in range(0, nLM):
         cv2.circle(img2, (lms[i, 0], lms[i, 1]), 5, (255, 0, 0))
     img, lms = utils.cropByInputLM(img, lms, img2)
 else:
     dlib_img = io.imread(image_path)
     img2 = cv2.copyMakeBorder(img, 0, 0, 0, 0, cv2.BORDER_REPLICATE)
     dets = detector(img, 1)
     print(">     Number of faces detected: {}".format(len(dets)))
     if len(dets) == 0:
         print('> Could not detect the face, skipping the image...' +
               image_path)
         continue
     if len(dets) > 1:
         print("> Process only the first detected face!")
     detected_face = dets[0]
     ## If we are using landmarks to crop
     shape = predictor(dlib_img, detected_face)
     nLM = shape.num_parts
Beispiel #3
0
def run():

	###################################################
	##### Prepare images ##############################
	countIms = 0
	with open(fileList, "r") as ins, open(data_out + "/imList.txt","w") as outs:
		for image_path in ins:
			# image_path = image_path[:-1]
			print("> Prepare image "+image_path + ":")
			imname = ntpath.basename(image_path)
			#imname = imname[:-4]
			imname = imname.split(imname.split('.')[-1])[0][0:-1]
			img = cv2.imread(image_path)
			## If we have input landmarks
			if len(landmarkDir) > 0:
				lms = np.loadtxt(landmarkDir + '/' + imname + '.pts')
				img2 = cv2.copyMakeBorder(img,0,0,0,0,cv2.BORDER_REPLICATE)
				nLM = lms.shape[0]
				for i in range(0,nLM):
					cv2.circle(img2, (lms[i,0], lms[i,1]), 5, (255,0,0))
				img, lms = utils.cropByInputLM(img, lms, img2)
			else:
				dlib_img = io.imread(image_path)
				img2 = cv2.copyMakeBorder(img,0,0,0,0,cv2.BORDER_REPLICATE)
				dets = detector(img, 1)
				print(">     Number of faces detected: {}".format(len(dets)))
				if len(dets) == 0:
					print('> Could not detect the face, skipping the image...' + image_path)
					continue
				if len(dets) > 1:
					print("> Process only the first detected face!")
				detected_face = dets[0]
				## If we are using landmarks to crop
				shape = predictor(dlib_img, detected_face)
				nLM = shape.num_parts
				for i in range(0,nLM):
					cv2.circle(img2, (shape.part(i).x, shape.part(i).y), 5, (255,0,0))
				img, lms = utils.cropByLM(img, shape, img2)
			cv2.imwrite(data_out + "/imgs/"+imname+"_detect.png",img2)

			lms = lms * 500.0/img.shape[0]
			fileout = open(data_out + "/imgs/"+imname + ".pts","w")
			for i in range(0,lms.shape[0]):
				fileout.write("%f %f\n" % (lms[i,0], lms[i,1]))
			fileout.close()
			img = cv2.resize(img,(500, 500))
			cv2.imwrite(data_out + "/imgs/"+imname+ ".png",img)
			outs.write("%s\n" % (data_out + "/imgs/"+imname+ ".png"))
			countIms = countIms + 1

	###################################################
	##### Shape fitting ############################## 
	# load net
	MainModel = imp.load_source('MainModel', "../CNN/shape_model.py")
	net = torch.load(model_path)
	net.eval()

	mean0 = np.load(mean_path, encoding='latin1')
	mean = mean0['arr_0']
	net.cuda()

	print('> CNN Model loaded to regress 3D Shape and Texture!')
	model = scipy.io.loadmat(BFM_path,squeeze_me=True,struct_as_record=False)
	model = model["BFM"]
	faces = model.faces-1
	print('> Loaded the Basel Face Model to write the 3D output!')
	## For loop over the input images
	count = 0
	with open(data_out + "/imList.txt", "r") as ins:
		for image_path in ins:
			if len(image_path) < 3:
				continue
			image_path = image_path[:-1]
			count = count + 1
			fig_name = ntpath.basename(image_path)
			outFile = data_out + "/shape/" + fig_name[:-4]
			print('> Processing image: ' + image_path)
			im = cv2.imread(image_path)
			im = cv2.resize(im, (224, 224)).astype(float).transpose((2,0,1))
			im = im - mean
			#im = im/255
			im = Variable(torch.from_numpy(im).unsqueeze(0).float().cuda())
			features = net(im).data.cpu().numpy()
			## Writing the regressed 3DMM parameters
			np.savetxt(outFile + '.ply.alpha', features[0,0:99])
			S,T = utils.projectBackBFM(model,features[0,:])
			print('> Writing 3D file in: ', outFile + '.ply')
			utils.write_ply(outFile + '.ply', S, T, faces)

	##################################################
	##### Bump map regression ########################
	print("Regress bump maps")
	bumpMapRegressor.estimateBump(bumpModel_path, data_out + "/imList.txt", data_out + "/bump/")
	##################################################
	##### Recover the 3D models ##################
	print("Recover the 3D models")
	print("./TestBump -batch " + data_out + "/imList.txt " + data_out + "/3D/ " + data_out + "/shape " + data_out + "/bump " + data_out + "/bump ../3DMM_model/BaselFaceModel_mod.h5 ../dlib_model/shape_predictor_68_face_landmarks.dat " + data_out + "/imgs " + data_out + "/imgs/ 1");
	os.system("./TestBump -batch " + data_out + "/imList.txt " + data_out + "/3D/ " + data_out + "/shape " + data_out + "/bump " + data_out + "/bump ../3DMM_model/BaselFaceModel_mod.h5 ../dlib_model/shape_predictor_68_face_landmarks.dat " + data_out + "/imgs " + data_out + "/imgs/ 1");