在我的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
}
其中我检查了righyeopenprobability,但得到null。
我们有'OnnxruntimeLivenessDetector'类,它有一个名为'detectLiveness()'的方法,它返回分数(浮点值)这个detectLiveness()方法是从FaceDetector类中的processDetection()方法调用的。
在这两个地方,我都试着检查右眼,左眼和微笑的概率,但没有得到任何价值。
我在这里做错了什么?或者是否有其他方法来检测用户的活跃度,即通过用户的眨眼和微笑值?提前感谢。
几天后就解决了,这只是一个愚蠢的错误。下面是设置你可以检查的人脸检测选项的方法:
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
,这简单地解决了这个问题。