背景:python端運用tensorFlow訓練權重,很快速。c代碼端爲了獲得更好的運行性能,只保留網絡前饋運算的部分。
目的:將python端通過tensorFlow訓練的權重輸出出來,c端讀取。
前期的工作:
MTCNN(三)基於python代碼的網絡結構更改 https://blog.csdn.net/weixin_36474809/article/details/82856171
MTCNN(六)c代碼網絡結構的更改 https://blog.csdn.net/weixin_36474809/article/details/83056795
權重輸出程序實現:莊銘泳 https://me.csdn.net/qqqzmy
一、原結構與原結構
MTCNN初始的程序爲人臉識別程序,原結構與原結構需要驗證對齊上。
1.1 讀入tensorFlow模型與參數
import tensorflow as tf
#import cv2
#import numpy as np
import os
import struct
from src.mtcnn import PNet, RNet, ONet
from tools import get_model_filenames
os.environ["CUDA_VISIBLE_DEVICES"] = "3"
model_dir = "/1t_second/myzhuang2/MTCNN/wangbm_tf/save_model/sepatate/"
file_paths = get_model_filenames(model_dir)
with tf.device('/cpu'):
with tf.Graph().as_default():
config = tf.ConfigProto(allow_soft_placement=True)
with tf.Session(config=config) as sess:
if len(file_paths) == 3:
image_pnet = tf.placeholder(
tf.float32, [None, None, None, 3])
pnet = PNet({'data': image_pnet}, mode='test')
out_tensor_pnet = pnet.get_all_output()
image_rnet = tf.placeholder(tf.float32, [None, 24, 24, 3])
rnet = RNet({'data': image_rnet}, mode='test')
out_tensor_rnet = rnet.get_all_output()
image_onet = tf.placeholder(tf.float32, [None, 48, 48, 3])
onet = ONet({'data': image_onet}, mode='test')
out_tensor_onet = onet.get_all_output()
saver_pnet = tf.train.Saver(
[v for v in tf.global_variables()
if v.name[0:5] == "pnet/"])
saver_rnet = tf.train.Saver(
[v for v in tf.global_variables()
if v.name[0:5] == "rnet/"])
saver_onet = tf.train.Saver(
[v for v in tf.global_variables()
if v.name[0:5] == "onet/"])
saver_pnet.restore(sess, file_paths[0])
def pnet_fun(img): return sess.run(
out_tensor_pnet, feed_dict={image_pnet: img})
saver_rnet.restore(sess, file_paths[1])
def rnet_fun(img): return sess.run(
out_tensor_rnet, feed_dict={image_rnet: img})
saver_onet.restore(sess, file_paths[2])
def onet_fun(img): return sess.run(
out_tensor_onet, feed_dict={image_onet: img})
1.2 創建相應文檔
##PNET Params Write
variable_names = [v.name for v in tf.global_variables()]
pnet_var = []
for var in variable_names:
if 'pnet' in var:
pnet_var.append(var)
print(var)
PnetOutFile = "Pnet.bin"
PnetBinFile = open(PnetOutFile,'wb')
print("tensorflow model load seccess")
writeNum = 0
1.3 寫入
Pconv1_w卷積核
#Pconv1_w
Pconv1_w = sess.run(pnet_var[0])
ky, kx, num_in_map, num_out_kerns = Pconv1_w.shape
print(0,Pconv1_w.shape)
for j in range(num_out_kerns):
for i in range(num_in_map):
for y in range(ky):
for x in range(kx):
PnetBinFile.write(struct.pack('f', Pconv1_w[y,x,i,j]))
writeNum += 1
Pconv1_b偏移動
#Pconv1_b
Pconv1_b = sess.run(pnet_var[1])
print(1,Pconv1_b.shape)
for item in range(0,len(Pconv1_b[:])):
PnetBinFile.write(struct.pack('f',Pconv1_b[item]))
writeNum += 1
PPReLU1斜率
#PPReLU1
PPReLU1 = sess.run(pnet_var[2])
print(2,PPReLU1.shape)
for item in range(0,len(PPReLU1[:])):
PnetBinFile.write(struct.pack('f',PPReLU1[item]))
writeNum += 1
Pconv41_w全連接層
#Pconv41_b
Pconv41_b = sess.run(pnet_var[10])
print(10,Pconv41_b.shape)
for item in range(0,len(Pconv41_b[:])):
PnetBinFile.write(struct.pack('f',Pconv41_b[item]))
writeNum += 1
#Pconv42_w
Pconv42_w = sess.run(pnet_var[11])
print(11,Pconv42_w.shape)
ky, kx, num_in_map, num_out_kerns = Pconv42_w.shape
for j in range(num_out_kerns):
for i in range(num_in_map):
for y in range(ky):
for x in range(kx):
PnetBinFile.write(struct.pack('f', Pconv42_w[y,x,i,j]))
writeNum += 1
二、新結構
人頭數據集上python代碼訓練,並且測試成功,c端直接運用python端的網絡結構來進行更改。
未完