0

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

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预测结果与我img1直接在 Create ML 应用程序中预测标签时得到的预测结果不同。我相信应用程序在预测图像的类标签之前对输入图像进行了一些调整。当 I 时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
      }
    }
  }
 }
}

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

4

2 回答 2

1

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

我认为coremltools数据结构和特征类型文档假设用于 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})
于 2020-07-01T08:11:50.670 回答
0

你不需要这样做:

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

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

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

于 2020-06-25T09:28:38.913 回答