【发布时间】:2017-11-23 14:19:59
【问题描述】:
我正在努力理解 CoreML。对于入门模型,我下载了Yahoo's Open NSFW caffemodel。你给它一张图片,它会给你一个概率分数(介于 0 和 1 之间),表明该图片包含不合适的内容。
使用 coremltools,我已将模型转换为 .mlmodel 并将其引入我的应用程序。它出现在 Xcode 中是这样的:
在我的应用程序中,我可以成功传递图像,并且输出显示为 MLMultiArray。我遇到麻烦的地方是理解如何使用这个 MLMultiArray 来获得我的概率分数。我的代码是这样的:
func testModel(image: CVPixelBuffer) throws {
let model = myModel()
let prediction = try model.prediction(data: image)
let output = prediction.prob // MLMultiArray
print(output[0]) // 0.9992402791976929
print(output[1]) // 0.0007597212097607553
}
作为参考,正在将 CVPixelBuffer 调整为模型要求的所需 224x224 大小(一旦我弄清楚这一点,我将开始使用 Vision)。
如果我提供不同的图像,我打印到控制台的两个索引确实会发生变化,但它们的分数与我在 Python 中运行模型时得到的结果大不相同。在 Python 中测试时传递给模型的相同图像给我的输出为 0.16,而根据上面的示例,我的 CoreML 输出与我期望看到的大不相同(和字典,与 Python 的双重输出不同)。
是否需要做更多工作才能获得我期望的结果?
【问题讨论】:
-
我认为您不需要手动调整缓冲区大小。我认为 CoreML 会为您解决这个问题
-
我相信只有在使用 Vision 时才会出现这种情况。如果仅使用 CoreML 本身,我相信确实需要调整缓冲区的大小(我可以确认;如果我通过 CVPixelBuffer 而不调整大小,它会引发错误)。
-
对。除非您喜欢编写、重写和维护图像处理代码,否则使用 Vision 将图像提供给您的模型要简单得多。
-
@rickster 我更愿意使用 Vision,但是对于这个特定的模型,它不会在结果中提供任何输出。当我尝试使用 CoreML 时,我得到了一些结果,尽管不是我所希望的。使用 Vision,传递原始图像会产生空输出。
标签: ios iphone neural-network caffe coreml