Размер байтового буфера и форма не совпадают.Я столкнулся с этой ошибкой при интеграции моей модели Ml в приложение для Android

#android #machine-learning #ocr #mlmodel

#Android #машинное обучение #распознавание #млмодель

Вопрос:

Я создаю свое первое интегрированное приложение ML для Android и пытаюсь добавить эту модель распознавания в свое приложение. Но я сталкиваюсь с этой ошибкой

 Caused by: java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match.  at org.tensorflow.lite.support.common.SupportPreconditions.checkArgument(SupportPreconditions.java:104)  at org.tensorflow.lite.support.tensorbuffer.TensorBuffer.loadBuffer(TensorBuffer.java:296)  at org.tensorflow.lite.support.tensorbuffer.TensorBuffer.loadBuffer(TensorBuffer.java:323)  at com.security.ml.MainActivity.onDetect(MainActivity.kt:36)  at java.lang.reflect.Method.invoke(Native Method)   at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:441)   at android.view.View.performClick(View.java:7585)   at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)   at android.view.View.performClickInternal(View.java:7541)   at android.view.View.access$3900(View.java:842)   at android.view.View$PerformClick.run(View.java:28875)   at android.os.Handler.handleCallback(Handler.java:938)   at android.os.Handler.dispatchMessage(Handler.java:99)   at android.os.Looper.loop(Looper.java:255)   at android.app.ActivityThread.main(ActivityThread.java:8212)   at java.lang.reflect.Method.invoke(Native Method)   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)   

Вот как я пытался это интегрировать

 val model = Linear.newInstance(this)  val imageview = findViewByIdlt;ImageViewgt;(R.id.imageview)  var bitmap = imageview.getDrawable().toBitmap()  bitmap = Bitmap.createScaledBitmap(bitmap, 32, 32, true)   val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 32, 32, 1), DataType.FLOAT32)   val tensorImage = TensorImage(DataType.FLOAT32)  tensorImage.load(bitmap)  val byteBuffer = tensorImage.buffer   inputFeature0.loadBuffer(byteBuffer)   val outputs = model.process(inputFeature0)  val outputFeature0 = outputs.outputFeature0AsTensorBuffer   model.close()   Toast.makeText(this, outputFeature0.floatArray[0].toString(),Toast.LENGTH_LONG).show()  

Я видел много других таких же вопросов и пробовал их решение, я пытался изменить размер тензорБуфера в 4 раза, я пытался передать байтбуфер непосредственно в функцию model.process (). Но ни один из них не сработал. В чем может быть проблема, помогите, пожалуйста.

Ответ №1:

Растровое изображение, которое вы создаете, скорее всего, основано на изображении с тремя каналами RGB , поэтому ваш буфер будет 32 x 32 x 3 = 3072

 bitmap = Bitmap.createScaledBitmap(bitmap, 32, 32, true)  

но вам нужно отправить Gray-Scale изображения вашей модели, так как это указывает [1,32,32,1] на то, что ей нужна только одна Шанель, поэтому буфер должен быть 32 x 32 x 1 = 1024

 val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 32, 32, 1), DataType.FLOAT32)  

Отлаживать

Есть способ проверить буфер.

 Log.d("shape", byteBuffer.toString()) Log.d("shape", inputFeature0.buffer.toString())  

И проверьте вывод буфера, чтобы найти в нем какую-либо разницу.