Исключение Espresso: «Недопустимый аргумент»: ядро общей формы при загрузке mlmodel

#swift #machine-learning #tf.keras #coreml #handwriting-recognition

#swift #машинное обучение #tf.keras #coreml #распознавание рукописного ввода

Вопрос:

Я преобразовал свою mlmodel из tf.keras. Цель состоит в том, чтобы распознать рукописный текст на изображении, когда я запускаю его с помощью этого кода:

 func performCoreMLImageRecognition(_ image: UIImage) {
     
        let model = try! HTRModel()
        // process input image
        let scale = image.scaledImage(200)
        let sized = scale?.resize(size: CGSize(width: 200, height: 50))
        let gray = sized?.rgb2GrayScale()
        
        guard let pixelBuffer = sized?.pixelBufferGray(width: 200, height: 50) else { fatalError("Cannot convert image to pixelBufferGray")}
        
        UIImageWriteToSavedPhotosAlbum(gray! ,
                                        self,
                                        #selector(self.didFinishSavingImage(_:didFinishSavingWithError:contextInfo:)),
                                        nil)
        
        let mlArray = try! MLMultiArray(shape: [1, 1], dataType: MLMultiArrayDataType.float32)
        let htrinput = HTRInput(image: pixelBuffer, label: mlArray)
        if let prediction = try? model.prediction(input: htrinput) {
            print(prediction)
        }
    }
 

Я получаю следующую ошибку:

 [espresso] [Espresso::handle_ex_plan] exception=Espresso exception: "Invalid argument": generic_reshape_kernel: Invalid bottom shape (64 12 1 1 1) for reshape to (768 50 -1 1 1) status=-6
2021-01-21 20:23:50.712585 0900 Guided Camera[7575:1794819] [coreml] Error computing NN outputs -6
2021-01-21 20:23:50.712611 0900 Guided Camera[7575:1794819] 
[coreml] Failure in -executePlan:error:.
 

Вот конфигурация моделивведите описание изображения здесь
Модель работала отлично. Где я ошибаюсь в этом. Я не очень хорошо разбираюсь в swift и нуждаюсь в помощи.
Что означает эта ошибка и как мне устранить эту ошибку?

Ответ №1:

Иногда во время преобразования из Keras (или любого другого) в Core ML конвертер не понимает, как обрабатывать определенные операции, что приводит к модели, которая не работает.

В вашем случае есть слой, который выводит тензор с формой (64, 12, 1, 1, 1) в то время как существует слой изменения формы, который ожидает чего-то, что может быть изменено на (768, 50, -1, 1, 1).

Вам нужно будет выяснить, какой слой изменяет форму, а затем изучить основную модель ML, почему она получает входной тензор неправильного размера. То, что в Keras все работает нормально, не означает, что преобразование в Core ML было безупречным.

Вы можете изучить основную модель ML с помощью Netron, средства просмотра моделей с открытым исходным кодом.

(Обратите внимание, что 64×12 = 768, поэтому проблема, по-видимому, связана с 50 в этом тензоре.)

Комментарии:

1. Спасибо! Похоже, ошибка возникает при масштабировании. Исправлено путем добавления соответствующего масштабирования при преобразовании модели