建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

大肉小馒头

发帖: 5粉丝: 1

级别 : 新手上路

发消息 + 关注

发表于2020年07月29日 14:56:12 1409 5
直达本楼层的链接
楼主
显示全部楼层
[干货分享] ACL新架构YoloV3模型转换Caffe+TF


YoloV3模型转换方法

Caffe模型转om模型

准备材料:

ATC转换工具环境,开发者文档(ATC工具使用指导),aipp_yolov3.cfg

转换步骤:

  1. 模型下载地址:https://pan.baidu.com/s/1yiCrnmsOm0hbweJBiiUScQ,下载所需输入格式的prototxt(网络结构)和caffemodel(模型权重)文件

  2. 参考开发者文档(ATC工具使用指导)的定制prototxt文件YoloV3部分,对网络结构进行修改,主要修改点为对原网络三个特征输出进行Yolo层的补充,输出为最终的boxout和boxoutnum

    image-20200724200442044image-20200724200442044.png

    image-20200724200501667image-20200724200501667.png

    image-20200724200528182image-20200724200528182.png

    image-20200724200540667

  3. 配置aipp_yolov3.cfg,按照模板配置,主要是在模型的格式配置上,需要与实际模型保持一致

    src_image_size_w : 416
    src_image_size_h : 416
  4. 使用ATC转换成om模型

    atc --model=./yolov3.prototxt \
    --weight=./yolov3.caffemodel \
    --framework=0 \
    --output=./yolov3_aipp \
    --soc_version=Ascend310 \
    --insert_op_conf=./aipp_yolov3.cfg

    如果出现如下信息,则说明转换成功

    ATC start working now, please wait for a moment.
    ATC run success, welcome to the next use.

    如果转换失败,可通过查询ACL日志寻找原因

    cat /var/log/npu/slog/host-0/host-0_2020xxxx.log | grep -i error





TensorFlow模型转om模型

前言:

checkpoint转pb方法,参考论坛https://bbs.huaweicloud.com/forum/thread-45383-1-1.html

准备材料:

开发者文档(ATC工具使用指导),aipp_yolov3.cfg,netron(选用)

环境依赖:

ATC转换工具环境

python3(tensorflow==1.15.0)

转换步骤:

  1. 获取checkpoint模型

    方法一:https://github.com/wizyoung/YOLOv3_TensorFlow/releases/ 直接下载checkpoint文件

    方法二:https://github.com/wizyoung/YOLOv3_TensorFlow下载weights文件,并参考其readme.md中weights convertion转换成checkpoint file

  2. ckpt转换为pb格式

    转换脚本如下

    import tensorflow as tf
    from tensorflow.python.framework import graph_util
    from tensorflow.python.platform import gfile

    def freeze_graph(input_path, output_path):
       output_node_names = "yolov3/yolov3_head/feature_map_1,yolov3/yolov3_head/feature_map_2,yolov3/yolov3_head/feature_map_3"
       saver = tf.train.import_meta_graph(input_path+".meta", clear_devices=True)
       graph = tf.get_default_graph()
       input_graph_def = graph.as_graph_def()

       with tf.Session() as sess:
           saver.restore(sess, input_path)
           output_graph_def = graph_util.convert_variables_to_constants(
                              sess=sess,
                              input_graph_def=input_graph_def,   # = sess.graph_def,
                              output_node_names=output_node_names.split(","))

           with tf.gfile.GFile(output_path, 'wb') as fgraph:
               fgraph.write(output_graph_def.SerializeToString())

    if __name__=="__main__":
       input_path = "./yolov3.ckpt"
       output_path = "./yolov3_416.pb"
       freeze_graph(input_path, output_path)

    该脚本需要知道模型的output_node_names(该YoloV3模型有三个输出yolov3/yolov3_head/feature_map_1, yolov3/yolov3_head/feature_map_2, yolov3/yolov3_head/feature_map_3)。如果不知道output_node_names,可使用netron,一个模型网络可视化工具来查看。

    执行命令:python {以上脚本的py文件名}

  3. 配置aipp_yolov3.cfg,步骤同Caffe版本

  4. 使用ATC转换成om模型

    atc --model=./yolov3.pb \
    --output=./yolov3_tf_bs1_fp16 \
    --framework=3 \
    --input_shape="Placeholder:1,416,416,3" \
    --insert_op_conf=./aipp_yolov3.cfg \
    --soc_version=Ascend310

    其中input_shape表示的是input_node_name和shape(NHWC),这些信息也可以通过netron来查看


附件

aipp_yolov3.cfg

aipp_op { 
aipp_mode : static
related_input_rank : 0
input_format : YUV420SP_U8
src_image_size_w : 416
src_image_size_h : 416
crop : false
csc_switch : true
rbuv_swap_switch : false
matrix_r0c0 : 256
matrix_r0c1 : 0
matrix_r0c2 : 359
matrix_r1c0 : 256
matrix_r1c1 : -88
matrix_r1c2 : -183
matrix_r2c0 : 256
matrix_r2c1 : 454
matrix_r2c2 : 0
input_bias_0 : 0
input_bias_1 : 128
input_bias_2 : 128
var_reci_chn_0 : 0.0039216
var_reci_chn_1 : 0.0039216
var_reci_chn_2 : 0.0039216
}


举报
分享

分享文章到朋友圈

分享文章到微博

Tianyi_Li

发帖: 283粉丝: 86

级别 : 外部版主

发消息 + 关注

发表于2020年07月29日 15:04:20
直达本楼层的链接
沙发
显示全部楼层

感谢分享!

除了上面的分享,同时在昇腾开发者社区的ModelZoo提供了训练好并转换完成的.om模型,大家可以直接下载使用哦。

如果希望自己训练,还提供了TensorFlow和MindSpore主流框架的训练算法。

无论是直接测试使用,还是自己训练,全方位满足开发者的需求。


这是昇腾开发者社区的ModelZoo链接哦:https://www.huaweicloud.com/ascend/resources/modelzoo

更多精彩内容,可访问昇腾开发者社区:https://www.huaweicloud.com/ascend/home.html


YOLOv3模型(.om格式):

image.png


YOLOv3算法(TensorFlow 和MindSpore):

image.png


点赞 评论 引用 举报

Tsings04

发帖: 2粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020年08月27日 10:54:38
直达本楼层的链接
板凳
显示全部楼层

感谢楼主分享!

请问增加的img_info有什么作用吗?看起来不参与推理

还有后面的YoloV3DetectionOutput是否也要仿照yolov3的样例修改?其中的参数变量名有要求吗?

评论
大肉小馒头 2020-9-2 15:32 评论

因为caffe的版本把yolo层也放进去了,所以他输出的是在原图的坐标框信息。而我们原来的模型是在模型固定输入宽高(416,416)上推理出来的坐标,所以需要加一个img_info,在yolo层后处理中根据img_info的原始图片宽高信息计算出原图的坐标框

... 查看全部
大肉小馒头 2020-9-2 15:33 评论

YoloV3DetectionOutput不需要,因为tf版本我们是在代码上做后处理,模型输出只是三个特征信息

... 查看全部
点赞 评论 引用 举报

Dood

发帖: 2粉丝: 0

级别 : 新手上路

发消息 + 关注

发表于2020年09月13日 21:24:48
直达本楼层的链接
地板
显示全部楼层

你好,我根据你的tensorflow模型转换om模型,使用方法一获取checkpoint,可以成功转换,但是在运行InferObjectDetection的时候出错,错误代码ret[500002],请问你有出现过这种错误吗?

image.png

评论
大肉小馒头 2020-9-15 16:20 评论

有错误日志吗?还有我想确认你执行命令有加-t 1没

... 查看全部
Deepcong 2020-10-20 18:28 评论

评论 大肉小馒头:你好 -t 1加在哪里 转换模型 还是执行推理

... 查看全部
大肉小馒头 2020-10-27 15:55 评论

评论 Deepcong:在执行命令的时候加

... 查看全部
点赞 评论 引用 举报

Rookie Ascender

发帖: 0粉丝: 0

级别 : 新手上路

发消息 + 关注

更新于2020年10月13日 21:36:18
直达本楼层的链接
5#
显示全部楼层

您好,非常感谢您的分享,但是我用您的方法基于tensorflow的模型转化获得.om模型后,发现其输入部分比起caffe转化的模型的少了一个分支,caffe转化获得的.om模型存在两个输入,一个是图片一个size,为了更方便地应用,我套用了官方的https://gitee.com/ascend/samples/tree/master/objectdetection/for_atlas200dk_1.7x.0.0_c++/ 的项目。 caffe转化获得.om模型顺利跑通了,  但是我注释掉了其中的size的输入,利用tensorflow转化获得的模型运行时,出现了没有任何的模型和数据加载的信息的打印,开发板的日志也没有报错,就是在Mind Studio上输出Segmentation fault的提示, 然后停止运行的情况,请问您有遇到过吗?或者有该tensorflow模型在Atlas200DK上可以运行的样例吗?望解惑,不甚感激。

Screenshot from 2020-10-13 21-24-22.png

评论
nayuta 2020-11-8 15:04 评论

兄弟你解决了吗

... 查看全部
点赞 评论 引用 举报

W--wangzhiqiang

发帖: 74粉丝: 4

级别 : 外部版主

发消息 + 关注

发表于2020年10月15日 11:37:22
直达本楼层的链接
6#
显示全部楼层

感谢分享

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册