CoreMLTools 转换为 MLModel:reName_Feature 不起作用

Posted

技术标签:

【中文标题】CoreMLTools 转换为 MLModel:reName_Feature 不起作用【英文标题】:CoreMLTools conversion to MLModel: reName_Feature does not work 【发布时间】:2021-05-24 05:38:43 【问题描述】:

问题:CoreMLTools reName_feature 不更新模型中的特征名称,仅在模型的“规范”中!

我为图像分类问题创建了一个顺序 Tensorflow 模型。 最初,在转换时(根据 Apple 文档):

# https://coremltools.readme.io/docs/tensorflow-2

mlmodel2 = ct.convert(model, 
                      inputs=[ct.ImageType()],
                      input_names=['image'],
                      image_input_names='image')

生成了一个 MLModel,它有一个名为“conv2d_3_input”的输入并且是一个 MultiArray (Float33. 1x299x299x1) 和一个名为“Identity”的输出,它也是 Float32 的 MultiArray

幸运的是,快速入门文档位于:https://coremltools.readme.io/docs/introductory-quickstart#download-the-model 阐明了输入类型的修复需要向 ImageType 添加一个形状 arg:

# Define the input type as image, 
# set pre-processing parameters to normalize the image 
# to have its values in the interval [0,1] 

image_input = ct.ImageType(shape=(1, 299, 299, 1,))
mlmodel3 = ct.convert(model, 
                      inputs=[image_input],
                      input_names=['image'],
                      image_input_names='image')

所以现在生成的 MLModel 有一个 Image (Grayscale 299 x 299) 输入类型(太棒了!),但它仍然被称为“conv2d_3_input”

对于样式点,我想将输入特征重命名为“图像”。转换函数(上图)的名称参数无效。我接下来尝试直接更改模型的规格:

spec = mlmodel.get_spec()
#spec.description.input
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')

#rename change spec but does not push new spec into model
spec.description.input

这会正确更改规范中的输入名称:

[name: "image"
type 
  imageType 
    width: 299
    height: 299
    colorSpace: GRAYSCALE
  

]

但是,这显然不会将更改推送到模型中!这是 mlmodel 的清单:

input 
  name: "conv2d_3_input"
  type 
    imageType 
      width: 299
      height: 299
      colorSpace: GRAYSCALE
    
  

output 
  name: "Identity"
  shortDescription: "Most likely ....."
  type 
    multiArrayType 
      dataType: FLOAT32
    
  

metadata 
  shortDescription: "Converts image ........."

如何将特征名称的更改推送到实际的 mlmodel 中?

【问题讨论】:

【参考方案1】:

在 coreMLtools 团队的 Aseem 的帮助下,将修改后的 protobuf 规范推回模型的机制如下:

spec = mlmodel3.get_spec()
ct.utils.rename_feature(spec, 'conv2d_3_input', 'image')
ct.utils.rename_feature(spec, 'Identity', 'output')


# reload the model with the updated spec and re-save
model = ct.models.MLModel(spec)
model.save("mlModel3.mlmodel")

#observe the correct model

model

Aseem 的 WWDC2020 演讲中更详细地介绍了这一点: https://developer.apple.com/videos/play/wwdc2020/10153/

【讨论】:

以上是关于CoreMLTools 转换为 MLModel:reName_Feature 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 iOS 11 mlmodel 进行图像分类 - 使用 coremltools 和经过训练的 .caffemodel 转换问题

Coremltools 无法成功将输出更改为图像

如何将样式转移 tensorflow 模型转换为具有灵活输入形状的 mlmodel?

动态加载 mlmodel

CoreML 模型在 coremltools 和 Xcode 之间产生不同的结果

将 Caffe 模型转换为 CoreML