Hi, I’m new to Android studio and TF and I’m having an issue. I convert my .pth file to .tflite file and imported into Android Studio. When I run my app, Logcat shows there is something wrong.
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.skinapp/com.example.skinapp.MainActivity}: java.lang.IllegalArgumentException: Cannot copy to a TensorFlowLite tensor (serving_default_input:0) with 2408448 bytes from a Java Buffer with 8064 bytes.
Following is my while code of MainActivity.kt.
package com.example.aifer import android.content.ActivityNotFoundException import android.content.Intent import android.graphics.Bitmap import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.provider.MediaStore import android.widget.* import com.example.skinapp.ml.ModelMeta import org.tensorflow.lite.support.image.TensorImage import java.io.IOException import android.graphics.drawable.BitmapDrawable import com.example.skinapp.R import kotlin.math.roundToInt class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.btn_photo).setOnClickListener { //Create an Intent object for image acquisition val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) //Use try-catch to avoid exceptions, and if they occur, display Toast try { startActivityForResult(intent, 0) //Send Intent } catch (e: ActivityNotFoundException) { Toast.makeText( this, "error", Toast.LENGTH_SHORT ).show() } } findViewById<Button>(R.id.btn_album).setOnClickListener { //Create an Intent object for image acquisition val intent = Intent(Intent.ACTION_GET_CONTENT).setType("image/*") //Use try-catch to avoid exceptions, and if they occur, display Toast try { startActivityForResult(intent, 1) //發送 Intent } catch (e: ActivityNotFoundException) { Toast.makeText( this, "error", Toast.LENGTH_SHORT ).show() } } } // receive results override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) //Identify returned objects and execution results if (requestCode == 0 && resultCode == RESULT_OK) { val image = data?.extras?.get("data") ?: return //Get information val bitmap = image as Bitmap //Convert data to Bitmap val imageView = findViewById<ImageView>(R.id.imageView) imageView.setImageBitmap(bitmap) //Using Bitmap to set images imageView.rotation = 90f //Make the ImageView rotate 90 degrees clockwise recognizeImage(bitmap) //Use Bitmap for identification } if (requestCode == 1 && resultCode == RESULT_OK) { val uri = data!!.data val imageView = findViewById<ImageView>(R.id.imageView) imageView.setImageURI(uri) imageView.rotation = 0f val drawable = imageView.drawable as BitmapDrawable //Obtain data from imageView and convert it into Bitmap val bitmap = drawable.bitmap recognizeImage(bitmap) //Use Bitmap for identification } } // Recognize images private fun recognizeImage(bitmap: Bitmap) { try { // Loads my custom model val model = ModelMeta.newInstance(this) // Creates inputs for reference. val tensorImage = TensorImage.fromBitmap(bitmap) // Runs model inference and gets result. val outputs = model.process(tensorImage) .probabilityAsCategoryList.apply { sortByDescending { it.score } // Sort from high to low } //Obtain identification results and credibility val result = arrayListOf<String>() for (output in outputs) { val label = output.label val score: Int = (output.score * 100).roundToInt() result.add("The probability that the disease is $label is $score %") } //Display results in ListView val listView = findViewById<ListView>(R.id.listView) listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, result ) } catch (e: IOException) { e.printStackTrace() } } }
I’d really appreciate if somebody could give me a hint.