基于近红外与可见光双目摄像头的活体人脸检测原理
人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印的人脸图、电子设备屏幕中的人脸数字图像及面具等。这些攻击手段若得逞,将对金融安全、门禁管理等造成严重威胁。
基于近红外与可见光双目摄像头的活体人脸检测利用红外摄像头下视频和大部分纸张不能呈现图像的特性,有效的防止了视频中伪造人脸的攻击;同时利用近红外摄像头和可见光摄像头下真实人脸与照片人脸纹理差异和颜色差异,可以有效地区分人脸是来自真实人脸还是照片中的伪造人脸。

Android实现双目红外活体检测
首先建议使用上图1 的USB 双目摄像头,能支持双头Type-C 接口UVC协议的,现在的手机平板大部分都是TypeC 接口了,千万别整公头USB口,需要特定的开发板才能开发调试。
然后 打通UVC协议摄像头预览,能正常预览才能取数据进行AI分析人脸识别等,目前Android 平台的UVC协议摄像头库最有名的就是日本大神的 saki4510t/UVCCamera,但是很久不维护了,文章最后的源码会集成到Demo 中
最后 就可以拿双目摄像头中的RGB和IR 图像进行活体检测人脸识别了。
/**
* 初始化IR 摄像头
*
*/
private void initIRCamara() {
irCameraManager.initCameraHelper();
irCameraManager.setOpeningMultiCamera(true);
irCameraManager.setCameraView(binding.irCameraTextureView,true);
irCameraManager.selectUsbCamera(UsbCameraEnum.IR);
irCameraManager.setOnDeviceStatuesCallBack(new UsbCameraManager.OnDeviceStatuesCallBack() {
@Override
public void onAttach(UsbDevice device) {
}
@Override
public void onDeviceOpen(UsbDevice device, boolean isFirstOpen) {
}
});
irCameraManager.setPreviewHeight(PREVIEW_HEIGHT);
irCameraManager.setFrameCallback(frame -> {
Size currentPreviewSize = irCameraManager.getCurrentPreviewSize();
int width = PREVIEW_WIDTH;
int height = PREVIEW_HEIGHT;
if (currentPreviewSize != null) {
width = currentPreviewSize.width;
height = currentPreviewSize.height;
}
Bitmap bitmap = DataConvertUtils.NV21Data2Bitmap(frame, width, height, 0, 0, false);
if (bitmap != null) {
faceVerifySetBitmap(bitmap, FaceVerifyUtils.BitmapType.IR);
}
}, UVCCamera.PIXEL_FORMAT_NV21);
}
初始化RGB和IR 数据后把数据转为Bitmap 后送入引擎开始人脸识别,双目活体检测了
faceVerifyUtils.goVerifyWithIR(irBitmap, rgbBitmap);
注意事项
- 目前的USB双目摄像头的带宽普遍不足,但好在人脸识别,双目活体检测不需要太高分辨率,1280*720 足够了
- 需要宽动态抗逆光摄像头,调试的时候经常经常用手触摸镜头需要保持镜头整洁
- 确保两个摄像头都正常稳定同步的输出了影像画面
演示接入代码Demo 和体验App 下载
上述的UVC 协议摄像头管理已经放在工程目了libs 下面了打包成了AAR 文件,整个项目代码GitHub 搜索AnyLifeZLB/FaceVerificationSDK
或者点击: <https://github.com/AnyLifeZLB/FaceVerificationSDK>
手上有双目摄像头的连接设备可以立马体验效果
