Files
insightface/src/data/agedb2pack2.py
2018-01-24 17:00:19 +08:00

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)