Milvus×EasyAi:如何用java从零搭建人脸识别应用


如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi + Milvus 的组合拳。
本文将使用到的软件和工具包括:
EasyAi:人脸特征向量提取
Milvus:向量数据库用于高效存储和检索数据。
01.
EasyAi:国内人气最高的Java人工智能算法框架
作为纯java开发 Ai 应用的框架,EasyAi无任何依赖,它是一个原生Java人工智能算法框架。首先,它可以Maven一键丝滑引入我们的Java项目,无需任何额外的环境配置与依赖,做到开箱即用。再者,它既有一些我们已经封装好的图像目标检测及人工智能客服的模块,也提供各种深度学习,机器学习,强化学习,启发式学习,矩阵运算,求导函数,求偏导函数等底层算法工具。开发者可以通过简单的学习,就能完成根据自身业务,深度开发符合自己业务的小微模型。
02.
EasyAi-Face:基于Easy-Ai的人脸识别应用
一,生成人类平均脸,将所有人脸样本样本缩放到统一尺寸后,多余的上下截断,不足的进行补0,所有像素通道求和后获取平均数,将样本输出生成平均脸。
二,通过事先训练好的人脸定位fastYolo模型,对目标照片进行一次定位,并设置一个阈值,只有当可信度超过该阈值时才被认为是人脸。
三,获取目标照片中可信度最高的人脸定位框,基于该定位进行人脸位置的二次修正。
二次修正方案:
通过粒子群,设置四个特征维度寻求最优解,它们分别是人脸位置左上角的x与y坐标与宽高。自适应函数返回值设置为最小值最优。xy与宽高四维粒子调整活动范围,上下限制为一次定位坐标与宽高的+-50像素的范围(自行可调)。
适应函数计算流程为通过四个维度粒子锁定的坐标将人脸截取下来,将它与先前获取的平均脸按照之前的缩放方案,再次缩放到指定的一个更小的尺寸,并将它们的灰度通道通过softMax将整个矩阵的所有数值概率化。
对比平均脸与粒子此时锁定人脸灰度概率图像的欧式距离,并返回。让粒子探索(在指定迭代次数中)最小值最优解。
四,获取人脸特征,获取最后粒子寻找的最优坐标,根据该坐标将图像截取下来,并截取其从上到下高度的0.7倍的图像位置(将嘴部扔掉,嘴部的稳定性比较差),获取此时图像的LBP局部二值化纹理特征。
03.
EasyAi-Face + Milvus搭建人脸识别应用
3.1 提取人脸特征
引入依赖
<dependency><groupId>org.dromara.easyai</groupId><artifactId>seeFace</artifactId><version>1.0.5</version></dependency> 初始化Face
@Beanpublic Face face(FaceConfig faceConfig ){if (StringUtils.isNotBlank(faceConfig.getAvgFace()) && StringUtils.isNotBlank(faceConfig.getFaceModel())){return FaceFactory.getFace(faceConfig.getAvgFace(), faceConfig.getFaceModel());}return FaceFactory.getFace();} 提取人脸特征
private List<Float> getFloats(InputStream inputStream) {ThreeChannelMatrix m = Picture.getThreeMatrix(inputStream, false);ErrorMessage errorMessage = face.look(m, idWorker.nextId(), 30);final Matrix feature = errorMessage.getFaceMessage().getFeature();return MatrixUtil.matrixToFloatList(feature);} 3.2 存到向量库
public void initUserVector(UserDTO userDTO, List<Float> features) {List<String> names = Collections.singletonList(userDTO.getUserName());List<Long> userIds = Collections.singletonList(userDTO.getUserId());List<String> getFaceUrl = Collections.singletonList(userDTO.getFaceUrl());List<String> getFaceFeatureUrl = Collections.singletonList(userDTO.getFaceFeatureUrl());List<List<Float>> vectors = Collections.singletonList(features);List<Field> fields = new ArrayList();fields.add(new Field("vector", vectors));fields.add(new Field("face_url", getFaceUrl));fields.add(new Field("face_feature_url", getFaceFeatureUrl));fields.add(new Field("user_id", userIds));fields.add(new Field("user_name", names));InsertParam insertParam = InsertParam.newBuilder().withCollectionName(milvusConfig.getCollectionName()).withFields(fields).build();this.milvusClient.insert(insertParam);} 3.3 【识别人脸】人脸特征L2相似性查找
public List<UserDTO> search(List<Float> floatList, Integer topK) {final List<SearchResultsWrapper.IDScore> idScoreList = vectorService.search(floatList, topK);List<UserDTO> list = new ArrayList<>();idScoreList.forEach(idScore -> {UserDTO imageDTO = new UserDTO();final float score = idScore.getScore();final Map<String, Object> fieldValues = idScore.getFieldValues();imageDTO.setAutoId(Long.valueOf(String.valueOf( fieldValues.getOrDefault("Auto_id", "-1"))));imageDTO.setUserId(Long.valueOf(String.valueOf( fieldValues.getOrDefault("user_id", "-1"))));imageDTO.setUserName(String.valueOf((fieldValues.getOrDefault("user_name", ""))));imageDTO.setFaceUrl(String.valueOf((fieldValues.getOrDefault("face_url", ""))));imageDTO.setFaceFeatureUrl(String.valueOf((fieldValues.getOrDefault("face_feature_url", ""))));imageDTO.setScore(Math.sqrt(score));list.add(imageDTO);});return list;} 04.
总结
本文展示了如何使用 EasyAi 和 Milvus 搭建一个人脸识别应用。通过结合Java生态EasyAi和Milvus向量搜索的优势,我们可以快速的使用java搭建自己的人脸识别的项目。我们希望这篇文章对您有所帮助。同时,我们鼓励您在自己的项目中使用EasyAi和向量搜索,探索更多可能性。本文涉及的代码可以通过 Gitee 获取:Easy-Ai-Face(https://gitee.com/fushoujiang/easy-ai-face)。
推荐阅读




相关文章:
Milvus×EasyAi:如何用java从零搭建人脸识别应用
如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…...
Dockerfile 实战指南:解锁高效容器化开发
一、Dockerfile 简介 Dockerfile 是构建镜像的文本文件,通过一系列指令描述镜像构建过程,构建操作由 Docker daemon 进行,它会先验证语法,然后逐一运行指令,每次生成一个新的镜像层,直到构建出最终的镜像。…...
【每日学点鸿蒙知识】混淆配置、主线程处理大量数据、客户端拖拽效果、三方网站加载样式、List警告问题
1、HarmonyOS API升级之后缺少混淆配置文件? 可参考以下文档: 混淆配置:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-build-obfuscation-V5 混淆规则:https://gitee.com/openharmony/arkcompiler_ets…...
ChatGPT-4助力学术论文提升文章逻辑、优化句式与扩充内容等应用技巧解析。附提示词案例
目录 1.扩写(expansion/paraphrasing) 2.优化(optimization) 3.缩写(optimization) 4.提取关键词(keyword extraction) 5.短语转换(phrase transformationÿ…...
Android TextView 添加图标并实现换行
图文混排。 binding.apply {val spannable = SpannableString(" " + "Kotlin 是 Android 官方推荐的编程语言。")val drawable: Drawable = ContextCompat.getDrawable(this@DemoMainXmlActivity,R.mipmap.ic_title_d)!!drawable.setBounds(0, 0, drawabl…...
matplotlib pyton 如何画柱状图,利用kimi,直接把图拉倒上面,让他生成
要绘制类似于您提供的图像的柱状图,您可以使用Python中的Matplotlib库,这是一个非常流行的绘图库。以下是一个简单的示例代码,展示如何使用Matplotlib来创建一个类似的柱状图: python import matplotlib.pyplot as plt import nu…...
如何保证mysql数据库到ES的数据一致性
1.同步双写方案 在代码中对数据库和ES进行双写操作,确保先更新数据后更新ES。 优点: 数据一致性:双写策略可以保证在MySql和Elasticsearch之间数据的强一致性,因为每次数据库的变更都会在Elasticsearch同步反映。实时性…...
安装MongoDB,环境配置
官网下载地址:MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…...
家用无线路由器的 2.4GHz 和 5GHz
家中的无线路由器 WiFi 名称有两个,一个后面带有 “5G” 的标记,这让人产生疑问:“连接带‘5G’的 WiFi 是不是速度更快?” 实际上,这里的 “5G” 并不是移动通信中的 5G 网络,而是指路由器的工作频率为 5G…...
我的tensorboard
1.Tensorboard 2.Tensorboard的使用 导入tensorboard并创建SummaryWriter 添加标量数据 添加图片数据 直方图 模型可视化 3.代码使用 模型可视化 # 记录模型结构 dummy_input torch.randn(1, 3, 224, 224).to(device) # 根据你的模型输入尺寸调整 writer.add_graph(model…...
Quartz 相关线程
我们在前面文章中说到过Quartz涉及到的线程,但是散落在几篇文章中,不好找。而Quartz涉及到的线程对于理解Quartz也比较重要,所以今天专门提取出来单独说一下。 Quartz中的主要线程: 任务调度线程QuartzSchedulerThread 任务执…...
【QED】爱丽丝与混沌的无尽海
文章目录 题目题目描述输入输出格式数据范围测试样例 思路代码复杂度分析时间复杂度空间复杂度 题目 题目链接🔗 题目描述 如图所示,爱丽丝在一个3x3的迷宫之中,每个方格中标有 1 − 9 1-9 1−9各不相同的数字,爱丽丝可以从一格…...
IO模型学习
背景知识 Socket 套接字。 客户端和服务端通信时,客户端需要数据出口,服务端需要数据入口,这两个出入口就是Socket。数据接收方新建socket后需要绑定ip和端口号,这样客户端才能链接上socket。连接的过程就是 三次握手 FD file …...
Doxygen 使用指南
Doxygen 是一个文档生成工具,可以从源代码中的注释生成高质量的文档,支持多种编程语言(如 C/C、Python、Java 等)。以下是 Doxygen 的基本使用方法。 1. 安装 Doxygen 1.1 下载 Doxygen 访问 Doxygen 官网。根据操作系统选择合适…...
设计模式与游戏完美开发(2)
更多内容可以浏览本人博客:https://azureblog.cn/ 😊 该文章主主题内容均来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第四章 游戏主要类——外观模式(Facade) 一、游戏子功能的整合 一个游戏程序常常由内部数个不…...
Coroutine 基础三 —— 结构化并发(二)
1、协程的结构化异常管理 如果一个协程抛异常,它所在的整个协程树上的其他协程(向上是父协程到根协程,向下是所有后代协程)都会被取消。因此协程发生异常的后果是十分严重的。 先讲原理,再说解决方案。 协程异常的处…...
GXUOJ-算法-第一次作业
1.整数划分 问题描述 GXUOJ | 整数划分 题解 #include<bits/stdc.h> using namespace std; const int N1010,mod1e97;int n; int f[N];int main(){cin>>n;f[0]1;for(int i1;i<n;i){for(int ji;j<n;j){f[j](f[j]f[j-i])%mod;}}cout<<f[n]; } 2.汉诺塔…...
Springboot项目Druid运行时动态连接多数据源的功能
项目支持多数据库连接是个很常见的需求,这不仅是要在编译前连已经知道的多个数据库,有时还要在程序运行时连后期增加的多个数据源来获得数据。 一、编译前注册数据库连接 1.引入依赖包 <!-- springboot 3.x --><dependency><groupId&g…...
字符串匹配——KMP算法
前言 刷到字符串匹配的力扣题了【28. 实现 strStr() 】,这题简单吧用库函数做就可以,说难吧,就得引出大名鼎鼎的线性匹配算法——KMP。 目录 KMP 算法背景与原理算法优势 前缀表1. 构建Next数组2. 搜索匹配 KMP 算法背景与原理 KMP&#x…...
Qt开发技术【下拉复选框 MultiSelectComboBox 自定义全选项】
继承ComboBox完成下拉复选框 自定义全选项 效果图 整个控件继承于QCombobox类。主要修改QLineEdit、QListWidget这两部分,QComboBox提供如下接口,可以将这两部分设置为新建的QLineEdit、QListWidget对象 CMultiSelectComboBox::CMultiSelectComboBo…...
ILI9163C SPI TFT驱动库深度解析与嵌入式优化实践
1. TFT_ILI9163C 驱动库深度解析:面向嵌入式系统的高性能SPI TFT显示方案1.1 项目定位与工程价值TFT_ILI9163C 是一款专为嵌入式平台优化的高性能 SPI TFT 显示驱动库,核心目标是在资源受限的微控制器上实现接近硬件极限的图形刷新吞吐量。其设计哲学并非…...
OpenClaw飞书机器人进阶:集成Kimi-VL-A3B-Thinking多模态对话能力
OpenClaw飞书机器人进阶:集成Kimi-VL-A3B-Thinking多模态对话能力 1. 为什么需要多模态飞书机器人 去年我们团队开始使用飞书作为主要协作工具,但很快发现一个痛点:当讨论涉及图片、图表或复杂文档时,传统的文本机器人显得力不从…...
ARM架构解析:从基础原理到嵌入式开发实践
1. ARM处理器架构概述作为一名嵌入式开发者,我经常需要和ARM处理器打交道。第一次接触ARM是在大学时期的一个智能小车项目上,当时使用的是STM32F103系列芯片,基于ARM Cortex-M3内核。从那时起,我就被ARM架构的精巧设计所吸引。经过…...
信通院:AI4SE行业现状调查报告 2026
这份信通院 2026 年 AI4SE 行业现状调查报告,核心是 AI 与软件工程深度融合进入规模化落地关键期,全流程提效显著,企业高度重视,但仍面临人才、成本等挑战,未来将走向自主编程、多智能体协同的新范式。一、调研概况有效…...
手把手教你开发电竞护航系统:从零到上线的小程序全流程
手把手教你开发电竞护航系统:从零到上线的小程序全流程 电竞产业近年来呈现爆发式增长,职业选手和游戏爱好者对专业服务的需求与日俱增。一款优秀的电竞护航小程序不仅能提供赛事资讯、战队管理、训练计划等基础功能,更能通过智能算法为玩家匹…...
3步彻底解决Windows多显示器DPI缩放难题:SetDPI工具完全指南
3步彻底解决Windows多显示器DPI缩放难题:SetDPI工具完全指南 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 还在为Windows系统下多显示器DPI缩放不一致而烦恼吗?主显示器清晰锐利,副显示器却模糊不堪…...
比话降AI实测:AI率87%的论文降到11%全程记录
这篇是比话降AI的真实使用记录,不是广告软文,是我帮朋友处理论文的完整过程。 朋友的情况:研究生论文,4.2万字,知网AIGC检测87%,距离提交截止7天。 为什么选比话降AI 比话降AI(www.bihuapass…...
哪款工具能把AI率从80%降到20%?实测3款对比
这篇文章的起点是一个具体问题:AI率80%以上的论文,用哪款工具降,能稳定降到20%以下? 我用3篇不同专业、不同AI率的论文(AI率分别为82%、86%、91%),分别测试了嘎嘎降AI、比话降AI、率零三款工具…...
最小二乘问题详解15:束平差原理与基础实现
初始两帧的 E 矩阵分解可能存在错误解或尺度模糊;三角化结果受位姿误差和图像噪声影响;PnP 的位姿估计会继承并放大前期误差。 随着图像数量增加,这些局部误差会不断累积,导致最终重建结果出现尺度漂移、结构扭曲甚至拓扑错误。要…...
COMSOL模拟:电磁超声压电接收技术在铝板裂纹检测中的应用
comsol电磁超声压电接收EMAT 在1mm厚铝板中激励250kHz的电磁超声在200mm位置处设置一个深0.8mm的裂纹缺陷,左端面设为低反射边界 在85mm位置处放置一个压电片接收信号,信号如图3所示,三个波分别为始波,裂纹反射波(S0模态)和右端面…...
