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

  • 相关阅读:
    拉姆达表达式(lambda Expressions)
    Func,Action 的介绍
    VS2012 此模板尝试加载组件程序集”NuGet.VisualStudio.interop,Version=1.0.0.0 的解决
    444 英语口语
    Base algorithm
    Windows Search Service
    Windows Azure Storage
    HDU 3395 Special Fish
    CodeForces 235B Let's Play Osu!
    HDU 3435 A new Graph Game
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/10874059.html
Copyright © 2011-2022 走看看