Tensorflow Lite iOS相机示例不适用于重新训练的MobileNet模型

时间:2018-11-18 18:11:03

标签: python ios tensorflow tensorflow-lite pre-trained-model

我正在尝试使用经过重新训练的Mobilenet模型运行the Tensorflow Lite Camera example

我已根据the instructionsthis fix成功运行iOS相机应用。该应用程序可以与模型mobilenet_v1_1.0_224.tflite一起正常使用。

我安装了Tensorflow:

pip3 install -U virtualenv
virtualenv --system-site-packages -p python3 ./venv
source ./venv/bin/activate
pip install --upgrade pip
pip install --upgrade tensorflow==1.12.0
pip install --upgrade tensorflow-hub==40.6.2

我现在想使用retrain the model the flowers set。我下载了flowers文件夹并运行:

python retrain.py \
    --bottleneck_dir=bottleneck \
    --how_many_training_steps=400 \
    --model_dir=model \
    --output_graph=pola_retrained.pb \
    --output_labels=pola_retrained_labels.txt \
    --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v1_100_224/quantops/feature_vector/1 \
    --image_dir=flower_photos

注意:我可以使用label_image.py脚本成功测试重新训练的模型。

我将重新训练的模型转换为其tflite格式:

toco \
  --graph_def_file=pola_retrained.pb \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --output_file=mobilenet_v1_1.0_224.tflite \
  --inference_type=FLOAT \
  --input_type=FLOAT \
  --input_arrays=Placeholder \
  --output_arrays=final_result \
  --input_shapes=1,224,224,3

我将新模型和标签文件都复制到iOS应用程序中。我按如下所示修改CameraExampleViewController.mm中的应用程序参数:

// These dimensions need to match those the model was trained with.
const int wanted_input_width = 224;
const int wanted_input_height = 224;
const int wanted_input_channels = 3;
const float input_mean = 128.0f;
const float input_std = 128.0f;
const std::string input_layer_name = "input";
const std::string output_layer_name = "final_result";

该应用程序崩溃。 the recognized object is outside of the range of trained objects的索引。置信度高于1。

1 个答案:

答案 0 :(得分:0)

Tensorflow Lite相机示例将输出张量大小硬编码为1000。如果使用输出数量较少的经过重新训练的模型测试示例,则iOS应用程序将崩溃。在CameraExampleViewController.mm中替换以下代码:

const int output_size = 1000;

具有:

// read output size from the output sensor
const int output_tensor_index = interpreter->outputs()[0];
TfLiteTensor* output_tensor = interpreter->tensor(output_tensor_index);
TfLiteIntArray* output_dims = output_tensor->dims;
assert(output_dims->size == 2);
const int output_size = output_dims->data[1]-output_dims->data[0];

上面的代码通过从模型输出尺寸读取输出尺寸来解决此问题。 The appropriate PR已提交。