Преобразование модели Caffe в CoreML

Я работаю, чтобы понять CoreML. Для начинающей модели я скачал кофейную модель Open NSFW от Yahoo. Вы даете ему изображение, оно дает вам оценку вероятности (от 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 ответ

Решение

Похоже, вы не трансформируете входное изображение так, как ожидает модель.
Большинство моделей кафе ожидают в качестве входных данных изображения со средним вычитанием, как и эта модель. Если вы проверяете код Python, предоставляемый Yahoo Open NSFW (classify_nsfw.py):

# 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

Также существует особый способ изменения размера изображения до 256x256, а затем обрезка до 224x224.

Чтобы получить абсолютно одинаковые результаты, вам необходимо одинаково преобразовать входное изображение на обеих платформах.

Смотрите эту тему для получения дополнительной информации.

Другие вопросы по тегам