From bb3c15fc71f4f0fd94a3b1038107060fd2470075 Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Mon, 12 Feb 2018 08:51:40 +0800 Subject: [PATCH 1/8] clean --- src/train_tripletloss.py | 377 --------------------------------------- src/val_lfw.py | 92 ---------- 2 files changed, 469 deletions(-) delete mode 100644 src/train_tripletloss.py delete mode 100644 src/val_lfw.py diff --git a/src/train_tripletloss.py b/src/train_tripletloss.py deleted file mode 100644 index c1520a6..0000000 --- a/src/train_tripletloss.py +++ /dev/null @@ -1,377 +0,0 @@ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import os -import sys -import random -import logging -import numpy as np -from data import FaceIter -import mxnet as mx -from mxnet import ndarray as nd -import argparse -import mxnet.optimizer as optimizer -import mxcommon.resnet_dcn as resnet_dcn -import lfw -import sklearn -from sklearn.decomposition import PCA -from center_loss import * - - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - -class AccMetric(mx.metric.EvalMetric): - def __init__(self): - self.axis = 1 - super(AccMetric, self).__init__( - 'acc', axis=self.axis, - output_names=None, label_names=None) - self.losses = [] - - def update(self, labels, preds): - #print(len(labels), len(preds)) - #print(preds[1].asnumpy()) - loss = preds[2].asnumpy()[0] - if len(self.losses)==100: - print('triplet loss', sum(self.losses)/len(self.losses)) - self.losses = [] - self.losses.append(loss) - preds = [preds[1]] #use softmax output - for label, pred_label in zip(labels, preds): - #print(label.shape, pred_label.shape) - if pred_label.shape != label.shape: - pred_label = mx.ndarray.argmax(pred_label, axis=self.axis) - pred_label = pred_label.asnumpy().astype('int32').flatten() - label = label.asnumpy().astype('int32').flatten() - #print(label) - #print(label, pred_label) - assert label.shape==pred_label.shape - self.sum_metric += (pred_label.flat == label.flat).sum() - self.num_inst += len(pred_label.flat) - -def parse_args(): - parser = argparse.ArgumentParser(description='Train face network') - # general - parser.add_argument('--prefix', default='../model/face', - help='directory to save model.') - parser.add_argument('--load-epoch', type=int, default=0, - help='load epoch.') - parser.add_argument('--end-epoch', type=int, default=20, - help='training epoch size.') - parser.add_argument('--retrain', action='store_true', default=False, - help='true means continue training.') - args = parser.parse_args() - return args - -def get_symbol(args, arg_params, aux_params): - new_args = dict({k:arg_params[k] for k in arg_params if 'fc' not in k}) - data_shape = (3,args.image_size,args.image_size) - image_shape = ",".join([str(x) for x in data_shape]) - layers = 152 - _,_,embeddings,_ = resnet_dcn.get_cls_symbol(128, layers, image_shape, use_deformable=False) - all_layers = embeddings.get_internals() - #print(all_layers) - layer_names = ['_plus10','_plus46', '_plus49'] - #layer_names = ['plus2', '_plus10','_plus46', '_plus49'] - layers = [] - for name in layer_names: - layers.append( all_layers[name+"_output"] ) - out_sym = mx.symbol.Group(layers) - out_name = out_sym.list_outputs() - #arg_name = embeddings.list_arguments() - #aux_name = embeddings.list_auxiliary_states() - data_shape_dict = {'data' : (args.batch_size,)+data_shape} - arg_shape, out_shape, aux_shape = out_sym.infer_shape(**data_shape_dict) - #print(out_shape) - out_shape_dict = dict(zip(out_name, out_shape)) - for k,v in out_shape_dict.iteritems(): - print(k,v) - - layers = [] - for i in xrange(len(layer_names)): - name = layer_names[i]+"_output" - _layer = all_layers[name] - _kernel = out_shape_dict[name][2]//5 - if _kernel>1: - layer = mx.sym.Pooling(data=_layer, kernel=(_kernel, _kernel), stride=(_kernel,_kernel), pad=(0,0), pool_type='max') - else: - layer = _layer - layer = mx.symbol.Convolution(data=layer, kernel=(3, 3), pad=(1,1), num_filter=128) - layers.append(layer) - body = mx.symbol.concat(*layers, dim=1) - body = mx.symbol.Convolution(data=body, kernel=(1, 1), pad=(0,0), num_filter=128) - body = mx.sym.Pooling(data=body, global_pool=True, kernel=(5, 5), pool_type='avg', name='last_pool') - embeddings = mx.sym.Flatten(data=body) - _, out_shape, _= embeddings.infer_shape(**data_shape_dict) - print(out_shape) - #print(arg_shape) - #sys.exit(0) - l2_embeddings = mx.symbol.L2Normalization(embeddings) - batch_size = args.batch_size//args.ctx_num - anchor = mx.symbol.slice_axis(l2_embeddings, axis=0, begin=0, end=batch_size//3) - positive = mx.symbol.slice_axis(l2_embeddings, axis=0, begin=batch_size//3, end=2*batch_size//3) - negative = mx.symbol.slice_axis(l2_embeddings, axis=0, begin=2*batch_size//3, end=batch_size) - ap = anchor - positive - an = anchor - negative - ap = ap*ap - an = an*an - ap = mx.symbol.sum(ap, axis=1, keepdims=1) #(T,1) - an = mx.symbol.sum(an, axis=1, keepdims=1) #(T,1) - loss_scale = [1.0, 0.0, 0.0] - #triplet_loss = mx.symbol.broadcast_maximum(0.0, ap-an+args.margin) #(T,1) - triplet_loss = mx.symbol.Activation(data = (ap-an+args.margin), act_type='relu') - triplet_loss = mx.symbol.sum(triplet_loss)/(batch_size//3) - triplet_loss = mx.symbol.MakeLoss(data = triplet_loss, grad_scale = loss_scale[0]) - data = mx.symbol.Variable('data') - gt_label = mx.symbol.Variable('softmax_label') - fc = mx.symbol.FullyConnected(data = embeddings, num_hidden = args.num_classes, name="fc2") - softmax = mx.symbol.SoftmaxOutput(data=fc, label = gt_label, name='softmax', grad_scale = loss_scale[1]) - if loss_scale[2]>0.0: - _center_loss = mx.symbol.Custom(data = l2_embeddings, label = gt_label, name='center_loss', op_type='centerloss' - , num_class= args.num_classes, alpha = 0.5, scale=loss_scale[2], batchsize=batch_size) - out = mx.symbol.Group([mx.symbol.BlockGrad(l2_embeddings), softmax, triplet_loss, _center_loss]) - else: - out = mx.symbol.Group([mx.symbol.BlockGrad(l2_embeddings), softmax, triplet_loss]) - #out = triplet_loss - #out = softmax - return (out, new_args, aux_params) - -def train_net(args): - ctx = [] - cvd = os.environ['CUDA_VISIBLE_DEVICES'].strip() - if len(cvd)>0: - for i in xrange(len(cvd.split(','))): - ctx.append(mx.gpu(i)) - if len(ctx)==0: - ctx = [mx.cpu()] - print('use cpu') - else: - print('gpu num:', len(ctx)) - prefix = args.prefix - end_epoch = args.end_epoch - pretrained = '../model/resnet-152' - load_epoch = args.load_epoch - args.image_size = 160 - per_batch_size = 60 - args.ctx_num = len(ctx) - args.batch_size = per_batch_size*args.ctx_num - #args.all_batch_size = args.batch_size*args.ctx_num - args.bag_size = 3600 - args.margin = 0.2 - args.num_classes = 10575 #webface - - - data_shape = (3,args.image_size,args.image_size) - - begin_epoch = 0 - base_lr = 0.05 - base_wd = 0.0002 - base_mom = 0.0 - lr_decay = 0.98 - if not args.retrain: - #load and initialize params - print(pretrained) - _, arg_params, aux_params = mx.model.load_checkpoint(pretrained, load_epoch) - sym, arg_params, aux_params = get_symbol(args, arg_params, aux_params) - #arg_params, aux_params = load_param(pretrained, epoch, convert=True) - data_shape_dict = {'data': (args.batch_size, 3, args.image_size, args.image_size), 'softmax_label': (args.batch_size,)} - resnet_dcn.init_weights(sym, data_shape_dict, arg_params, aux_params) - else: - pretrained = args.prefix - sym, arg_params, aux_params = mx.model.load_checkpoint(pretrained, load_epoch) - begin_epoch = load_epoch - end_epoch = begin_epoch+10 - base_wd = 0.00005 - lr_decay = 0.5 - base_lr = 0.015 - # infer max shape - - model = mx.mod.Module( - context = ctx, - symbol = sym, - #label_names = [], - #fixed_param_prefix = fixed_param_prefix, - ) - - train_dataiter = FaceIter( - path_imglist = "/raid5data/dplearn/faceinsight_align_webface.lst", - data_shape = data_shape, - mod = model, - ctx_num = args.ctx_num, - batch_size = args.batch_size, - bag_size = args.bag_size, - images_per_person = 5, - ) - - #_dice = DiceMetric() - _acc = AccMetric() - eval_metrics = [mx.metric.create(_acc)] - - # rpn_eval_metric, rpn_cls_metric, rpn_bbox_metric, eval_metric, cls_metric, bbox_metric - #for child_metric in [fcn_loss_metric]: - # eval_metrics.add(child_metric) - - # callback - #batch_end_callback = callback.Speedometer(input_batch_size, frequent=args.frequent) - #epoch_end_callback = mx.callback.module_checkpoint(mod, prefix, period=1, save_optimizer_states=True) - - # decide learning rate - #lr_step = '10,20,30' - #train_size = 4848 - #nrof_batch_in_epoch = int(train_size/input_batch_size) - #print('nrof_batch_in_epoch:', nrof_batch_in_epoch) - #lr_factor = 0.1 - #lr_epoch = [float(epoch) for epoch in lr_step.split(',')] - #lr_epoch_diff = [epoch - begin_epoch for epoch in lr_epoch if epoch > begin_epoch] - #lr = base_lr * (lr_factor ** (len(lr_epoch) - len(lr_epoch_diff))) - #lr_iters = [int(epoch * train_size / batch_size) for epoch in lr_epoch_diff] - #print 'lr', lr, 'lr_epoch_diff', lr_epoch_diff, 'lr_iters', lr_iters - - #lr_scheduler = MultiFactorScheduler(lr_iters, lr_factor) - - # optimizer - #optimizer_params = {'momentum': 0.9, - # 'wd': 0.0005, - # 'learning_rate': base_lr, - # 'rescale_grad': 1.0, - # 'clip_gradient': None} - initializer = mx.init.Xavier(rnd_type='gaussian', factor_type="in", magnitude=2) - #opt = optimizer.SGD(learning_rate=base_lr, momentum=0.9, wd=base_wd, rescale_grad=(1.0/args.batch_size)) - opt = optimizer.SGD(learning_rate=base_lr, momentum=base_mom, wd=base_wd, rescale_grad=1.0) - #opt = optimizer.AdaGrad(learning_rate=base_lr, wd=base_wd, rescale_grad=1.0) - _cb = mx.callback.Speedometer(args.batch_size, 10) - - lfw_dir = '/raid5data/dplearn/lfw_mtcnn' - lfw_pairs = lfw.read_pairs(os.path.join(lfw_dir, 'pairs.txt')) - lfw_paths, issame_list = lfw.get_paths(lfw_dir, lfw_pairs, 'png') - imgs = [] - lfw_data_list = [] - for flip in [0,1]: - lfw_data = nd.empty((len(lfw_paths), 3, args.image_size, args.image_size)) - i = 0 - for path in lfw_paths: - with open(path, 'rb') as fin: - _bin = fin.read() - img = mx.image.imdecode(_bin) - img = nd.transpose(img, axes=(2, 0, 1)) - if flip==1: - img = img.asnumpy() - for c in xrange(img.shape[0]): - img[c,:,:] = np.fliplr(img[c,:,:]) - img = nd.array( img ) - #print(img.shape) - lfw_data[i][:] = img - i+=1 - if i%1000==0: - print('loading lfw', i) - print(lfw_data.shape) - lfw_data_list.append(lfw_data) - - def lfw_test(nbatch): - print('testing lfw..') - embeddings_list = [] - for i in xrange( len(lfw_data_list) ): - lfw_data = lfw_data_list[i] - embeddings = None - ba = 0 - while ba=0 and param.nbatch%400==0: - acc = lfw_test(param.nbatch) - if acc>highest_acc[0]: - highest_acc[0] = acc - if acc>0.9 and acc-last_save_acc[0]>=0.01: - print('saving', mbatch, acc, last_save_acc[0]) - _arg, _aux = model.get_params() - mx.model.save_checkpoint(args.prefix, mbatch, model.symbol, _arg, _aux) - last_save_acc[0] = acc - print('[%d]highest Accu: %1.3f'%(param.nbatch, highest_acc[0])) - - - - - sys.stdout.flush() - sys.stderr.flush() - - epoch_cb = mx.callback.do_checkpoint(prefix, 1) - #epoch_cb = None - - - - def _epoch_callback(epoch, sym, arg_params, aux_params): - print('epoch-end', epoch) - - model.fit(train_dataiter, - begin_epoch = begin_epoch, - num_epoch = end_epoch, - #eval_data = val_dataiter, - eval_metric = eval_metrics, - kvstore = 'device', - optimizer = opt, - #optimizer_params = optimizer_params, - initializer = initializer, - arg_params = arg_params, - aux_params = aux_params, - allow_missing = True, - batch_end_callback = _batch_callback, - epoch_end_callback = epoch_cb ) - -def main(): - #time.sleep(3600*6.5) - args = parse_args() - print('Called with argument:', args) - train_net(args) - -if __name__ == '__main__': - main() diff --git a/src/val_lfw.py b/src/val_lfw.py deleted file mode 100644 index b64b8f2..0000000 --- a/src/val_lfw.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import division - -import numpy as np -import os -import sys -sys.path.append(os.path.join(os.path.dirname(__file__), 'eval')) -import lfw -import sklearn -from sklearn.decomposition import PCA - -lfw_dir = '/raid5data/dplearn/lfw_mtcnn2' -lfw_pairs = lfw.read_pairs(os.path.join(lfw_dir, 'pairs.txt')) -lfw_paths, issame_list = lfw.get_paths(lfw_dir, lfw_pairs, 'jpg') - -model_dir = '../model' - -models = ['sphereface_p0_20-lfw-0006.npy'] -models = ['sphereface-64-p0_0_96_95_0-lfw-0001.npy'] -models = ['sphereface_p0_20-lfw-0006.npy', 'sphereface-64-p0_0_96_95_0-lfw-0001.npy'] -models = ['sphereface-20-p0_0_96_112_0-lfw-0022.npy','sphereface-20-p0_0_96_95_0-lfw-0021.npy', 'sphereface-20-p0_40_96_112_0-lfw-0022.npy'] -models = ['sphereface-20-p0_0_96_112_0-lfw-0022.npy','sphereface-20-p0_0_96_95_0-lfw-0021.npy', 'sphereface-36-p0_0_96_112_0-lfw-0022.npy'] -models = ['sphereface-20-p0_0_96_112_0-lfw-0022.npy','sphereface-20-p0_0_96_95_0-lfw-0021.npy'] -models = ['sphereface-20-p0_0_96_112_0-lfw-0022.npy','sphereface-20-p0_0_96_95_0-lfw-0021.npy', 'sphereface-36-p0_0_96_112_0-lfw-0022.npy'] -models = ['sphereface-20-p0_0_96_112_0-lfw-0022.npy','sphereface-20-p0_0_96_95_0-lfw-0021.npy', 'sphereface-36-p0_0_96_95_0-lfw-0021.npy'] -models = [ - #'sphereface-20-p0_0_96_112_0-lfw-0022.npy', - #'sphereface-20-p0_0_96_95_0-lfw-0021.npy', - #'sphereface-20-p0_0_80_95_0-lfw-0021.npy', - #'sphereface-36-p0_0_96_95_0-lfw-0021.npy', - 'sphereface-s60-p0_0_96_112_0-lfw-0031.npy', - 'sphereface-s60-p0_0_96_95_0-lfw-0021.npy', - 'sphereface2-s60-p0_0_96_112_0-lfw-0021.npy', - 'sphereface3-s60-p0_0_96_95_0-lfw-0023.npy', - #'sphereface-s60-p0_0_80_95_0-lfw-0025.npy', - #'sphereface-s60-p16_0_96_112_0-lfw-0023.npy', - #'spherefacec-s60-p0_0_96_112_0-lfw-0021.npy', - ] -models = [ - '../model31/sphere-m51-p0_0_96_112_0-lfw-0083.npy', - '../model/softmax-m53-p0_0_96_112_0-lfw-0026.npy', - #'../model32/sphere-m30-p0_0_96_112_0-lfw-0092.npy', - ] -#models = models[0:3] -concat = True -pca = False -weights = None -#weights = [0.5, 1.0, 0.5] - -F = None -ii = 0 -for m in models: - model = m - #model = os.path.join(model_dir, m) - X = np.load(model) - X1 = X[0:(X.shape[0]//2),:] - X2 = X[(X.shape[0]//2):,:] - print(X.shape, X1.shape, X2.shape) - #X1 = sklearn.preprocessing.normalize(X1) - #X2 = sklearn.preprocessing.normalize(X2) - XX = X1+X2 - XX = sklearn.preprocessing.normalize(XX) - if weights is not None: - weight = weights[ii] - XX *= weight - if F is None: - F = XX - else: - if concat: - F = np.concatenate((F,XX), axis=1) - else: - F += XX - ii+=1 - #if concat: - # F = np.concatenate((F,X2), axis=1) - #else: - # F += X2 - -print(F.shape) -npca = 0 -if concat and pca: - #F = sklearn.preprocessing.normalize(F) - npca = 180 - #pca = PCA(n_components=512) - #F = pca.fit_transform(F) - for npca in xrange(512,513,1): - _, _, accuracy, val, val_std, far = lfw.evaluate(F, issame_list, nrof_folds=10, pca=npca) - print('[%d]Accuracy: %1.5f+-%1.5f' % (npca, np.mean(accuracy), np.std(accuracy))) -else: - F = sklearn.preprocessing.normalize(F) - _, _, accuracy, val, val_std, far = lfw.evaluate(F, issame_list, nrof_folds=10, pca=npca) - print('[%d]Accuracy: %1.5f+-%1.5f' % (0, np.mean(accuracy), np.std(accuracy))) - print('Validation rate: %2.5f+-%2.5f @ FAR=%2.5f' % (val, val_std, far)) From 7c4a217d77df1bd1267218735aec5e013c888013 Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Tue, 13 Feb 2018 13:34:27 +0800 Subject: [PATCH 2/8] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 30cd605..51dab59 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ ### Recent Update -  **`2018.02.07`**: We evaluate LFW,CFP,AgeDB-30 again after removing training set overlaps, the results almost stay the same. See [Results](#results) for detail. + **`2018.02.13`**: We achieved state-of-the-art performance on [MegaFace-Challenge-1](http://megaface.cs.washington.edu/results/facescrub.html), at `98.06%`. Also note that the training set we used has NO identities overlap with facescrub, please check our paper for detail. + + **`2018.02.07`**: We evaluate LFW,CFP,AgeDB-30 again after removing training set overlaps, the results almost stay the same. See [Results](#results) for detail. **`2018.01.30`**: We provide a *LResNet50E-IR* model which can achieve **`99.80@LFW`** and **`97.64%`** at MegaFace 1M Acc. See [Pretrained-Models](#pretrained-models) for detail. From 2927b1a6fe3bf7ec46e7969ea3b77e82882193a8 Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Fri, 16 Feb 2018 18:33:27 +0800 Subject: [PATCH 3/8] add megaface noises and rules --- src/megaface/README.md | 6 + src/megaface/facescrub_noises.txt | 606 +++++++++++++++++++++++++ src/megaface/megaface_noises.txt | 720 ++++++++++++++++++++++++++++++ src/megaface/remove_noises.py | 175 ++++++++ 4 files changed, 1507 insertions(+) create mode 100644 src/megaface/README.md create mode 100644 src/megaface/facescrub_noises.txt create mode 100644 src/megaface/megaface_noises.txt create mode 100644 src/megaface/remove_noises.py diff --git a/src/megaface/README.md b/src/megaface/README.md new file mode 100644 index 0000000..ede1546 --- /dev/null +++ b/src/megaface/README.md @@ -0,0 +1,6 @@ +Please strictly follow these rules if you want to use our MegaFace noises list. + +* Please cite our paper and git repo if you want to use this list in your paper. +* Please include the information like `We used the noises list proposed by InsightFace, at https://github.com/deepinsight/insightface/tree/master/src/megaface` if you want to submit the result to MegaFace challenge. +* To be fair, if you want to submit MegaFace result, please remove the FaceScrub-overlapped identities from your training set if cosine similarity is larger than 0.4 with FaceScrub identities(by using centre feature vector). +* If you find more overlaps noise, please open an issue at InsightFace. diff --git a/src/megaface/facescrub_noises.txt b/src/megaface/facescrub_noises.txt new file mode 100644 index 0000000..da28c10 --- /dev/null +++ b/src/megaface/facescrub_noises.txt @@ -0,0 +1,606 @@ +#Please strictly follow the rules in https://github.com/deepinsight/insightface/tree/master/src/megaface/README.md if you want to use this list. +Aaron_Eckhart_136.png +Aaron_Eckhart_221.png +Adam_McKay_468.png +Adam_McKay_478.png +Adam_Sandler_558.png +Adrienne_Barbeau_4259.png +Adrienne_Frantz_27683.png +Adrienne_Frantz_27693.png +Adrienne_Frantz_27699.png +Adrienne_Frantz_27701.png +Adrienne_Frantz_27829.png +Aisha_Hinds_35768.png +Alec_Baldwin_2121.png +Alice_Krige_40717.png +Alley_Mills_52029.png +Alley_Mills_52039.png +Alley_Mills_52044.png +Allison_Janney_37357.png +Allison_Janney_37447.png +Alyson_Hannigan_32288.png +Alyssa_Milano_51641.png +America_Ferrera_25859.png +America_Ferrera_25870.png +Amy_Davidson_18553.png +Andrea_Bogart_8427.png +Andrea_Bowen_8992.png +Andrea_Bowen_9090.png +Andy_Richter_3141.png +Angell_Conwell_15508.png +Anne_Hathaway_33648.png +Anne_Hathaway_33685.png +Annie_Ilonzeh_37123.png +Anthony_Hopkins_3562.png +Anthony_Hopkins_3595.png +Anthony_Hopkins_3694.png +Antonio_Banderas_4016.png +Arnold_Vosloo_4287.png +Ashley_Benson_4144.png +Ashley_Johnson_37631.png +Ashley_Johnson_37649.png +Audra_McDonald_49657.png +Audrey_Landers_42201.png +Audrey_Landers_42246.png +Barbara_Carrera_11961.png +Ben_Affleck_4700.png +Ben_Affleck_4706.png +Ben_Affleck_4762.png +Ben_Affleck_4885.png +Ben_Kingsley_5146.png +Ben_McKenzie_5219.png +Ben_Stiller_5419.png +Ben_Stiller_5432.png +Bernard_Hill_5869.png +Bernard_Hill_5969.png +Bernie_Mac_6083.png +Billy_Bob_Thornton_7010.png +Billy_Bob_Thornton_7016.png +Billy_Bob_Thornton_7028.png +Billy_Bob_Thornton_7047.png +Billy_Bob_Thornton_7069.png +Billy_Bob_Thornton_7093.png +Billy_Bob_Thornton_7106.png +Billy_Bob_Thornton_7140.png +Billy_Bob_Thornton_7161.png +Billy_Boyd_7281.png +Billy_Boyd_7334.png +Billy_Burke_7418.png +Billy_Burke_7556.png +Billy_Burke_7558.png +Billy_Zane_7799.png +Billy_Zane_7821.png +Bobbie_Eakes_23690.png +Bobbie_Eakes_23702.png +Brad_Pitt_8285.png +Bradley_Cooper_8416.png +Brianna_Brown_10455.png +Brianna_Brown_10482.png +Brooke_Langton_42515.png +Brooke_Langton_42603.png +Brooke_Langton_42604.png +Brooke_Langton_42628.png +Brooke_Langton_42634.png +Brooke_Langton_42643.png +Bruce_Greenwood_8831.png +Candice_Bergen_6028.png +Candice_Bergen_6055.png +Candice_Bergen_6080.png +Carla_Gallo_28085.png +Carla_Gallo_28139.png +Carmen_Electra_24315.png +Caroline_Dhavernas_21720.png +Cary_Elwes_9746.png +Casey_Affleck_9925.png +Cathy_Lee_Crosby_16548.png +Cathy_Lee_Crosby_16564.png +Chase_Masterson_48256.png +Chazz_Palminteri_10758.png +Cheryl_Hines_35834.png +Chris_Evans_10942.png +Chris_Evans_10943.png +Chris_Evans_10990.png +Chris_Evans_11000.png +Chris_Evans_11039.png +Chris_Kattan_11206.png +Chris_Klein_11329.png +Chris_Klein_11346.png +Chris_Klein_11471.png +Christa_Miller_51872.png +Christian_Bale_11961.png +Christina_Applegate_2776.png +Christopher_Lloyd_12504.png +Christopher_Reeve_12692.png +Christopher_Reeve_12737.png +Chyler_Leigh_43366.png +Chyler_Leigh_43374.png +Ciara_Bravo_10094.png +Ciara_Bravo_10161.png +Ciara_Bravo_10214.png +Clint_Eastwood_12918.png +Colin_Farrell_13196.png +Colin_Farrell_13268.png +Colin_Farrell_13282.png +Colin_Firth_13455.png +Colin_Firth_13566.png +Courteney_Cox_16360.png +Crystal_Chappell_13859.png +Crystal_Chappell_13921.png +Crystal_Chappell_13932.png +Crystal_Chappell_13949.png +Crystal_Chappell_13961.png +Dan_Lauria_13992.png +Dan_Lauria_14073.png +Dana_Delany_20425.png +Dana_Delany_20561.png +Dana_Delany_20621.png +Dana_Delany_20632.png +Daniel_Day-Lewis_14356.png +Daniel_Day-Lewis_14361.png +Daniel_Day-Lewis_14397.png +Daniel_Day-Lewis_14545.png +Daniel_Radcliffe_14770.png +David_Schwimmer_15942.png +David_Wenham_16210.png +David_Wenham_16221.png +David_Wenham_16224.png +David_Wenham_16235.png +David_Wenham_16241.png +David_Wenham_16261.png +David_Wenham_16295.png +David_Wenham_16300.png +David_Wenham_16327.png +Dean_Cain_16435.png +Debra_Messing_50555.png +Debra_Messing_50597.png +Debra_Messing_50703.png +Debra_Messing_50746.png +Delta_Burke_11111.png +Delta_Burke_11176.png +Denzel_Washington_16698.png +Desmond_Harrington_17178.png +Diahann_Carroll_12351.png +Diahann_Carroll_12397.png +Dianna_Agron_269.png +Dianna_Agron_363.png +Dianna_Agron_375.png +Dianna_Agron_396.png +Dustin_Hoffman_17932.png +Elizabeth_Berkley_6214.png +Elizabeth_Berkley_6259.png +Elizabeth_Hendrickson_34413.png +Ellen_Greene_30978.png +Ellen_Greene_31003.png +Ellen_Greene_31005.png +Emily_Deschanel_20666.png +Erin_Cummings_17368.png +Erin_Cummings_17400.png +Erin_Cummings_17457.png +Ethan_Hawke_19548.png +Eva_Longoria_45027.png +Farah_Fath_25299.png +Farah_Fath_25343.png +Farah_Fath_25365.png +Farah_Fath_25401.png +Farrah_Fawcett_25594.png +Florencia_Lozano_45592.png +Florencia_Lozano_45594.png +Florencia_Lozano_45606.png +Florencia_Lozano_45632.png +Florencia_Lozano_45640.png +Fran_Drescher_22955.png +Fran_Drescher_23030.png +Gabrielle_Carteris_12657.png +Gates_McFadden_49864.png +Gates_McFadden_49868.png +Glenn_Close_14672.png +Glenn_Close_14739.png +Harrison_Ford_22656.png +Hayden_Christensen_23089.png +Heather_Locklear_44410.png +Heather_Locklear_44498.png +Heather_Locklear_44504.png +Heather_Locklear_44527.png +Holly_Marie_Combs_15225.png +Ian_Holm_24214.png +Jackee_Harry_32964.png +Jackee_Harry_33011.png +James_Brolin_26065.png +James_Frain_26352.png +James_Franco_26574.png +James_Marsden_26731.png +James_Marsden_26756.png +James_McAvoy_26932.png +Jamie_Lee_Curtis_17869.png +Jamie_Lee_Curtis_18018.png +Jamie_Lee_Curtis_18056.png +Jamie_Luner_46356.png +Jamie_Luner_46423.png +Jane_Curtin_17787.png +Jane_Curtin_17820.png +Jane_Leeves_42833.png +Jane_Lynch_46639.png +Jane_Lynch_46743.png +January_Jones_38213.png +January_Jones_38384.png +January_Jones_38414.png +Jasmine_Guy_31496.png +Jasmine_Guy_31562.png +Jasmine_Guy_31594.png +Jasmine_Guy_31618.png +Jasmine_Guy_31678.png +Jason_Biggs_28339.png +Jason_Lee_55690.png +Jason_Lee_55703.png +Jeanne_Cooper_15551.png +Jeanne_Cooper_15652.png +Jeanne_Cooper_15696.png +Jenilee_Harrison_32833.png +Jenilee_Harrison_32864.png +Jenilee_Harrison_32895.png +Jennette_McCurdy_49314.png +Jennie_Garth_28672.png +Jennie_Garth_28686.png +Jeremy_Sisto_29948.png +Jessica_Biel_7413.png +Jessica_Capshaw_11891.png +Jessica_Capshaw_11909.png +Jessica_Leccia_42714.png +Jessica_Leccia_42719.png +Jill_Eikenberry_24108.png +Jill_Eikenberry_24159.png +Jill_Eikenberry_24166.png +Jill_Eikenberry_24179.png +Jill_Eikenberry_24188.png +Jill_Hennessy_35087.png +Jim_Carrey_30976.png +Jim_Carrey_31137.png +Jim_Carrey_31150.png +Joan_Collins_14963.png +Joanna_Kerns_40119.png +Joanna_Kerns_40127.png +Joanna_Kerns_40145.png +Joanna_Kerns_40162.png +Joanna_Kerns_40170.png +Joanna_Kerns_40177.png +John_Malkovich_32908.png +John_Malkovich_32934.png +Jon_Hamm_33859.png +Jonathan_Rhys_Meyers_34545.png +Jonathan_Sadowski_55304.png +Josh_Brolin_34866.png +Josh_Duhamel_35073.png +Josie_Bissett_7155.png +Josie_Bissett_7222.png +Josie_Bissett_7243.png +Joyce_DeWitt_20190.png +Julia_Louis-Dreyfus_45687.png +Julia_Louis-Dreyfus_45785.png +Julie_Marie_Berman_6437.png +Justin_Long_35979.png +Justin_Long_35983.png +Justine_Bateman_4879.png +Kassie_DePaiva_19841.png +Katherine_Helmond_34045.png +Kathy_Baker_3934.png +Kathy_Baker_3984.png +Kathy_Griffin_31087.png +Kathy_Griffin_31113.png +Kellan_Lutz_36883.png +Kevin_Costner_37976.png +Kim_Cattrall_13087.png +Kim_Delaney_20329.png +Kim_Delaney_20363.png +Kim_Fields_26573.png +Kimberlin_Brown_10564.png +Kimberly_McCullough_49225.png +Kirstie_Alley_1565.png +Kit_Harington_38601.png +Kit_Harington_38638.png +Kristen_Alderson_615.png +Kristen_Alderson_714.png +Kristen_Johnston_37751.png +Kristin_Chenoweth_14161.png +Kristin_Chenoweth_14220.png +Kristin_Chenoweth_14242.png +Kristy_McNichol_50183.png +Kristy_McNichol_50205.png +Kristy_McNichol_50256.png +Kristy_McNichol_50272.png +Kristy_McNichol_50295.png +Kristy_McNichol_50304.png +Kristy_McNichol_50314.png +Lacey_Chabert_13239.png +Lacey_Chabert_13291.png +Laura_Innes_37302.png +Laura_Innes_37329.png +Laura_Leighton_43101.png +Laura_Leighton_43169.png +Lauralee_Bell_5169.png +Lauralee_Bell_5206.png +Lauralee_Bell_5272.png +Lauren_Holly_36179.png +Lauren_Holly_36191.png +Lauren_Holly_36211.png +Lauren_Koslow_40373.png +Lauren_Koslow_40426.png +Lauren_Koslow_40428.png +Lauren_Koslow_40434.png +Lauren_Koslow_40453.png +Laurie_Metcalf_50846.png +Laurie_Metcalf_50878.png +Laurie_Metcalf_50883.png +Laurie_Metcalf_50897.png +Laurie_Metcalf_50916.png +Laurie_Metcalf_50917.png +Laurie_Metcalf_50920.png +Laurie_Metcalf_50946.png +Laurie_Metcalf_50973.png +Laurie_Metcalf_50984.png +Laurie_Metcalf_50986.png +Laurie_Metcalf_50989.png +Laurie_Metcalf_51019.png +Lea_Michele_51327.png +Lea_Michele_51337.png +Lea_Michele_51362.png +Lea_Michele_51363.png +Lea_Michele_51427.png +Lecy_Goranson_30511.png +Lecy_Goranson_30538.png +Lecy_Goranson_30539.png +Lesley-Anne_Down_22118.png +Lesley-Anne_Down_22144.png +Lesley-Anne_Down_22249.png +Lexi_Ainsworth_126.png +Lexi_Ainsworth_129.png +Lexi_Ainsworth_150.png +Lexi_Ainsworth_28.png +Lexi_Ainsworth_47.png +Lexi_Ainsworth_54.png +Liev_Schreiber_39673.png +Linda_Evans_24646.png +Linda_Evans_24670.png +Linda_Gray_30789.png +Linda_Gray_30823.png +Linda_Gray_30895.png +Lindsay_Hartley_33089.png +Lindsay_Hartley_33091.png +Lindsay_Hartley_33182.png +Lindsay_Hartley_33188.png +Lindsay_Hartley_33192.png +Lisa_Bonet_8489.png +Lisa_Bonet_8547.png +Lisa_Kudrow_40922.png +Lisa_LoCicero_44328.png +Lisa_LoCicero_44334.png +Loni_Anderson_2152.png +Loni_Anderson_2190.png +Lorraine_Bracco_9632.png +Lorraine_Bracco_9746.png +Lourdes_Benedicto_5324.png +Lourdes_Benedicto_5360.png +Mary_Beth_Evans_24742.png +Mary_Crosby_16814.png +Mary_Crosby_16826.png +Mary_Crosby_16827.png +Mary_Crosby_16835.png +Mary_Crosby_16856.png +Mary_Crosby_16867.png +Mary_Crosby_16876.png +Matt_Czuchry_41100.png +Matt_Dillon_41441.png +Matt_Dillon_41584.png +Melina_Kanakaredes_39464.png +Melissa_Archer_3127.png +Melissa_Archer_3169.png +Melissa_Benoist_5425.png +Melissa_Benoist_5490.png +Melissa_Benoist_5507.png +Melissa_Benoist_5523.png +Melissa_Benoist_5538.png +Michael_Douglas_43514.png +Michael_Douglas_43520.png +Michael_Douglas_43593.png +Michael_Landes_43643.png +Michael_Landes_43712.png +Michael_Vartan_43752.png +Michael_Vartan_43873.png +Mila_Kunis_41190.png +Miranda_Cosgrove_15892.png +Molly_Burnett_11287.png +Molly_Burnett_11323.png +Morena_Baccarin_3662.png +Natalia_Livingston_44183.png +Natalie_Hall_31866.png +Natalie_Hall_31875.png +Natalie_Hall_31898.png +Natalie_Hall_31914.png +Natalie_Martinez_48106.png +Natalie_Martinez_48117.png +Natalie_Martinez_48191.png +Neve_Campbell_11584.png +Nicole_Eggert_23928.png +Nicole_Eggert_24088.png +Nicole_de_Boer_19422.png +Nicole_de_Boer_19448.png +Olivia_d'Abo_18077.png +Olivia_d'Abo_18126.png +Olivia_d'Abo_18133.png +Olivia_d'Abo_18166.png +Olivia_d'Abo_18188.png +Olivia_d'Abo_18202.png +Olivia_d'Abo_18224.png +Olivia_d'Abo_18228.png +Olivia_d'Abo_18229.png +Pamela_Sue_Martin_47876.png +Pamela_Sue_Martin_48018.png +Pamela_Sue_Martin_48027.png +Patricia_Arquette_3360.png +Patricia_Kalember_39346.png +Patricia_Kalember_39361.png +Patricia_Kalember_39365.png +Patricia_Kalember_39366.png +Patricia_Kalember_39367.png +Patricia_Kalember_39369.png +Peggy_Lipton_43900.png +Peggy_Lipton_43935.png +Peggy_Lipton_43962.png +Peggy_Lipton_44032.png +Peggy_Lipton_44070.png +Peggy_Lipton_44071.png +Peggy_McCay_48867.png +Peggy_McCay_48870.png +Peggy_McCay_48883.png +Peggy_McCay_48897.png +Peri_Gilpin_29456.png +Philip_Seymour_Hoffman_47737.png +Philip_Seymour_Hoffman_47778.png +Portia_Doubleday_22036.png +Portia_Doubleday_22101.png +Portia_de_Rossi_19903.png +Portia_de_Rossi_19908.png +Portia_de_Rossi_19957.png +Portia_de_Rossi_19963.png +Portia_de_Rossi_19997.png +Portia_de_Rossi_20036.png +Portia_de_Rossi_20069.png +Rachel_Dratch_22646.png +Rachel_Dratch_22751.png +Rebecca_Budig_10668.png +Rebecca_Budig_10714.png +Rebecca_Budig_10756.png +Rebecca_Budig_10785.png +Rebecca_Budig_10792.png +Rebecca_Budig_10805.png +Rebecca_Herbst_35381.png +Rebecca_Herbst_35391.png +Rebecca_Herbst_35407.png +Rebecca_Herbst_35454.png +Richard_E._Grant_48348.png +Richard_Gere_48555.png +Richard_Gere_48559.png +Richard_Madden_48806.png +Robert_Di_Niro_49242.png +Robert_Downey_Jr._49395.png +Robert_Downey_Jr._49485.png +Robert_Duvall_49683.png +Robert_Duvall_49684.png +Robert_Duvall_49744.png +Robert_Knepper_49865.png +Roma_Downey_22357.png +Roma_Downey_22378.png +Roseanne_Barr_4520.png +Roseanne_Barr_4546.png +Roseanne_Barr_4622.png +Rue_McClanahan_48968.png +Rue_McClanahan_49092.png +Rue_McClanahan_49151.png +Rupert_Friend_50825.png +Ryan_Gosling_51576.png +S._Epatha_Merkerson_50436.png +S._Epatha_Merkerson_50464.png +Sara_Gilbert_29260.png +Sara_Gilbert_29333.png +Sarah_Drew_23164.png +Sarah_Drew_23166.png +Sarah_Drew_23174.png +Sarah_Drew_23209.png +Sarah_Drew_23245.png +Sarah_Drew_23272.png +Sarah_Drew_23286.png +Sarah_Hyland_36867.png +Sean_Bean_52769.png +Selena_Gomez_30458.png +Selena_Gomez_30471.png +Seth_Rogen_52915.png +Seth_Rogen_53117.png +Seth_Rogen_53123.png +Shannen_Doherty_21826.png +Shannon_Kane_39638.png +Shannon_Kane_39729.png +Shannon_Kane_39732.png +Sharon_Case_12719.png +Sharon_Case_12779.png +Sharon_Case_12889.png +Sharon_Gless_29936.png +Sharon_Gless_29976.png +Sharon_Gless_29987.png +Sharon_Gless_29989.png +Shelley_Hack_31728.png +Shelley_Hack_31736.png +Shelley_Hack_31826.png +Sherilyn_Fenn_25694.png +Shirley_Jones_38512.png +Shirley_Jones_38556.png +Staci_Keanan_39993.png +Staci_Keanan_40018.png +Staci_Keanan_40038.png +Staci_Keanan_40068.png +Stana_Katic_39947.png +Susan_Flannery_27075.png +Susan_Flannery_27095.png +Susan_Flannery_27128.png +Swoosie_Kurtz_41518.png +Swoosie_Kurtz_41605.png +Tamala_Jones_38648.png +Tamara_Braun_9874.png +Tatyana_M._Ali_1228.png +Tatyana_M._Ali_1266.png +Tatyana_M._Ali_1290.png +Tatyana_M._Ali_1349.png +Taylor_Atelian_3507.png +Taylor_Atelian_3517.png +Taylor_Atelian_3526.png +Taylor_Atelian_3532.png +Taylor_Atelian_3533.png +Taylor_Atelian_3553.png +Taylor_Atelian_3559.png +Taylor_Atelian_3566.png +Taylor_Atelian_3581.png +Taylor_Lautner_54170.png +Taylor_Lautner_54238.png +Taylor_Lautner_54258.png +Taylor_Lautner_54279.png +Taylor_Lautner_54292.png +Taylor_Lautner_54296.png +Taylor_Lautner_54328.png +Tempestt_Bledsoe_8014.png +Tempestt_Bledsoe_8062.png +Tempestt_Bledsoe_8063.png +Teri_Hatcher_33393.png +Teri_Hatcher_33395.png +Teri_Hatcher_33401.png +Terry_Farrell_25136.png +Terry_Farrell_25203.png +Tia_Carrere_12136.png +Tia_Carrere_12240.png +Tobey_Maguire_54398.png +Tom_Hanks_54730.png +Tyne_Daly_18276.png +Tyne_Daly_18293.png +Tyne_Daly_18322.png +Tyne_Daly_18362.png +Tyne_Daly_18370.png +Tyne_Daly_18399.png +Tyne_Daly_18420.png +Valerie_Cruz_17158.png +Valerie_Harper_32638.png +Valerie_Harper_32705.png +Valerie_Harper_32771.png +Vanessa_Marcil_47131.png +Vanessa_Marcil_47158.png +Vanessa_Marcil_47182.png +Veronica_Hamel_32010.png +Veronica_Hamel_32016.png +Veronica_Hamel_32020.png +Veronica_Hamel_32030.png +Victor_Garber_54809.png +Victor_Garber_54894.png +Victoria_Justice_39219.png +Wanda_De_Jesus_19687.png +Wendie_Malick_46848.png +Yasmine_Bleeth_8219.png +Yasmine_Bleeth_8238.png +Yasmine_Bleeth_8259.png +Yasmine_Bleeth_8350.png +Zooey_Deschanel_20937.png diff --git a/src/megaface/megaface_noises.txt b/src/megaface/megaface_noises.txt new file mode 100644 index 0000000..f4bf156 --- /dev/null +++ b/src/megaface/megaface_noises.txt @@ -0,0 +1,720 @@ +#Please strictly follow the rules in https://github.com/deepinsight/insightface/tree/master/src/megaface/README.md if you want to use this list. +375/37531198@N00/4174611825_0.jpg +375/37531198@N00/4174611825_1.jpg +925/92596048@N00/3910487430_2.jpg +587/58736276@N00/3023685783_2.jpg +905/90553008@N00/824787574_0.jpg +350/35034345966@N01/3086429616_0.jpg +388/38847947@N03/4351812234_0.jpg +788/78865207@N05/8267101710_0.jpg +495/49503172960@N01/2674784671_0.jpg +481/48122140@N00/3488870947_0.jpg +770/77029195@N00/490108118_3.jpg +566/56692742@N05/8202697602_1.jpg +546/54613470@N00/6155519468_0.jpg +486/48600102544@N01/206574155_6.jpg +857/85705006@N00/2052818739_0.jpg +345/34531071@N07/3374444062_1.jpg +714/71490499@N06/6460912773_0.jpg +790/79045485@N00/8312851597_9.jpg +497/49703429@N00/487110767_5.jpg +588/58819758@N00/502852994_0.jpg +603/60370779@N07/12733436605_1.jpg +351/35197415@N06/3392955585_0.jpg +414/41464693@N02/4431128027_1.jpg +745/74536253@N07/7744893278_0.jpg +745/74536253@N07/7744893278_1.jpg +745/74536253@N07/7744893278_2.jpg +745/74536253@N07/7746445288_0.jpg +720/72093892@N00/8394540214_0.jpg +943/94306126@N05/8585087758_0.jpg +316/31635293@N06/10300923803_0.jpg +316/31635293@N06/10300923803_1.jpg +461/46151867@N00/1361048872_0.jpg +316/31658559@N04/11248071845_2.jpg +510/51035763730@N01/3487351916_0.jpg +381/38176611@N04/6845223441_1.jpg +812/8127814@N07/1169159373_0.jpg +596/59689442@N00/397368405_0.jpg +457/45702277@N04/4404748345_2.jpg +457/45702277@N04/4405512456_0.jpg +315/31557769@N04/5183029470_0.jpg +105/105042823@N05/10224905845_1.jpg +233/23302147@N08/6717536683_0.jpg +943/94324445@N02/8585299005_5.jpg +865/86525452@N06/9026905203_1.jpg +575/57593906@N00/183103326_0.jpg +575/57593906@N00/183103326_1.jpg +513/51313580@N08/6077728920_10.jpg +794/79447530@N00/2646557330_3.jpg +838/8385182@N06/8791791352_2.jpg +834/83452322@N00/1379291226_0.jpg +299/29932833@N06/4605882096_0.jpg +125/12523672@N02/1368391674_0.jpg +251/25193498@N00/4015722351_2.jpg +207/20741443@N00/5045852254_2.jpg +313/31369133@N04/5050193084_3.jpg +313/31369133@N04/5050193084_5.jpg +504/50440126@N03/8061480293_0.jpg +353/35336901@N00/4353383267_0.jpg +102/10249456@N08/839447586_7.jpg +621/62158648@N07/5765099754_0.jpg +779/77991982@N00/3351774300_0.jpg +779/77991982@N00/3351774300_2.jpg +207/20741443@N00/5045852254_0.jpg +579/57954142@N07/6082189380_0.jpg +210/21091679@N08/5811404199_1.jpg +555/55530018@N04/5481680731_1.jpg +830/8302818@N06/7180492423_4.jpg +108/108788939@N08/11207124956_0.jpg +358/35803015@N03/5571012744_5.jpg +125/12508217@N08/3458308016_3.jpg +526/52617239@N07/9550573423_3.jpg +760/7600622@N07/442516245_2.jpg +838/83855583@N00/139393859_0.jpg +357/35775623@N00/4387679624_0.jpg +508/50824803@N04/5101695889_0.jpg +813/81369265@N00/5962625787_1.jpg +849/84987970@N00/6503971169_3.jpg +366/36692718@N00/7508265904_1.jpg +101/101878765@N05/9792203325_2.jpg +149/14994959@N04/3611150762_2.jpg +257/25777683@N04/3781609919_2.jpg +206/20625597@N07/3362909564_1.jpg +768/7686538@N06/1370874019_0.jpg +286/28675521@N05/2677267827_0.jpg +958/95818633@N00/317066357_0.jpg +114/11461909@N06/3569039014_2.jpg +114/11461909@N06/3926753297_2.jpg +827/8271358@N08/4748146669_0.jpg +341/34120602@N05/5979478480_5.jpg +114/11461909@N06/8281364025_1.jpg +467/46721620@N00/3849799981_0.jpg +407/40719493@N06/4008300252_1.jpg +764/76491372@N00/540480752_1.jpg +330/33019425@N00/275100215_2.jpg +316/31677763@N00/273039584_0.jpg +213/21349468@N00/82691007_2.jpg +425/42568333@N05/4079636121_3.jpg +972/97205184@N04/10076409423_0.jpg +827/8279509@N08/2712311284_0.jpg +311/31150907@N03/4133932870_0.jpg +412/41259870@N06/5812928114_0.jpg +332/33213804@N04/7599995760_0.jpg +375/37552553@N03/8157072811_0.jpg +737/7376233@N08/8712184839_0.jpg +665/66598017@N08/9614369266_3.jpg +352/35237099299@N01/16090400_0.jpg +395/39545243@N00/1121668561_11.jpg +529/52968060@N00/4836487807_1.jpg +466/46648278@N00/68839900_0.jpg +768/76841197@N00/349452085_0.jpg +971/97193933@N00/7441014914_1.jpg +711/71164686@N00/2199159152_3.jpg +956/95633051@N00/2504698743_0.jpg +850/85094310@N00/2536647566_0.jpg +850/85094310@N00/2536647566_1.jpg +546/54673576@N00/3231373075_1.jpg +419/41942641@N02/3911619734_0.jpg +706/70654989@N00/435992217_0.jpg +665/66588862@N00/4990604401_0.jpg +665/66588862@N00/4990604401_1.jpg +175/17514301@N00/504360950_0.jpg +242/24256726@N00/2284033395_1.jpg +388/38847947@N03/4278156225_0.jpg +120/12057709@N00/4817523632_5.jpg +958/95876452@N07/8757383318_5.jpg +958/95876452@N07/9136979141_0.jpg +511/51135741@N00/1197314078_2.jpg +732/73257494@N00/254360075_0.jpg +217/21725313@N04/2735944275_4.jpg +859/85928975@N00/3054044988_0.jpg +803/8035175@N05/511570673_2.jpg +169/16922208@N08/5320713367_0.jpg +370/37016273@N02/8089047614_0.jpg +108/10807869@N03/9369308884_2.jpg +859/85928975@N00/3320166109_0.jpg +365/36521958172@N01/100498068_4.jpg +724/7243800@N05/2227611248_0.jpg +724/7243800@N05/2227611248_3.jpg +117/11738031@N00/2998834476_0.jpg +795/7959345@N03/5237906433_0.jpg +236/23634892@N07/8479172294_0.jpg +334/33484476@N00/1631862642_0.jpg +793/7934170@N07/4553285915_3.jpg +603/60370779@N07/12733436605_0.jpg +943/94366076@N00/3048525915_0.jpg +277/27721729@N07/3509070727_2.jpg +759/75933558@N00/3620382660_0.jpg +460/46041863@N08/4441052512_0.jpg +129/12989638@N00/6212397379_0.jpg +337/33757663@N00/7358306448_0.jpg +943/94306126@N05/8585087758_1.jpg +953/95388136@N08/8862410806_0.jpg +223/22320444@N08/5673545350_0.jpg +434/43411679@N00/262399750_0.jpg +635/63534101@N00/2646352652_1.jpg +225/22591084@N00/6196535614_0.jpg +635/63587775@N03/6196638593_25.jpg +353/35399223@N08/6016093673_0.jpg +410/41063459@N02/3864724318_0.jpg +822/8220615@N05/4552969733_3.jpg +549/54949957@N00/5233621265_1.jpg +701/70177760@N04/9477029774_4.jpg +105/10564470@N04/2648385175_0.jpg +199/19909714@N00/3830545099_2.jpg +758/75818171@N02/7146473317_0.jpg +233/23354880@N03/2452852823_0.jpg +399/39915396@N00/5193727577_1.jpg +575/57503924@N07/6296483205_0.jpg +430/43093552@N00/6705048843_0.jpg +417/41739894@N04/4830148462_0.jpg +417/41739894@N04/4830148462_1.jpg +101/101386609@N04/13523151125_0.jpg +381/38117284@N00/1590829110_0.jpg +827/8279509@N08/2712311284_1.jpg +379/37963250@N06/3588816064_0.jpg +510/51035607419@N01/3883605563_0.jpg +311/31150907@N03/4133932870_1.jpg +311/31150907@N03/4333226349_0.jpg +409/40989913@N03/5368897603_1.jpg +332/33213804@N04/7599995760_2.jpg +519/51973188@N06/8553574872_0.jpg +665/66598017@N08/9614369266_1.jpg +131/13117300@N05/2323998041_0.jpg +489/48949906@N00/3917465141_1.jpg +489/48949906@N00/3917465141_2.jpg +251/25117187@N03/9118076515_0.jpg +225/22547477@N05/10576991153_1.jpg +169/16926338@N06/3551147251_1.jpg +120/12057709@N00/4817523632_1.jpg +327/32721085@N04/5095989423_2.jpg +404/40406266@N08/7499062102_1.jpg +227/22766186@N07/5625438347_0.jpg +227/22766186@N07/5626032050_2.jpg +302/30237597@N00/3761331400_0.jpg +412/41259870@N06/5811920381_0.jpg +369/36934384@N07/7153191901_0.jpg +369/36934384@N07/7153191901_1.jpg +332/33213804@N04/7599995760_6.jpg +526/52604186@N03/9982748374_2.jpg +125/12508217@N08/3458308016_0.jpg +793/79383703@N08/8188874944_2.jpg +328/32820037@N04/12550334735_0.jpg +554/55456932@N08/5239999140_0.jpg +193/19323934@N05/5236281857_0.jpg +300/30035643@N03/6318064786_1.jpg +260/26071009@N04/8133430835_0.jpg +395/39545243@N00/1121668561_23.jpg +927/92723020@N00/198034899_0.jpg +732/73257494@N00/254360075_1.jpg +768/76815233@N00/318365457_0.jpg +768/76815233@N00/318365457_1.jpg +758/75818171@N02/6811401849_0.jpg +960/96009072@N00/7213113090_1.jpg +440/44042276@N00/11078882754_1.jpg +563/56379629@N00/231943094_0.jpg +984/98411817@N00/2372250142_0.jpg +984/98411817@N00/2372250142_4.jpg +758/75815807@N00/3141877049_8.jpg +779/77991982@N00/3351774300_1.jpg +956/95668756@N00/9137041215_1.jpg +664/66487272@N00/3175332074_0.jpg +714/71484472@N08/7749429212_0.jpg +622/62292236@N03/12280954993_0.jpg +716/71635685@N00/2171921996_1.jpg +703/70335407@N00/2629913923_0.jpg +375/37526864@N03/3575384689_0.jpg +441/44124482892@N01/4076872185_0.jpg +760/7600622@N07/442516245_2.jpg +923/92399379@N00/3745627039_0.jpg +236/23634892@N07/8479172294_1.jpg +620/62092813@N00/12460977104_8.jpg +486/48600102544@N01/206574155_2.jpg +486/48600102544@N01/206574155_9.jpg +120/12057709@N00/4817523632_4.jpg +421/42197860@N05/7964010316_0.jpg +790/79045485@N00/8312851597_13.jpg +943/94366076@N00/3048525915_2.jpg +904/9047144@N06/4039658431_2.jpg +222/22292214@N00/4243141797_0.jpg +736/73694732@N00/4431487460_0.jpg +527/52706816@N04/4862401074_0.jpg +696/69654695@N04/8112732403_0.jpg +147/14754516@N00/6746387961_0.jpg +497/49703429@N00/487110767_7.jpg +145/14537247@N02/3736211228_8.jpg +286/28629203@N00/3064397634_3.jpg +332/33213624@N05/3106373748_0.jpg +334/33415234@N02/3114165513_1.jpg +314/31492856@N08/3175678730_1.jpg +333/33369864@N07/3244523696_4.jpg +309/30975003@N06/3322588992_1.jpg +262/26212498@N08/3372483710_1.jpg +373/37310116@N04/3434757683_0.jpg +246/24652718@N07/3504274334_0.jpg +311/31170710@N02/3541648434_0.jpg +868/8683186@N05/3611020792_0.jpg +868/8683186@N05/3611020792_6.jpg +145/14537247@N02/3736211228_1.jpg +145/14537247@N02/3736211228_10.jpg +145/14537247@N02/3736211228_3.jpg +145/14537247@N02/3736211228_7.jpg +403/40384578@N06/4101631794_0.jpg +495/49503010002@N01/4159540475_1.jpg +868/8683186@N05/4808516991_6.jpg +412/41275121@N06/4903601396_5.jpg +529/52947003@N08/5062807160_1.jpg +529/52947003@N08/5062807160_10.jpg +529/52947003@N08/5062807160_6.jpg +556/55642376@N02/5907157097_2.jpg +556/55642376@N02/5907157097_3.jpg +294/29475291@N05/6520878321_0.jpg +788/78832981@N04/7439193650_0.jpg +861/86125876@N07/7890416460_0.jpg +495/49503124519@N01/8054014324_8.jpg +170/17040371@N08/8095753999_5.jpg +170/17040371@N08/8095788948_4.jpg +336/33672038@N05/8147806935_1.jpg +340/34085730@N06/8292774555_1.jpg +268/26881063@N08/13878266544_2.jpg +309/30932831@N00/2773069134_2.jpg +276/27674701@N00/306654282_1.jpg +402/40272616@N07/4800636882_1.jpg +980/98055082@N00/992566662_1.jpg +232/23206546@N04/8621794327_0.jpg +232/23206546@N04/8621794327_1.jpg +224/22491837@N08/3626048130_0.jpg +224/22491837@N08/3641245154_2.jpg +950/95026061@N00/2542285242_0.jpg +759/75923111@N02/8430338965_0.jpg +106/10647915@N04/6503063251_1.jpg +759/7598168@N03/5226476291_0.jpg +105/105042823@N05/10224905845_2.jpg +450/45019754@N02/7606879826_2.jpg +943/94324445@N02/8585299005_4.jpg +310/31083236@N06/2986649565_0.jpg +441/44124482892@N01/4076872185_4.jpg +292/29276771@N03/11641854816_0.jpg +363/36382552@N04/5425274524_3.jpg +767/76795962@N03/12297733704_0.jpg +121/121110687@N08/13323427194_2.jpg +229/22969849@N00/1349964647_17.jpg +371/37147296@N03/3720755210_3.jpg +366/36684003@N06/4437979063_0.jpg +533/53384351@N06/4978715463_0.jpg +125/12572929@N05/5221666460_1.jpg +641/64158255@N00/5489160164_0.jpg +299/29912007@N05/5921111759_2.jpg +388/38820321@N06/6281589012_0.jpg +266/26657772@N02/7323904516_0.jpg +812/81253095@N08/7563494124_0.jpg +812/81253095@N08/7563494124_7.jpg +131/13117300@N05/2323998041_1.jpg +239/23927487@N05/4499177940_1.jpg +624/62477948@N02/5691704999_3.jpg +458/45842803@N00/2702028061_3.jpg +213/21385420@N00/9351830159_2.jpg +111/11149280@N02/9354553803_0.jpg +297/29785808@N04/2869578452_0.jpg +581/58167807@N00/4216179051_0.jpg +309/30932831@N00/2773069134_0.jpg +113/113235388@N08/11701952496_5.jpg +431/43152922@N00/3293843245_0.jpg +270/27088911@N08/5601971419_0.jpg +291/29123483@N00/8613949068_1.jpg +619/61992454@N00/119165477_2.jpg +260/26071009@N04/8133430835_1.jpg +561/56198214@N00/11354524454_0.jpg +295/29599105@N00/5802624346_6.jpg +330/33085931@N08/9400799871_0.jpg +341/34128229@N06/3267947070_0.jpg +213/21385420@N00/9351830159_0.jpg +758/75815807@N00/3141877049_7.jpg +529/52909086@N08/4912165639_0.jpg +923/92319630@N00/2022738688_0.jpg +318/31826784@N06/3346271475_0.jpg +437/43791698@N07/4031782636_4.jpg +269/26966164@N08/2699439482_3.jpg +525/52545972@N00/7991923484_0.jpg +250/25030443@N03/2852010154_6.jpg +886/88664590@N00/702044241_0.jpg +658/65873073@N00/8667101819_1.jpg +274/27433266@N00/5972034863_0.jpg +292/29233640@N07/3691901778_5.jpg +122/12254431@N02/5261928850_0.jpg +765/76562640@N00/2561153799_0.jpg +664/66487272@N00/3175332074_3.jpg +349/34946027@N06/3899131678_3.jpg +914/91409706@N00/7296129156_3.jpg +914/91409706@N00/7296129156_5.jpg +329/32996060@N05/7496967290_1.jpg +241/24112094@N00/7545432624_0.jpg +588/58871905@N03/8212289784_0.jpg +284/28426408@N00/4985494194_0.jpg +315/31594932@N00/8242400525_1.jpg +315/31594932@N00/8243469114_0.jpg +500/50016899@N03/4605388504_0.jpg +263/26357527@N05/7223540266_2.jpg +498/49814762@N00/8014123645_0.jpg +498/49814762@N00/8014123645_1.jpg +875/87504239@N08/10670731404_4.jpg +875/87504239@N08/10852751085_3.jpg +372/37244828@N04/13173856803_10.jpg +371/37147296@N03/3720755210_1.jpg +125/12572929@N05/5221666460_2.jpg +641/64158255@N00/5489160164_2.jpg +356/35658425@N08/5726282580_0.jpg +766/76681787@N00/5957052480_2.jpg +812/81253095@N08/7563494124_10.jpg +812/81253095@N08/7563494124_6.jpg +699/69958247@N05/13388922034_0.jpg +748/74896593@N07/6764119963_0.jpg +846/84655869@N08/7775105362_0.jpg +181/18155385@N00/239228291_7.jpg +421/42103613@N08/4040845679_1.jpg +313/31369133@N04/5050193084_4.jpg +785/78573292@N00/2256084892_0.jpg +167/16759096@N00/489481531_0.jpg +957/95723376@N06/8735477642_1.jpg +863/8630870@N02/5322350325_0.jpg +863/8630870@N02/5322350325_2.jpg +863/8630870@N02/5322350325_3.jpg +863/8630870@N02/5322350325_4.jpg +863/8630870@N02/5322350325_5.jpg +735/73531427@N00/218215108_0.jpg +309/30932831@N00/2773069134_3.jpg +727/72707136@N00/33992579_1.jpg +762/76236359@N00/6234006071_5.jpg +736/73626930@N00/9428192473_0.jpg +105/105042823@N05/10224905845_4.jpg +284/28476480@N04/3975041778_0.jpg +943/94324445@N02/8585299005_1.jpg +601/60125017@N00/344049639_2.jpg +876/87619178@N03/8590731823_0.jpg +277/27712137@N04/2623505924_0.jpg +701/70154022@N00/3925362192_1.jpg +459/45975847@N07/4691684655_2.jpg +459/45975847@N07/4692316090_0.jpg +514/51460103@N07/4823559383_0.jpg +220/22072051@N03/5011260955_0.jpg +535/53533856@N08/5361207739_0.jpg +535/53533856@N08/5361207739_1.jpg +535/53533856@N08/5361207739_4.jpg +528/52858230@N08/5564688606_0.jpg +574/57438188@N07/5627487722_0.jpg +176/17694278@N04/6508529521_0.jpg +362/36204621@N08/6698329979_0.jpg +697/69794372@N08/6785690647_2.jpg +100/100739634@N06/9717775343_0.jpg +267/26728047@N05/5524462661_5.jpg +156/15699085@N05/6408711257_0.jpg +327/32721085@N04/5095989423_0.jpg +669/66964839@N00/8741217920_1.jpg +608/60842486@N00/2702417524_0.jpg +206/20625597@N07/3362909564_5.jpg +554/55456932@N08/5239999140_1.jpg +616/61628022@N02/6999143216_0.jpg +685/68558611@N06/6390155109_1.jpg +770/77029195@N00/490108118_4.jpg +258/25827417@N00/2574466319_0.jpg +878/87855339@N00/3244971644_0.jpg +878/87855339@N00/3244971644_1.jpg +654/65497908@N00/6813913952_1.jpg +868/8683186@N05/3611020792_2.jpg +868/8683186@N05/4808516991_9.jpg +294/29475291@N05/6520878321_1.jpg +716/71678139@N05/6807828131_0.jpg +716/71678139@N05/6807828131_1.jpg +716/71678139@N05/6807828131_2.jpg +716/71678139@N05/6807828131_3.jpg +716/71678139@N05/6807828131_4.jpg +716/71678139@N05/6807828131_5.jpg +716/71678139@N05/6807828131_6.jpg +170/17040371@N08/8095753999_3.jpg +170/17040371@N08/8095788948_3.jpg +336/33672038@N05/8147806935_2.jpg +441/44124395142@N01/407637002_0.jpg +795/79543373@N00/2529893768_1.jpg +575/57545119@N04/8673142329_0.jpg +359/35909637@N06/3917967715_0.jpg +407/40719493@N06/4008300252_0.jpg +764/76491372@N00/540480752_0.jpg +221/22132798@N08/8018992056_1.jpg +402/40245280@N00/1936928371_2.jpg +114/114772050@N03/12008186175_0.jpg +636/63601558@N00/199623056_0.jpg +185/18502090@N00/2524917681_47.jpg +793/79398354@N00/2622290309_0.jpg +898/8982863@N07/10257490644_5.jpg +898/8982863@N07/10257490644_8.jpg +458/45861060@N00/7900853588_1.jpg +102/102077743@N07/12190186456_0.jpg +228/22882274@N04/3632475832_2.jpg +233/23357263@N03/3953791578_5.jpg +317/31769130@N03/11011170923_0.jpg +371/37195519@N02/3424150218_0.jpg +795/79589933@N00/3352567863_0.jpg +623/62362697@N00/8577869641_3.jpg +365/36521958172@N01/100498068_1.jpg +898/8982863@N07/10257490644_10.jpg +102/102077743@N07/12190186456_2.jpg +354/35468148224@N01/12347079_0.jpg +905/90516586@N00/159075833_0.jpg +773/77364737@N00/2503183115_0.jpg +975/97584199@N00/2632241655_1.jpg +527/52772894@N00/90756428_0.jpg +527/52772894@N00/90756428_2.jpg +972/97205184@N04/10076409423_0.jpg +101/101386609@N04/13523144805_0.jpg +827/8279509@N08/2712311284_0.jpg +379/37963250@N06/3588816064_1.jpg +379/37963250@N06/3588816064_2.jpg +510/51035607419@N01/3883605563_1.jpg +311/31150907@N03/4133932870_0.jpg +409/40989913@N03/5368897603_0.jpg +412/41259870@N06/5812928114_0.jpg +332/33213804@N04/7599995760_0.jpg +332/33213804@N04/7599995760_1.jpg +375/37552553@N03/8157072811_0.jpg +665/66598017@N08/9614369266_3.jpg +241/24112094@N00/3994684107_2.jpg +388/38847947@N03/4351812234_5.jpg +510/51035620166@N01/237428859_2.jpg +450/45019754@N02/7606879826_0.jpg +664/66474562@N00/19195378_2.jpg +287/28771658@N03/3905862519_0.jpg +123/12360228@N04/7166710688_1.jpg +123/12360228@N04/7166710688_2.jpg +302/30245869@N07/2843650382_4.jpg +972/97205184@N04/10079707226_0.jpg +570/57023246@N00/4623144791_0.jpg +332/33213804@N04/7599995760_4.jpg +487/48782814@N07/13847705683_0.jpg +595/59533494@N04/5479759436_0.jpg +938/93841400@N00/8327059841_1.jpg +824/8240241@N06/4114864483_0.jpg +513/51313580@N08/6077728920_5.jpg +289/28917877@N00/6333929606_0.jpg +395/39545243@N00/1121668561_35.jpg +640/64073015@N00/2831021702_0.jpg +141/14195956@N04/3948300818_3.jpg +539/53906287@N00/5101060235_7.jpg +500/50034633@N05/4837007562_1.jpg +254/25414047@N00/145668608_3.jpg +489/48949906@N00/3917465141_0.jpg +808/80812769@N00/442495313_0.jpg +459/45964884@N08/5242276755_2.jpg +103/10394437@N03/4568233297_5.jpg +169/16989146@N06/7641494140_4.jpg +597/59751999@N00/3289666452_1.jpg +437/43709093@N07/4256796727_0.jpg +445/44521275@N00/506634574_2.jpg +716/71616417@N05/6509071195_2.jpg +716/71616417@N05/6509074321_2.jpg +524/52407821@N00/7984244356_0.jpg +366/36624962@N03/8288304168_3.jpg +697/69756126@N00/4662338037_0.jpg +631/63177605@N08/6792309851_2.jpg +616/61670399@N07/10102978284_1.jpg +105/105042823@N05/10225015423_0.jpg +273/27357514@N00/11343847725_0.jpg +463/46327697@N00/2124534031_4.jpg +984/98411817@N00/2372250142_6.jpg +257/25797798@N07/3211844955_1.jpg +111/11134149@N02/3317710642_0.jpg +388/38847947@N03/4178270889_3.jpg +822/8220615@N05/4552969733_5.jpg +611/61109191@N00/5543733500_2.jpg +806/80604586@N07/9070005912_4.jpg +241/24113869@N07/9379713988_1.jpg +748/74888386@N00/9692493485_0.jpg +695/69501650@N00/46407370_1.jpg +950/95082307@N00/8773335932_0.jpg +510/51035620166@N01/237428859_2.jpg +434/43411679@N00/262399750_3.jpg +634/63465779@N07/6362029047_0.jpg +987/98736785@N00/4499296_3.jpg +715/7155702@N03/2302080410_0.jpg +715/7155702@N03/2302080410_1.jpg +715/7155702@N03/2302080410_3.jpg +715/7155702@N03/2302080410_4.jpg +715/7155702@N03/2302080410_5.jpg +715/7155702@N03/3631806363_2.jpg +874/87472210@N00/3105959620_1.jpg +246/24638567@N00/3321513653_0.jpg +945/94545836@N00/1443145007_1.jpg +362/36298222@N08/5935447071_0.jpg +222/22284790@N06/2176524544_0.jpg +747/7478277@N04/3155354570_0.jpg +747/7478277@N04/3155354570_1.jpg +375/37531198@N00/4174611825_2.jpg +375/37531198@N00/4174611825_4.jpg +768/76841197@N00/349452085_2.jpg +768/76841197@N00/349452085_3.jpg +468/46868174@N08/6511978997_0.jpg +100/10058188@N05/8295748234_0.jpg +108/108285828@N06/10779570026_1.jpg +108/108285828@N06/10779778303_0.jpg +168/16873194@N05/1801191486_0.jpg +857/8572970@N04/2079107678_1.jpg +472/47253165@N00/360990372_0.jpg +647/64767764@N00/450008059_0.jpg +729/72971773@N00/58588039_0.jpg +911/91148289@N00/7916666268_1.jpg +416/41608212@N00/8718283094_0.jpg +911/91113759@N00/2539574881_0.jpg +293/29322132@N08/3569343093_3.jpg +876/87671668@N00/9013803280_0.jpg +381/38176611@N04/8638753913_4.jpg +976/97644214@N00/6173832483_1.jpg +232/23206546@N04/8621794327_6.jpg +563/56379629@N00/231943094_3.jpg +864/86429182@N00/330808508_1.jpg +353/35336901@N00/4353383267_1.jpg +631/63122283@N06/7978644677_2.jpg +932/93211492@N06/8487757725_206.jpg +575/57545119@N04/8673142329_3.jpg +354/35479068@N06/3306075644_0.jpg +277/27721729@N07/3509070727_0.jpg +188/18899983@N00/4100299699_2.jpg +213/21349468@N00/82691007_1.jpg +110/11021333@N02/2957267195_2.jpg +925/9259500@N03/5710775169_0.jpg +486/48600102544@N01/206574155_11.jpg +486/48600102544@N01/206574155_12.jpg +486/48600102544@N01/206574155_7.jpg +339/33959433@N05/8396364213_0.jpg +997/9975353@N03/12630170935_1.jpg +247/24733288@N07/5846541456_0.jpg +872/8729914@N05/5099947628_0.jpg +889/88976184@N05/8244475370_1.jpg +889/88976184@N05/8244475370_3.jpg +630/63095109@N00/1079079769_0.jpg +664/66422694@N00/182828985_0.jpg +645/64503524@N00/2480285692_0.jpg +864/86429182@N00/330808508_0.jpg +447/44754496@N00/4287694240_1.jpg +363/36382552@N04/5425274524_6.jpg +210/21091679@N08/5811404199_2.jpg +562/56213435@N08/9008148399_0.jpg +695/69501650@N00/46407370_0.jpg +889/88976184@N05/8244475370_0.jpg +889/88976184@N05/8244475370_2.jpg +889/88976184@N05/8244475370_4.jpg +889/88976184@N05/8244475370_5.jpg +527/52706816@N04/4862401074_1.jpg +794/79428123@N06/7349516920_1.jpg +790/79024059@N04/7351250586_0.jpg +693/69318970@N00/9266107252_1.jpg +943/94324445@N02/8585410655_1.jpg +599/59947594@N00/5684370261_0.jpg +849/84986567@N00/177640275_0.jpg +345/34514184@N03/3562741086_0.jpg +158/15803691@N00/6914149962_2.jpg +817/81708918@N03/7855914580_5.jpg +309/30975003@N06/3322588992_8.jpg +900/90054085@N00/43987316_0.jpg +136/13675730@N06/2452368334_0.jpg +386/38675455@N00/6803844225_0.jpg +717/71763791@N00/5532357066_0.jpg +606/60604521@N07/5584865343_0.jpg +395/39545243@N00/1121668561_29.jpg +391/39196943@N05/3992501716_2.jpg +207/20719052@N04/8646466859_0.jpg +207/20719052@N04/8646466859_1.jpg +758/75815807@N00/3141877049_0.jpg +471/47170787@N05/6477792561_2.jpg +317/31734244@N00/542792072_0.jpg +931/9319402@N03/3358320101_0.jpg +362/36223735@N03/3784170734_3.jpg +534/53400644@N05/5044502598_0.jpg +513/51313580@N08/6077728920_1.jpg +137/13774680@N04/12313323523_0.jpg +636/63608960@N08/13553141815_2.jpg +434/43463445@N07/5723825501_0.jpg +237/23740675@N05/6877915376_0.jpg +868/8683186@N05/3611020792_4.jpg +216/21653251@N04/5633592631_0.jpg +216/21653251@N04/5633592631_1.jpg +170/17040371@N08/8095753999_1.jpg +170/17040371@N08/8095788948_1.jpg +620/62092813@N00/12460977104_4.jpg +236/23686718@N08/10662589695_3.jpg +264/26451473@N00/1342290947_5.jpg +636/63608960@N08/13553141815_6.jpg +409/40926212@N05/13257463775_7.jpg +449/44915880@N03/4248497494_1.jpg +235/23588194@N00/4494098639_1.jpg +532/53201041@N07/4911217327_0.jpg +532/53201041@N07/4911259327_0.jpg +606/60625084@N04/6450812495_0.jpg +650/65013293@N02/7724906252_3.jpg +560/56021903@N02/8227297222_2.jpg +359/35904083@N08/4345934789_0.jpg +593/59319260@N00/8743143610_2.jpg +271/27125798@N05/2710711437_0.jpg +402/40210933@N02/6043303646_0.jpg +122/12280910@N06/6299940378_1.jpg +207/20775043@N07/3627508299_0.jpg +595/59592751@N08/9096179270_0.jpg +395/39545243@N00/1121668561_14.jpg +296/29625288@N00/12891226005_0.jpg +548/54858071@N00/205845735_1.jpg +751/75148156@N00/3485469298_1.jpg +407/40764492@N08/3797968770_0.jpg +333/33369864@N07/3244523696_0.jpg +312/31236383@N03/3259555928_1.jpg +385/38524878@N04/3563411595_0.jpg +259/25955358@N06/3921002900_2.jpg +788/78832981@N04/7447167480_1.jpg +696/69696568@N05/6872955321_1.jpg +757/75741170@N02/6829396274_0.jpg +724/72448202@N00/359801202_1.jpg +969/96934953@N00/4315376370_0.jpg +133/13361855@N00/989708629_1.jpg +664/66478195@N00/11649050243_3.jpg +122/12276055@N02/4214939371_0.jpg +463/46327697@N00/2124534031_3.jpg +534/53400644@N05/5044502598_1.jpg +669/66944684@N03/6306275408_0.jpg +710/71006820@N00/4037980088_0.jpg +766/76656964@N04/9363467181_3.jpg +112/11262617@N07/12873348265_0.jpg +409/40926212@N05/13257463775_4.jpg +409/40926212@N05/13835647984_0.jpg +528/52858230@N08/5636750038_0.jpg +528/52858230@N08/5636750038_1.jpg +203/20335591@N04/9752849313_1.jpg +350/35034345966@N01/3086429616_1.jpg +736/73694732@N00/4430689233_0.jpg +605/60517117@N00/10370054943_0.jpg +421/42173774@N03/3889203507_0.jpg +511/51135741@N00/1197314078_3.jpg +267/26753167@N04/5922076258_2.jpg +330/33062815@N00/8606375434_1.jpg +108/10807869@N03/9369308884_0.jpg +761/76151808@N00/6945480767_0.jpg +757/75741170@N02/6829396274_1.jpg +220/22057861@N07/2126995093_0.jpg +665/66572814@N00/8242014606_0.jpg +849/84986567@N00/177640275_1.jpg +444/44460493@N03/4085897885_0.jpg +330/33085931@N08/9400799871_1.jpg +533/53314395@N00/5174087013_11.jpg +864/86429182@N00/330808508_2.jpg +151/15133426@N08/3646529532_0.jpg +302/30223854@N00/6535512351_0.jpg +929/92903356@N04/8497572867_0.jpg +412/41232325@N03/9045866185_0.jpg +582/58246614@N00/2842715287_1.jpg +513/51304493@N05/4932744035_0.jpg +301/30120696@N02/3068639840_0.jpg +407/40764492@N08/3797968770_0.jpg +231/23100621@N04/3986465605_0.jpg +288/28891066@N00/4210148052_2.jpg +940/94066910@N00/448278027_1.jpg +532/53282124@N00/3858373020_0.jpg +597/59751999@N00/3289666452_2.jpg +365/36521958172@N01/100498068_4.jpg +293/29322132@N08/3569343093_3.jpg diff --git a/src/megaface/remove_noises.py b/src/megaface/remove_noises.py new file mode 100644 index 0000000..c69bcef --- /dev/null +++ b/src/megaface/remove_noises.py @@ -0,0 +1,175 @@ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +import os.path +import datetime +from easydict import EasyDict as edict +import time +import json +import shutil +import sys +import numpy as np +import importlib +import itertools +import argparse +import struct +import cv2 +sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) +import face_preprocess +from sklearn.preprocessing import normalize +import mxnet as mx +from mxnet import ndarray as nd + + +feature_dim = 512 +feature_ext = 1 + +def load_bin(path, fill = 0.0): + with open(path, 'rb') as f: + bb = f.read(4*4) + #print(len(bb)) + v = struct.unpack('4i', bb) + #print(v[0]) + bb = f.read(v[0]*4) + v = struct.unpack("%df"%(v[0]), bb) + feature = np.full( (feature_dim+feature_ext,), fill, dtype=np.float32) + feature[0:feature_dim] = v + #feature = np.array( v, dtype=np.float32) + #print(feature.shape) + #print(np.linalg.norm(feature)) + return feature + +def write_bin(path, feature): + feature = list(feature) + with open(path, 'wb') as f: + f.write(struct.pack('4i', len(feature),1,4,5)) + f.write(struct.pack("%df"%len(feature), *feature)) + +def main(args): + + out_algo = args.suffix + if len(args.algo)>0: + out_algo = args.algo + + fs_noise_map = {} + for line in open(args.facescrub_noises, 'r'): + if line.startswith('#'): + continue + line = line.strip() + fname = line.split('.')[0] + p = fname.rfind('_') + fname = fname[0:p] + fs_noise_map[line] = fname + + print(len(fs_noise_map)) + + i=0 + fname2center = {} + noises = [] + for line in open(args.facescrub_lst, 'r'): + if i%1000==0: + print("reading fs",i) + i+=1 + image_path, label, bbox, landmark, aligned = face_preprocess.parse_lst_line(line) + assert aligned==True + _path = image_path.split('/') + a, b = _path[-2], _path[-1] + feature_path = os.path.join(args.facescrub_feature_dir, a, "%s_%s.bin"%(b, args.suffix)) + feature_dir_out = os.path.join(args.facescrub_feature_dir_out, a) + if not os.path.exists(feature_dir_out): + os.makedirs(feature_dir_out) + feature_path_out = os.path.join(args.facescrub_feature_dir_out, a, "%s_%s.bin"%(b, out_algo)) + #print(b) + if not b in fs_noise_map: + #shutil.copyfile(feature_path, feature_path_out) + feature = load_bin(feature_path) + write_bin(feature_path_out, feature) + if not a in fname2center: + fname2center[a] = np.zeros((feature_dim+feature_ext,), dtype=np.float32) + fname2center[a] += feature + else: + #print('n', b) + noises.append( (a,b) ) + print(len(noises)) + + for k in noises: + a,b = k + assert a in fname2center + center = fname2center[a] + g = np.zeros( (feature_dim+feature_ext,), dtype=np.float32) + g2 = np.random.uniform(-0.001, 0.001, (feature_dim,)) + g[0:feature_dim] = g2 + f = center+g + _norm=np.linalg.norm(f) + f /= _norm + feature_path_out = os.path.join(args.facescrub_feature_dir_out, a, "%s_%s.bin"%(b, out_algo)) + write_bin(feature_path_out, f) + + mf_noise_map = {} + for line in open(args.megaface_noises, 'r'): + if line.startswith('#'): + continue + line = line.strip() + _vec = line.split("\t") + if len(_vec)>1: + line = _vec[1] + mf_noise_map[line] = 1 + + print(len(mf_noise_map)) + + i=0 + nrof_noises = 0 + for line in open(args.megaface_lst, 'r'): + if i%1000==0: + print("reading mf",i) + i+=1 + image_path, label, bbox, landmark, aligned = face_preprocess.parse_lst_line(line) + assert aligned==True + _path = image_path.split('/') + a1, a2, b = _path[-3], _path[-2], _path[-1] + feature_path = os.path.join(args.megaface_feature_dir, a1, a2, "%s_%s.bin"%(b, args.suffix)) + feature_dir_out = os.path.join(args.megaface_feature_dir_out, a1, a2) + if not os.path.exists(feature_dir_out): + os.makedirs(feature_dir_out) + feature_path_out = os.path.join(args.megaface_feature_dir_out, a1, a2, "%s_%s.bin"%(b, out_algo)) + bb = '/'.join([a1, a2, b]) + #print(b) + if not bb in mf_noise_map: + feature = load_bin(feature_path) + write_bin(feature_path_out, feature) + #shutil.copyfile(feature_path, feature_path_out) + else: + feature = load_bin(feature_path, 100.0) + write_bin(feature_path_out, feature) + #g = np.random.uniform(-0.001, 0.001, (feature_dim,)) + #print('n', bb) + #write_bin(feature_path_out, g) + nrof_noises+=1 + print(nrof_noises) + + +def parse_arguments(argv): + parser = argparse.ArgumentParser() + + parser.add_argument('--facescrub-noises', type=str, help='', default='./facescrub_noises.txt') + parser.add_argument('--megaface-noises', type=str, help='', default='./megaface_noises.txt') + parser.add_argument('--suffix', type=str, help='', default='r100_cm_112x112') + parser.add_argument('--algo', type=str, help='', default='') + parser.add_argument('--megaface-lst', type=str, help='', default='/raid5data/dplearn/megaface/megaface_mtcnn_112x112/lst') + parser.add_argument('--facescrub-lst', type=str, help='', default='/raid5data/dplearn/megaface/facescrubr/small_lst') + parser.add_argument('--megaface-feature-dir', type=str, help='', default='/raid5data/dplearn/megaface/MegaFace_Features') + parser.add_argument('--facescrub-feature-dir', type=str, help='', default='/raid5data/dplearn/megaface/FaceScrub_Features') + #parser.add_argument('--megaface-feature-dir-out', type=str, help='', default='/raid5data/dplearn/megaface/MegaFace_Features_cm') + #parser.add_argument('--facescrub-feature-dir-out', type=str, help='', default='/raid5data/dplearn/megaface/FaceScrub_Features_cm') + parser.add_argument('--megaface-feature-dir-out', type=str, help='', default='/opt/jiaguo/MegaFace_Features_cm') + parser.add_argument('--facescrub-feature-dir-out', type=str, help='', default='/opt/jiaguo/FaceScrub_Features_cm') + return parser.parse_args(argv) + +if __name__ == '__main__': + main(parse_arguments(sys.argv[1:])) + + From 188c386eeaf8ce912976503774193555ea246de9 Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Fri, 16 Feb 2018 18:52:51 +0800 Subject: [PATCH 4/8] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 51dab59..f686210 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ ### Recent Update + **`2018.02.16`**: We put the MegaFace noise list in this repo. Please refer to [https://github.com/deepinsight/insightface/blob/master/src/megaface] for detail. + **`2018.02.13`**: We achieved state-of-the-art performance on [MegaFace-Challenge-1](http://megaface.cs.washington.edu/results/facescrub.html), at `98.06%`. Also note that the training set we used has NO identities overlap with facescrub, please check our paper for detail. **`2018.02.07`**: We evaluate LFW,CFP,AgeDB-30 again after removing training set overlaps, the results almost stay the same. See [Results](#results) for detail. From 5f4465643c947bd2672f67d6615bb64ee1f4871b Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Sun, 18 Feb 2018 18:41:49 +0800 Subject: [PATCH 5/8] add flexiable multiple margin --- src/train_softmax.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/train_softmax.py b/src/train_softmax.py index eec7ac3..14d0145 100644 --- a/src/train_softmax.py +++ b/src/train_softmax.py @@ -300,6 +300,20 @@ def get_symbol(args, arg_params, aux_params): cos_t = zy/s if args.margin_verbose>0: margin_symbols.append(mx.symbol.mean(cos_t)) + if m>1.0: + t = mx.sym.arccos(cos_t) + t = t*m + body = mx.sym.cos(t) + new_zy = body*s + if args.margin_verbose>0: + new_cos_t = new_zy/s + margin_symbols.append(mx.symbol.mean(new_cos_t)) + diff = new_zy - zy + diff = mx.sym.expand_dims(diff, 1) + gt_one_hot = mx.sym.one_hot(gt_label, depth = args.num_classes, on_value = 1.0, off_value = 0.0) + body = mx.sym.broadcast_mul(gt_one_hot, diff) + fc7 = fc7+body + #threshold = math.cos(args.margin_m) #cond_v = cos_t - threshold #cond = mx.symbol.Activation(data=cond_v, act_type='relu') From 4b8ea35166cbe185eefe2f43f15b32ccd4ff4ac0 Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Sun, 18 Feb 2018 18:50:51 +0800 Subject: [PATCH 6/8] Update README.md --- src/megaface/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/megaface/README.md b/src/megaface/README.md index ede1546..8947358 100644 --- a/src/megaface/README.md +++ b/src/megaface/README.md @@ -2,5 +2,5 @@ Please strictly follow these rules if you want to use our MegaFace noises list. * Please cite our paper and git repo if you want to use this list in your paper. * Please include the information like `We used the noises list proposed by InsightFace, at https://github.com/deepinsight/insightface/tree/master/src/megaface` if you want to submit the result to MegaFace challenge. -* To be fair, if you want to submit MegaFace result, please remove the FaceScrub-overlapped identities from your training set if cosine similarity is larger than 0.4 with FaceScrub identities(by using centre feature vector). +* To be fair, if you want to submit MegaFace result, please ensure there's no training set overlaps with FaceScrub identities. You can do this by removing identities from your training set whose cosine similarity is larger than 0.4 with any FaceScrub identity by comparing their centre feature vectors. * If you find more overlaps noise, please open an issue at InsightFace. From beb994e57efe63e9f1d533954a7e359d1db9e28b Mon Sep 17 00:00:00 2001 From: Jia Guo Date: Sun, 18 Feb 2018 21:38:38 +0800 Subject: [PATCH 7/8] YTF --- src/eval/ytf.py | 302 +++++++++++++++++++++++++++++++++++++++ src/eval/ytf_badcases.py | 75 ++++++++++ 2 files changed, 377 insertions(+) create mode 100644 src/eval/ytf.py create mode 100644 src/eval/ytf_badcases.py diff --git a/src/eval/ytf.py b/src/eval/ytf.py new file mode 100644 index 0000000..793dab3 --- /dev/null +++ b/src/eval/ytf.py @@ -0,0 +1,302 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import cv2 +import argparse +import sys +import numpy as np +from scipy import misc +from sklearn.model_selection import KFold +from scipy import interpolate +import sklearn +from sklearn.metrics.pairwise import euclidean_distances +import datetime +import pickle +from sklearn.decomposition import PCA +import mxnet as mx +from mxnet import ndarray as nd +from verification import evaluate +from verification import calculate_accuracy +sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) +import face_image + + +model = None +feature_cache = {} +image_size = [112,112] + +def get_feature(name, vid, args): + global feature_cache + key = (name,vid) + if key in feature_cache: + return feature_cache[key] + + input_dir = os.path.join(args.image_dir, name, str(vid)) + data = nd.zeros( (1 ,3, image_size[0], image_size[1]) ) + F = [] + for img in os.listdir(input_dir): + img = os.path.join(input_dir, img) + img = cv2.imread(img) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = np.transpose(img, (2,0,1)) + data[0][:] = img + db = mx.io.DataBatch(data=(data,)) + model.forward(db, is_train=False) + net_out = model.get_outputs()[0].asnumpy().flatten() + F.append(net_out) + F = np.array(F) + F = sklearn.preprocessing.normalize(F) + feature = np.mean(F, axis=0, keepdims=True) + feature = sklearn.preprocessing.normalize(feature).flatten() + + feature_cache[key] = feature + return feature + +def get_feature_set(name, vid, args): + global feature_cache + key = (name,vid) + if key in feature_cache: + return feature_cache[key] + + input_dir = os.path.join(args.image_dir, name, str(vid)) + data = nd.zeros( (1 ,3, image_size[0], image_size[1]) ) + F = [] + for img in os.listdir(input_dir): + img = os.path.join(input_dir, img) + img = cv2.imread(img) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = np.transpose(img, (2,0,1)) + data[0][:] = img + db = mx.io.DataBatch(data=(data,)) + model.forward(db, is_train=False) + net_out = model.get_outputs()[0].asnumpy().flatten() + F.append(net_out) + F = np.array(F) + F = sklearn.preprocessing.normalize(F) + + feature_cache[key] = F + return F + +def main(args): + global model + ctx = mx.gpu(args.gpu) + args.ctx_num = 1 + print('image_size', image_size) + vec = args.model.split(',') + prefix = vec[0] + epoch = int(vec[1]) + print('loading',prefix, epoch) + sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch) + all_layers = sym.get_internals() + sym = all_layers['fc1_output'] + model = mx.mod.Module(symbol=sym, context=ctx, label_names = None) + model.bind(data_shapes=[('data', (args.batch_size, 3, image_size[0], image_size[1]))]) + model.set_params(arg_params, aux_params) + args.image_dir = os.path.join(args.data_dir, 'images') + pairs_file = os.path.join(args.data_dir, 'splits2.txt') + embeddings = [] + issame_list = [] + data = [] + pp = 0 + for line in open(pairs_file, 'r'): + line = line.strip() + if line.startswith('split'): + continue + pp+=1 + if pp%10==0: + print('processing', pp) + vec = line.split(',') + assert len(vec)>=5 + issame_list.append(int(vec[-1])) + for i in [2,3]: + _str = vec[i].strip() + _vec = _str.split('/') + assert len(_vec)==2 + name = _vec[0] + vid = int(_vec[1]) + feature = get_feature(name, vid, args) + print('feature', feature.shape) + embeddings.append(feature) + data.append( (name, vid) ) + #if len(issame_list)==20: + # break + embeddings = np.array(embeddings) + print(embeddings.shape) + thresholds = np.arange(0, 4, 0.01) + actual_issame = np.asarray(issame_list) + nrof_folds = 10 + embeddings1 = embeddings[0::2] + embeddings2 = embeddings[1::2] + assert(embeddings1.shape[0] == embeddings2.shape[0]) + assert(embeddings1.shape[1] == embeddings2.shape[1]) + nrof_pairs = min(len(actual_issame), embeddings1.shape[0]) + nrof_thresholds = len(thresholds) + k_fold = KFold(n_splits=nrof_folds, shuffle=False) + + tprs = np.zeros((nrof_folds,nrof_thresholds)) + fprs = np.zeros((nrof_folds,nrof_thresholds)) + accuracy = np.zeros((nrof_folds)) + indices = np.arange(nrof_pairs) + + diff = np.subtract(embeddings1, embeddings2) + dist = np.sum(np.square(diff),1) + pouts = [] + nouts = [] + for fold_idx, (train_set, test_set) in enumerate(k_fold.split(indices)): + # Find the best threshold for the fold + acc_train = np.zeros((nrof_thresholds)) + #print(train_set) + #print(train_set.__class__) + for threshold_idx, threshold in enumerate(thresholds): + p2 = dist[train_set] + p3 = actual_issame[train_set] + _, _, acc_train[threshold_idx] = calculate_accuracy(threshold, p2, p3) + best_threshold_index = np.argmax(acc_train) + for threshold_idx, threshold in enumerate(thresholds): + tprs[fold_idx,threshold_idx], fprs[fold_idx,threshold_idx], _ = calculate_accuracy(threshold, dist[test_set], actual_issame[test_set]) + _, _, accuracy[fold_idx] = calculate_accuracy(thresholds[best_threshold_index], dist[test_set], actual_issame[test_set]) + best_threshold = thresholds[best_threshold_index] + for iid in test_set: + ida = iid*2 + idb = ida+1 + asame = actual_issame[iid] + _dist = dist[iid] + violate = _dist - best_threshold + if not asame: + violate *= -1.0 + if violate>0.0: + dataa = data[ida] + datab = data[idb] + #print(imga.shape, imgb.shape, violate, asame, _dist) + if asame: + pouts.append( (dataa, datab, _dist, best_threshold, ida) ) + else: + nouts.append( (dataa, datab, _dist, best_threshold, ida) ) + + + tpr = np.mean(tprs,0) + fpr = np.mean(fprs,0) + acc = np.mean(accuracy) + pouts = sorted(pouts, key = lambda x: x[2], reverse=True) + nouts = sorted(nouts, key = lambda x: x[2], reverse=False) + print(len(pouts), len(nouts)) + print('acc', acc) + if len(nouts)>0: + threshold = nouts[0][3] + else: + threshold = pouts[-1][3] + #print('threshold', threshold) + print('positive(false negative):') + for out in pouts: + print("\t%s\t%s\t(distance:%f, threshold:%f)"%(out[0], out[1], out[2], out[3])) + print('negative(false positive):') + for out in nouts: + print("\t%s\t%s\t(distance:%f, threshold:%f)"%(out[0], out[1], out[2], out[3])) + + + + + + #_, _, accuracy, val, val_std, far = evaluate(embeddings, issame_list, nrof_folds=10) + #acc2, std2 = np.mean(accuracy), np.std(accuracy) + #print('acc', acc2) + +def main2(args): + global model + ctx = mx.gpu(args.gpu) + args.ctx_num = 1 + print('image_size', image_size) + vec = args.model.split(',') + prefix = vec[0] + epoch = int(vec[1]) + print('loading',prefix, epoch) + sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch) + all_layers = sym.get_internals() + sym = all_layers['fc1_output'] + model = mx.mod.Module(symbol=sym, context=ctx, label_names = None) + model.bind(data_shapes=[('data', (args.batch_size, 3, image_size[0], image_size[1]))]) + model.set_params(arg_params, aux_params) + args.image_dir = os.path.join(args.data_dir, 'images') + pairs_file = os.path.join(args.data_dir, 'splits2.txt') + issame_list = [] + dist = [] + pp = 0 + for line in open(pairs_file, 'r'): + line = line.strip() + if line.startswith('split'): + continue + pp+=1 + if pp%10==0: + print('processing', pp) + vec = line.split(',') + assert len(vec)>=5 + issame_list.append(int(vec[-1])) + feature_sets = [] + for i in [2,3]: + _str = vec[i].strip() + _vec = _str.split('/') + assert len(_vec)==2 + name = _vec[0] + vid = int(_vec[1]) + feature = get_feature_set(name, vid, args) + print('feature', len(feature)) + feature_sets.append(feature) + X = feature_sets[0] + Y = feature_sets[1] + _dist = euclidean_distances(X, Y) + _dist = _dist*_dist + #_tmp = np.eye(_dist.shape[0], dtype=np.float32) + #_dist += _tmp + if args.mode==2: + _dist = np.amin(_dist) + elif args.mode==3: + _dist = np.mean(_dist) + else: + _dist = np.amax(_dist) + print(_dist) + dist.append(_dist) + #if len(dist)==10: + # break + + dist = np.array(dist) + nrof_folds = 10 + thresholds = np.arange(0, 4, 0.01) + actual_issame = np.array(issame_list) + nrof_pairs = len(actual_issame) + nrof_thresholds = len(thresholds) + k_fold = KFold(n_splits=nrof_folds, shuffle=False) + + tprs = np.zeros((nrof_folds,nrof_thresholds)) + fprs = np.zeros((nrof_folds,nrof_thresholds)) + accuracy = np.zeros((nrof_folds)) + indices = np.arange(nrof_pairs) + for fold_idx, (train_set, test_set) in enumerate(k_fold.split(indices)): + + # Find the best threshold for the fold + acc_train = np.zeros((nrof_thresholds)) + for threshold_idx, threshold in enumerate(thresholds): + _, _, acc_train[threshold_idx] = calculate_accuracy(threshold, dist[train_set], actual_issame[train_set]) + best_threshold_index = np.argmax(acc_train) + for threshold_idx, threshold in enumerate(thresholds): + tprs[fold_idx,threshold_idx], fprs[fold_idx,threshold_idx], _ = calculate_accuracy(threshold, dist[test_set], actual_issame[test_set]) + _, _, accuracy[fold_idx] = calculate_accuracy(thresholds[best_threshold_index], dist[test_set], actual_issame[test_set]) + acc2, std2 = np.mean(accuracy), np.std(accuracy) + print('acc', acc2) + +if __name__ == '__main__': + + parser = argparse.ArgumentParser(description='do verification') + # general + parser.add_argument('--data-dir', default='/raid5data/dplearn/YTF', help='') + parser.add_argument('--model', default='../model/softmax,50', help='path to load model.') + parser.add_argument('--gpu', default=0, type=int, help='gpu id') + parser.add_argument('--batch-size', default=32, type=int, help='') + parser.add_argument('--mode', default=1, type=int, help='') + args = parser.parse_args() + if args.mode>=2: + main2(args) + else: + main(args) + diff --git a/src/eval/ytf_badcases.py b/src/eval/ytf_badcases.py new file mode 100644 index 0000000..a2525c3 --- /dev/null +++ b/src/eval/ytf_badcases.py @@ -0,0 +1,75 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +import os +import numpy as np +import cv2 + +pairs_file = '/raid5data/dplearn/YTF/splits2.txt' +stat = [0,0] +for line in open(pairs_file, 'r'): + line = line.strip() + if line.startswith('split'): + continue + vec = line.split(',') + issame = int(vec[-1]) + if issame: + stat[0]+=1 + else: + stat[1]+=1 +print('stat', stat) + +image_dir = '/raid5data/dplearn/YTF/images' + +def get_img(name, vid): + input_dir = os.path.join(image_dir, name, str(vid)) + paths = [] + for img in os.listdir(input_dir): + path = os.path.join(input_dir, img) + paths.append(path) + paths = sorted(paths) + parts = 8 + assert len(paths)>=parts + gap = len(paths)//parts + img = None + for i in xrange(parts): + idx = gap*i + path = paths[idx] + _img = cv2.imread(path) + #print(_img.shape) + if img is None: + img = _img + else: + img = np.concatenate( (img, _img), axis=1) + return img + + +text_color = (153,255,51) +for input in ['ytf_false_positive', 'ytf_false_negative']: + all_img = None + pp = 0 + for line in open(input+".log", 'r'): + if line.startswith("\t"): + break + vec = line.strip().split(',') + img1 = get_img(vec[0], int(vec[1])) + img2 = get_img(vec[2], int(vec[3])) + img = np.concatenate( (img1, img2), axis=0) + if all_img is None: + all_img = img + else: + all_img = np.concatenate( (all_img, img), axis=0) + blank_img = np.zeros( (20, 112*8,3), dtype=np.uint8) + blank_img[:,:,:] = 255 + font = cv2.FONT_HERSHEY_SIMPLEX + k = "centre-distance:%.3f"%(float(vec[4])) + #print(k) + cv2.putText(blank_img,k,(350,blank_img.shape[0]-4), font, 0.6, text_color, 2) + all_img = np.concatenate( (all_img, blank_img), axis=0) + pp+=1 + + filename = os.path.join('badcases', input+".png") + cv2.imwrite(filename, all_img) + From 102b73e050e996d5654dea6f88c68e269f5b0a4b Mon Sep 17 00:00:00 2001 From: nttstar Date: Mon, 19 Feb 2018 19:11:02 +0800 Subject: [PATCH 8/8] n sgd --- src/common/noise_sgd.py | 38 ++++++++++++++++++++++++++++++++++++++ src/train_softmax.py | 34 ++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/common/noise_sgd.py diff --git a/src/common/noise_sgd.py b/src/common/noise_sgd.py new file mode 100644 index 0000000..70024ec --- /dev/null +++ b/src/common/noise_sgd.py @@ -0,0 +1,38 @@ +import mxnet.optimizer as optimizer +from mxnet import ndarray as nd + +class NoiseSGD(optimizer.SGD): + """Noise SGD. + + + This optimizer accepts the same arguments as :class:`.SGD`. + """ + def __init__(self, scale, **kwargs): + super(NoiseSGD, self).__init__(**kwargs) + print('init noise sgd with', scale) + self.scale = scale + + def update(self, index, weight, grad, state): + assert(isinstance(weight, NDArray)) + assert(isinstance(grad, NDArray)) + self._update_count(index) + lr = self._get_lr(index) + wd = self._get_wd(index) + + grad = grad * self.rescale_grad + if self.clip_gradient is not None: + grad = clip(grad, -self.clip_gradient, self.clip_gradient) + noise = nd.random.normal(scale = self.scale, shape = grad.shape, dtype=grad.dtype, ctx = grad.context) + grad += noise + + if state is not None: + mom = state + mom[:] *= self.momentum + grad += wd * weight + mom[:] += grad + grad[:] += self.momentum * mom + weight[:] += -lr * grad + else: + assert self.momentum == 0.0 + weight[:] += -lr * (grad + wd * weight) + diff --git a/src/train_softmax.py b/src/train_softmax.py index eec7ac3..0f148e1 100644 --- a/src/train_softmax.py +++ b/src/train_softmax.py @@ -17,6 +17,7 @@ import argparse import mxnet.optimizer as optimizer sys.path.append(os.path.join(os.path.dirname(__file__), 'common')) import face_image +from noise_sgd import NoiseSGD sys.path.append(os.path.join(os.path.dirname(__file__), 'eval')) sys.path.append(os.path.join(os.path.dirname(__file__), 'symbols')) import fresnet @@ -53,7 +54,7 @@ class AccMetric(mx.metric.EvalMetric): def update(self, labels, preds): self.count+=1 - if args.loss_type>=2 and args.loss_type<=4 and args.margin_verbose>0: + if args.loss_type>=2 and args.loss_type<=5 and args.margin_verbose>0: if self.count%args.ctx_num==0: mbatch = self.count//args.ctx_num if mbatch==1 or mbatch%args.margin_verbose==0: @@ -123,10 +124,9 @@ def parse_args(): parser.add_argument('--version-unit', type=int, default=3, help='') parser.add_argument('--end-epoch', type=int, default=100000, help='training epoch size.') - parser.add_argument('--lr', type=float, default=0.1, - help='') - parser.add_argument('--wd', type=float, default=0.0005, - help='') + parser.add_argument('--noise-sgd', type=float, default=0.0, help='') + parser.add_argument('--lr', type=float, default=0.1, help='') + parser.add_argument('--wd', type=float, default=0.0005, help='') parser.add_argument('--mom', type=float, default=0.9, help='') parser.add_argument('--emb-size', type=int, default=512, @@ -176,6 +176,7 @@ def parse_args(): help='') parser.add_argument('--rand-mirror', type=int, default=1, help='') + parser.add_argument('--cutoff', type=int, default=0, help='') parser.add_argument('--patch', type=str, default='0_0_96_112_0', help='') parser.add_argument('--lr-steps', type=str, default='', help='') @@ -376,6 +377,21 @@ def get_symbol(args, arg_params, aux_params): gt_one_hot = mx.sym.one_hot(gt_label, depth = args.num_classes, on_value = 1.0, off_value = 0.0) body = mx.sym.broadcast_mul(gt_one_hot, diff) fc7 = fc7+body + elif args.loss_type==5: + s = args.margin_s + m = args.margin_m + assert s>0.0 + assert m>=0.0 + assert m<(math.pi/2) + _weight = mx.symbol.Variable("fc7_weight", shape=(args.num_classes, args.emb_size), lr_mult=1.0) + _weight = mx.symbol.L2Normalization(_weight, mode='instance') + nembedding = mx.symbol.L2Normalization(embedding, mode='instance', name='fc1n') + cos_a = mx.sym.FullyConnected(data=nembedding, weight = _weight, no_bias = True, num_hidden=args.num_classes, name='fc7') + theta_a = mx.sym.arccos(cos_a) + gt_one_hot = mx.sym.one_hot(gt_label, depth = args.num_classes, on_value = m, off_value = 0.0) + theta_a = theta_a+gt_one_hot + fc7 = math.pi/2 - theta_a + fc7 = fc7*s elif args.loss_type==10: #marginal loss nembedding = mx.symbol.L2Normalization(embedding, mode='instance', name='fc1n') params = [1.2, 0.3, 1.0] @@ -697,6 +713,7 @@ def train_net(args): shuffle = True, rand_mirror = args.rand_mirror, mean = mean, + cutoff = args.cutoff, c2c_threshold = args.c2c_threshold, output_c2c = args.output_c2c, c2c_mode = args.c2c_mode, @@ -720,6 +737,7 @@ def train_net(args): shuffle = True, rand_mirror = args.rand_mirror, mean = mean, + cutoff = args.cutoff, c2c_threshold = args.c2c_threshold, output_c2c = args.output_c2c, c2c_mode = args.c2c_mode, @@ -749,7 +767,11 @@ def train_net(args): else: initializer = mx.init.Xavier(rnd_type='uniform', factor_type="in", magnitude=2) _rescale = 1.0/args.ctx_num - opt = optimizer.SGD(learning_rate=base_lr, momentum=base_mom, wd=base_wd, rescale_grad=_rescale) + if args.noise_sgd>0.0: + print('use noise sgd') + opt = NoiseSGD(scale = args.noise_sgd, learning_rate=base_lr, momentum=base_mom, wd=base_wd, rescale_grad=_rescale) + else: + opt = optimizer.SGD(learning_rate=base_lr, momentum=base_mom, wd=base_wd, rescale_grad=_rescale) som = 20 if args.loss_type==12 or args.loss_type==13: som = 2