网上几乎没有关于java使用深度学习的人脸识别完整的源码,这个是我进半年来自己摸索出来的,现在开源出来,希望对喜欢人脸识别的java社区有帮助。
人脸识别分为以下3步骤完成:
1.人脸定位,也叫人脸检测,就是在一张图片中去定位人脸区域,并截图人脸照片。
2.根据步骤1得到的人脸截图输入模型,提取特征,得出一个512维度的特征向量数组。
3.根据2得出的向量数组输入分类网络,输出分类最相似的结果:lab和相似度。
本人已经完全封装好了,可直接运行测试代码调用海康等摄像头或者本地usb摄像头进行人脸识别,笨例子运行的是调用本地的usb摄像头进行试验。
项目源码:jdeep-learning: java深度学习:人脸识别、安全帽、防护服、车牌检测、抽烟、火苗等
项目是标准的maven工程,直接导入到您的开发工具,如eclipse。
打开cn.jiming.jdlearning.test.face.FaceMain.java,如图:
FaceMain.Java 核心源码:
@Test
public void test() throws Exception {
FaceNet faceNet = FaceNet.load("models/face_net.xm");
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
grabber.start(); //开始获取摄像头数据
CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setAlwaysOnTop(true);
while(true){
if(!canvas.isDisplayable()){//窗口是否关闭
grabber.stop();//停止抓取
System.exit(2);//退出
break;
}
Frame frame = grabber.grabFrame();
// 将Frame转为Mat
Mat mat = converter.convertToMat(frame);
//mat转换imag
BufferedImage bimg = Java2DFrameUtils.toBufferedImage(mat);
//转DJL img
Image img = ImageFactory.getInstance().fromImage(bimg);
//人脸定位
List<Image> faces = RetinaFaceDetection.faceDetection(img, true, mat);//RetinaFace
// List<Image> faces = FaceDetection.detection(mat);//moble net
//特征提取
if(faces != null && faces.size() > 0) {
for(Image face:faces) {
float[] f = FeatureExtraction.faceFeatureExtraction(face);
if(f != null) {
//lab推理
MaxLab maxLab = faceNet.predict(f);
System.out.println("lab=" + maxLab.maxLab + " 相似度=" + maxLab.maxSimilar);
}
}
}
//Image转Frame
BufferedImage bi = (BufferedImage)img.getWrappedImage();
Frame convertFrame1 = Java2DFrameUtils.toFrame(bi);
// Frame convertFrame1 = Java2DFrameUtils.toFrame(mat);
canvas.showImage(convertFrame1);//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
mat.release();
}
运行该@Test单元测试即可,注意前提是您电脑必须有usb或者内嵌有摄像头。
运行结果:
说明:从结果上来看已经分类出来是“xiaoming” 相似度最好的是0.973,精度还是非常好的,我应用在实际项目中效果都不错,即使摄像头挂在墙上也能准确识别出来是我。
好了这一篇先介绍到这里把,下一篇再讲解怎么自己采集自己的人脸用于训练FaceNet网络。。。