目前darknet框架下的模型訓練都是在C環境下訓練的,不免較爲晦澀,若是能將模型轉換到Tensorflow環境下完成模型的訓練,在將訓練好的權重轉爲Darknet能夠識別的權重部署到實際應用中。這樣就能夠將算法的訓練和實際部署分開!html
一、將Darknet框架下的.cfg與.weights 轉爲Tensorflow框架下的.cpkt模型python
先clone這個項目,用於darknet模型轉tensorflowgit
https://github.com/Linzmin1927/DW2TF
cd 到DW2TF目錄下,而後執行github
python3 main.py \ --cfg 'data/yolov3-tiny.cfg' \ --weights 'data/yolov3-tiny.weights' \ --output 'tf_file/' \ --prefix 'yolov3-tiny/' \ --gpu 0
能夠在tf_file中查看相關生成的ckpt文件與pd文件算法
在python中執行如下腳本,能夠查看網絡結構和各個權重瀏覽器
import tensorflow as tf from tensorflow.python import pywrap_tensorflow tf.reset_default_graph() model_dir = "tf_files" # ckpt文件目錄 ckpt = tf.train.get_checkpoint_state(model_dir) ckpt_path = ckpt.model_checkpoint_path # 加載圖結構 reader = pywrap_tensorflow.NewCheckpointReader(ckpt_path) param_dict = reader.get_variable_to_shape_map() # 打印圖中變量 for key, val in param_dict.items(): try: print(key, val) except: pass # 加載權重數據 saver = tf.train.import_meta_graph(ckpt_path+'.meta',clear_devices=True) graph = tf.get_default_graph() with tf.Session( graph=graph) as sess: sess.run(tf.global_variables_initializer()) saver.restore(sess,ckpt_path) #啓動TensorBoard summaryWriter = tf.summary.FileWriter('log/', tf.get_default_graph()) # 查看第一個卷積層的卷積權重 key = 'yolov3-tiny/convolutional1/kernel' w = reader.get_tensor(key) print(type(w)) print(w.shape) print(w)
能夠看到網絡第一層卷積層卷積權重打印出來網絡
而後在根目錄下打開cmd 輸入 tensorboard --logdir log/ 啓動tensorboard服務,在瀏覽器中輸入http://localhost:6006/ 能夠查看當前網絡結構框架
二、darknet 與 tensorflow 權重數據解析與轉換.net
若是須要將Tensorflow的權重數據轉爲Darknet的權重,須要進一步解析兩個框架下權重保存的數據格式。3d
分別打開 yolov3.weights文件和yolov3-tiny.ckpt.data-00000-of-00001文件。
yolov3.weights文件(Darknet)
yolov3-tiny.ckpt.data-00000-of-00001文件(Tensorflow)
能夠看到權重值是同樣的,yolov3.weights文件中還包含了權重版本信息和迭代訓練次數!因此只要Tensorflow網絡結構和Darknet一致,就能很方便手動將Tensorflow權重轉存爲Darknet。--------------------- 做者:橘子都吃不起! 來源:CSDN 原文:https://blog.csdn.net/weixin_42754237/article/details/87534092 版權聲明:本文爲博主原創文章,轉載請附上博文連接!