Springboot 整合 Java DL4J 实现企业门禁人脸识别系统
🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
Spring Boot 整合 Deeplearning4j 实现企业门禁人脸识别系统
一、引言
在当今数字化时代,企业对于安全性和效率的要求越来越高。传统的门禁系统如钥匙、密码等存在易丢失、易被破解等问题。而人脸识别技术作为一种非接触式、高效、准确的身份验证方式,正逐渐成为企业门禁系统的首选。本文将详细介绍如何使用 Spring Boot
整合 Java Deeplearning4j
实现一个企业门禁人脸识别系统,通过识别员工面部特征实现快速身份验证,提高安全性和通行效率。
二、神经网络选择
本案例中我们选择使用卷积神经网络(Convolutional Neural Network
,CNN
)来实现人脸识别。CNN
是一种专门用于处理图像数据的神经网络,具有以下优点:
- 能够自动提取图像的特征,减少了人工特征提取的工作量。
- 对图像的平移、旋转、缩放等具有一定的不变性,提高了识别的准确性。
- 可以处理大规模的图像数据,适用于企业门禁系统中可能出现的大量员工面部图像。
选择理由:
- 人脸识别是一个复杂的任务,需要对图像中的面部特征进行准确的提取和识别。
CNN
能够自动学习图像的特征,并且在图像识别领域取得了非常好的效果。 - 企业门禁系统需要快速准确地识别员工的面部特征,以提高通行效率。
CNN
可以在较短的时间内对图像进行处理,满足企业门禁系统的实时性要求。 - 随着深度学习技术的不断发展,
CNN
的性能不断提高,并且有很多成熟的开源框架和工具可以使用,如Deeplearning4j
,使得开发人脸识别系统变得更加容易。
三、数据集格式
- 数据集来源:我们可以使用公开的人脸识别数据集,如
Labeled Faces in the Wild(LFW)
数据集,也可以自己收集企业员工的面部图像构建数据集。 - 数据集格式:数据集通常以图像文件的形式存储,每个图像文件对应一个员工的面部图像。图像文件可以是 JPEG、PNG 等常见的图像格式。为了方便管理和使用数据集,我们可以将图像文件按照员工的编号或姓名进行命名,并将其存储在一个特定的目录中。例如,我们可以创建一个名为“
dataset
”的目录,然后在该目录下创建多个子目录,每个子目录对应一个员工,子目录中的图像文件即为该员工的面部图像。 - 数据集表格示例:
员工编号 | 员工姓名 | 图像文件路径 |
---|---|---|
001 | 张三 | dataset/001/face1.jpg |
001 | 张三 | dataset/001/face2.jpg |
002 | 李四 | dataset/002/face1.jpg |
002 | 李四 | dataset/002/face2.jpg |
四、技术介绍
- Spring Boot:
Spring Boot
是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的开发过程,使得开发者可以更加专注于业务逻辑的实现。在本案例中,我们使用 Spring Boot 来构建企业门禁系统的后端服务,实现人脸识别的业务逻辑。 - Deeplearning4j:
Deeplearning4j
是一个基于 Java 的深度学习框架,它支持多种神经网络模型,如 CNN、循环神经网络(Recurrent Neural Network
,RNN
)等。在本案例中,我们使用 Deeplearning4j 来训练和部署人脸识别模型。 - 图像预处理:在进行人脸识别之前,我们需要对图像进行预处理,包括图像的缩放、裁剪、归一化等操作,以提高模型的识别准确性。
- 模型训练:使用 Deeplearning4j 提供的 API,我们可以构建和训练人脸识别模型。在训练过程中,我们需要将数据集分为训练集和测试集,使用训练集对模型进行训练,使用测试集对模型的性能进行评估。
- 模型部署:训练好的模型可以部署到企业门禁系统中,实现人脸识别的功能。在部署过程中,我们需要将模型转换为适合在生产环境中运行的格式,并使用 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 {@Testpublic 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 {@Testpublic 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 {@Testpublic 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)
。
八、预期输出
- 图像预处理:经过图像预处理后,图像的像素值应该在 0 到 1 之间,并且图像的大小应该符合模型的输入要求。
- 模型训练:在模型训练过程中,我们可以观察到模型的损失函数和准确率的变化情况。随着训练的进行,损失函数应该逐渐减小,准确率应该逐渐提高。
- 模型部署:当我们上传一张员工的面部图像时,后端服务应该能够快速准确地识别出该员工的身份,并返回相应的识别结果。
九、参考资料文献
- Deeplearning4j 官方文档
- Spring Boot 官方文档
- 卷积神经网络介绍
- 人脸识别技术介绍
相关文章:

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

SSTI模板注入+CTF实例
参考文章: 一文了解SSTI和所有常见payload 以flask模板为例-腾讯云开发者社区-腾讯云 (tencent.com) python-flask模块注入(SSTI) - ctrl_TT豆 - 博客园 (cnblogs.com) ssti详解与例题以及绕过payload大全_ssti绕过空格-CSDN博客 1. SSTI(模板注入&…...

iPhone 16 Pro 拆解揭秘:设计改进与维修便利性
苹果最新推出的iPhone 16系列在许多方面都进行了更新和改进,而这次我们要聚焦的是其中的高端型号——iPhone 16 Pro。 这款手机不仅在性能上有所提升,在内部构造上也带来了不少变化,让我们一起来看看这些细节吧。 更容易进入的内部结构 对于…...

Java项目实战II养老||基于Java+Spring Boot+MySQL的社区智慧养老监护管理平台设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着老龄化…...

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)
利用FnOS搭建虚拟云桌面,并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面,并搭建前端开发环境(一) 上一章安装了飞牛FnOS系统,界面如下,这一张配置前端…...
【Python】Qwen-VL-7B box
VLLM-Qwen2-VL-7B-Instruct import cv2# 读取图像 image_path haibaoA.png # 替换为图像的路径 image cv2.imread(image_path)# 定义框的坐标 (x1, y1) 是左上角,(x2, y2) 是右下角 x1, y1 200, 550 # 左上角坐标 x2, y2 799, 750 # 右下角坐标 h, w image.…...

echarts按需引入解决项目大小问题
背景: 按需加载缩减项目大小,提升项目性能和可用性 实现: 创建echarts.js main.js进行配置 页面中引用 效果 全量导入 按需加载:...

天气预报echarts
如上图,可以切换温度,降水量,风力风向和空气质量 <template><el-radio-group v-model"selectedData" change"updateChart"><el-radio-button label"temperature">温度</el-radio-butto…...

Kafka-初识
一、Kafka是什么? Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台,由服务器和客户端组成,通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上,也可以部署在本…...
Redis的主要的特性和优势 ?
Redis 的主要特性 内存存储:Redis 将数据存储在内存中,这使得读写操作非常快速。它还支持将数据持久化到磁盘,以防止数据丢失。 丰富的数据结构:Redis 不仅支持简单的字符串键值对,还支持更复杂的数据结构,…...

yolov5-7.0模型DNN加载函数及参数详解(重要)
yolov5-7.0模型DNN加载函数及参数详解(重要) 引言yolov5(v7.0)1,yolov5.h(加载对应模型里面的相关参数要更改)2,main主程序(1)加载网络(2)检测推理࿰…...
StringEntity 用于将字符串内容作为 HTTP 请求实体(请求体)
StringEntity 类是 Apache HttpClient 库中的一个类,它用于将字符串内容作为 HTTP 请求实体(请求体)。这个类非常适合用于发送 JSON、XML 或其他需要以字符串形式发送的数据。以下是 StringEntity 类的一些常用方法和代码案例: …...

校园系统校园小程序 论坛校园圈系统失物招领、闲置二手、跑腿外卖等校园圈子系统应该具备有哪些功能
针对校园系统、校园小程序、论坛校园圈系统以及失物招领、闲置二手、跑腿外卖等具体功能,一个综合性的校园圈子系统应该具备以下主要功能: 前后端源码查看 一、基础功能 用户注册与登录 提供用户注册和登录功能,支持学生身份验证、手机号验…...

[AWS云]kafka调用和创建
背景:因为因为公司的项目需要使用AWS的kafka,但是在创建和使用过程中都遇到了一些报错和麻烦,毕竟老外的东西,和阿里云、华为使用起来还是不一样。 一、创建(创建的配置过程就略了,就是配置一下可用区、型号࿰…...

查看 Excel 应用程序中已打开的 Excel 文件的完整路径
要查看 Excel 应用程序中已打开的 Excel 文件的完整路径(全路径),你可以通过以下几种方法获取具体路径,尤其是在 VSTO 应用程序中。 方法1:使用 VSTO Excel 外接程序代码 在 VSTO 外接程序代码中,您可以直接…...
学习 RocketMQ 单机部署、消息发送、消息接收
文章目录 RocketMQ 介绍为什么要使用 MQ ?RocketMQ 与其他产品对比vs Kafkavs RabbitMQvs ActiveMQ RocketMQ 重要概念部署 Namesrver、Broker、Dashboard快速入门消息生产者消息消费者 消费模式简单消息1)同步发送2)异步发送3)单…...
【计算机网络】CDN
CDN(Content Delivery Network,内容分发网络)是一种分布式的服务器网络,旨在通过将内容缓存到多个地理位置的服务器上,加速内容的分发和传递。CDN 的主要目的是减少用户访问网站时的延迟,提升用户体验&…...
数据结构:插入排序
1.插入排序 此排序如打扑克牌一样;每次抓牌,把扑克从前向后扒拉;找到合适的位置插入进去—所以叫插入排序; 时间复杂度:O(N^2) int arr[10] { 9,8,7,6,5,4,3,2,1,0 };//数据太多就不好写了 …...

Nginx反向代理配置与负载均衡配置
简介:整理自黑马程序员苍穹外卖的第11节 nginx是什么? nginx的好处 nginx反向代理配置方式 nginx负载均衡的配置方式 nginx负责均衡策略...
axios 前端与 Django 后端的 POST 交互
背景 自己在写一些油猴脚本,前端需要用 JS,后端是自己的服务,是用 Python 的 Django 框架完成的。 油猴脚本中需要通过 POST 方法,向后端传一些数据,所以前端我用的是 axios 库,后端需要用 Django 处理 P…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...