2017-06-20 206 views
3

我正在理解CoreML。对于初学者模型,我已经下载了Yahoo's Open NSFW caffemodel。您给它一张图片,它会给出一个概率分数(介于0和1之间)图片包含不适合的内容。将Caffe模型转换为CoreML

使用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,该模型问(我会得到与视觉打一次,我可以算出来)。

如果我提供了不同的图像,我已经打印到控制台的两个索引确实发生了变化,但是他们的分数与我在Python中运行模型时得到的结果大不相同。在Python中进行测试时,传递给模型的图像给出了0.16的输出,而根据上面的示例,我的CoreML输出与我期望看到的截然不同(和Python的双输出不同)。

需要更多的工作来获得像我期待的结果?

+0

我不认为你需要手动调整缓冲区大小。我认为CoreML可以为你处理 – Guig

+0

我相信在使用Vision时可能只是这种情况。如果只使用CoreML本身,我确实认为缓冲区确实需要调整大小(我可以确认;如果我通过CVPixelBuffer而不调整大小,则会引发错误)。 – ZbadhabitZ

+0

对。除非您喜欢编写,重写和维护图像处理代码,否则使用Vision将图像传送到模型会简单得多。 – rickster

回答

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了解更多信息。

+0

这很有道理!我已经回顾了classify_nsfw.py文件,但希望Vision框架能为我处理所有这些问题。当失败时,我选择使用CoreML,但没有考虑调整图像的需要。有时间了解如何完成所有这些转换! – ZbadhabitZ

+2

@ZbadhabitZ - 除了Shai指出的内容之外,当生成你的mlmodel时,你可能想尝试为'caffe.convert()'设置'is_bgr = True',因为大多数Caffe模型都使用BGR输入。默认情况下,Core ML将转换为假设RGB输入,并且我想象交换颜色通道会对寻找人体肤色的东西的准确性有很大的影响。 –

+0

@BradLarson非常感谢!我曾尝试使用is_bgr标志转换模型与coremltools两种方式,没有区别。 Shai的回应可能需要首先解决,然后我会再次使用is_bgr标记集来尝试模型。感谢您的评论! – ZbadhabitZ