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

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

推薦閱讀

3e269c480421977466a754d1077a5b18.png

0b7d90a603fad85865cce270162ff81a.png

c783fe4a28d6c1849d52a3051f754538.png

a0321a6039d460d790884d957d0be4fc.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64147.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NS3學習——tcpVegas算法代碼詳解(2)

NS3學習——tcpVegas算法代碼詳解&#xff08;1&#xff09;-CSDN博客 目錄 4.TcpVegas類中成員函數 (5) CongestionStateSet函數 (6) IncreaseWindow函數 1.檢查是否啟用 Vgas 2.判斷是否完成了一個“Vegas 周期” 2.1--if&#xff1a;判斷RTT樣本數量是否足夠 2.2--e…

GitLab 將停止為中國區用戶提供服務,60天遷移期如何應對? | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心篩選&#xff0c;為您帶來最新鮮、最具洞察力的科技新聞。 GitLab作為一個廣受歡迎的開源代碼托管平臺&#xff0c;近期宣布將停止服務中國大陸、澳門和香港地區的用戶提供服務。根據官方通知&#x…

華為實訓課筆記 2024 1223-1224

華為實訓 12/2312/24 12/23 [Huawei]stp enable --開啟STP display stp brief --查詢STP MSTID Port Role STP State Protection 實例ID 端口 端口角色 端口狀態 是否開啟保護[Huawei]display stp vlan xxxx --查詢制定vlan的生成樹計算結…

企業數字化轉型中如何區分“IT投入”和“業務投入”

在數字化轉型的浪潮中&#xff0c;企業往往面臨一個關鍵問題&#xff1a;如何區分“IT投入”和“業務投入”&#xff1f;在很多企業中&#xff0c;這兩個概念往往被混淆&#xff0c;不少公司甚至認為“數字化轉型”就是“IT的事情”&#xff0c;但實際上&#xff0c;它們之間有…

【Spring AI】Spring AI Alibaba的簡單使用

提示&#xff1a;文章最后有詳細的參考文檔。 前提條件 SpringBoot版本為3.x以上JDK為17以上申請api-key&#xff0c;地址&#xff1a;百煉平臺 引入依賴 說明&#xff1a;我的springboot版本為3.2.4&#xff0c;spring-ai-alibaba-starter版本為1.0.0-M2.1(對應spring-ai版本…

《Java源力物語》-3.空值獵手

~犬&#x1f4f0;余~ “我欲賤而貴&#xff0c;愚而智&#xff0c;貧而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯學乎” \quad 夜色漸深&#xff0c;在一處偏僻小徑上&#xff0c;月光透過濃密的源力云層&#xff0c;在地面上投下斑駁的光影。String正獨自練習著剛從…

科技云報到:人工智能時代“三大件”:生成式AI、數據、云服務

科技云報到原創。 就像自行車、手表和縫紉機是工業時代的“三大件”。生成式AI、數據、云服務正在成為智能時代的“新三大件”。加之全球人工智能新基建加速建設&#xff0c;成為了人類社會數字化遷徙的助推劑&#xff0c;讓新三大件之間的耦合越來越緊密。從物理世界到數字世…

hiprint結合vue2項目實現靜默打印詳細使用步驟

代碼地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ?打印、打印設計、可視化設計器、報表設計、元素編輯、可視化打印編輯 本地安裝包地址&#xff1a;electron-hiprint 發行版 - Gitee.com 1、先安裝hipint安裝包在本地 2、項目運行npm&#xff08;socket.…

CUDA各種內存和使用方法

文章目錄 1、全局內存2、局部內存3、共享內存3.1 靜態共享內存3.2 動態共享內存 4、紋理內存5、常量內存6、寄存器內存7、用CUDA運行時API函數查詢設備CUDA 錯誤檢測 1、全局內存 特點&#xff1a;容量最大&#xff0c;訪問延時最大&#xff0c;所有線程都可以訪問。 線性內存…

Chapter 03 復合數據類型-1

1.列表 Python內置的一種有序、可變的序列數據類型&#xff1b; 列表的定義&#xff1a; [ ]括起來的逗號分隔的多個元素組成的序列 列表對象的創建&#xff1a; &#xff08;1&#xff09;直接賦值 >>> list1 []#創建一個空列表賦值給list1 >>> list…

【后端】LNMP環境搭建

長期更新各種好文&#xff0c;建議關注收藏&#xff01; 本文近期更新完畢。 LNMPlinuxnginxmysqlphp 需要的資源 linux服務器 web服務軟件nginx 對應的語言編譯器代碼文件 數據庫mysql安裝 tar.gz包或者命令行安裝 進入root&#xff1a; sodu 或su mkdir path/{server,soft}…

基于PyQt5的UI界面開發——多界面切換

介紹 最初&#xff0c;因為課設的緣故&#xff0c;我只是想做一個通過按鍵進行切面切換而已&#xff0c;但是我看網上資料里面僅是語焉不詳&#xff0c;讓我困惑的很&#xff0c;但后面我通過摸索才發現這件事實在是太簡單了&#xff0c;因此我想要記錄下來。 本博客將介紹如…

操作002:HelloWorld

文章目錄 操作002&#xff1a;HelloWorld一、目標二、具體操作1、創建Java工程①消息發送端&#xff08;生產者&#xff09;②消息接收端&#xff08;消費者&#xff09;③添加依賴 2、發送消息①Java代碼②查看效果 3、接收消息①Java代碼②控制臺打印③查看后臺管理界面 操作…

機器視覺檢測相機基礎知識 | 顏色 | 光源 | 鏡頭 | 分辨率 / 精度 / 公差

注&#xff1a;本文為 “keyence 視覺沙龍中機器視覺檢測基礎知識” 文章合輯。 機器視覺檢測基礎知識&#xff08;一&#xff09;顏色篇 視覺檢測硬件構成的基本部分包括&#xff1a;處理器、相機、鏡頭、光源。 其中&#xff0c;和光源相關的最重要的兩個參數就是光源顏色和…

【每日學點鴻蒙知識】壓力測試、Web組件攔截器、nfc開關狀態、定位能力、rn支持的三方庫

1、HarmonyOS的wukong 支持運行python腳本進行壓力或者常規測試嗎&#xff1f; Python腳本調用hdc命令&#xff0c;執行hdc shell wukong XXXwukong只支持穩定性壓測&#xff0c;普通測試建議使用arkxtest測試框架 2、Web組件頁面內跳轉時自定義WebHeader問題&#xff1f; 如…

GDPU Vue前端框架開發 期末賽道出勇士篇(更新ing)

記住&#xff0c;年底陪你跨年的不會僅是方便面跟你的閨蜜&#xff0c;還有孑的筆記。 選擇題 1.下列選項用于設置Vue.js頁面視圖的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列選項中能夠定義Vuejs根實例對象的元素是&#xff08;&…

Flutter開發HarmonyOS 鴻蒙App的好處、能力以及把Flutter項目打包成鴻蒙應用

Flutter開發HarmonyOS的好處&#xff1a; Flutter是谷歌公司開發的一款開源、免費的UI框架&#xff0c;可以讓我們快速的在Android和iOS上構建高質量App。它最大的特點就是跨平臺、以及高性能。 目前 Flutter 已經支持 iOS、Android、Web、Windows、macOS、Linux 的跨平臺開發…

Effective C++ 條款 17:以獨立語句將 `newed` 對象置入智能指針

文章目錄 條款 17&#xff1a;以獨立語句將 newed 對象置入智能指針核心思想示例代碼錯誤用法分析推薦設計總結 條款 17&#xff1a;以獨立語句將 newed 對象置入智能指針 核心思想 問題背景 如果在將 newed 對象傳遞給智能指針時&#xff0c;包含了復雜的表達式&#xff0c;一…

【體驗官招募】SoFlu - JavaAI 開發助手:開啟智能開發新時代

你是否有過這樣的經歷&#xff1f;在深夜的辦公室里&#xff0c;面對緊急的 Java 項目&#xff0c;看著厚厚的需求文檔&#xff0c;你是否感到無從下手&#xff1f; 當你嘗試理解客戶那些復雜又模糊的需求時&#xff0c;是否會因為要和產品經理反復溝通確認每一個細節而感到厭…

【Compose multiplatform教程07】多平臺常用組件和重要組件目錄

一、基礎交互與顯示組件 Text 查看示例 功能說明&#xff1a;用于在界面上顯示文本內容&#xff0c;支持設置字體、大小、顏色、樣式&#xff08;如加粗、斜體、下劃線&#xff09;等屬性&#xff0c;滿足不同的文本展示需求&#xff0c;可傳達各種信息給用戶。示例場景&#…