年龄_性别识别
参考开源项目:年龄_性别识别
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