我正在努力了解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的双输出) .
是否需要更多工作来获得我期待的结果?
1 回答
您似乎没有像模型所期望的那样转换输入图像 .
大多数caffe模型都希望"mean subtracted"图像作为输入,这个模型也是如此 . 如果你检查Yahoo's Open NSFW(classify_nsfw.py)提供的python代码:
还有一种特定的图像方式是resized to 256x256 and then cropped to 224x224 .
要获得完全相同的结果,您需要在两个平台上以完全相同的方式转换输入图像 .
有关其他信息,请参见this thread .