Преобразование UIImage в MLMultiArray для модели Keras

В Python я обучил модель классификации изображений с помощью керас, чтобы получать входные данные в виде массива [224, 224, 3] и выводить прогноз (1 или 0). Когда я загружаю сохранить модель и загружаю ее в xcode, он утверждает, что входные данные должны быть в формате MLMultiArray.

Есть ли способ для меня, чтобы преобразовать UIImage в формат MLMultiArray? Или есть способ изменить модель keras, чтобы принимать объекты типа CVPixelBuffer в качестве входных данных.

3 ответа

В вашем скрипте преобразования Core ML вы можете указать параметр image_input_names='data' где data это имя вашего входа.

Теперь Core ML будет обрабатывать этот вход как изображение (CVPixelBuffer) вместо нескольких массивов.

Когда вы конвертируете модель кафе в MLModel, вам нужно добавить эту строку:

image_input_names = 'data'

Возьмите мой собственный скрипт переноса в качестве примера, скрипт должен быть таким:

import coremltools
coreml_model = coremltools.converters.caffe.convert(('gender_net.caffemodel', 
'deploy_gender.prototxt'),
image_input_names = 'data',
class_labels = 'genderLabel.txt')
coreml_model.save('GenderMLModel.mlmodel')

А потом твой MLModelвходные данные будут CVPixelBufferRef вместо MLMultiArray, Передача UIImage в CVPixelBufferRef было бы легко.

Не пробовал это, но вот как это сделано для образца FOOD101

func preprocess(image: UIImage) -> MLMultiArray? {
        let size = CGSize(width: 299, height: 299)


        guard let pixels = image.resize(to: size).pixelData()?.map({ (Double($0) / 255.0 - 0.5) * 2 }) else {
            return nil
        }

        guard let array = try? MLMultiArray(shape: [3, 299, 299], dataType: .double) else {
            return nil
        }

        let r = pixels.enumerated().filter { $0.offset % 4 == 0 }.map { $0.element }
        let g = pixels.enumerated().filter { $0.offset % 4 == 1 }.map { $0.element }
        let b = pixels.enumerated().filter { $0.offset % 4 == 2 }.map { $0.element }

        let combination = r + g + b
        for (index, element) in combination.enumerated() {
            array[index] = NSNumber(value: element)
        }

        return array
    }

https://github.com/ph1ps/Food101-CoreML

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