将Caffe模型转换为CoreML

时间:2017-06-20 21:22:38

标签: ios iphone neural-network caffe coreml

我正在努力了解CoreML。对于初学者模型,我已经下载了Yahoo's Open NSFW caffemodel。你给它一个图像,它给你一个概率分数(0到1之间),图像包含不合适的内容。

使用 coremltools ,我已将模型转换为.mlmodel并将其带入我的应用。它在Xcode中出现如下:

enter image description here

在我的应用中,我可以成功传递图像,输出显示为 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 个答案:

答案 0 :(得分:2)

您似乎没有像模型所期望的那样转换输入图像 大多数caffe模型预计"意味着减去"图像作为输入,这个模型也是如此。如果您检查Yahoo's Open NSFWclassify_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