MTCNN(十)輸出python端權重到c端

背景: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端的網絡結構來進行更改。

 

未完

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章