hd.close() embeddings = tf.nn.l2_normalize(prelogits, 1, 1e-10, name='embeddings') # Norm for the prelogits eps = 1e-5 prelogits_norm = tf.reduce_mean( tf.norm(tf.abs(prelogits) + eps, ord=args.prelogits_norm_p, axis=1)) tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, prelogits_norm * args.prelogits_norm_loss_factor) # inference_loss, logit = cos_loss(prelogits, labels, args.class_number) w_init_method = slim.initializers.xavier_initializer() inference_loss, logit = arcface_loss(embedding=embeddings, labels=labels, w_init=w_init_method, out_num=args.class_number) tf.add_to_collection('losses', inference_loss) # total losses regularization_losses = tf.get_collection( tf.GraphKeys.REGULARIZATION_LOSSES) total_loss = tf.add_n([inference_loss] + regularization_losses, name='total_loss') # define the learning rate schedule learning_rate = tf.train.piecewise_constant( epoch, boundaries=args.lr_schedule, values=[0.1, 0.01, 0.001, 0.0001, 0.00001], name='lr_schedule')
db, args.image_size, args) #預設是lfw,image size 27行 112*112,得到dataset BGR [112, 112, 3] ver_list.append(data_set) #把驗證集加到ver_list裡 ver_name_list.append(db) #把驗證集path加到ver_name_list裡 # 3. define network, loss, optimize method, learning rate schedule, summary writer, saver # 3.1 inference phase w_init_method = tf.contrib.layers.xavier_initializer(uniform=False) net = get_resnet(images, args.net_depth, type='ir', w_init=w_init_method, trainable=True, keep_rate=dropout_rate) # 3.2 get arcface loss logit = arcface_loss(embedding=net.outputs, labels=labels, w_init=w_init_method, out_num=args.num_output) # test net because of batch normal layer tl.layers.set_name_reuse(True) test_net = get_resnet(images, args.net_depth, type='ir', w_init=w_init_method, trainable=False, reuse=True, keep_rate=dropout_rate) embedding_tensor = test_net.outputs # 3.3 define the cross entropy inference_loss = tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels))
def custom_insightface_evaluation(args): tf.reset_default_graph() # Read the directory containing images pairs = read_pairs(args.insightface_pair) image_list, issame_list = get_paths_with_pairs( args.insightface_dataset_dir, pairs) # Evaluate custom dataset with facenet pre-trained model print("Getting embeddings with facenet pre-trained model") # Getting batched images by TF dataset tf_dataset = facenet.tf_gen_dataset( image_list=image_list, label_list=None, nrof_preprocess_threads=args.nrof_preprocess_threads, image_size=args.insightface_dataset_dir, method='cache_slices', BATCH_SIZE=args.batch_size, repeat_count=1, to_float32=True, shuffle=False) # tf_dataset = facenet.tf_gen_dataset(image_list, label_list, args.nrof_preprocess_threads, args.facenet_image_size, method='cache_slices', # BATCH_SIZE=args.batch_size, repeat_count=1, shuffle=False) tf_dataset_iterator = tf_dataset.make_initializable_iterator() tf_dataset_next_element = tf_dataset_iterator.get_next() images = tf.placeholder(name='img_inputs', shape=[ None, args.insightface_image_size, args.insightface_image_size, 3 ], dtype=tf.float32) labels = tf.placeholder(name='img_labels', shape=[ None, ], dtype=tf.int64) dropout_rate = tf.placeholder(name='dropout_rate', dtype=tf.float32) w_init_method = tf.contrib.layers.xavier_initializer(uniform=False) net = L_Resnet_E_IR_fix_issue9.get_resnet(images, args.net_depth, type='ir', w_init=w_init_method, trainable=False, keep_rate=dropout_rate) embeddings = net.outputs # mv_mean = tl.layers.get_variables_with_name('resnet_v1_50/bn0/moving_mean', False, True)[0] # 3.2 get arcface loss logit = arcface_loss(embedding=net.outputs, labels=labels, w_init=w_init_method, out_num=args.num_output) sess = tf.Session() saver = tf.train.Saver() feed_dict = {} feed_dict_flip = {} path = args.ckpt_file + args.ckpt_index_list[0] saver.restore(sess, path) print('ckpt file %s restored!' % args.ckpt_index_list[0]) feed_dict.update(tl.utils.dict_to_one(net.all_drop)) feed_dict_flip.update(tl.utils.dict_to_one(net.all_drop)) feed_dict[dropout_rate] = 1.0 feed_dict_flip[dropout_rate] = 1.0 batch_size = args.batch_size input_placeholder = images sess.run(tf_dataset_iterator.initializer) print('getting embeddings..') total_time = 0 batch_number = 0 embeddings_array = None embeddings_array_flip = None while True: try: images = sess.run(tf_dataset_next_element) data_tmp = images.copy() # fix issues #4 for i in range(data_tmp.shape[0]): data_tmp[i, ...] -= 127.5 data_tmp[i, ...] *= 0.0078125 data_tmp[i, ...] = cv2.cvtColor(data_tmp[i, ...], cv2.COLOR_RGB2BGR) # Getting flip to left_right batched images by TF dataset data_tmp_flip = images.copy() # fix issues #4 for i in range(data_tmp_flip.shape[0]): data_tmp_flip[i, ...] = np.fliplr(data_tmp_flip[i, ...]) data_tmp_flip[i, ...] -= 127.5 data_tmp_flip[i, ...] *= 0.0078125 data_tmp_flip[i, ...] = cv2.cvtColor(data_tmp_flip[i, ...], cv2.COLOR_RGB2BGR) start_time = time.time() feed_dict[input_placeholder] = data_tmp _embeddings = sess.run(embeddings, feed_dict) feed_dict_flip[input_placeholder] = data_tmp_flip _embeddings_flip = sess.run(embeddings, feed_dict_flip) if embeddings_array is None: embeddings_array = np.zeros( (len(image_list), _embeddings.shape[1])) embeddings_array_flip = np.zeros( (len(image_list), _embeddings_flip.shape[1])) try: embeddings_array[batch_number * batch_size:min((batch_number + 1) * batch_size, len(image_list)), ...] = _embeddings embeddings_array_flip[batch_number * batch_size:min( (batch_number + 1) * batch_size, len(image_list)), ...] = _embeddings_flip # print('try: ', batch_number * batch_size, min((batch_number + 1) * batch_size, len(image_list)), ...) except ValueError: print( 'batch_number*batch_size value is %d min((batch_number+1)*batch_size, len(image_list)) %d,' ' batch_size %d, data.shape[0] %d' % (batch_number * batch_size, min((batch_number + 1) * batch_size, len(image_list)), batch_size, images.shape[0])) print('except: ', batch_number * batch_size, min((batch_number + 1) * batch_size, images.shape[0]), ...) duration = time.time() - start_time batch_number += 1 total_time += duration except tf.errors.OutOfRangeError: print( 'tf.errors.OutOfRangeError, Reinitialize tf_dataset_iterator') sess.run(tf_dataset_iterator.initializer) break print(f"total_time: {total_time}") _xnorm = 0.0 _xnorm_cnt = 0 for embed in [embeddings_array, embeddings_array_flip]: for i in range(embed.shape[0]): _em = embed[i] _norm = np.linalg.norm(_em) # print(_em.shape, _norm) _xnorm += _norm _xnorm_cnt += 1 _xnorm /= _xnorm_cnt final_embeddings_output = embeddings_array + embeddings_array_flip final_embeddings_output = sklearn.preprocessing.normalize( final_embeddings_output) print(final_embeddings_output.shape) tpr, fpr, accuracy, val, val_std, far = verification.evaluate( final_embeddings_output, issame_list, nrof_folds=10) acc2, std2 = np.mean(accuracy), np.std(accuracy) auc = metrics.auc(fpr, tpr) print('XNorm: %f' % (_xnorm)) print('Accuracy-Flip: %1.5f+-%1.5f' % (acc2, std2)) print('TPR: ', np.mean(tpr), 'FPR: ', np.mean(fpr)) print('Area Under Curve (AUC): %1.3f' % auc) tpr_lfw, fpr_lfw, accuracy_lfw, val_lfw, val_std_lfw, far_lfw = lfw.evaluate( final_embeddings_output, issame_list, nrof_folds=10, distance_metric=0, subtract_mean=False) print('accuracy_lfw: %2.5f+-%2.5f' % (np.mean(accuracy_lfw), np.std(accuracy_lfw))) print( f"val_lfw: {val_lfw}, val_std_lfw: {val_std_lfw}, far_lfw: {far_lfw}") print('val_lfw rate: %2.5f+-%2.5f @ FAR=%2.5f' % (val_lfw, val_std_lfw, far_lfw)) auc_lfw = metrics.auc(fpr_lfw, tpr_lfw) print('TPR_LFW:', np.mean(tpr_lfw), 'FPR_LFW: ', np.mean(fpr_lfw)) print('Area Under Curve LFW (AUC): %1.3f' % auc_lfw) sess.close() return acc2, std2, _xnorm, [embeddings_array, embeddings_array_flip]
loss_keys = [] with tf.variable_scope(tf.get_variable_scope()): for i in range(args.num_gpus): with tf.device('/gpu:%d' % i): with tf.name_scope('%s_%d' % (args.tower_name, i)) as scope: # net = get_resnet(images_s[i], args.net_depth, type='ir', w_init=w_init_method, trainable=True, keep_rate=dropout_rate) prelogits, net_points = inference(images_s[i], bottleneck_layer_size=512, phase_train=True, weight_decay=args.weight_decay) embeddings = tf.nn.l2_normalize(prelogits, 1, 1e-10, name='embeddings') eps = 1e-5 prelogits_norm = tf.reduce_mean(tf.norm(tf.abs(prelogits) + eps, ord=1.0, axis=1)) tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, prelogits_norm * 2e-5) w_init_method = slim.initializers.xavier_initializer() logit = arcface_loss(embedding=embeddings, labels=labels_s[i], w_init=w_init_method, out_num=args.num_output) # Reuse variables for the next tower. tf.get_variable_scope().reuse_variables() # define the cross entropy inference_loss = tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels_s[i])) tf.add_to_collection('losses', inference_loss) regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) reg_loss = tf.add_n(regularization_losses,name='reg_loss') total_loss = tf.add_n([inference_loss] + regularization_losses, name='total_loss') # define weight deacy losses loss_dict[('inference_loss_%s_%d' % ('gpu', i))] = inference_loss
], dtype=tf.int64) t_model_path = args.teacher_model_path w_init_method = tf.contrib.layers.xavier_initializer(uniform=False) net_t = get_resnet(images_t, args.net_depth, type='ir', w_init=w_init_method, trainable=False, keep_rate=dropout_keep_rate) embedding_tensor_t = net_t.outputs logit_t = arcface_loss(embedding=embedding_tensor_t, labels=labels_t, var_scope='arcface_loss', w_init=w_init_method, out_num=args.num_output) t_tau = tf.scalar_mul(1.0 / args.tau, logit_t) pred_t = tf.nn.softmax(logit_t) acc_t = tf.reduce_mean( tf.cast(tf.equal(tf.argmax(pred_t, axis=1), labels_t), dtype=tf.float32)) print('########################') print('teacher model start to restore') saver_restore_t = tf.train.Saver() config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=args.log_device_mapping) config.gpu_options.allow_growth = True sess_t = tf.Session(config=config)
def get_insightface_embeddings(args): tf.reset_default_graph() # Read the directory containing images dataset = facenet.get_dataset(args.insightface_dataset_dir) nrof_classes = len(dataset) # Evaluate custom dataset with facenet pre-trained model print("Getting embeddings with facenet pre-trained model") # Get a list of image paths and their labels image_list, label_list = facenet.get_image_paths_and_labels(dataset) assert len(image_list) > 0, 'The dataset should not be empty' print('Number of classes in dataset: %d' % nrof_classes) print('Number of examples in dataset: %d' % len(image_list)) # Getting batched images by TF dataset tf_dataset = facenet.tf_gen_dataset( image_list=image_list, label_list=None, nrof_preprocess_threads=args.nrof_preprocess_threads, image_size=args.insightface_dataset_dir, method='cache_slices', BATCH_SIZE=args.batch_size, repeat_count=1, to_float32=True, shuffle=False) tf_dataset_iterator = tf_dataset.make_initializable_iterator() tf_dataset_next_element = tf_dataset_iterator.get_next() images = tf.placeholder(name='img_inputs', shape=[ None, args.insightface_image_size, args.insightface_image_size, 3 ], dtype=tf.float32) labels = tf.placeholder(name='img_labels', shape=[ None, ], dtype=tf.int64) dropout_rate = tf.placeholder(name='dropout_rate', dtype=tf.float32) w_init_method = tf.contrib.layers.xavier_initializer(uniform=False) net = L_Resnet_E_IR_fix_issue9.get_resnet(images, args.net_depth, type='ir', w_init=w_init_method, trainable=False, keep_rate=dropout_rate) embeddings = net.outputs # mv_mean = tl.layers.get_variables_with_name('resnet_v1_50/bn0/moving_mean', False, True)[0] # 3.2 get arcface loss logit = arcface_loss(embedding=net.outputs, labels=labels, w_init=w_init_method, out_num=args.num_output) sess = tf.Session() saver = tf.train.Saver() feed_dict = {} feed_dict_flip = {} path = args.ckpt_file + args.ckpt_index_list[0] saver.restore(sess, path) print('ckpt file %s restored!' % args.ckpt_index_list[0]) feed_dict.update(tl.utils.dict_to_one(net.all_drop)) feed_dict_flip.update(tl.utils.dict_to_one(net.all_drop)) feed_dict[dropout_rate] = 1.0 feed_dict_flip[dropout_rate] = 1.0 batch_size = args.batch_size input_placeholder = images sess.run(tf_dataset_iterator.initializer) # sess.run(tf_dataset_iterator_flip.initializer) print('getting embeddings..') total_time = 0 batch_number = 0 embeddings_array = None embeddings_array_flip = None while True: try: images = sess.run(tf_dataset_next_element) data_tmp = images.copy() # fix issues #4 for i in range(data_tmp.shape[0]): data_tmp[i, ...] -= 127.5 data_tmp[i, ...] *= 0.0078125 data_tmp[i, ...] = cv2.cvtColor(data_tmp[i, ...], cv2.COLOR_RGB2BGR) # Getting flip to left_right batched images by TF dataset data_tmp_flip = images.copy() # fix issues #4 for i in range(data_tmp_flip.shape[0]): data_tmp_flip[i, ...] = np.fliplr(data_tmp_flip[i, ...]) data_tmp_flip[i, ...] -= 127.5 data_tmp_flip[i, ...] *= 0.0078125 data_tmp_flip[i, ...] = cv2.cvtColor(data_tmp_flip[i, ...], cv2.COLOR_RGB2BGR) start_time = time.time() feed_dict[input_placeholder] = data_tmp _embeddings = sess.run(embeddings, feed_dict) feed_dict_flip[input_placeholder] = data_tmp_flip _embeddings_flip = sess.run(embeddings, feed_dict_flip) if embeddings_array is None: embeddings_array = np.zeros( (len(image_list), _embeddings.shape[1])) embeddings_array_flip = np.zeros( (len(image_list), _embeddings_flip.shape[1])) try: embeddings_array[batch_number * batch_size:min((batch_number + 1) * batch_size, len(image_list)), ...] = _embeddings embeddings_array_flip[batch_number * batch_size:min( (batch_number + 1) * batch_size, len(image_list)), ...] = _embeddings_flip # print('try: ', batch_number * batch_size, min((batch_number + 1) * batch_size, len(image_list)), ...) except ValueError: print( 'batch_number*batch_size value is %d min((batch_number+1)*batch_size, len(image_list)) %d,' ' batch_size %d, data.shape[0] %d' % (batch_number * batch_size, min((batch_number + 1) * batch_size, len(image_list)), batch_size, images.shape[0])) print('except: ', batch_number * batch_size, min((batch_number + 1) * batch_size, images.shape[0]), ...) duration = time.time() - start_time batch_number += 1 total_time += duration except tf.errors.OutOfRangeError: print( 'tf.errors.OutOfRangeError, Reinitialize tf_dataset_iterator') sess.run(tf_dataset_iterator.initializer) break print(f"total_time: {total_time}") _xnorm = 0.0 _xnorm_cnt = 0 for embed in [embeddings_array, embeddings_array_flip]: for i in range(embed.shape[0]): _em = embed[i] _norm = np.linalg.norm(_em) # print(_em.shape, _norm) _xnorm += _norm _xnorm_cnt += 1 _xnorm /= _xnorm_cnt final_embeddings_output = embeddings_array + embeddings_array_flip final_embeddings_output = sklearn.preprocessing.normalize( final_embeddings_output) print(final_embeddings_output.shape) sess.close() return embeddings_array, embeddings_array_flip, final_embeddings_output, _xnorm
name='lr_schedule') # 3.3 define the optimize method opt = tf.train.MomentumOptimizer(learning_rate=lr, momentum=args.momentum) # Calculate the gradients for each model tower. tower_grads = [] tl.layers.set_name_reuse(True) loss_dict = {} drop_dict = {} loss_keys = [] with tf.variable_scope(tf.get_variable_scope()): for i in range(args.num_gpus): with tf.device('/gpu:%d' % i): with tf.name_scope('%s_%d' % (args.tower_name, i)) as scope: net = get_resnet(images_s[i], args.net_depth, type='ir', w_init=w_init_method, trainable=True, keep_rate=dropout_rate) logit = arcface_loss(embedding=net.outputs, labels=labels_s[i], w_init=w_init_method, out_num=args.num_output) # Reuse variables for the next tower. tf.get_variable_scope().reuse_variables() # define the cross entropy inference_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels_s[i])) # define weight deacy losses wd_loss = 0 for weights in tl.layers.get_variables_with_name('W_conv2d', True, True): wd_loss += tf.contrib.layers.l2_regularizer(args.weight_deacy)(weights) for W in tl.layers.get_variables_with_name('resnet_v1_50/E_DenseLayer/W', True, True): wd_loss += tf.contrib.layers.l2_regularizer(args.weight_deacy)(W) for weights in tl.layers.get_variables_with_name('embedding_weights', True, True): wd_loss += tf.contrib.layers.l2_regularizer(args.weight_deacy)(weights) for gamma in tl.layers.get_variables_with_name('gamma', True, True): wd_loss += tf.contrib.layers.l2_regularizer(args.weight_deacy)(gamma) for alphas in tl.layers.get_variables_with_name('alphas', True, True):
w_init_method = tf.contrib.layers.xavier_initializer( uniform=False) # 随机初始化权重先把空架子搭起来,后续再往里面restore train好的权重 net = get_resnet( images, args.net_depth, type='ir', w_init=w_init_method, trainable=False, keep_rate=dropout_rate) # L_Resnet_E_IR (?, 112,112,3)>(?, 512) embedding_tensor = net.outputs # mv_mean = tl.layers.get_variables_with_name('resnet_v1_50/bn0/moving_mean', False, True)[0] # 3.2 get arcface loss logit = arcface_loss( embedding=net.outputs, labels=labels, w_init=w_init_method, out_num=args.num_output) # (?, 512),(?,),initializer ,85164 gpu_config = tf.ConfigProto() gpu_config.gpu_options.allow_growth = True sess = tf.Session(config=gpu_config) saver = tf.train.Saver() result_index = [] for file_index in args.ckpt_index_list: feed_dict_test = {} path = args.ckpt_file + file_index saver.restore(sess, path) print('ckpt file %s restored!' % file_index) feed_dict_test.update(tl.utils.dict_to_one(net.all_drop))
exclusions = None if checkpoint_exclude_scopes: exclusions = [ scope.strip() for scope in checkpoint_exclude_scopes.split(',')] variables_to_restore = [] for var in slim.get_model_variables(): excluded = False for exclusion in exclusions: if var.op.name.startswith(exclusion): excluded = True if not excluded: variables_to_restore.append(var) print('################################') print('variables in ori model to restore are set') logit = arcface_loss(embedding=net, labels=labels, var_scope='arcface_loss', w_init=w_init_method, out_num=args.num_output) # test net because of batch normal layera # tl.layers.set_name_reuse(True) # test_net = get_resnet(images, args.net_depth, type='ir', w_init=w_init_method, trainable=False, reuse=True, keep_rate=dropout_rate) # embedding_tensor = test_net.outputs # 3.3 define the cross entropy inference_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logit, labels=labels)) # inference_loss_avg = tf.reduce_mean(inference_loss) # 3.4 define weight deacy losses # for var in tf.trainable_variables(): # print(var.name) # print('##########'*30) # wd_loss = tf.convert_to_tensor(np.array([0.,], dtype=np.float32)) # 3.5 total losses # total_loss = inference_loss + wd_loss
# Norm for the prelogits prelogits_norm = tf.reduce_mean( tf.norm(tf.abs(prelogits) + 1e-5, ord=args.prelogits_norm_p, axis=1)) tf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, prelogits_norm * args.prelogits_norm_loss_factor) if args.loss_type == 'softmax': inference_loss, logit = softmax_loss(prelogits, labels, args.num_output) elif args.loss_type == 'arcface': inference_loss, logit = arcface_loss( embeddings, labels, args.num_output, w_init=slim.initializers.xavier_initializer()) else: print('loss_type is invalid, you can use softmax or arcface.') exit(0) # total losses regularization_losses = tf.get_collection( tf.GraphKeys.REGULARIZATION_LOSSES) total_loss = tf.add_n([inference_loss] + regularization_losses, name='total_loss') # define the learning rate schedule learning_rate = tf.train.piecewise_constant( global_step,
drop_dict = {} loss_keys = [] with tf.variable_scope(tf.get_variable_scope()): for iter_gpus in num_gpus: with tf.device('/gpu:%d' % iter_gpus): with tf.name_scope('%s_%d' % (tower_name, iter_gpus)) as scope: net = get_resnet(images_s[iter_gpus], net_depth, type=is_seblock, w_init=w_init_method, trainable=True, keep_rate=dropout_rate) if is_arcloss == 1: logit = arcface_loss(embedding=net.outputs, labels=labels[iter_gpus], w_init=w_init_method, out_num=num_output, s=loss_s, m=loss_m) else: logit = cosineface_losses(embedding=net.outputs, labels=labels_s[iter_gpus], w_init=w_init_method, out_num=num_output, s=loss_s, m=loss_m) # Reuse variables for the next tower. tf.get_variable_scope().reuse_variables( ) # 同名变量将会复用,假设现在gpu0上创建了两个变量var0,var1,那么在gpu1上创建计算图的时候,如果还有var0和var1,则默认复用之前gpu0上的创建的那两个值 # define the cross entropy inference_loss = tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(