● 对一款人脸识别自助储物柜逆向分析(二)
1.人脸识别功能实现
在face/FaceHelper.java
里看到这句:
public static final KFFaceM mFace = new KFFaceM();
public boolean FaceDetection(byte[] bArr, int i, int i2) {
synchronized (this.objectFaceDetection) {
if (bArr == null) {
return false;
}
ByteBuffer order = ByteBuffer.allocateDirect(3686400).order(ByteOrder.nativeOrder());
order.put(bArr);
float[] FindFace = mFace.FindFace(order, i, i2, true);
return FindFace.length > 1 && ((int) FindFace[0]) > 0;
}
}
FaceDetection
方法已经提示得很明显了,就是人脸识别
。调用mFace.FindFace
对比人脸数据。继续溯源,找到了
public class KFFaceM {
public static String TAG = "KFFaceM";
static {
System.loadLibrary("Face");
}
......
}
又加载了外部动态库libface
。
2.活体检测
在看face/FaceHelper.java
时候发现,这个类初始化时,优先加载了LivingBodyHelper
,不仅做了人脸识别,还做了活体检测
,也就是说用手机或者照片欺骗摄像头是行不通的。如下图高亮所示:
有一段代码匪夷所思,把人脸识别的精度设置为了70%,也就是说跟之前摄像头抓取的照片有70%以上的相似度,即可通过。实际中很多APP都在95%以上,估计是从柜子本身的安全度或者提高识别速度考虑吧。
face/LivingBodyHelper.java
人脸检测部分源码:
import cn.heils.detect.FaceCnn;
public class LivingBodyHelper {
private static FaceCnn faceCnn = new FaceCnn();
}
......
活体检测又调用了cn.heils.detect.FaceCnn
,heils为深圳禾思众成
,还以为是 华为海思。人脸识别的源码底层是OpenCV
和TensorFlow
——计算机视觉和机器学习软件库,比串口操作的难度高了几个等级。
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;
public class c {
private static c b;
private TensorFlowInferenceInterface a;
private String c = FaceCnn.a().getInput();
private String d = FaceCnn.a().getActivation();
private int e = FaceCnn.a().getGate();
private c(Context context) {
b(context);
}
public static void a(Context context) {
b = new c(context);
}
public static float[] a(Bitmap bitmap) {
float[] a;
synchronized (c.class) {
try {
a = b.a(b.b(bitmap));
} catch (Throwable th) {
throw th;
}
}
return a;
}
......
}
3.结尾
虽然只在上一篇中做了一个android demo,真的非常不喜欢android开发,因为繁琐的配置文件。我觉得Linux+QT,甚至是Electron更干净一些。或许是android的资料更多吧...