Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

2023-11-13

@Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

前言

之前一直通过1.13版本的TensorflowGpu训练模型,使用范围局限在电脑端(例如opencv调用模型等等)。最近的一个项目需要在移动端部署,将训练好的.pb模型可以成功移植到安卓移动端,但是出现了一个老生常谈的问题,就是无法迅速连续识别,这主要是因为移动端和PC端硬件的差异,为了解决这一问题,决定投入Tensorflowlite的怀抱,实现在移动端的迅捷目标检测。
环境介绍:
Ubuntu 16.04
Tensorflow 1.13.1(含Gpu)
移动端 Honor V20
Android Studio 3.5.3
算法 MobileNet-ssd-V1

一、.pb文件的生成

tensorflow训练开始后,会随时间推移生成不同训练步数的记录文件,如下:
在这里插入图片描述如果不考虑后续的Tflite转换,那么只需要调用object_detection的export_inference_graph.py,输入以下类似命令来生成.pb文件即可,文件使用方法不赘述。

python export_inference_graph.py --input_type image_tensor --pipeline_co
nfig_path training/ssd_mobilenet_v1_XXX.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory detection  

注意。如果后续要设计tflite转换,那么需要调用的文件是object_detection下的export_tflite_ssd_graph.py,命令与上类似:

python export_tflite_ssd_graph.py --input_type image_tensor --pipeline_co
nfig_path training/ssd_mobilenet_v1_XXX.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory detection   

执行export_tflite_ssd_graph.py后,输出文件夹内容大致如下:
在这里插入图片描述包含tflite_graph.pb和tflite_graph.pbtxt两个文件。这就是我们需要使用的.pb文件

二、.pb转换.tflite

(1)Bazel配置

注意!很多文章都有详细的Tensorflow Bazel配置过程详解,我们的配置过程类似,但是Bazel build过程,我们只需要以下一个步骤即可,

bazel build tensorflow/tools/graph_transforms:summarize_graph

build完成后,可以通过命令获取.pb模型输入输出节点array名称和相关矩阵参数,在下面的pb_to_tflite.py程序中填写使用。
注意!!!
bazel build tensorflow/tools/graph_transforms:summarize_graph此处有个BUG,输出的信息中,output_array我这里只显示一个TFLite_Detection_PostProcess,
其实正确的应该是
‘TFLite_Detection_PostProcess’,‘TFLite_Detection_PostProcess:1’,‘TFLite_Detection_PostProcess:2’,'TFLite_Detection_PostProcess:3’这四个,
分别代表的含义是
detection_boxes, detection_classes, detection_scores, and num_detections,
在后面的pb_to_tflite.py中也要写这四个才能保证.tflite模型在移动端的正常使用!!!

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=tflite_graph.pb 

至于其他文章经常提及的两个步骤:

bazel build tensorflow/lite/toco:toco
bazel build tensorflow/python/tools:freeze_graph

其实并不是必要的,原因:

首先

bazel build tensorflow/lite/toco:toco

的一个目的是,在后续转换tflite文件中,可通过

bazel run --config=opt tensorflow/lite/toco:toco -- \
 
--input_file=$OUTPUT_DIR/tflite_graph.pb \
 
--output_file=$OUTPUT_DIR/detect.tflite \
 
--input_shapes=1,300,300,3 \
 
--input_arrays=normalized_input_image_tensor \
 
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'  \
 
--inference_type=FLOAT \
 
--allow_custom_ops

生成.tflite文件,但是我在使用过程,总是出现各种莫名其妙的错误,可能是我太菜了。。,所以这一步我用一个pb_to_tflite.py程序替代,如下

# -*- coding:utf-8 -*-
##python 1
import tensorflow as tf

in_path = "tflite_graph.pb"
#out_path = "tflite_graph.tflite"
# out_path = "./model/quantize_frozen_graph.tflite"

# 模型输入节点
input_tensor_name = ["normalized_input_image_tensor"]
input_tensor_shape = {"normalized_input_image_tensor":[1,300,300,3]}
# 模型输出节点
classes_tensor_name = ['TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3']

converter = tf.lite.TFLiteConverter.from_frozen_graph(in_path,
                                            input_tensor_name, classes_tensor_name,
                                            input_tensor_shape)

converter.allow_custom_ops=True
#converter.post_training_quantize = True
tflite_model = converter.convert()

open("4output_detect.tflite", "wb").write(tflite_model)

生成一个自定义名称的.tflite文件。

bazel build tensorflow/python/tools:freeze_graph

在前面的export_tflite_ssd_graph.py执行后,其实已经freeze模型了,所以这行build其实也没用上。

(2)pb_to_tflite.py重要语句介绍

converter.allow_custom_ops=True

这一行很重要,目的是保存一个在tflite中一些无法转换的原模型参数,不填加的话,十有八九回报错。

#converter.post_training_quantize = True

这一行的目的是决定是否输出量化的tflite模型
注意!量化后精度必然会有一定程度的降低,大小将缩小至1/4。

三、Android Studio调用

将第二步中的tflite文件放在android/app/src/main/assets中,并在同一目录新建一个txt文件存放物体标签,格式类似于:

???
label1
label2
...
???
???

在官方提供的项目的gradle中,comment out这一句

// apply from:'download_model.gradle'

避免下载官方tflite模型覆盖自己的模型。
以下三行是调用移植是否成功的关键,

  private static final boolean TF_OD_API_IS_QUANTIZED = true;
  private static final String TF_OD_API_MODEL_FILE = "detect.tflite";
  private static final String TF_OD_API_LABELS_FILE = "file:///android_asset/labels_list.txt";

第一行根据自己的程序是否量化自行填写,量化写true,反之false
第二行和第三行则填入自己的文件,随后Run至手机即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录 的相关文章

随机推荐

  • 利用sharding-jdbc进行加密解密

    使用前必看 加密后字段不可以进行like查询 加密字段以及涉及的表 代码中需改成小写 数据库表定义也需改成小写 jar包引入 mybatis spring boot starter升级为2 2 2
  • jre替换local_policy.jar和US_export_policy.jar

    JDK1 8 0 151以前版本方法 JDK1 8 0 151的无限制强度加密策略文件变动
  • 【机器视觉系统】基于3DOF机械臂的五子棋机器人(1)

    基于3DOF机械臂的五子棋机器人 文章目录 基于3DOF机械臂的五子棋机器人 1 前言 2 机器视觉系统概述 2 1 机器 2 2 视觉 2 3 系统 3 系统组成概述 3 1 使用工具盘点 3 2 流程图 4 制作步骤建议 5 需要的知识
  • 伤腰的Python爬虫案例,零基础必备实战教程

    目录 前言 开发环境介绍 爬虫案例数据采集一般步骤 1 首先第一步 找到对应的链接地址
  • 三维GIS技术应用

    三维GIS技术应用 背景 以二三维一体化GIS技术为基础框架 进一步拓展二三维一体化数据模型 融合倾斜摄影 BIM 激光点云等多源异构数据 推动三维GIS实现室外室内一体化 宏观微观一体化与空天 地表 地下一体化 赋能全空间的三维GIS应用
  • 北斗短报文遥测终端机在水雨情监测系统中的应用

    一 方案概述 我国水利监管手段比较单一 水雨情监测移动公网覆盖不足等诸多问题 利用北斗短报文通信技术 数字化信息采集技术 实现水文自动测报 大幅度提升湿地生态和水域的监测 查询 预警和应急处理能力 在恶劣天气情况或特殊灾害环境中 通过北斗卫
  • Django 缓存机制 Redis缓存

    Django 提供6种缓存方式 1 开发调式缓存 2 内存缓存 3 文件缓存 4 数据库缓存 5 Memcache缓存 使用Python memcached模块 6 Memcache缓存 使用pylibmc模块 常用的缓存方式是 文件缓存
  • 5g信令流程详解_5G无线网络信令流程

    招个电子工程师 招个电子工程师 一个只专注电子工程师精准招聘的服务 精准 快速 高效 低成本 这是 招个电子工程师 服务的精髓 如果您的技术团队需要扩军 那么 热烈欢迎各大中小企业的HR和招聘负责人与我们联系 具体合作详情请咨询 管理员微信
  • Compose 动画边学边做 - 夏日彩虹

    引言 Compose 在动画方面下足了功夫 提供了种类丰富的 API 但也正由于 API 种类繁多 如果想一气儿学下来 可能会消化不良导致似懂非懂 结合例子学习是一个不错的方法 本文就带大家边学边做 通过高仿微博长按点赞的彩虹动画 学习和实
  • 初学者如何快速练习盲打

    初学者如何快速练习盲打 2012 05 22 15 25 54 转载 标签 打字练习 初学者 手感 杂谈 分类 计算机技巧 盲打要求的是对键盘的熟练 是感觉上的东西 当你看到一句话想到的不应该是每个字有哪个拼音 有那个字母 而是像 手感 一
  • sonar扫描时报Failed to upload report - An error has occurred. Please contact your administrator

    本人新学习使用此软件 参考网络各大神资料后解决问题方法如下 此问题产生的原因在于mysql的max allowed packet 参数限制默认为4M 将设置进行修改就可以了 mysql根据配置文件会限制server接受的数据包大小 有时候大
  • 【应届生必看】技术岗面试应答有哪些话术和技巧?

    很多时候 面试过程中A与B两人工作经历 能力都相差不大时 A能脱颖而出的大部分原因是在面试过程中表现出的较高的情商 稳定性和与企业文化匹配的性格 价值观等 求职者从各项提问中了解面试官想要考察的主旨 根据自己实际情况适当地进行总结和梳理 以
  • Linux操作系统学习,Linux基础命令大全

    目录 第一章 Linux简介和安装 1 1 Linux简介和分类 1 2 安装VMware虚拟机 在虚拟机中安装CentOS 7 第二章 虚拟机中Linux的IP地址配置详解 2 1 什么是IP地址 如何查看 2 2 虚拟机NAT模式中Li
  • JCR分区与中科院分区详解-中科院基础版和升级版详解

    https baijiahao baidu com s id 1642002458698070188 wfr spider for pc JCR分区 科睿唯安每年出版JCR 期刊引用报告 JCR将收录的期刊分为176个不同学科类别 每个学科
  • ubuntu安装NERDTree,Taglist和WinManager

    在ubuntu中要用vim进行开发的话 这三个插件组合在一起 给你一种顺滑的感受 NERDTree NERDTree的安装 nerdtree可以显示当前项目的文件结构 安装方法如下 执行以下命令即可 1 创建文件夹 mkdir vim 如果
  • 线性代数的本质(五)——矩阵的运算

    文章目录 矩阵的运算 矩阵的转置 方阵的运算 初等矩阵 分块矩阵 逆矩阵 矩阵的秩 广义逆矩阵 矩阵的运算 矩阵的转置 转置 矩阵 A A A的行列互换得到的矩阵称为 A A A 的转置 transpose 记作
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】最佳植树距离

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 最佳植树距离 知识点二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 按照环保公司要求 小明需要在沙化严重的地区进行植树防沙工作 初步目标是种植一条直线的树带
  • git报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining

    今天和朋友聊天 推荐了个项目给我看看 在克隆的过程中发现太大拉不下来 报错如下 error RPC failed curl 18 transfer closed with outstanding read data remaining 远程
  • 黄金矿工(Java)

    先来一张效果图 图片资源 https pan baidu com s 1weCGFLQlzOTvDRY18bizrg pwd ivjt 提取码 ivjt 该项目一共12个类 均处于同一目录 首先是基类 其余用来表示物体的类都继承它 impo
  • Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

    Tensorflow 1 13训练模型 pb文件转换成Tensorflowlite可以使用的 tflite文件过程记录 前言 之前一直通过1 13版本的TensorflowGpu训练模型 使用范围局限在电脑端 例如opencv调用模型等等