首页 文章

将Caffe模型转换为CoreML

提问于
浏览
3

我正在努力了解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 回答

  • 2

    您似乎没有像模型所期望的那样转换输入图像 .
    大多数caffe模型都希望"mean subtracted"图像作为输入,这个模型也是如此 . 如果你检查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 .

相关问题