mirror of
https://github.com/deepinsight/insightface.git
synced 2026-05-19 15:41:33 +00:00
144 lines
4.0 KiB
Python
144 lines
4.0 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 AgeDB 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()
|
|
|
|
|
|
for part in [ ('04_FINAL_protocol_30_years.mat', 'agedb_30') ]:
|
|
mat_file = os.path.join(args.data_dir, part[0])
|
|
mat_data = loadmat(mat_file)
|
|
print(mat_data.__class__)
|
|
data = mat_data['splits']
|
|
|
|
bins = []
|
|
issame_list = []
|
|
nrof = [0, 0, 0]
|
|
print('processing', part[1])
|
|
pp = 0
|
|
for i in xrange(data.shape[0]):
|
|
split = data[i][0][0][0][0]
|
|
print(split.shape)
|
|
for c in xrange(split.shape[1]):
|
|
last_name = ''
|
|
for r in xrange(split.shape[0]):
|
|
pp+=1
|
|
if pp%10==0:
|
|
print('processing', pp, nrof)
|
|
item = split[r][c][0][0]
|
|
path = str(item[0][0])
|
|
vec = path.split('_')
|
|
assert len(vec)>=5
|
|
name = vec[0]
|
|
if r==1:
|
|
issame = False
|
|
if name==last_name:
|
|
issame = True
|
|
#print(issame)
|
|
issame_list.append(issame)
|
|
last_name = name
|
|
age = int(item[1])
|
|
#print(path, age)
|
|
#sys.exit(0)
|
|
img_path = os.path.join(args.data_dir, '03_Protocol_Images', path+".jpg")
|
|
#print(img_path)
|
|
img = misc.imread(img_path)
|
|
if img.ndim == 2:
|
|
img = to_rgb(img)
|
|
assert img.ndim==3
|
|
assert img.shape[2]==3
|
|
#img = img[:,:,0:3]
|
|
all_landmark = np.zeros( (68,2), dtype=np.float32)
|
|
pts_file = img_path[0:-3]+"pts"
|
|
pp=0
|
|
|
|
for line in open(pts_file, 'r'):
|
|
pp+=1
|
|
pointid = pp-3
|
|
if pointid<1 or pointid>68:
|
|
continue
|
|
point = [float(x) for x in line.strip().split()]
|
|
assert len(point)==2
|
|
point = np.array(point).reshape( (1,2) )
|
|
#print(pointid)
|
|
all_landmark[pointid-1,:] = point
|
|
|
|
|
|
_landmark = np.zeros( (5,2), dtype=np.float32)
|
|
_landmark[0,:] = (all_landmark[36,:]+all_landmark[39,:])/2
|
|
_landmark[1,:] = (all_landmark[42,:]+all_landmark[45,:])/2
|
|
_landmark[2,:] = all_landmark[33,:]
|
|
_landmark[3,:] = all_landmark[48,:]
|
|
_landmark[4,:] = all_landmark[54,:]
|
|
_bbox = None
|
|
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)
|
|
|
|
|
|
|
|
|
|
|