java深度学习人脸检测、特征提取、人脸对比
网上几乎没有关于java使用深度学习的人脸识别完整的源码,这个是我进半年来自己摸索出来的,现在开源出来,希望对喜欢人脸识别的java社区有帮助。
人脸识别分为以下3步骤完成:
3.根据2得出的向量数组输入分类网络,输出分类最相似的结果:lab和相似度。
本人已经完全封装好了,可直接运行测试代码调用海康等摄像头或者本地usb摄像头进行人脸识别,笨例子运行的是调用本地的usb摄像头进行试验。
项目源码:
项目是标准的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,精度还是非常好的,我应用在实际项目中效果都不错,即使摄像头挂在墙上也能准确识别出来是我。
上一篇:
IDEA上Java项目控制台中文乱码