簡體   English   中英

為什么這些日志語句不打印?

[英]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類的代碼。

YourImageAnalyzer.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() }
        }
    }
}

主活動.kt

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM