[英]Why are these log statements not printing?
我正在構建一個對象檢測應用程序(在 Kotlin 中,用於 Android)。 該應用程序使用 CameraX 構建相機預覽,並使用 Google ML 提供機器學習專業知識。 僅供參考; 我使用了這個CameraX 文檔和這個Google ML Kit 文檔。
我目前正在嘗試將Log.d("TAG", "onSuccess" + it.size)
打印到我的 IDE 控制台,以確定.addonSuccessListener
是否實際運行。 如果是,它應該按照onSuccess1
打印一些內容。 然而,事實並非如此。 事實上,它甚至沒有從.addOnFailureListener
打印 Log 語句,這讓我很困惑,因為我什至不完全確定 objectDetector 代碼是否正在運行。 真正讓我困惑的是,我用Java相對完成了同一個項目,沒有遇到過這個問題。
我確實有人指出,在我的YourImageAnalyzer.kt
類中,如果mediaImage
為空,那么我將看不到任何日志記錄。 但是,經過我自己的調試(這實際上是我第一次調試),我無法確定這一段的第一句話是否正確。 我想這個問題可能會為我如何解決這個問題提供線索,並學習如何正確調試。
這是我的YourImageAnalyzer.kt
類,我還將在下面添加我的MainActivity.kt
類的代碼。
private class YourImageAnalyzer : ImageAnalysis.Analyzer {
override fun analyze(imageProxy: ImageProxy) {
val mediaImage = imageProxy.image
if (mediaImage != null) {
val image =
InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
val localModel = LocalModel.Builder()
.setAssetFilePath("mobilenet_v1_0.75_192_quantized_1_metadata_1.tflite")
.build()
val customObjectDetectorOptions =
CustomObjectDetectorOptions.Builder(localModel)
.setDetectorMode(CustomObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.setClassificationConfidenceThreshold(0.5f)
.setMaxPerObjectLabelCount(3)
.build()
val objectDetector =
ObjectDetection.getClient(customObjectDetectorOptions)
objectDetector //Here is where the issue stems, with the following listeners
.process(image)
.addOnSuccessListener {
Log.i("TAG", "onSuccess" + it.size)
for (detectedObjects in it)
{
val boundingBox = detectedObjects.boundingBox
val trackingId = detectedObjects.trackingId
for (label in detectedObjects.labels) {
val text = label.text
val index = label.index
val confidence = label.confidence
}
}
}
.addOnFailureListener { e -> Log.e("TAG", e.getLocalizedMessage()) }
.addOnCompleteListener { it -> imageProxy.close() }
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider>
override fun onCreate(savedInstanceState: Bundle?) {
cameraProviderFuture = ProcessCameraProvider.getInstance(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))
}
fun bindPreview(cameraProvider: ProcessCameraProvider) {
val previewView = findViewById<PreviewView>(R.id.previewView)
var preview : Preview = Preview.Builder()
.build()
var cameraSelector : CameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
preview.setSurfaceProvider(previewView.surfaceProvider)
var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}
}
您沒有綁定 ImageAnalysis 用例。 類似的東西:
val imageAnalysis = ImageAnalysis.Builder()
.setTargetResolution(Size(1280, 720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
.build()
進而;
imageAnalysis.setAnalyzer(executor, YourImageAnalyzer())
cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, imageAnalysis, preview)
還有一個建議作為獎勵:你應該讓你的LocalModel.Builder()
退出analyze
因為每次圖像到達時都會調用它。 您不需要每次都執行這段代碼,因為它會使您的分析變慢。 所以移動這個代碼:
val localModel = LocalModel.Builder()
.setAssetFilePath("mobilenet_v1_0.75_192_quantized_1_metadata_1.tflite")
.build()
到類private class YourImageAnalyzer : ImageAnalysis.Analyzer {
正下方private class YourImageAnalyzer : ImageAnalysis.Analyzer {
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.