如何在 Tensorflow Lite 上为 CoreML 委托设置填充类型以修复未设置“PoolingLayerBuilder (MEAN)_1”。

Posted

技术标签:

【中文标题】如何在 Tensorflow Lite 上为 CoreML 委托设置填充类型以修复未设置“PoolingLayerBuilder (MEAN)_1”。【英文标题】:How to set Padding Type for CoreML Delegate on Tensorflow Lite to fix `PoolingLayerBuilder (MEAN)_1' is not set.`? 【发布时间】:2021-10-08 17:49:32 【问题描述】:

我最近在 Google 的 Vision 平台上训练了一个对象检测模型,并将其导出到 TensorFlow Lite 边缘模型。

在带有 CoreML 委托的 ios 设备上运行时,我在 Xcode 中收到此错误:

验证器错误:未设置池化层“PoolingLayerBuilder (MEAN)_1”的填充类型。

当使用带有 CoreML 委托的 TensorFlow lite 在 iOS 上运行时,我收到此错误:

错误编译模型错误读取 protobuf 规范。验证器错误:未设置池化层“PoolingLayerBuilder (MEAN)_1”的填充类型。

这是我迄今为止尝试过的:

更新我的 pod 以确保我使用的是 TensorFlowLiteSwift 夜间版本 仅在 CPU 上运行(该模型有效,所以我知道这是一个 CoreML 委托问题) 确保 CoreMLDelegate 使用的是最新版本的 CoreML (3)

接下来的步骤?

尝试修改 TFLite 文件本身,以某种方式为池化层设置填充类型。如何做到这一点并不明显

尝试修改 CoreML 委托以将填充类型设置为默认值?在这个文件的某个地方? https://github.com/tensorflow/tensorflow/blob/nightly/tensorflow/lite/delegates/coreml/builders/pooling_layer_builder.cc#L54

这是正确的方法还是我没有看到更简单的解决方案?

【问题讨论】:

【参考方案1】:

为了编辑一个 TFlite 模型,我推荐你使用这个名为 Netron 的 Python 库。我还没有使用对象检测模型对此进行测试[我将在当天更新此评论],但是,我设法访问了模型本身并修改了它的配置。

当您安装 Netron 并将 model.tflite 称为 netron 'model.tflite' 时,服务器链接将显示在您的命令 shell 中。单击它时,您将可以访问模型的图形模式。单击图层时,将显示一组属性,您可以在其中进行修改。感谢github comments,我设法注意到了这一点。我想这会让你解决你的问题。

同时,一旦我有一个对象检测案例的新部署模型,我将尝试修改我的模型的 CoreML 版本。我会及时通知你的!

让我知道到目前为止这是否对您有所帮助。

【讨论】:

【参考方案2】:

你可以尝试一些事情:

    使用 tensorflow-onnx 将模型转换为 .onnx 格式。 您可以尝试将 tensorflow 模型(.h5,SavedModel,tf.keras.Model,具体函数)直接转换为 CoreML,而不是将 .tflite 转换为 CoreML 模型。参考:Tensorflow 2 Conversion

【讨论】:

以上是关于如何在 Tensorflow Lite 上为 CoreML 委托设置填充类型以修复未设置“PoolingLayerBuilder (MEAN)_1”。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中导入 tensorflow lite 解释器?

如何在 CMake 中正确使用 Tensorflow Lite?

如何创建可轻松转换为 TensorFlow Lite 的模型?

Android:如何在 Android 中使用 tensorflow lite 扩展图像的维度

Android Tensorflow lite 识别关键字

如何创建一个可轻松转换为TensorFlow Lite的模型?