年龄_性别识别
参考开源项目:年龄_性别识别
1.识别效果如下图
2.keras模型转pb模型,方便模型的迁移和rknn平台的使用,代码1如下:
from keras.models import load_model import tensorflow as tf import os import os.path as osp from keras import backend as K from wide_resnet import WideResNet import tensorflow as tf from tensorflow.python.framework import graph_io print(tf.__version__) import keras as ks print(ks.__version__) import platform print (platform.python_version()) def freeze_graph(graph, session, output_node_names, model_name): with graph.as_default(): graphdef_inf = tf.graph_util.remove_training_nodes(graph.as_graph_def()) graphdef_frozen = tf.graph_util.convert_variables_to_constants(session, graphdef_inf, output_node_names) graph_io.write_graph(graphdef_frozen, "tmp", os.path.basename(model_name) + ".pb", as_text=False) print("done") def pb_transfer(): weight_file = "E:\\python_project\\age-gender-estimation-master\\pretrained_models\\weights.28-3.73.hdf5" output_fld ='./' output_graph_name = 'age-gender.pb' tf.keras.backend.set_learning_phase(0) img_size = 64 model = WideResNet(img_size, depth=16, k=8)() model.load_weights(weight_file) for out in model.outputs: print(out.op.name) session = tf.keras.backend.get_session() freeze_graph(session.graph, session, [out.op.name for out in model.outputs], weight_file) if __name__ == '__main__': pb_transfer()
代码2如下:
# coding=utf-8 from keras.models import load_model import tensorflow as tf import os import os.path as osp from keras import backend as K #路径参数 weight_file_path = "E:\\python_project\\age-gender-estimation-master\\pretrained_models\\weights.28-3.73.hdf5" output_graph_name = 'ttt.pb' #转换函数 def h5_to_pb(h5_model,output_dir,model_name,out_prefix = "output_",log_tensorboard = True): if osp.exists(output_dir) == False: os.mkdir(output_dir) out_nodes = [] for i in range(len(h5_model.outputs)): out_nodes.append(out_prefix + str(i + 1)) tf.identity(h5_model.output[i],out_prefix + str(i + 1)) sess = K.get_session() from tensorflow.python.framework import graph_util,graph_io init_graph = sess.graph.as_graph_def() main_graph = graph_util.convert_variables_to_constants(sess,init_graph,out_nodes) graph_io.write_graph(main_graph,output_dir,name = model_name,as_text = False) if log_tensorboard: from tensorflow.python.tools import import_pb_to_tensorboard import_pb_to_tensorboard.import_to_tensorboard(osp.join(output_dir,model_name),output_dir) #输出路径 output_dir = "./" #加载模型 #h5_model = load_model(weight_file_path) from keras.models import load_model import tensorflow as tf import os import os.path as osp from keras import backend as K from wide_resnet import WideResNet import tensorflow as tf weight_file = "E:\\python_project\\age-gender-estimation-master\\pretrained_models\\weights.28-3.73.hdf5" output_fld ='./' tf.keras.backend.set_learning_phase(0) img_size = 64 model = WideResNet(img_size, depth=16, k=8)() model.load_weights(weight_file) h5_to_pb(model,output_dir = output_dir,model_name = output_graph_name) print('model saved')
3.推理代码如下:
import tensorflow as tf from tensorflow.python.platform import gfile import os import cv2 import numpy as np import time from keras.layers import Input, Activation, add, Dense, Flatten, Dropout #facenet_model_checkpoint ="E:\\python_project\\age-gender-estimation-master\\tmp\\weights.28-3.73.hdf5.pb" facenet_model_checkpoint ="E:\\python_project\\age-gender-estimation-master\\ttt.pb" def load_model(model, input_map=None): # Check if the model is a model directory (containing a metagraph and a checkpoint file) # or if it is a protobuf file with a frozen graph model_exp = os.path.expanduser(model) if (os.path.isfile(model_exp)): print('Model filename: %s' % model_exp) with gfile.FastGFile(model_exp,'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) tf.import_graph_def(graph_def, input_map=input_map, name='') def main(): img_size = 64 with tf.Graph().as_default(): with tf.Session() as sess: print("load model:" + facenet_model_checkpoint) load_model(facenet_model_checkpoint) print("load over.") images_placeholder = tf.get_default_graph().get_tensor_by_name("input_1:0") gender = tf.get_default_graph().get_tensor_by_name("pred_gender/Softmax:0") age = tf.get_default_graph().get_tensor_by_name("pred_age/Softmax:0") while True: img = cv2.imread("E:\\python_project\\age-gender-estimation-master\\0036.jpg") faces = cv2.resize(img, (img_size, img_size)) faces = faces[np.newaxis, :, :, :] start_time = time.time() feed_dict = {images_placeholder: faces} results = sess.run([gender,age], feed_dict=feed_dict) predicted_genders = results[0] # print(predicted_genders) ages = np.arange(0, 101).reshape(101, 1) predicted_ages = results[1].dot(ages).flatten() print("spend_time is", time.time() - start_time) print(int(predicted_ages[0])) if predicted_genders[0][0] < 0.5: print("m") else: print("f") if __name__ == '__main__': main()
4.推理时间在tx2上为:70ms