Размер байтового буфера и форма не совпадают. TFLite/Kotlin
Я новичок в ML, но благодаря документации и сообществу я развиваюсь в этом направлении. Теперь я наткнулся на ошибку и в течение нескольких дней не могу ее решить, в чем проблема и как ее решить?
Я просмотрел туториалы, документацию и кажется, я ничего не забыл. На XML-макете есть картинка, текст, куда идут и берутся данные, их идентификаторы совпадают
Что мне нужно? Я хочу открыть камеру, сфотографировать объект, определить что это такое, основываясь на моей обученной модели
Проблема: приложение завершает работу в строке 194:
inputFeature0.loadBuffer(byteBuffer)
полный текст ошибки: java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match.
class SortingFragment : Fragment(), View.OnClickListener {
//ML
lateinit var bitmap: Bitmap
lateinit var appCtx: Application
lateinit var btnMLrn : Button
@SuppressLint("WrongConstant")
public fun checkandGetpermissions() {
if (PermissionChecker.checkSelfPermission(
requireActivity(),
Manifest.permission.CAMERA
) == PackageManager.PERMISSION_DENIED
) {
requestPermissions(arrayOf(Manifest.permission.CAMERA), 100)
} else {
requireActivity().showToast("Camera permission granted")
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 100) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requireActivity().showToast("Camera permission granted")
} else {
requireActivity().showToast("Permission Denied")
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.v(LOG_SORTING_FRAGMENT, "onCreate called")
// handling permissions
checkandGetpermissions()
appCtx = requireActivity().application
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.v(LOG_SORTING_FRAGMENT, "onCreateView called")
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_sorting, container, false)
btnMLrn = rootView.findViewById(R.id.btnMLrn)
fltNtf = rootView.findViewById(R.id.fltNtf)
fltNtf.setOnClickListener(this)
btnMLrn.setOnClickListener(View.OnClickListener {
var camera : Intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(camera, 200)
})
return rootView
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == 250){
img_view.setImageURI(data?.data)
var uri : Uri?= data?.data
bitmap = MediaStore.Images.Media.getBitmap(requireActivity().contentResolver, uri)
}
else if(requestCode == 200 && resultCode == Activity.RESULT_OK){
bitmap = data?.extras?.get("data") as Bitmap
img_view.setImageBitmap(bitmap)
var resized = Bitmap.createScaledBitmap(bitmap, 224, 224, true)
val model = ModelUnquant.newInstance(requireActivity())
var tbuffer = TensorImage.fromBitmap(resized)
var byteBuffer = tbuffer.buffer
// Creates inputs for reference.
val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 224, 224, 3), DataType.FLOAT32)
inputFeature0.loadBuffer(byteBuffer)
// Runs model inference and gets result.
val outputs = model?.process(inputFeature0)
val outputFeature0 = outputs?.outputFeature0AsTensorBuffer
var max = outputFeature0?.let { it1 -> getMax(it1.floatArray) }
val labels = appCtx.assets.open("labels.txt").bufferedReader().use { it.readText() }.split("\n")
sorttext.setText(labels[max!!])
// Releases model resources if no longer used.
if (model != null) {
model.close()
}
}}
fun getMax(arr: FloatArray): Int {
var ind = 0;
var min = 0.0f;
for (i in 0..10) {
if (arr[i] > min) {
min = arr[i]
ind = i;
}
}
return ind
}
} ```