mirror of
https://github.com/deepinsight/insightface.git
synced 2026-05-19 15:41:33 +00:00
146 lines
4.6 KiB
Python
146 lines
4.6 KiB
Python
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
#import mxnet as mx
|
|
#from mxnet import ndarray as nd
|
|
import argparse
|
|
import cv2
|
|
import pickle
|
|
import numpy as np
|
|
import sys
|
|
from scipy import misc
|
|
import os
|
|
import tensorflow as tf
|
|
from scipy.io import loadmat
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'align'))
|
|
#sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
|
|
import detect_face
|
|
import face_image
|
|
import face_preprocess
|
|
#import lfw
|
|
|
|
def to_rgb(img):
|
|
w, h = img.shape
|
|
ret = np.empty((w, h, 3), dtype=np.uint8)
|
|
ret[:, :, 0] = ret[:, :, 1] = ret[:, :, 2] = img
|
|
return ret
|
|
|
|
|
|
def IOU(Reframe,GTframe):
|
|
x1 = Reframe[0];
|
|
y1 = Reframe[1];
|
|
width1 = Reframe[2]-Reframe[0];
|
|
height1 = Reframe[3]-Reframe[1];
|
|
|
|
x2 = GTframe[0]
|
|
y2 = GTframe[1]
|
|
width2 = GTframe[2]-GTframe[0]
|
|
height2 = GTframe[3]-GTframe[1]
|
|
|
|
endx = max(x1+width1,x2+width2)
|
|
startx = min(x1,x2)
|
|
width = width1+width2-(endx-startx)
|
|
|
|
endy = max(y1+height1,y2+height2)
|
|
starty = min(y1,y2)
|
|
height = height1+height2-(endy-starty)
|
|
|
|
if width <=0 or height <= 0:
|
|
ratio = 0
|
|
else:
|
|
Area = width*height
|
|
Area1 = width1*height1
|
|
Area2 = width2*height2
|
|
ratio = Area*1./(Area1+Area2-Area)
|
|
return ratio
|
|
|
|
parser = argparse.ArgumentParser(description='Package CFP images')
|
|
# general
|
|
parser.add_argument('--data-dir', default='', help='')
|
|
parser.add_argument('--image-size', type=str, default='112,96', help='')
|
|
parser.add_argument('--output', default='./', help='path to save.')
|
|
args = parser.parse_args()
|
|
|
|
with tf.Graph().as_default():
|
|
#gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=args.gpu_memory_fraction)
|
|
#sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
|
|
sess = tf.Session()
|
|
with sess.as_default():
|
|
pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
|
|
|
|
minsize = 20
|
|
threshold = [0.6,0.7,0.9]
|
|
factor = 0.85
|
|
#minsize = 15
|
|
threshold = [0.6,0.7,0.7]
|
|
factor = 0.9
|
|
#factor = 0.7
|
|
|
|
for part in [ ('CFP_frontal_paris.mat', 'cfp_ff'), ('CFP_profile_paris.mat', 'cfp_fp') ]:
|
|
mat_file = os.path.join(args.data_dir, part[0])
|
|
mat_data = loadmat(mat_file)
|
|
pairs = mat_data['pairs']
|
|
bins = []
|
|
issame_list = []
|
|
nrof = [0, 0, 0]
|
|
print('processing', part[1], pairs.shape[1])
|
|
for i in xrange(pairs.shape[1]):
|
|
if i%10==0:
|
|
print('processing', i, nrof)
|
|
pair = pairs[0][i]
|
|
#print(str(pair[0]), str(pair[1]), int(pair[2]), int(pair[3]))
|
|
issame = False
|
|
if int(pair[3])>0:
|
|
issame = True
|
|
issame_list.append(issame)
|
|
fold = int(pair[2])
|
|
paths = [str(pair[0][0]), str(pair[1][0])]
|
|
for path in paths:
|
|
img_path = os.path.join(args.data_dir, 'CFP', path)
|
|
txt_path = os.path.join(args.data_dir, 'CFP', path[0:-3]+"txt")
|
|
landmark = []
|
|
for line in open(txt_path, 'r'):
|
|
vec = line.strip().split(',')
|
|
x = np.array( [float(x) for x in vec], dtype=np.float32)
|
|
landmark.append(x)
|
|
landmark = np.array(landmark, dtype=np.float32)
|
|
#print(landmark.shape)
|
|
img = misc.imread(img_path)
|
|
_bbox = None
|
|
_landmark = None
|
|
bounding_boxes, points = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
|
|
nrof_faces = bounding_boxes.shape[0]
|
|
if nrof_faces>0:
|
|
nrof[0]+=1
|
|
else:
|
|
bounding_boxes, points = detect_face.detect_face_force(img, minsize, pnet, rnet, onet)
|
|
nrof_faces = bounding_boxes.shape[0]
|
|
if nrof_faces>0:
|
|
nrof[1]+=1
|
|
else:
|
|
nrof[2]+=1
|
|
if nrof_faces>0:
|
|
det = bounding_boxes[:,0:4]
|
|
img_size = np.asarray(img.shape)[0:2]
|
|
bindex = 0
|
|
if nrof_faces>1:
|
|
bounding_box_size = (det[:,2]-det[:,0])*(det[:,3]-det[:,1])
|
|
img_center = img_size / 2
|
|
offsets = np.vstack([ (det[:,0]+det[:,2])/2-img_center[1], (det[:,1]+det[:,3])/2-img_center[0] ])
|
|
offset_dist_squared = np.sum(np.power(offsets,2.0),0)
|
|
bindex = np.argmax(bounding_box_size-offset_dist_squared*2.0) # some extra weight on the centering
|
|
_bbox = bounding_boxes[bindex, 0:4]
|
|
_landmark = points[:, bindex].reshape( (2,5) ).T
|
|
warped = face_preprocess.preprocess(img, bbox=_bbox, landmark = _landmark, image_size=args.image_size)
|
|
warped = warped[...,::-1] #to bgr
|
|
_, s = cv2.imencode('.jpg', warped)
|
|
bins.append(s)
|
|
print(nrof)
|
|
outname = os.path.join(args.output, part[1]+'.bin')
|
|
with open(outname, 'wb') as f:
|
|
pickle.dump((bins, issame_list), f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
|
|
|
|
|
|
|