#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())
И проверьте вывод буфера, чтобы найти в нем какую-либо разницу.