Springboot 整合 Java DL4J 实现安防监控系统
🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
Spring Boot 整合 Java Deeplearning4j 实现安防监控系统
一、引言
在当今社会,安防监控系统的重要性日益凸显。传统的安防监控系统主要依赖人工监控,不仅效率低下,而且容易出现疏漏。随着人工智能技术的发展,智能安防监控系统逐渐成为研究的热点。本文将介绍如何使用 Spring Boot 整合 Java Deeplearning4j 实现一个智能安防监控系统,该系统能够自动检测异常行为,如闯入、打斗等,通过分析监控视频中的图像,及时发现潜在的安全隐患。
二、技术概述
(一)Spring Boot
Spring Boot 是一个用于快速开发 Java 应用程序的框架。它简化了 Java 企业级应用的开发过程,通过自动配置和约定优于配置的原则,使得开发者能够快速构建独立运行的、生产级别的应用程序。
(二)Deeplearning4j
Deeplearning4j 是一个基于 Java 和 Scala 的深度学习开源库。它支持多种深度学习算法,包括卷积神经网络(Convolutional Neural Networks,CNN)、循环神经网络(Recurrent Neural Networks,RNN)等。Deeplearning4j 提供了丰富的 API 和工具,使得开发者能够轻松地构建和训练深度学习模型。
(三)神经网络选择
在本案例中,我们选择使用卷积神经网络(CNN)来实现图像识别。CNN 是一种专门用于处理图像数据的神经网络,它具有以下优点:
- 局部连接:CNN 中的神经元只与输入图像的局部区域相连,这使得 CNN 能够有效地提取图像的局部特征。
- 权值共享:CNN 中的同一层神经元共享相同的权重,这大大减少了模型的参数数量,提高了模型的训练效率。
- 池化层:CNN 中的池化层能够对输入图像进行下采样,减少图像的尺寸,同时保留图像的重要特征。
选择 CNN 的理由如下:
- 对于图像识别任务,CNN 已经被证明是非常有效的。它能够自动学习图像的特征,而不需要人工设计特征提取器。
- Deeplearning4j 对 CNN 的支持非常好,提供了丰富的 API 和工具,使得开发者能够轻松地构建和训练 CNN 模型。
- 在安防监控系统中,需要对实时视频流进行处理,CNN 具有较高的计算效率,能够满足实时性的要求。
三、数据集介绍
(一)数据集格式
我们使用的数据集是一个包含大量监控视频图像的数据集,每张图像都标注了是否存在异常行为。数据集的格式如下:
- 图像文件:数据集包含大量的图像文件,图像文件的格式可以是 JPEG、PNG 等常见的图像格式。
- 标注文件:数据集还包含一个标注文件,标注文件中记录了每张图像的标注信息,包括是否存在异常行为以及异常行为的类型等。
(二)样例表格
以下是一个样例表格,展示了数据集的标注信息:
图像文件名 | 是否存在异常行为 | 异常行为类型 |
---|---|---|
image1.jpg | 否 | 无 |
image2.jpg | 是 | 闯入 |
image3.jpg | 是 | 打斗 |
(三)目录结构
数据集的目录结构如下:
- dataset/
- images/
- image1.jpg
- image2.jpg
-…
- labels.csv
- images/
其中,images
目录下存放了所有的图像文件,labels.csv
是标注文件。
四、技术实现
(一)Maven 依赖
在项目的 pom.xml 文件中,需要添加以下 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>
(二)代码示例
- 数据加载
首先,我们需要加载数据集。以下是一个数据加载的示例代码:
import org.datavec.image.loader.NativeImageLoader;
import org.deeplearning4j.datasets.iterator.impl.ListDataSetIterator;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class DataLoader {public static ListDataSetIterator loadData(String dataDir) {NativeImageLoader loader = new NativeImageLoader(224, 224, 3);File[] files = new File(dataDir).listFiles();List<DataSet> dataSets = new ArrayList<>();for (File file : files) {if (file.isFile() && (file.getName().endsWith(".jpg") || file.getName().endsWith(".png"))) {INDArray image = loader.asMatrix(file);DataNormalization scaler = new ImagePreProcessingScaler(0, 1);scaler.transform(image);// 假设标签从文件名中获取,这里只是一个简单的示例boolean hasAbnormalBehavior = file.getName().contains("abnormal");double[] label = hasAbnormalBehavior? new double[]{1.0} : new double[]{0.0};dataSets.add(new DataSet(image, label));}}return new ListDataSetIterator(dataSets, 32);}
}
- 模型构建
接下来,我们需要构建一个卷积神经网络模型。以下是一个模型构建的示例代码:
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.ConvolutionLayer;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.lossfunctions.LossFunctions;public class ModelBuilder {public static MultiLayerNetwork buildModel() {MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().seed(123).updater(org.deeplearning4j.nn.weights.WeightInit.XAVIER).list().layer(0, new ConvolutionLayer.Builder(5, 5).nIn(3).stride(1, 1).nOut(32).activation(Activation.RELU).build()).layer(1, new ConvolutionLayer.Builder(3, 3).stride(1, 1).nOut(64).activation(Activation.RELU).build()).layer(2, new DenseLayer.Builder().activation(Activation.RELU).nOut(128).build()).layer(3, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).activation(Activation.SOFTMAX).nOut(2).build()).build();return new MultiLayerNetwork(conf);}
}
- 训练模型
然后,我们可以使用加载的数据对模型进行训练。以下是一个训练模型的示例代码:
import org.deeplearning4j.datasets.iterator.impl.ListDataSetIterator;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ModelTrainer {private static final Logger log = LoggerFactory.getLogger(ModelTrainer.class);public static void trainModel(MultiLayerNetwork model, ListDataSetIterator iterator) {model.fit(iterator);log.info("Model training completed.");}
}
- 预测
最后,我们可以使用训练好的模型对新的图像进行预测。以下是一个预测的示例代码:
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;public class Predictor {public static boolean predict(MultiLayerNetwork model, INDArray image) {INDArray output = model.output(image);double[] probabilities = output.getRow(0).toDoubleVector();return probabilities[1] > 0.5;}
}
五、单元测试
我们可以使用 JUnit 对上述代码进行单元测试。以下是一个单元测试的示例代码:
import org.deeplearning4j.datasets.iterator.impl.ListDataSetIterator;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertTrue;public class ModelTest {private MultiLayerNetwork model;private ListDataSetIterator iterator;@BeforeEachpublic void setUp() {model = ModelBuilder.buildModel();iterator = DataLoader.loadData("path/to/dataset");}@Testpublic void testModelTraining() {ModelTrainer.trainModel(model, iterator);assertTrue(true);}@Testpublic void testPrediction() {// 加载一个测试图像INDArray image = Nd4j.create(new float[]{0.5f, 0.5f, 0.5f}, new int[]{1, 3, 224, 224});boolean hasAbnormalBehavior = Predictor.predict(model, image);assertTrue(true);}
}
预期输出:
- 单元测试应该通过,没有错误或异常。
- 在测试预测时,输出应该是一个布尔值,表示图像中是否存在异常行为。
六、总结
本文介绍了如何使用 Spring Boot 整合 Java Deeplearning4j 实现一个智能安防监控系统。我们选择了卷积神经网络(CNN)来实现图像识别,并介绍了数据集的格式和加载方法,以及模型的构建、训练和预测过程。通过单元测试,我们验证了代码的正确性。在实际应用中,可以将该系统部署到服务器上,实时监控视频流,及时发现潜在的安全隐患。
七、参考资料
- Spring Boot 官方文档
- Deeplearning4j 官方文档
- 卷积神经网络介绍
相关文章:

Springboot 整合 Java DL4J 实现安防监控系统
🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…...

【数据结构与算法】第1课—算法复杂度
文章目录 1. 数据结构2. 算法3. 算法效率4. 算法复杂度5. 算法时间复杂度5.1 大O的渐进表示法5.2 时间复杂度示例 6. 空间复杂度6.1 练习16.2 练习26.3 练习3 1. 数据结构 数据结构是计算机存储、组织数据的方式,指相互之间存在一种和多种特定关系的数据元素的集合&…...
利用高德API获取整个城市的公交路线并可视化(五)
如果说我比别人看得更远些,那是因为我站在了巨人的肩上。——牛顿 参考:使用高德API获取公交线路数据,无需代码_实时公交api-CSDN博客 记录于2024年10月,因数据获取受网站更新策略等影响可能会失效,故记录写作时间,同时拾人牙慧,优化了后半部分数据直接导出为csv和shp…...
DNS:互联网域名系统的核心
什么是 DNS? DNS(Domain Name System,域名系统)是互联网的一项基础服务,它负责将人类容易记忆的域名(如 www.example.com)转换成计算机可以识别的 IP 地址(如 192.0.2.1)…...

小猿口算炸鱼脚本
目录 写在前面: 一、关于小猿口算: 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享: 补充:软件包下载 写在前面: 最近小猿口算已经被不少大学生攻占,小学生直呼有挂。原本是以为大学生都打着本…...

浅谈云原生--微服务、CICD、Serverless、服务网格
往期推荐 浅学React和JSX-CSDN博客 一文搞懂大数据流式计算引擎Flink【万字详解,史上最全】-CSDN博客 一文入门大数据准流式计算引擎Spark【万字详解,全网最新】_大数据 spark-CSDN博客 目录 1. 云原生概念和特点 2. 常见云模式 3. 云对外提供服务的…...

android app执行shell命令视频课程补充android 10/11适配-千里马android
(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi,有学员在学习跨进程通信专题课程时候,在实战app执行一个shell命令的项目时候,对课程本身的android …...

C++笔记-UTF8和UTF8-dom的区别
在文件格式上,UTF-8 和 UTF-8-BOM 是两种不同的编码方式,其中 UTF-8-BOM 包含字节顺序标记(BOM),而 UTF-8 则不包含。 UTF-8: UTF-8 是一种以字节为单位的可变长度字符编码,常用于以字节为单位…...

“探索Adobe Photoshop 2024:订阅方案、成本效益分析及在线替代品“
设计师们对Adobe Photoshop这款业界领先的图像编辑软件肯定不会陌生。如果你正考虑加入Photoshop的用户行列,可能会对其价格感到好奇。Photoshop的价值在于其强大的功能,而它的价格也反映了这一点。下面,我们就来详细了解一下Adobe Photoshop…...

网页复制粘贴助手,Chrome网页复制插件(谷歌浏览器复制插件)
一款解决网页限制复制问题的插件,当你遇到限制复制粘贴和右键的网页是不是很头痛?安装这个插件后,点下插件按钮就能解决了 碰到这种情况 也是非常头疼 chrome拓展-chrome插件-强制复制 当我们浏览网页的时候,看到感兴趣的内容就…...
【C++刷题】力扣-#118-杨辉三角
题目描述 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它正上方两个数的和。 示例 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]]题解 这个问题…...

Linux下的环境变量
目录 1.引言 1.1bash的部分工作 1.2main函数也有参数 1.3我们可以通过给main函数传入不同的参数,让同一份代码实现不同的功能 1.4先认识一个环境变量PATH,帮助Linux找到指令程序的地址 2.环境变量 2.1环境变量的概念 2.2见见其他的环境变量 2…...

Edge论文的创新点
创新点及其来源 1. 从灰度边缘重建RGB图像的方法(EdgRec) 基于的方法:传统的重建方法,如使用自动编码器或生成模型来重建正常样本的图像,并通过对原始图像和重建图像的比较来检测异常。 重建过程: 训练阶…...

ComfyUI 高级实战:实现华为手机的AI消除功能
大家好,我是每天分享AI应用的萤火君! 不知道大家是否还记得华为 Pura 70的「AI消除」事件,当时使用 华为Pura 70 系列手机的智能消除功能时,该功能可以被用来消除照片中女性胸口处的衣物,这一功能曾引发广泛的关注和伦…...

我记得我曾喜欢过冬天
写在前面 1316 字 | 感触 | 世界 | 情感 | 体验 | 经历 | 想法 | 认知 正文 晚上出门,起电单车,很冷。冻得有些发抖。下车,我第一时间和珍发了消息。 我说,居然在四川感受到了哈尔滨的温度。 哈尔滨的夏天很热,但哈尔…...

最新夜间数据集发布LoLI-Street: 33000帧数据,涵盖19000个目标
最新夜间数据集发布LoLI-Street: 33000帧数据,涵盖19000个目标 Abstract 低光照图像增强(LLIE)对于许多计算机视觉任务至关重要,包括目标检测、跟踪、分割和场景理解。尽管已有大量研究致力于提高在低光照条件下捕捉的低质量图像…...

反向传播算法与随机搜索算法的比较
反向传播算法与随机搜索算法的比较 在这篇文章中,我们将通过一个简单的线性回归问题来比较反向传播算法和随机搜索算法的性能。我们将使用Python代码来实现这两种算法,并可视化它们的梯度下降过程。 反向传播算法 反向传播算法是深度学习和神经网络训…...

【PDF文件】默认被某种软件打开,如何进行修改?
当有时下载某种软件后,电脑中的PDF文件就默认由该种软件打开,每次需要右键选择打开方式才能选择需要的其他软件打开。如下图所示。 修改方法: (1)点击电脑的“设置”,选择应用 (2)…...

Kaggle Python练习:字符串和字典(Exercise: Strings and Dictionaries)
文章目录 问题:搜索特定单词并定位思路代码实现官方代码代码解析 更进一步 问题:搜索特定单词并定位 一位研究人员收集了数千篇新闻文章。但她想将注意力集中在包含特定单词的文章上。完成以下功能以帮助她过滤文章列表。 您的函数应满足以下条件&…...

React(四) 事件总线,setState的原理,PureComponent优化React性能,ref获取类组件与函数组件
文章目录 一、全局事件总线二、setState的原理1. 为什么要使用setState修改数据2. setState的三种用法(1) 基本使用(2) 传入回调函数(3) setState是一个异步调用 3. setState为什么要设置成异步 二、PureComponent优化性能1. React的diff算法以及Key的优化(扩展)(1) diff算法(2…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...