将TensorFlow转换为Unity后端(Barracuda)时遇到问题

我正在尝试将用Keras创建的UNet模型转换为.nn文件,以便在Unity的神经网络后端中使用。然而,我遇到了这个错误。我的模型导出时生成了一个’.h5’文件,我将其转换成了二进制的’.pb’文件,之后我使用了tensorflow_to_barracuda.py。有没有人在Unity中有一个工作的分割程序?

Converting unet_person.bytes to unet_person.nnIGNORED: PlaceholderWithDefault unknown layerIGNORED: Switch unknown layerIGNORED: Switch unknown layerIGNORED: Shape unknown layerIGNORED: Switch unknown layerIGNORED: Merge unknown layerIGNORED: Shape unknown layerIGNORED: Shape unknown layer---------------------------------------------------------------------------UnboundLocalError                         Traceback (most recent call last)<ipython-input-22-d09d8c6d2c1a> in <module>      1 from mlagents.trainers import tensorflow_to_barracuda as tb      2 ----> 3 tb.convert('unet_person.bytes', 'unet_person.nn')/anaconda3/lib/python3.6/site-packages/mlagents/trainers/tensorflow_to_barracuda.py in convert(source_file, target_file, trim_unused_by_output, verbose, compress_f16)938     o_model = barracuda.Model()939     o_model.layers, o_input_shapes, o_model.tensors, o_model.memories = \--> 940         process_model(i_model, args)941 942     # Cleanup unconnected Identities (they might linger after processing complex node patterns like LSTM)/anaconda3/lib/python3.6/site-packages/mlagents/trainers/tensorflow_to_barracuda.py in process_model(model, args)870                 nodes = nodes_as_array[node_index:pattern_end]871                 name = nodes[-1].name--> 872                 var_tensors, const_tensors = get_tensors(nodes)873                 if args.print_patterns or args.verbose:874                     print('PATTERN:', name, '~~', pattern_name, pattern, '<-', var_tensors, '+', [t.name for t in const_tensors])/anaconda3/lib/python3.6/site-packages/mlagents/trainers/tensorflow_to_barracuda.py in get_tensors(pattern_nodes)845                 tensor_nodes = [n for n in pattern_nodes if n.op == 'Const']846                 tensors = [Struct(name = n.name, obj = n.attr["value"].tensor, shape = get_tensor_dims(n.attr["value"].tensor), data = get_tensor_data(n.attr["value"].tensor))--> 847                     for n in tensor_nodes]848 849                 # TODO: unify / reuse code from process_layer/anaconda3/lib/python3.6/site-packages/mlagents/trainers/tensorflow_to_barracuda.py in <listcomp>(.0)845                 tensor_nodes = [n for n in pattern_nodes if n.op == 'Const']846                 tensors = [Struct(name = n.name, obj = n.attr["value"].tensor, shape = get_tensor_dims(n.attr["value"].tensor), data = get_tensor_data(n.attr["value"].tensor))--> 847                     for n in tensor_nodes]848 849                 # TODO: unify / reuse code from process_layer/anaconda3/lib/python3.6/site-packages/mlagents/trainers/tensorflow_to_barracuda.py in get_tensor_data(tensor)492     if tensor.bool_val:493         data = np.array(tensor.bool_val, dtype=float)--> 494     return np.array(data).reshape(dims)495 496 def flatten(items,enter=lambda x:isinstance(x, list)):UnboundLocalError: local variable 'data' referenced before assignment

回答:

在Barracuda 1.0中,有一种方法可以使用Keras2ONNX pip包将Keras (.h5) 模型转换为ONNX模型。

你需要安装keras2ONNX,然后运行以下代码:

import keras2onnxonnx_model = keras2onnx.convert_keras(unet, name='unet')keras2onnx.save_model(onnx_model, "unet.onnx")

请注意,你可能需要使用以下标志:channel_first_inputs=[unet.layers[0].layers[0]]

onnx_model = keras2onnx.convert_keras(unet, name='unet')

由于Barracuda的输入是通道优先的,这意味着对于一个批次大小 x 宽度 x 高度 x rgb的图像,排序是rgb x 宽度 x 高度 x 批次大小。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注