zoukankan      html  css  js  c++  java
  • (转)Darknet模型与Tensorflow模型相互转换

    目前darknet框架下的模型训练都是在C环境下训练的,难免较为晦涩,如果能将模型转换到Tensorflow环境下完成模型的训练,在将训练好的权重转为Darknet可以识别的权重部署到实际应用中。这样就可以将算法的训练和实际部署分开!

    1、将Darknet框架下的.cfg与.weights 转为Tensorflow框架下的.cpkt模型

    先clone这个项目,用于darknet模型转tensorflow

    https://github.com/Linzmin1927/DW2TF
    cd 到DW2TF目录下,然后执行

    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/ 可以查看当前网络结构

     

    2、darknet 与 tensorflow 权重数据解析与转换

    如果需要将Tensorflow的权重数据转为Darknet的权重,需要进一步解析两个框架下权重保存的数据格式。

    分别打开 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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/10874059.html
Copyright © 2011-2022 走看看