继续此前的文章,使用vlc播放了rtsp流媒体视频后,想检测视频中的人脸,之前采用了opencv但是遇到低头、抬头和侧脸时候,效果就不太好。所以本篇介绍如何使用mtcnn来检测视频中的人脸。
大致流程:
一、Tensorflow 模型固化
将PNet、ONet、RNet 网络参数.npy固化成.pb格式,方便java载入, 固化后的文件在assets中,文件名mtcnn_freezed_model.pb。
二、引入android tensorflow lite 库
只需在build.gradle(module)最后添加以下几行语句即可。
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
compile(name: 'libvlc-3.0.0', ext: 'aar')
implementation files('libs/androidutils.jar')
compile 'org.tensorflow:tensorflow-android:+'
implementation files('libs/libutils.jar')
}
三、新建MTCNN类
该类包含加载模型文件,并检测bitmap中的人脸
package com.cayden.face.facenet;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Point;
import android.util.Log;
import com.cayden.face.FaceApplication;
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
import java.util.Vector;
import static java.lang.Math.max;
import static java.lang.Math.min;
/**
* Created by caydencui on 2018/9/6.
*/
public class MTCNN {
//参数
private float factor=0.709f;
private float PNetThreshold=0.6f;
private float RNetThreshold=0.7f;
private float ONetThreshold=0.7f;
//MODEL PATH
private static final String MODEL_FILE = "file:///android_asset/mtcnn_freezed_model.pb";
//tensor name
private static final String PNetInName ="pnet/input:0";
private static final String[] PNetOutName =new String[]{"pnet/prob1:0","pnet/conv4-2/BiasAdd:0"};
private static final String RNetInName ="rnet/input:0";
private static final String[] RNetOutName =new String[]{ "rnet/prob1:0","rnet/conv5-2/conv5-2:0",};
private static final String ONetInName ="onet/input:0";
private static final String[] ONetOutName =new String[]{ "onet/prob1:0","onet/conv6-2/conv6-2:0","onet/conv6-3/conv6-3:0"};
private static class SingletonInstance {
private static final MTCNN INSTANCE = new MT