kotlin 用ML KIT Android检测活力-眨眼和微笑概率

q8l4jmvw  于 2023-05-01  发布在  Kotlin
关注(0)|答案(1)|浏览(181)

在我的Android应用程序中使用Google ml-kit进行人脸检测。
我还必须检测眨眼和微笑的活性。
下面是函数:

fun detectLiveness(image: Bitmap, face: Face): Float? {
    val aligned = this.faceSquaredAligner.computeImagePatch(face, image, 224)
    val token = this.faceSquaredAligner.computeImagePatch(face, image, 448)

    val squareData = prepareImage(aligned, 1)
    val tokenData = prepareImage(token, 1)

    var score: Float? = null
    if (face.rightEyeOpenProbability != null) {
        Toast.makeText(context,"got it", Toast.LENGTH_SHORT).show()
    }else{
        Toast.makeText(context,"Right Eye null", Toast.LENGTH_SHORT).show()
    }
    this.env.use {
        var squareTensor = OnnxTensor.createTensor(
            this.env, squareData,
            this.getTensorShape(aligned)
        )
        val tokenTensor = OnnxTensor.createTensor(
            this.env, tokenData,
            this.getTensorShape(token)
        )
        squareTensor.use {
            tokenTensor.use {
                var inputs = mutableMapOf("input.1" to tokenTensor, "input.207" to squareTensor)
                var outputs = mutableSetOf("718")
                val output = this.session.run(inputs, outputs, OrtSession.RunOptions())
                output.use {
                    @Suppress("UNCHECKED_CAST")
                    val rawOutput = ((output?.get(0)?.value) as Array<FloatArray>)[0]
                    score = softMax(rawOutput)[0]
                }
            }
        }
    }
    return score
}

其中我检查了rightEyeOpenProbability,但结果为null。
我们有'OnnxruntimeLivenessDetector'类,它有一个名为'detectLiveness()'的方法,该方法返回score(float value)。
在这两个地方,我试图检查右眼,左眼和微笑的概率,但没有得到任何价值。
我做错了什么?或者有什么不同的方法来检测活性i。即用户的眨眼和微笑值?先谢了。

qlfbtfca

qlfbtfca1#

几天后就解决了,这只是一个愚蠢的错误。以下是设置人脸检测选项的方法,您可以检查:

fun getFaceDetectorOptions(context : Context?) : FaceDetectorOptions {
    val landmarkMode = FaceDetectorOptions.LANDMARK_MODE_ALL
    val contourMode = FaceDetectorOptions.CONTOUR_MODE_NONE
    //val classificationMode = FaceDetectorOptions.CLASSIFICATION_MODE_NONE
    val classificationMode = FaceDetectorOptions.CLASSIFICATION_MODE_ALL
    val performanceMode = FaceDetectorOptions.PERFORMANCE_MODE_FAST

    val enableFaceTracking = false
    val minFaceSize = "0.1".toFloat()
    val optionsBuilder = FaceDetectorOptions.Builder()
        .setLandmarkMode(landmarkMode)
        .setContourMode(contourMode)
        .setClassificationMode(classificationMode)
        .setPerformanceMode(performanceMode)
        .setMinFaceSize(minFaceSize)
    if (enableFaceTracking) {
        optionsBuilder.enableTracking()
    }
    return optionsBuilder.build()
}

你可以看到他们的我已经评论了val classificationMode = FaceDetectorOptions.CLASSIFICATION_MODE_NONE,而不是使用val classificationMode = FaceDetectorOptions.CLASSIFICATION_MODE_ALL,它只是解决了这个问题。

相关问题