【问题标题】:Input for model created using Apple Create ML application使用 Apple Create ML 应用程序创建的模型的输入
【发布时间】:2020-10-15 04:46:12
【问题描述】:

使用 Apple 的 Create ML 应用程序(Xcode 附带的开发工具),我训练了一个图像分类模型并下载了它。然后,我使用 coremltools 包将模型作为 python 项目的一部分加载:

import coremltools
import PIL.Image

def load_image(path, resize_to=None):
   img = PIL.Image.open(path)
   if resize_to is not None:
       img = img.resize(resize_to, PIL.Image.ANTIALIAS)
   r, g, b= img.split()
   img = PIL.Image.merge("RGB", (b, g, r))
   return img

model = coremltools.models.MLModel('classification1.mlmodel')
img_dir = "img1"
img = load_image(img_dir, resize_to=(299, 299))

result = model.predict({'image': img})
print(result)

此代码打印出预测的classlabel,与我直接在 Create ML 应用程序中预测 img1 的标签时得到的预测结果不同。我相信应用程序在预测图像的类标签之前对输入图像进行了一些调整。当我print(model)时,我得到了一些关于输入的信息:

input {
name: "image"
shortDescription: "Input image to be classified"
type {
  imageType {
    width: 299
    height: 299
    colorSpace: BGR
    imageSizeRange {
      widthRange {
        lowerBound: 299
        upperBound: -1
      }
      heightRange {
        lowerBound: 299
        upperBound: -1
      }
    }
  }
 }
}

我相信我已经通过调整图像大小和转换色彩空间进行了所需的调整。为什么代码和应用的预测不一致?

【问题讨论】:

    标签: python python-imaging-library coreml coremltools createml


    【解决方案1】:

    尝试在 OpenCV 中读取您的图像并转换为 PIL.Image,然后再将其传递给 MLModel.predict()。

    coremltools Data Structures and Feature Types 文档假设,我认为,用于 CoreML Vision 图像分类的图像已解压缩。您可以使用 OpenCV 将图像编码为解压缩的 PNG 格式。根据您的色彩空间,您可能需要 numpy 来更改每像素的图像位数。

    import coremltools as ct
    import cv2 as cv
    import numpy as np
    from PIL import Image
    
    
    model = ct.models.MLModel('classification1.mlmodel')
    img = cv.imread('path/to/image')
    img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    #// 32 bits per pixel: RGBA with A channel ignored
    img = np.float32(img)
    #// Assumes raw (decompressed) format
    _, img_decompressed = cv.imencode('.png', img, params=[cv.IMWRITE_PNG_COMPRESSION, 0])
    img_pil = Image.fromarray(img_decompressed)
    img_pil = img_pil.resize((299, 299), resample=Image.BICUBIC)
    prediction = model.predict({'image': img_pil})
    

    【讨论】:

    • 在尝试了您的建议后,我仍然无法得到相同的预测。
    • CreateML 应用程序是黑盒,他们的特征提取器 VisionFeaturePrint_Scene 是一种方法,就我的所有研究而言,它还不能在 Python 中重现。尝试后 - 我决定不使用 CreateML 并切换到 Turicreate (github.com/apple/turicreate)。它是来自 Apple 的用于创建 mlmodel 的库,但您避免使用 VisionFeaturePrint_Scene 特征提取器进行图像分类。之后,您仍然可以使用 coremltools 进行预测。我希望这会有所帮助。
    【解决方案2】:

    你不需要这样做:

    img = PIL.Image.merge("RGB", (b, g, r))
    

    由于 Core ML 模型已经知道 BGR 的输入,它会为您翻转颜色通道。

    由于您已经手动翻转它们,它们现在将被翻转两次,这不是您想要的。

    【讨论】:

    • 我尝试了你的建议。预测仍然不同
    • 在图像编辑器中将图像设为 299x299 像素,将其保存为 PNG,然后在不调整大小或在 Python 中进行任何更改的情况下加载它。与 Create ML 相比,它是否仍然给出非常不同的结果?我之所以这么问,是因为在 Python 和 Create ML 应用程序中,调整大小之类的操作可能会有所不同,像素的微小差异实际上会导致预测结果的巨大差异。
    猜你喜欢
    • 2021-03-19
    • 2019-02-08
    • 1970-01-01
    • 2021-02-20
    • 2018-12-20
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多