目前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 版权声明:本文为博主原创文章,转载请附上博文连接!