Springboot 整合 Java DL4J 实现企业门禁人脸识别系统

news2024/11/27 4:21:23

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。

在这里插入图片描述


在这里插入图片描述

Spring Boot 整合 Deeplearning4j 实现企业门禁人脸识别系统

一、引言

在当今数字化时代,企业对于安全性和效率的要求越来越高。传统的门禁系统如钥匙、密码等存在易丢失易被破解等问题。而人脸识别技术作为一种非接触式高效准确的身份验证方式,正逐渐成为企业门禁系统的首选。本文将详细介绍如何使用 Spring Boot 整合 Java Deeplearning4j 实现一个企业门禁人脸识别系统,通过识别员工面部特征实现快速身份验证,提高安全性通行效率

二、神经网络选择

本案例中我们选择使用卷积神经网络(Convolutional Neural NetworkCNN)来实现人脸识别。CNN 是一种专门用于处理图像数据的神经网络,具有以下优点:

  • 能够自动提取图像的特征,减少了人工特征提取的工作量。
  • 对图像的平移、旋转、缩放等具有一定的不变性,提高了识别的准确性。
  • 可以处理大规模的图像数据,适用于企业门禁系统中可能出现的大量员工面部图像。

选择理由

  • 人脸识别是一个复杂的任务,需要对图像中的面部特征进行准确的提取和识别。CNN 能够自动学习图像的特征,并且在图像识别领域取得了非常好的效果。
  • 企业门禁系统需要快速准确地识别员工的面部特征,以提高通行效率。CNN 可以在较短的时间内对图像进行处理,满足企业门禁系统的实时性要求。
  • 随着深度学习技术的不断发展,CNN 的性能不断提高,并且有很多成熟的开源框架和工具可以使用,如 Deeplearning4j,使得开发人脸识别系统变得更加容易。

三、数据集格式

  1. 数据集来源:我们可以使用公开的人脸识别数据集,如 Labeled Faces in the Wild(LFW)数据集,也可以自己收集企业员工的面部图像构建数据集。
  2. 数据集格式:数据集通常以图像文件的形式存储,每个图像文件对应一个员工的面部图像。图像文件可以是 JPEG、PNG 等常见的图像格式。为了方便管理和使用数据集,我们可以将图像文件按照员工的编号或姓名进行命名,并将其存储在一个特定的目录中。例如,我们可以创建一个名为“dataset”的目录,然后在该目录下创建多个子目录,每个子目录对应一个员工,子目录中的图像文件即为该员工的面部图像。
  3. 数据集表格示例
员工编号员工姓名图像文件路径
001张三dataset/001/face1.jpg
001张三dataset/001/face2.jpg
002李四dataset/002/face1.jpg
002李四dataset/002/face2.jpg

四、技术介绍

  1. Spring BootSpring Boot 是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的开发过程,使得开发者可以更加专注于业务逻辑的实现。在本案例中,我们使用 Spring Boot 来构建企业门禁系统的后端服务,实现人脸识别的业务逻辑。
  2. Deeplearning4jDeeplearning4j 是一个基于 Java 的深度学习框架,它支持多种神经网络模型,如 CNN、循环神经网络(Recurrent Neural NetworkRNN)等。在本案例中,我们使用 Deeplearning4j 来训练和部署人脸识别模型。
  3. 图像预处理:在进行人脸识别之前,我们需要对图像进行预处理,包括图像的缩放、裁剪、归一化等操作,以提高模型的识别准确性。
  4. 模型训练:使用 Deeplearning4j 提供的 API,我们可以构建和训练人脸识别模型。在训练过程中,我们需要将数据集分为训练集和测试集,使用训练集对模型进行训练,使用测试集对模型的性能进行评估。
  5. 模型部署:训练好的模型可以部署到企业门禁系统中,实现人脸识别的功能。在部署过程中,我们需要将模型转换为适合在生产环境中运行的格式,并使用 Spring Boot 提供的 RESTful API 将模型暴露给前端应用。

五、相关Maven 依赖

在使用 Spring Boot 整合 Deeplearning4j 实现企业门禁人脸识别系统时,我们需要添加以下 Maven 依赖:

<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-core</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-nn</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
<dependency>
    <groupId>org.deeplearning4j</groupId>
    <artifactId>deeplearning4j-ui</artifactId>
    <version>1.0.0-beta7</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

六、代码示例

6.1 图像预处理

import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.nn.modelimport.keras.KerasModelImport;
import org.deeplearning4j.nn.transferlearning.FineTuneConfiguration;
import org.deeplearning4j.nn.transferlearning.TransferLearning;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImagePreprocessor {

    private static final Logger logger = LoggerFactory.getLogger(ImagePreprocessor.class);

    public static double[] preprocessImage(String imagePath) {
        try {
            BufferedImage image = ImageIO.read(new File(imagePath));
            int width = 224;
            int height = 224;
            BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            resizedImage.getGraphics().drawImage(image, 0, 0, width, height, null);

            double[] pixels = new double[width * height * 3];
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    int argb = resizedImage.getRGB(x, y);
                    int r = (argb >> 16) & 0xff;
                    int g = (argb >> 8) & 0xff;
                    int b = argb & 0xff;
                    pixels[y * width * 3 + x * 3] = r / 255.0;
                    pixels[y * width * 3 + x * 3 + 1] = g / 255.0;
                    pixels[y * width * 3 + x * 3 + 2] = b / 255.0;
                }
            }

            DataNormalization scaler = new ImagePreProcessingScaler(0, 1);
            scaler.transform(Nd4j.create(pixels));
            return pixels;
        } catch (IOException e) {
            logger.error("Error preprocessing image: {}", e.getMessage());
            return null;
        }
    }
}

这段代码实现了对图像的预处理功能,包括图像的缩放、归一化等操作。首先,我们使用ImageIO读取图像文件,并将其缩放到指定的大小。然后,我们将图像的像素值转换为double类型,并进行归一化处理,使得像素值在 0 到 1 之间。

6.2 模型训练

import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.nn.modelimport.keras.KerasModelImport;
import org.deeplearning4j.nn.transferlearning.FineTuneConfiguration;
import org.deeplearning4j.nn.transferlearning.TransferLearning;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FaceRecognitionTrainer {

    private static final Logger logger = LoggerFactory.getLogger(FaceRecognitionTrainer.class);

    public static ComputationGraph trainModel(String datasetPath, int numClasses) {
        try {
            // 加载预训练的 VGG16 模型
            ZooModel zooModel = VGG16.builder().build();
            ComputationGraph vgg16 = (ComputationGraph) zooModel.initPretrained();

            // 设置微调配置
            FineTuneConfiguration fineTuneConf = new FineTuneConfiguration.Builder()
                   .updater("sgd")
                   .learningRate(0.001)
                   .seed(123)
                   .build();

            // 进行迁移学习
            ComputationGraph model = new TransferLearning.GraphBuilder(vgg16)
                   .fineTuneConfiguration(fineTuneConf)
                   .setFeatureExtractor("fc2")
                   .removeVertexKeepConnections("predictions")
                   .addLayer("predictions",
                            org.deeplearning4j.nn.conf.layers.OutputLayer.builder()
                                   .nIn(4096)
                                   .nOut(numClasses)
                                   .activation("softmax")
                                   .build())
                   .build();

            // 加载数据集
            List<double[]> images = new ArrayList<>();
            List<Integer> labels = new ArrayList<>();
            File datasetDir = new File(datasetPath);
            for (File employeeDir : datasetDir.listFiles()) {
                int label = Integer.parseInt(employeeDir.getName());
                for (File imageFile : employeeDir.listFiles()) {
                    double[] pixels = ImagePreprocessor.preprocessImage(imageFile.getAbsolutePath());
                    if (pixels!= null) {
                        images.add(pixels);
                        labels.add(label);
                    }
                }
            }

            // 创建数据集迭代器
            DataSetIterator iterator = new FaceRecognitionDataSetIterator(images, labels);

            // 训练模型
            model.fit(iterator);

            return model;
        } catch (Exception e) {
            logger.error("Error training model: {}", e.getMessage());
            return null;
        }
    }
}

这段代码实现了对人脸识别模型的训练功能。首先,我们加载预训练的 VGG16 模型,并设置微调配置。然后,我们使用迁移学习的方法,将预训练的模型进行微调,以适应人脸识别的任务。接着,我们加载数据集,并创建数据集迭代器。最后,我们使用迭代器对模型进行训练。

6.3 模型部署

import org.deeplearning4j.nn.graph.ComputationGraph;
import org.deeplearning4j.zoo.ZooModel;
import org.deeplearning4j.zoo.model.VGG16;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.factory.Nd4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@SpringBootApplication
@RestController
public class FaceRecognitionApplication {

    private static final Logger logger = LoggerFactory.getLogger(FaceRecognitionApplication.class);

    private ComputationGraph model;

    public static void main(String[] args) {
        SpringApplication.run(FaceRecognitionApplication.class, args);
    }

    @PostMapping("/recognize")
    public ResponseEntity<String> recognizeFace(@RequestParam("image") MultipartFile imageFile) {
        try {
            // 加载模型(如果尚未加载)
            if (model == null) {
                model = FaceRecognitionTrainer.trainModel("dataset", 10);
            }

            // 保存上传的图像文件
            File tempFile = File.createTempFile("temp", ".jpg");
            imageFile.transferTo(tempFile);

            // 预处理图像
            double[] pixels = ImagePreprocessor.preprocessImage(tempFile.getAbsolutePath());

            // 进行人脸识别
            int prediction = predictFace(pixels);

            // 返回识别结果
            return new ResponseEntity<>("Recognized face as employee " + prediction, HttpStatus.OK);
        } catch (IOException e) {
            logger.error("Error recognizing face: {}", e.getMessage());
            return new ResponseEntity<>("Error recognizing face", HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    private int predictFace(double[] pixels) {
        double[] output = model.outputSingle(pixels);
        int prediction = Nd4j.argMax(output).getInt(0);
        return prediction;
    }
}

这段代码实现了将训练好的人脸识别模型部署为一个 RESTful API 的功能。我们使用 Spring Boot 构建了一个后端服务,并在服务中加载训练好的模型。当接收到前端应用上传的图像文件时,我们对图像进行预处理,并使用模型进行人脸识别。最后,我们将识别结果返回给前端应用。

七、单元测试

7.1 图像预处理测试

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class ImagePreprocessorTest {

    @Test
    public void testPreprocessImage() {
        double[] pixels = ImagePreprocessor.preprocessImage("test.jpg");
        assertNotNull(pixels);
    }
}

这段代码对图像预处理功能进行了单元测试。我们使用一个测试图像文件,并调用ImagePreprocessor.preprocessImage方法对图像进行预处理。然后,我们检查返回的像素数组是否不为空。

7.2 模型训练测试

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class FaceRecognitionTrainerTest {

    @Test
    public void testTrainModel() {
        ComputationGraph model = FaceRecognitionTrainer.trainModel("dataset", 10);
        assertNotNull(model);
    }
}

这段代码对模型训练功能进行了单元测试。我们使用一个测试数据集,并调用FaceRecognitionTrainer.trainModel方法对模型进行训练。然后,我们检查返回的模型是否不为空。

7.3 模型部署测试

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import java.io.FileInputStream;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class FaceRecognitionApplicationTest {

    @Test
    public void testRecognizeFace() throws IOException {
        FaceRecognitionApplication application = new FaceRecognitionApplication();
        FileInputStream fis = new FileInputStream("test.jpg");
        MockMultipartFile imageFile = new MockMultipartFile("image", "test.jpg", "image/jpeg", fis);
        ResponseEntity<String> response = application.recognizeFace(imageFile);
        assertEquals(HttpStatus.OK, response.getStatusCode());
    }
}

这段代码对模型部署功能进行了单元测试。我们使用一个测试图像文件,并模拟前端应用上传图像文件的请求。然后,我们检查返回的响应状态码是否为 200(OK)

八、预期输出

  1. 图像预处理:经过图像预处理后,图像的像素值应该在 0 到 1 之间,并且图像的大小应该符合模型的输入要求。
  2. 模型训练:在模型训练过程中,我们可以观察到模型的损失函数和准确率的变化情况。随着训练的进行,损失函数应该逐渐减小,准确率应该逐渐提高。
  3. 模型部署:当我们上传一张员工的面部图像时,后端服务应该能够快速准确地识别出该员工的身份,并返回相应的识别结果。

九、参考资料文献

  1. Deeplearning4j 官方文档
  2. Spring Boot 官方文档
  3. 卷积神经网络介绍
  4. 人脸识别技术介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系列-常见的指令(二)

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” mv 剪切文件&#xff0c;目录 重命名 比如说&#xff0c;我们在最开始创建一个新的文件hello.txt 然后我们将这个文件改一个名字&#xff0c;改成world.txt 所以&#xff0c;…

C++ 算法学习——1.8 快速幂算法

背景知识&#xff1a; 1.位运算 在C中&#xff0c;位运算是对整数类型的位进行操作的一种运算方式。常见的位运算符包括按位与&#xff08;&&#xff09;、按位或&#xff08;|&#xff09;、按位异或&#xff08;^&#xff09;、取反&#xff08;~&#xff09;、左移&am…

Unity MVC框架1-2 实战分析

该课程资源来源于唐老狮&#xff0c;吃水不忘打井人&#xff0c;不胜感激 Unity MVC框架演示 1-1 理论分析-CSDN博客 首先你需要知道什么mvc框架&#xff0c;并且对三个层级有个比较清晰的认识&#xff0c;当然不清楚也好&#xff0c;下面例子中将会十分细心地让你理解&#x…

“CFD+水务”,积鼎通用流体仿真软件VirtualFlow助力水处理能力提升

在快速发展的现代社会中&#xff0c;水务行业作为城市基础设施的重要组成部分&#xff0c;其高效、安全、可持续的运营直接关系到民众的生活质量与城市的健康发展。随着科技的进步&#xff0c;CFD技术正逐步渗透到水务行业的各个角落&#xff0c;以其独特的模拟预测能力&#x…

软件测试学习笔记丨质量门禁 - SonarQube

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32486 一&#xff0c;质量门禁概念 质量门禁是为了控制达标率的检查任务设置质量门禁的好处 通过检查达标状态来评估产品质量&#xff0c;控制产品发布利用自动化任务来控制产品的代码质量&a…

构建高效互通的数字桥梁:香港服务器托管指南

在当今全球化日益加深的商业环境中&#xff0c;出海企业面临着前所未有的机遇与挑战。为了确保国内外业务的顺畅运行&#xff0c;特别是在实现国内外数据高效互通、低延迟访问方面&#xff0c;选择一家合适的香港服务器机房进行托管成为了许多企业的关键决策之一。香港&#xf…

科研绘图系列:R语言蝴蝶图(Butterfly Chart)

文章目录 介绍加载R包数据函数画图系统信息介绍 蝴蝶图(Butterfly Chart),也被称为龙卷风图(Tornado Chart)或双轴图(Dual-Axis Chart),是一种用于展示两组对比数据的图表。这种图表通过在中心轴两侧分别展示两组数据的条形图,形似蝴蝶的翅膀,因此得名。蝴蝶图的特点…

ORM 框架 查询相关函数

1、Ubuntu 实时查看 Mysql 数据库日志 sudo tail -f /var/log/mysql/mysql.log2、Django 的 ORM 3、查询相关函数 4、get filter exclude 方法可以增加条件 &#xff08;1&#xff09;条件格式&#xff1a; 模型类属性名__条件值值 &#xff08;2&#xff09;示例代码 # 在…

Spark优化-缓存和checkpoint

目录 缓存使用 checkpoint使用 两者的区别 如下图,如果不适用缓存,rdd3的数据需要经过两次计算,而每次计算也是在内存中计算,很消耗内存,而使用了缓存,可以直接从缓存中直接获取数据,不需要每次对rdd2进行计算 缓存和checkpoint也叫作rdd的持久化&#xff0c;将rdd的数据存储…

快速总结ACmix

ACMix&#xff1a;On the Integration of Self-Attention and Convolution 卷积和自注意力模块通常遵循不同的设计范式&#xff1a; 传统卷积根据卷积滤波器权重利用局部感受野上的聚合函数&#xff0c;这些权重在整个特征图中共享。 内在特性对图像处理施加了至关重要的归纳…

Linux入门:进程状态与优先级

文章目录 一. OS进程状态1.1 一般分类1.2 运行状态1.3 阻塞状态1.4 挂起状态1.5 并行与并发 二. Linux进程状态2.1 分类2.1.1 R状态2.1.2 S状态2.1.3 D状态2.1.4 T状态与t状态2.1.6 X状态 2.2 僵尸状态&#xff08;Z&#xff09;2.2.1 概念2.2.2 查看状态 三. 进程的优先级3.1 …

6N137S1取反电路图

文章目录 一、前言二、6N137S1性能介绍三、应用电路图 一、前言 在硬件电路设计中需要用到隔离电路&#xff0c;但此引脚输出为WS2812的信号&#xff0c;频率有840khz&#xff0c;所以需要使用逻辑光耦&#xff0c;选用6N137S1光耦&#xff0c;速率能达到10Mhz&#xff0c;能满…

Python+Flask接口判断身份证省份、生日、性别、有效性验证+docker部署+Nginx代理运行

这里写目录标题 一、接口样式二、部署流程2.1 镜像打包2.1.1 准备工作2.1.2 build打包2.1.3 dokcer部署运行2.1.4 Nginx代理 三、代码及文件3.1 index.py3.2 areaCodes.json3.3 Dockerfile 一、接口样式 https://blog.henryplus.cn/idcardApi/idCard/query?idcard{idcard} 二、…

anatraf网络性能监控与故障排除

目录 网络性能监控的必要性 1. 提前预警问题 2. 快速响应与故障排除 网络故障排除的常见场景 1. 带宽不足导致的网络卡顿 2. IP冲突引发的网络中断 3. 网络设备故障 结语 随着现代企业对网络依赖性的日益增强&#xff0c;网络性能监控&#xff08;Network Performance …

进口磁力仪G882SX和原装G882究竟有什么区别?

Geometrics公司的铯光泵磁力仪G882有两个型号&#xff1a;一个是出口型号G882SX&#xff0c;另一个是原装型号G882&#xff0c;出口型号的噪声水平比原装型号高一个量级。国内搞磁力仪的专业人士认为进口型号故意加了噪声。 ​ 在之前的博文《如何利用matlab对G882数据进行频谱…

SpringCloud Alibaba-01 入门简介

1.Spring Cloud Alibaba 是由阿里巴巴结合自身丰富的微服务实践而推出的微服务开发的一站式解决方案。它是 Spring Cloud 生态中的第二代实现&#xff0c;提供了包括服务注册与发现、分布式配置管理、服务限流降级、消息驱动能力、阿里云对象存储、分布式任务调度等在内的多种功…

打开cad自动新建一个图纸

命令栏输入&#xff1a;startmode,改为0 即为自动打开cad新建一个图纸。 改为2&#xff0c;即不会新建图纸。

高效录制 PPT 秘籍:四款卓越录屏软件深度解析

一、引言 在现代工作、学习与知识传播的多元场景中&#xff0c;PPT 已然成为不可或缺的信息载体。将 PPT 内容录制下来&#xff0c;其用途广泛&#xff0c;从教师精心打造线上教学课件&#xff0c;到职场精英分享项目方案&#xff0c;再到培训师筹备培训素材等。而获取优质的 P…

来电无通话界面问题分析

1、问题描述 场测反馈&#xff0c;无法接到电话&#xff0c;被叫失败。 2、Log分析 从Modem log看&#xff0c;空口确实有上报到有相关通话信息 排查AT相关Log&#xff0c;确实有上报AT< EAIC相关命令 查看相关AT指令 /* * EAIC: <call_id>,<number>,<type…

Centos 7.9NFS搭建

原创作者&#xff1a;运维工程师 谢晋 Centos 7.9NFS搭建 NFS服务端安装客户机访问共享配置 NFS服务端安装 SSH连接系统登录到服务端安装nfs服务 # yum -y install nfs-utils2. 安装完成后&#xff0c;查看需要共享的目录&#xff0c;这边共享的是/home目录&#xff0c;如…