tensorflow训练的模型怎么实际应用,python用tensorflow训练标准模型

  tensorflow训练的模型怎么实际应用,python用tensorflow训练标准模型

  Tensorflow模型部署到盛腾310的虚拟平台上进行推理运算。Tensorflow代码编写的是适应于任务分析环境的配置模型转换推理代码。

  Tensorflow代码编写和任务分析

  由于华为应用案例中有很多例子,所以今天我们来做一个不一样的。

  前几天我们在课程作业中需要做一个车牌识别的项目。今天我们就把它部署到华为的310平台上进行推理和试用。

  因为懒,直接从github上找了一个车牌识别项目网址。效果很好。

  训练步骤大致分为车牌分割-车牌校正-字符识别。具体细节我就不说了,大家可以自己看代码。

  推理阶段大致分为四个部分。

  用分割网络分割车牌掩膜,校正车牌(需要用C重写)。将校正后的车牌输入CNN网络进行字符识别。最后把车牌识别的结果打印在图片上(原程序做了一个接口,所以我可以直接用C实现自己的功能)。环境配置我用华为的云平台。具体环境有视频讲解,不赘述。

  模型转换程序用Tensorflow训练,Keras输出的模型是两个。h5文件。为了安全起见,我们把它们转换成。pb第一。

  from tensor flow . keras . models import load _ model import tensor flow as TF import OS from tensor flow . keras import back end as k # transformation function def H5 _ to _ Pb(H5 _ model,output_dir,model_name,out_prefix=output_ ,log _ tensor board=True):if OS . path . exists(Output _ dir)==False:OS . mkdir(Output _ dir)out _ nodes=[]for I in range(len(H5 _ model . outputs)):out _ nodes . append(out _ prefix str/cnn.h5 # output path output_dir=。/ # load model H5 _ model=load _ model(weight _ file _ path)H5 _ to _ Pb(H5 _ model,output _ dir=output _ dir,model _ name= CNN . Pb )print( model saved )转换后得到两个。pb文件,即unet.pb和cnn.pb,分别对应拆分网络和字符识别网络。

  上传两张。pb文件到云平台,转换模型,输出两个。om文件,这样第三方框架的模型就可以在瑞星平台上运行了。

  事不宜迟,直接去码。

  在模型所在的文件夹中,命令行执行:

  atc -型号=。/unet . Pb -framework=3-output= unet -SOC _ version=ascend 310-input _ format=NHWC-input _ shape= input _ 1:1,512,512,3 ATC-model=。/CNN . Pb -framework=3-output= CNN -SOC _ version=ascend 310-input _ format=nhwc-input _ shape= input _ 1:1,80,240,3

  模型:输入模型的路径。

  Framework:第三方框架的代号,如Caffe为0,mindspore为1,tensorflow为3,ONNX为5。

  -SOC _ version:处理器的版本,可以是Ascend310,也可以是Ascend910,根据自己的硬件填写。

  input _ format:原帧为TensorFlow时,支持NCHW、NHWC、ND、NCDHW、NDHWC五种输入格式,默认为NHWC。

  -input _ shape:模型输入的形状信息,例如:“input_name1:n1,c1,h1,w1;输入名称2:n2,c2,h2,w2 .指定的节点必须用双引号括起来,用英文分号分隔。在转换之前,输入名称必须是网络模型中的节点名称。可以使用可视化工具netron查看节点的名称。我自己使用在线工具:

  Netron

  最后得到两个模型文件:unet.om和cnn.om

  推理代码改编华为有很多样例,给个链接。

  我们就随便挑一个拉下来修改吧。

  华为工程师已经帮我们写好框架了哈哈,不嫖白不嫖,给黑白图片上色

  先看一下代码结构:

  App名称

  模型//该目录下存放模型转换相关的配置文件

   xxx.cfg

  数据

  xxx.jpg//测试数据

  公司//该目录下存放声明函数的头文件

   xxx.h

  出局//该目录下存放输出结果

   src //该目录下存放系统初始化的配置文件、编译脚本、函数的实现文件

   xxx.json //系统初始化的配置文件

   CMakeLists.txt //编译脚本

   xxx.cpp //实现文件

  我们来模仿着写一个。

  首先确定h。文件,构建推理类普拉特雷克级,需要实现的功能及流程如下:

  需要进行AscendCL的初始化:init()申请运行管理资源:init_resources()数据处理(车牌矫正与标记车牌):plate_correct(),plate_draw()推理:推论()运行资源释放,AscendCL去初始化:销毁资源()类plate rec { public:plate rec(const char * model path,uint32_t modelWidth,uint 32 _ t model height);~ PlateRec();AtlasError init();AtlasError init _ resource();阿特拉斯错误推理(STD:vector推断输出推断输出);atlaserrorplate _ correct(const STD:string图像文件,STD:vectorInferenceOutput模型输出);atlaserrorplate _ draw(const STD:string图像文件,STD:vectorInferenceOutput模型输出);void destroy _ resource();};这肯定是不够的

  第二步没必要公共的,用初始化()来调用就可以了,第五步由析构函数调用就可以了

  第二步中需要申请设备,上下文,流。设备好理解,上下文作为一个容器,管理了所有对象(包括流、事件、设备内存等)的生命周期溪流。用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在设备上执行。最后,获取当前昇腾人工智能软件栈的运行模式运行模式_,根据不同的运行模式,后续的接口调用方式不同

  第三步中也需要一些必要的参数

  还要准备数据输入输出的数据结构

  改过后的代码:

  /* * * plate rec */class plate rec { public:plate rec(const char * model path,uint32_t modelWidth,uint 32 _ t model height);~ PlateRec();AtlasError init();阿特拉斯错误推理(STD:vector推断输出推断输出);atlaserrorplate _ correct(const STD:string图像文件,STD:vectorInferenceOutput模型输出);atlaserrorplate _ draw(const STD:string图像文件,STD:vectorInferenceOutput模型输出);private:AtlasError init _ resource();AtlasError create _ input(size _ t输入数据大小);void save _ image(const STD:string orig image文件,cv:Mat image);void destroy _ resource();private:int 32 _ t设备id _;aclrtContext上下文_;aclrtStream stream _;阿特拉斯模型模型_;const char *模型路径_;uint32_t型号宽度_;uint32_t车型高度_;uint 32 _ t input datasize _ void * input buf _;aclrtRunMode运行模式_;bool是inited _;};现在来实现:

  构造与析构函数:

  PlateRec:PlateRec(const char * model path,uint32_t modelWidth,uint 32 _ t model height):device id _(0),context_(nullptr),stream_(nullptr),inputBuf_(nullptr),modelWidth_(modelWidth),modelHeight_(modelHeight),is init _(false){ model path _=model path;} PlateRec:~ PlateRec(){ destroy _ resource();} 申请运行资源时,我们隐式调用了语境和溪流。aclrtSetDevice()申请了三个资源

  atlaserrorplaterec:init _ resource(){//open device ret=aclrtSetDevice(device id _);如果(ret!=ACL _ ERROR _ NONE){ ATLAS _ LOG _ ERROR( ACL打开设备%d失败,设备id _);返回ATLAS _ ERROR} ATLAS_LOG_INFO(打开设备%d成功,设备id _);ret=aclrtGetRunMode(运行模式_);如果(ret!=ACL _ ERROR _ NONE){ ATLAS _ LOG _ ERROR( ACL获取运行模式失败);返回ATLAS _ ERROR}返回ATLAS _ OK}未完待续、

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: