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

84a239c6063e493bb52ebc61b9be1722.png

a603cd554729439a9f7b81a06806916b.png

如何从零搭建一个人脸识别应用?不妨试试原生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

@Bean
    public 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)

推荐阅读

3e269c480421977466a754d1077a5b18.png

0b7d90a603fad85865cce270162ff81a.png

c783fe4a28d6c1849d52a3051f754538.png

a0321a6039d460d790884d957d0be4fc.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运维】文件存储公共盘升级及数据迁移

记录一下升级公共盘及数据迁移的经历 一、背景&#xff1a; 因旧公共盘性能较差&#xff0c;故公司打算采购一批主机&#xff0c;用于替换旧的公共盘。 二、迁移计划&#xff1a; 选择了用户使用较少的星期五晚上到星期日晚上作为迁移时间窗口&#xff0c;同时选择了fastco…

消息队列(一)消息队列的工作流程

什么是消息队列 首先&#xff0c;代入一个场景&#xff0c;我现在做一个多系统的集成&#xff0c;分别有系统A、B、C、D四个系统&#xff0c;A系统因为使用产生了业务数据&#xff0c;B、C、D需要使用这些数据做相关的业务处理和运算&#xff0c;最基本的做法就是通过接口通信…

SAP配置网络打印机

1、网络打印机 在项目中需要用打印机打印表单&#xff0c;如果不配置网络打印机&#xff0c;通常需要通过连接特定的计算机&#xff08;如打印服务器&#xff09;来进行打印&#xff0c;或者使用本地连接的打印机&#xff0c;这样每台计算机可能需要单独配置打印机或安装驱动&…

GB/T34944-2017 《Java语言源代码漏洞测试规范》解读——安全功能

GB/T34944-2017 《Java语言源代码漏洞测试规范》标准是软件测试实验室开展代码测试活动的重要依据&#xff0c;也是软件测试实验室申请代码测试CNAS/CMA实验室认证时所依据的标准方法。本系列文章一起解读GB/T34944-2017 《Java语言源代码漏洞测试规范》&#xff0c;前面的文章…

NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

监听器listener

文章目录 监听器( listener)对Application内置对象监听的语法和配置对session内置对象监听的语法和配置 监听器( listener) 对象与对象的关系&#xff1a; 继承关联 tomcat一启动创建的顺序&#xff1a;监听器&#xff0c;config&#xff0c;application(全局初始化参数)&am…

LabVIEW数字式气压计自动检定系统

开发了一个基于LabVIEW开发的数字式气压计自动检定系统。在自动化检定PTB220和PTB210系列数字气压计&#xff0c;通过优化硬件组成和软件设计&#xff0c;实现高效率和高准确度的检定工作&#xff0c;有效降低人力成本并提升操作准确性。 项目背景 随着自动气象站的广泛部署&a…

在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”

1. 异常描述 在linux系统中使用jdbc访问sqlite数据库时出现如下错误提示&#xff1a; 2. 异常分析 可能是当前使用版本的sqlite-jdbc-xxx.jar版本有bug。 3. 异常解决 我是从3.8.9.1版本换到了3.16.1版本就好了。

Java(Sprigboot) 项目调用第三方 WebService 接口实现方式

文章目录 Java(Sprigboot) 项目调用第三方 WebService 接口实现方式WebService 简介业务场景描述WSDL 文档请求地址及方式接口请求/响应报文 代码实现1、接口请求/响应报文 JSON 准备&#xff08;1&#xff09;TransData&#xff08;2&#xff09;BaseInfo、InputData、OutputD…

基础爬虫案例实战

我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节&#xff0c;我们就来实现一个完整的网站爬虫&#xff0c;把前面学习的知识点串联起来&#xff0c;同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告&#xff1a;HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…

C++-----线性结构

C线性结构模板 概念&#xff1a;线性结构是一种数据元素之间存在一对一线性关系的数据结构&#xff0c;如数组、链表、栈、队列等。C中的模板可以让我们编写通用的代码&#xff0c;适用于不同的数据类型&#xff0c;而不必为每种数据类型都重复编写相同的代码结构。作用&#…

六大基础深度神经网络之CNN

左侧是传统卷积网络输入的是一列像素点&#xff0c;右侧是卷积神经网络&#xff0c;输入的是具有长宽通道数的原始图像 下图为整体架构。卷积层可以认为提取特征&#xff0c;池化层是压缩特征。全连接层是把图像展平然后计算10个类别的概率值 给出一张图像不同区域的特征不同&a…

AIOps平台的功能对比:如何选择适合的解决方案?

定义与概念 AIOps&#xff0c;即人工智能运维&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff0c;是将人工智能技术应用于 IT 运维领域&#xff0c;以实现自动化、智能化的运维管理。它通过整合大数据、机器学习等先进技术&#xff0c;对海量运维数…

pr基础(3)-lumetri

这篇应该是基础的完结篇了&#xff0c;主要记录调色方面的相关知识。 主要的内容是lumetri的使用 Lumetri的翻译其实来源于两个部分的组合。"Lume"这个词源于拉丁语&#xff0c;意为明亮度或光亮度&#xff0c;是Luminance (Luma) 的缩写&#xff0c;强调了光线的强…

【 thefuck 安装与使用】Linux 终端自动纠错工具:一头GitHub上的“草泥马“ - thefuck,妈妈再也不用担心我打错命令行了!

目录 快速安装使用 . 1.简介 2.安装 3.配置 4.补充 官方盗料参考 快速安装使用 快速安装使用&#xff0c;四步即可&#xff1a; #Ubuntu/Debian系统 sudo apt update sudo apt install python3-dev python3-pip sudo pip3 install thefuck #编辑bashrc配置文件 vim ~/.bashrc…

基于pytorch的深度学习基础3——模型创建与nn.Module

三 模型创建与nn.Module 3.1 nn.Module 模型构建两要素&#xff1a; 构建子模块——__init()__拼接子模块——forward&#xff08;&#xff09; 一个module可以有多个module&#xff1b; 一个module相当于一个运算&#xff0c;都必须实现forward函数&#xff1b; 每一个mod…

智慧农业物联网传感器:开启农业新时代

在当今科技飞速发展的时代&#xff0c;农业领域正经历着一场前所未有的变革&#xff0c;而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”&#xff0c;悄然渗透到农业生产的各个环节&#xff0c;为传统农业注入了全新的活力&#xff0c;让农业生产…

OpenLayers实现渐变透明填充和光效边界

之前在cesium中做过多边形的填充使用渐变透明的效果,那个时候使用的是着色器,利用距离中心点的距离去写shader函数,距离中心越远颜色透明度越高,那么本文我们在openlayers中来实现这一过程。老规矩还是先来看一下效果: 好接下来开始讲述原理,首先关于边界发光的原理我在O…

低代码开发中 DDD 领域驱动的页面权限控制

在低代码开发的领域中&#xff0c;应用安全与灵活性是两大关键考量因素。领域驱动设计&#xff08;DDD&#xff09;作为一种在软件设计领域广泛应用且颇具影响力的方法论&#xff0c;正逐渐在低代码开发的页面权限控制方面展现出其独特的价值与潜力。本文旨在客观地探讨如何借助…