网上几乎没有关于java使用深度学习的人脸识别完整的源码,这个是我进半年来自己摸索出来的,现在开源出来,希望对喜欢人脸识别的java社区有帮助。

人脸识别分为以下3步骤完成:

1.人脸定位,也叫人脸检测,就是在一张图片中去定位人脸区域,并截图人脸照片。

2.根据步骤1得到的人脸截图输入模型,提取特征,得出一个512维度的特征向量数组。

3.根据2得出的向量数组输入分类网络,输出分类最相似的结果:lab和相似度。

本人已经完全封装好了,可直接运行测试代码调用海康等摄像头或者本地usb摄像头进行人脸识别,笨例子运行的是调用本地的usb摄像头进行试验。

项目源码:jdeep-learning: java深度学习:人脸识别、安全帽、防护服、车牌检测、抽烟、火苗等

项目是标准的maven工程,直接导入到您的开发工具,如eclipse。

打开cn.jiming.jdlearning.test.face.FaceMain.java,如图:

java人脸识别技术 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或者内嵌有摄像头。

运行结果:

java人脸识别技术 java人脸识别算法_人脸识别_02

说明:从结果上来看已经分类出来是“xiaoming” 相似度最好的是0.973,精度还是非常好的,我应用在实际项目中效果都不错,即使摄像头挂在墙上也能准确识别出来是我。

好了这一篇先介绍到这里把,下一篇再讲解怎么自己采集自己的人脸用于训练FaceNet网络。。。