Преобразование 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
}