Core ML 模型转换失败 "Unable to infer input name and dimensions"

Core ML model conversion fails with "Unable to infer input name and dimensions"

我正在尝试从 Places205 - GoogLeNet 制作一个 Core ML 模型,如 Apple here 所述。

我不想使用 Apple 的 ready-made 模型,所以我从这个 link 得到了原始模型:https://developer.apple.com/machine-learning/model-details/Places205-GoogLeNet.txt

根据 Apple 的 WWDC session,我们可以使用 Coremltools 转换该模型。在他们的 session 中,我们不知道他们使用哪个 IDE 进行 Python 编码,但目前我正在使用 Pycharm 进行 Python 编码。

对模型使用link,我们可以得到两个东西.caffemodel 和.prototext。我尝试使用 coremltools 转换它们并收到以下错误:

RuntimeError: Unable to infer input name and dimensions. Please provide a .prototxt file with 'Input' layer and dimensions defined.

那么,如果 Apple 的给定模型没有转换,那么我们怎么能说其他开源模型会起作用呢?

您可以在附加的屏幕截图中看到我的代码库。

如何解决这个错误?

看起来 Matthijs 用他上面的评论解决了你的核心问题,但我可以为将来遇到其他模型的人扩展它。

使用 Apple 的 coremltools 将 Caffe 模型转换为 .mlmodel 文件时,Apple 的转换器采用二进制 .caffemodel(包含模型结构和权重)以及基于文本的 .prototxt 模型描述(其中可能比 .caffemodel 有更多的上下文)。

通常,经过训练的 Caffe 模型会有几个不同的 .prototxt 文件(deploy.prototxtsolver.prototxttrain.prototxt),您通常希望使用 deploy.prototxt(或类似命名的 prototxt)。

即使这样做,您仍然可能会遇到关于 coremltools 的错误 "Unable to infer input name and dimensions"。 Caffe 模型没有明确要求说明模型将接受的输入维度,因此 coremltools 尝试从几个不同的来源推断这一点。如果缺少这些源,您可能需要自己将它们编辑到 .prototxt 中。

在上面的链接 deploy_places205.protxt 中,此输入大小由文件顶部的以下代码指定:

input: "data"
input_dim: 10
input_dim: 3
input_dim: 224
input_dim: 224

但您可能还会在这些 .prototxt 描述之一中看到以下内容:

input: "data"
input_shape {
  dim: 1
  dim: 3
  dim: 227
  dim: 227
}

如果您的 .prototxt 文件缺少此输入,您可以在文件中的第一个 layer { 实例之前添加上述任一内容。维度依次为:批量大小(被 Core ML 忽略)、颜色通道、图像宽度、图像高度。您可以调整这些以匹配网络的预期。

您可能还需要验证 "data" 是模型使用的输入层,因此查找第一个 layer { 实例并检查其中是否显示 bottom: "data"。如果层名称有所不同,您可能需要在此处或在数据层名称中进行更改。

您可能还需要在 coremltools 转换器中设置数据层名称,以确保它选择正确的名称。作为参考,这是我用来转换模型的小 Python 脚本:

import coremltools

coreml_model = coremltools.converters.caffe.convert(('mymodel.caffemodel', 'deploy.prototxt'),
                                                    image_input_names = "data",
                                                    is_bgr = True,
                                                    class_labels='labels.txt'
                                                   )


coreml_model.save('MyModel.mlmodel')