我正在努力了解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的双输出)。
是否需要做更多工作才能获得我期待的结果?
答案 0 :(得分:2)
您似乎没有像模型所期望的那样转换输入图像
大多数caffe模型预计"意味着减去"图像作为输入,这个模型也是如此。如果您检查Yahoo's Open NSFW(classify_nsfw.py
)提供的python代码:
# Note that the parameters are hard-coded for best results
caffe_transformer = caffe.io.Transformer({'data': nsfw_net.blobs['data'].data.shape})
caffe_transformer.set_transpose('data', (2, 0, 1)) # move image channels to outermost
caffe_transformer.set_mean('data', np.array([104, 117, 123])) # subtract the dataset-mean value in each channel
caffe_transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255]
caffe_transformer.set_channel_swap('data', (2, 1, 0)) # swap channels from RGB to BGR
此外,图片的具体方式为resized to 256x256 and then cropped to 224x224。
要获得完全相同的结果,您需要在两个平台上以完全相同的方式转换输入图像。
有关其他信息,请参阅this thread。