我有一个Android应用程序,用户可以使用相机拍摄鸟类的照片,然后对鸟类进行分类。我按照为Android使用自定义模型标记图像的文档进行了操作,但它不起作用。我在onActivityResult
中有以下代码:
val source = ImageDecoder.createSource(this.contentResolver, Uri.fromFile(photoFile))val birdBitmap= ImageDecoder.decodeBitmap(source)val image = InputImage.fromBitmap(birdBitmap, 0)val localModel = LocalModel.Builder().setAssetFilePath("model.tflite").build()val customImageLabelerOptions = CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.5f) .setMaxResultCount(5) .build()val imageLabeler = ImageLabeling.getClient(customImageLabelerOptions)imageLabeler.process(image) .addOnSuccessListener { labels -> var highConf = -1.0f var highText = "" for (label in labels) { val text = label.text val confidence = label.confidence val index = label.index if(confidence > highConf) { highConf = confidence highText = text } } Log.d("PREDICTION", "$highText, $highConf") } .addOnFailureListener { e -> Log.d("FAIL", "$e") }
当用户拍摄照片时,会调用addOnFailureListener
,我得到的错误是:
com.google.mlkit.common.MlKitException: Internal error has occurred when executing ML Kit tasksat com.google.mlkit.common.sdkinternal.ModelResource.zza(com.google.mlkit:common@@16.0.0:28)at com.google.mlkit.common.sdkinternal.zzn.call(Unknown Source:6)at com.google.mlkit.common.sdkinternal.zzm.run(com.google.mlkit:common@@16.0.0:5)at com.google.mlkit.common.sdkinternal.zzq.run(com.google.mlkit:common@@16.0.0:3)at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zzd(com.google.mlkit:common@@16.0.0:24)at com.google.mlkit.common.sdkinternal.MlKitThreadPool.zza(com.google.mlkit:common@@16.0.0:30)at com.google.mlkit.common.sdkinternal.zzj.run(Unknown Source:2)At java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)at java.lang.Thread.run(Thread.java:764)Caused by: java.lang.IllegalArgumentException: Unsupported bitmap config HARDWAREat com.google.android.libraries.vision.visionkit.pipeline.zzbb.zza(com.google.mlkit:vision-internal-vkp@@17.0.0:56)at com.google.mlkit.vision.vkp.PipelineManager.process(com.google.mlkit:vision-internal-vkp@@17.0.0:150)at com.google.mlkit.vision.label.custom.internal.zzd.zza(com.google.mlkit:image-labeling-custom@@16.1.0:19)at com.google.mlkit.vision.label.custom.internal.zzd.run(com.google.mlkit:image-labeling-custom@@16.1.0:112)at com.google.mlkit.vision.common.internal.MobileVisionBase.zza(com.google.mlkit:vision-common@@16.0.0:23)at com.google.mlkit.vision.common.internal.zzb.call(Unknown Source:4)at com.google.mlkit.common.sdkinternal.ModelResource.zza(com.google.mlkit:common@@16.0.0:26)
谁能告诉我如何解决这个问题?
回答:
查看堆栈跟踪,似乎输入的Bitmap直接来自相机,并且存储在内存中(Bitmap.Config.HARDWARE
)。ML Kit仅支持ARGB_8888格式的位图,请尝试以下方法:
val newBitmap = myBitmap.copy(Bitmap.Config.ARGB_8888, myBitmap.isMutable())
在开发这个功能时,我们考虑的是从设备上加载保存为ARGB_8888格式的文件,而不是直接从设备相机获取。我将提交一个增强请求,看看我们是否能覆盖这种用例。感谢您指出这个问题!