- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在尝试使用 deeplabv3 和 mobilenetv2 在 android 上运行语义分割模型。我们在 bazel 的帮助下使用 TOCO 和 tflite_convert 遵循官方的 tensorflow lite 转换程序。源卡住图是从官方 TensorFlow DeepLab Model Zoo 获得的.
我们能够使用以下命令成功转换模型:-
CUDA_VISIBLE_DEVICES="0" toco --output_file=toco256.tflite --graph_def_file=path/to/deeplab/deeplabv3_mnv2_pascal_trainval/frozen_inference_graph.pb --input_arrays=ImageTensor --output_arrays=SemanticPredictions --input_shapes=1,256,256,3 --inference_input_type=QUANTIZED_UINT8 --inference_type=FLOAT --mean_values=128 --std_dev_values=127 --allow_custom_ops --post_training_quantize
tflite 文件的大小约为 2.25 Mb。但是当我们尝试使用官方基准测试工具测试模型时,它失败了,并显示以下错误报告:-
bazel run -c opt tensorflow/contrib/lite/tools/benchmark:benchmark_model -- --graph=`realpath toco256.tflite`
INFO: Analysed target //tensorflow/contrib/lite/tools/benchmark:benchmark_model (0 packages loaded).
INFO: Found 1 target...
Target //tensorflow/contrib/lite/tools/benchmark:benchmark_model up-to-date:
bazel-bin/tensorflow/contrib/lite/tools/benchmark/benchmark_model
INFO: Elapsed time: 0.154s, Critical Path: 0.00s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Running command line: bazel-bin/tensorflow/contrib/lite/tools/benchmark/benchmark_model '--graph=path/to/deeplab/venINFO: Build completed successfully, 1 total action
STARTING!
Num runs: [50]
Inter-run delay (seconds): [-1]
Num threads: [1]
Benchmark name: []
Output prefix: []
Warmup runs: [1]
Graph: path/to/venv/tensorflow/toco256.tflite]
Input layers: []
Input shapes: []
Use nnapi : [0]
Loaded model path/to/venv/tensorflow/toco256.tflite
resolved reporter
Initialized session in 45.556ms
Running benchmark for 1 iterations
tensorflow/contrib/lite/kernels/pad.cc:96 op_context.dims != 4 (3 != 4)
Node number 24 (PAD) failed to prepare.
Failed to invoke!
Aborted (core dumped)
我们还尝试了不包括“allow_custom_ops”和“post_training_quantize”选项的相同命令,甚至使用与 1,513,513,3 相同的输入大小;但结果是一样的。
这个问题似乎与下面的github问题类似: (https://github.com/tensorflow/tensorflow/issues/21266)。然而,在最新版本的 TensorFlow 中,该问题应该已得到修复。
型号:http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_trainval_2018_01_29.tar.gz tensorflow 版本:1.11巴泽尔版本:0.17.2操作系统:Ubuntu 18.04
Android 应用程序也无法正确加载模型(tflite 解释器)
那么,我们如何才能将分割模型正确地转换为可用于在 Android 设备上进行推理的 tflite 格式?
更新:-
使用tensorflow 1.12,我们得到一个新的错误:
$ bazel run -c opt tensorflow/lite/tools/benchmark:benchmark_model -- --graph=`realpath /path/to/research/deeplab/venv/tensorflow/toco256.tflite`
tensorflow/lite/kernels/depthwise_conv.cc:99 params->depth_multiplier * SizeOfDimension(input, 3) != SizeOfDimension(filter, 3) (0 != 32)
Node number 30 (DEPTHWISE_CONV_2D) failed to prepare.
此外,在使用来自 tensorflow deeplab model zoo 的 depth_multiplier=0.5 的同一模型(3 Mb .pb 文件)的较新版本时,我们得到了一个不同的错误:-
F tensorflow/lite/toco/graph_transformations/propagate_fixed_sizes.cc:116] Check failed: dim_x == dim_y (3 vs. 32)Dimensions must match
在这种情况下,我们使用上述相同的命令进行 tflite 转换;但我们甚至无法生成“tflite”文件作为输出。这似乎是深度倍增值的问题。(即使我们尝试提供 depth_multiplier参数作为转换时的参数)。
最佳答案
我也遇到了这个问题。转换中似乎有 2 个问题:
对于下面的解决方案,这是经过测试的:
我假设您已经使用 deeplab 文件夹中的 export_model.py 文件创建了一个 .pb 文件,并将此文件命名为 deeplab_mobilenet_v2.pb。从这里开始:
python3 optimize_for_inference.py \
--input "path/to/your/deeplab_mobilenet_v2.pb" \
--output "path/to/deeplab_mobilenet_v2_opt.pb" \
--frozen_graph True \
--input_names ImageTensor \
--output_names SemanticPredictions \
--placeholder_type_enum=4
placeholder_type_enum=4 是uint8数据类型(dtypes.uint8.as_datatype_enum)
确保您已经安装了 bazel 并从 github 下载了 tensorflow r1.15 分支。然后从 tensorflow repo 制作 transform_graph 工具:
bazel 构建 tensorflow/tools/graph_transforms:transform_graph
然后运行 transform_graph 工具(确保将形状设置为您用作输入的任何形状):
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph="/path/to/deeplab_mobilenet_v2_opt.pb" \
--out_graph="/path/to/deeplab_mobilenet_v2_opt_flatten.pb" \
--inputs='ImageTensor' \
--outputs='SemanticPredictions' \
--transforms='
strip_unused_nodes(type=quint8, shape="1,400,225,3")
flatten_atrous_conv
fold_constants(ignore_errors=true, clear_output_shapes=false)
fold_batch_norms
fold_old_batch_norms
remove_device
sort_by_execution_order'
运行下面的 python 文件,确保将 model_filepath、save_folder 和 save_name 更改为适合您需要的任何内容。
import tensorflow as tf
import numpy as np
from tensorflow.contrib import graph_editor as ge
def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):
"""
Freezes the state of a session into a pruned computation graph.
Creates a new computation graph where variable nodes are replaced by
constants taking their current value in the session. The new graph will be
pruned so subgraphs that are not necessary to compute the requested
outputs are removed.
@param session The TensorFlow session to be frozen.
@param keep_var_names A list of variable names that should not be frozen,
or None to freeze all the variables in the graph.
@param output_names Names of the relevant graph outputs.
@param clear_devices Remove the device directives from the graph for better portability.
@return The frozen graph definition.
"""
graph = session.graph
with graph.as_default():
freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
output_names = output_names or []
output_names += [v.op.name for v in tf.global_variables()]
input_graph_def = graph.as_graph_def()
if clear_devices:
for node in input_graph_def.node:
node.device = ""
frozen_graph = tf.graph_util.convert_variables_to_constants(
session, input_graph_def, output_names, freeze_var_names)
return frozen_graph
def load_convert_save_graph(model_filepath, save_folder, save_name):
'''
Lode trained model.
'''
print('Loading model...')
graph = tf.Graph()
sess = tf.InteractiveSession(graph = graph)
with tf.gfile.GFile(model_filepath, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
print('Check out the input placeholders:')
nodes = [n.name + ' => ' + n.op for n in graph_def.node if n.op in ('Placeholder')]
for node in nodes:
print(node)
# Define input tensor
input = tf.placeholder(np.uint8, shape = [1,400,225,3], name='ImageTensor')
tf.import_graph_def(graph_def, {'ImageTensor': input}, name='')
print('Model loading complete!')
# remove the pad to bounding box node
name = "pad_to_bounding_box"
print(name)
sgv = ge.make_view_from_scope(name, tf.get_default_graph())
print("\t" + sgv.inputs[0].name)
for node in sgv.inputs:
print("name in = " + node.name)
for node in sgv.outputs:
print("name out = " + node.name)
print("\t" + sgv.outputs[len(sgv.outputs)-1].name)
sgv = sgv.remap_inputs([0])
sgv = sgv.remap_outputs([len(sgv.outputs)-1])
(sgv2, det_inputs) = ge.bypass(sgv)
frozen_graph = freeze_session(sess,
output_names=['SemanticPredictions'])
tf.train.write_graph(frozen_graph, save_folder, save_name, as_text=False)
load_convert_save_graph("path/to/deeplab_mobilenet_v2_opt_flatten.pb", "/path/to", "deeplab_mobilenet_v2_opt_flatten_static.pb")
tflite_convert \
--graph_def_file="/path/to/deeplab_mobilenet_v2_opt_flatten_static.pb" \
--output_file="/path/to/deeplab_mobilenet_v2_opt_flatten_static.tflite" \
--output_format=TFLITE \
--input_shape=1,400,225,3 \
--input_arrays="ImageTensor" \
--inference_type=FLOAT \
--inference_input_type=QUANTIZED_UINT8 \
--std_dev_values=128 \
--mean_values=128 \
--change_concat_input_ranges=true \
--output_arrays="SemanticPredictions" \
--allow_custom_ops
您现在可以运行您的 tflite 模型
关于android - 无法测试和部署用于推理的 deeplabv3-mobilenetv2 tensorflow-lite 分割模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228969/
实际上我只需要用JAVA编写一个简单的程序来将MySQL INSERTS行转换为CSV文件(每个mysql表等于一个CSV文件) 在JAVA中使用正则表达式是最好的解决方案吗? 我的主要问题是如何正确
我有一个 txt 文件,其格式为: Key:value Key:value Key:value ... 我想将所有键及其值放入我创建的 hashMap 中。如何让 FileReader(file) 或
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我每周都会从我的主机下载数据库的备份。它生成一个 .sql 文件,当前大小约为 800mb。此 .sql 文件包含 44 个表。 有什么方法可以通过某些软件将 .sql 文件与所有表分开,以便单独导出
在 iOS 4.0 及更高版本中,有没有一种方法可以在不将整个图像加载到内存的情况下对 CGImage 进行分割?我试图做的是*以编程方式*分割图像,以便在使用大图像的 CATiledLayer 应用
我的 .split() 函数有问题,我有以下字符串: var imageUrl = "Images\Products\randomImage.jpg"; 我想用字符“\”分割,但是,这种情况发生了:
是否可以使用正则表达式将字符串拆分两次?例如,假设我有字符串: example=email@address.com|fname|lname 如何拆分结果为: email@address.com,fna
我正在寻找一种在线程系统(主从)中使用数组的解决方案,它允许我通过用户输入在多个线程上划分矩阵的计算,并将其通过 1 个主线程引导到多个从属线程,这些从属线程计算矩阵的 1 个字段。 我尝试运用我的知
我建立了一个系统来分割包含手写符号的二值图像并对它们进行分类(专门用于音乐)。我知道有商业应用程序可以执行此操作,但这是我尝试将其作为一个项目从头开始。 为了简单起见,假设我的整个图像中有两个元素:
我正在尝试找到一种可接受的复杂性的有效方法 检测图像中的对象,以便将其与周围环境隔离 将该对象分割成它的子部分并标记它们,这样我就可以随意获取它们 我进入图像处理世界已经 3 周了,我已经阅读了很多算
我有一组3D 空间中的点。下图是一个示例: 我想把这些点变成一个面。我只知道点的 X、Y 和 Z 值。例如,查看下图,它显示了从 3D 空间中的点生成的人脸网格。 我在谷歌上搜索了很多,但我找到的是一
我有一个字符串 String placeStr="place1*place2*place3"我想获取包含 place1、place2、place3 的数组,如下所示: String[] places=
我在 Python 中有一个类似于 google.com 的字符串,我想将其分成两部分:google 和 .com。问题是我有一个 URL,例如 subdomain.google.com,我想将其拆分
朋友需要对一个pdf文件进行分割,在网上查了查发现这个pypdf2可以完成这些操作,所以就研究了下这个库,并做一些记录。首先pypdf2是python3版本的,在之前的2版本有一个对应pypdf库。
伙计们,这是一个难以解决的问题,因为它涉及很多硬件细节,所以我想把它放到 EE.SE,但它的主要重点是编程,所以我决定坚持在这里。 我最近怀旧(以及渴望回到 CPU 内在函数),所以我决定自制一个 8
给定 haskell 中的排序列表,我如何获得分段列表,其中连续数字位于同一列表中。例如,如果我有一个排序列表 [1,2,3,4,7,8,10,12,13,15] 结果将是 [[1,2,3 ,4],[
如果我添加三个分割 View ,如下图所示,第三个分割 View (称为 splitView-3)将自动为该分割 View 中的自定义 View 生成约束,例如 customview1 的 Heigh
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
如何为馈送给映射器的文件的每一行提供相同文件的拆分? 基本上我想做的是 for each line in file-split { for each line in file{
带有Snappy压缩功能的ORC文件是否可拆分成条形? 据我所知,Snappy Compressed File是不可拆分的。 但我在博客中读到,快速压缩的文件可以在 strip 上拆分。 真的吗? 最
我是一名优秀的程序员,十分优秀!