愛智EdgerOS之深入解析AI圖像引擎如何實現AI視覺開發

一、前言

  • AI 視覺是為了讓計算機利用攝像機來替代人眼對目標進行識別,跟蹤并進一步完成一些更加復雜的圖像處理。這一領域的學術研究已經存在了很長時間,但直到 20 世紀 70 年代后期,當計算機的性能提高到足以處理圖片這樣大規模的數據時,計算機視覺才得到了正式的關注和發展。
  • 現在 AI 視覺已經在我們的生活中無處不在,從日常使用的二維碼到人臉識別直至更專業的病理分析。AI 視覺的應用所滲透到的領域遠比我們想象的更加廣泛。雖然 AI 視覺的應用已經隨處可見,但如果想要自己去開發一套屬于自己的 AI 視覺應用,對于一個非專業領域的開發者還是非常復雜的,單從最基礎的算法訓練就要消耗掉大量的精力與時間。
  • EdgerOS 系統則內置了多種不同方向的 AI 引擎,使開發者可以實現快速實現 AI 視覺領域的開發,極大的降低了開發周期。開發者可以根據自己的需求對不同 AI 引擎進行組合達到自己想要的業務實現。本文將帶領大家一起了解 EdgerOS 中常用的兩款 AI 引擎。

二、FaceNN

  • FaceNN 是 EdgerOS 所提供的一個針對人臉識別的 AI 處理引擎,它可以從視頻流或者圖片中捕捉到人臉的具體位置,還可以根據人臉的特征來分析出對應人物的特征信息如:年齡、性別、情感等一些具體信息。
  • FaceNN 引擎封裝在 “facenn” 模塊中,可以通過以下方式來導入:
const facenn= require('facenn');
  • FaceNN 引擎提供了極簡的接口,這使得開發者可以更加快速的實現關于人臉的 AI 處理,同時也降低了巨大的學習成本。
  • 首先需要明確一下被識別的圖像格式,目前 FaceNN 引擎支持如下格式:
類型說明
facenn.PIX FMT RGB24RGB24 pixel format
facenn.PIX FMT BGR2RGB24BGR24 to RBG24 pixel format
facenn.PIXFMTGRAY2RGB24Grayscale to RGB24 pixel format
facenn.PIX FMT RGBA2RGB24RGBA to RGB24 pixel format
  • facenn.detect(videoBuf, attribute[, quick])
    • attribute {Object} 圖像格式
      • width {Integer} 圖像寬度
      • height {Integer} 圖像高度
      • pixelFormat {Integer} 圖像格式
    • quick {Boolean} 是否啟用快速模式
  • 返回信息:
    • score {Number} 人臉的覆蓋率
    • x0 {Integer} 左上角 x 的位置
    • y0 {Integer} 左上角 y 的位置
    • x1 {Integer} 右下角 x 的位置
    • y1 {Integer} 右下角 y 的位置
    • area {Number} Area,非快速模式
    • regreCoord {Array} RegreCoord,非快速模式
    • landmark {Array} Landmark,非快速模式
  • facenn.detect 可以識別出一幀圖像數據中的人臉個數以及人臉所在圖像中的位置。
  • facenn.feature(videoBuf, attribute, faceInfo[, extra])
    • videoBuf {Buffer} 圖像格式
    • attribute {Object} 圖像屬性
      • width {Integer} 圖像寬度
      • height {Integer} 圖像高度
      • pixelFormat {Integer} 圖像格式
    • extra {Object} 需要擴展的人臉信息 default: undefined
  • 返回信息:
    • keys {Array} Face keys
    • male {Boolean} 性別, 需要在擴展中選擇
    • age {Integer} Age, 需要在擴展中選擇
    • emotion {String} Emotion, 需要在擴展中選擇
    • emotion 可分辨情緒包括: angry,disgust,fear,happy,sad,surprise,neutral
    • live {Number} 存活率,需要在擴展中選擇
  • facenn.feature 可以識別出一張人像的具體信息,例如性別,情緒年齡等。
  • facenn.compare(faceKeys1, faceKeys2)
    • faceKey1 {Object} Face keys 1
    • faceKey2 {Object} Face keys 2
  • 返回信息:
    • 相似值 0.0 ~ 1.0
    • facenn.compare 可以比對出兩張人臉信息的相似值。
  • 接下來用一下兩張圖片來嘗試使用 FaceNN 引擎,讀取其中的特征信息:

在這里插入圖片描述
在這里插入圖片描述

const imagecodec = require('imagecodec'); // 圖片解析模塊
const facenn = require('facenn'); function facennHandel(imagePath, imagePath2) {const image1 = imagecodec.decode(imagePath, imagecodec.COMPONENTS_RGB)const imageInfo1 = imagecodec.info(imagePath)const videoAttrFacenn = { width: imageInfo1.width, height: imageInfo1.height, pixelFormat: facenn.PIX_FMT_RGB24 }const faceInfos = facenn.detect(image1.buffer, videoAttrFacenn);const facennFeature = facenn.feature(image1.buffer, videoAttrFacenn, faceInfos[0], {male: true,age: true,emotion: true,live: true})console.log(`image1.png  male:${facennFeature.male} age:${facennFeature.age} emotion:${facennFeature.emotion} live:${facennFeature.live}`)const image2 = imagecodec.decode(imagePath2, imagecodec.COMPONENTS_RGB)const imageInfo2 = imagecodec.info(imagePath2)const videoAttrFacenn2 = { width: imageInfo2.width, height: imageInfo2.height, pixelFormat: facenn.PIX_FMT_RGB24 }const faceInfos2 = facenn.detect(image2.buffer, videoAttrFacenn2);const facennFeature2 = facenn.feature(image2.buffer, videoAttrFacenn2, faceInfos2[0], {male: true,age: true,emotion: true,live: true})console.log(`image2.png  male:${facennFeature2.male} age:${facennFeature2.age} emotion:${facennFeature2.emotion} live:${facennFeature2.live}`)const compareNum = facenn.compare(facennFeature.keys, facennFeature2.keys)console.log(compareNum)
}facennHandel('/image/image1.png', '/image/image2.png')// 輸出如下:
// [JSRE-CON]image1.png  male:false age:21 emotion:neutral live:0.9843575954437256
// [JSRE-CON]image2.png  male:true age:58 emotion:sad live:0.33667701482772827
// [JSRE-CON]-0.1453045904636383

三、ThingNN

  • ThingNN 是 EdgerOS 可以從視頻流或者圖片中捕捉到具體事物,分別標記事務所在圖片中的具體位置。
  • ThingNN 引擎封裝在 “thingnn” 模塊中,可以通過以下方式來導入:
const facenn= require('thingnn');
  • 同樣也需要明確一下被識別的圖像格式,目前 ThingNN 引擎支持如下格式:
類型說明
thingnn.PIX FMT_ RGB24RGB24 pixel format
thingnn.PIX_FMT_BGR2RGB24BGR24 to RBG24 pixel format
thingnn.PIX FMT GRAY2RGB24Grayscale to RGB24 pixel format
thingnn.PIX FMT RGBA2RGB24RGBA to RGB24 pixel format
  • 接下來看看 ThingNN 接口提供了那些接口:
  • thingnn.detect(videoBuf, attribute)
    • videoBuf {Buffer} 圖像格式
    • attribute {Object} 圖像屬性
    • width {Integer} 圖像寬度
    • height {Integer} 圖像高度
    • pixelFormat {Integer} 圖像格式
  • 返回信息:
    • className{Array} Face keys
    • prob{Boolean} 性別, 需要在擴展中選擇
    • x0 {Integer} 左上角 x 的位置
    • y0 {Integer} 左上角 y 的位置
    • x1 {Integer} 右下角 x 的位置
    • y1 {Integer} 右下角 y 的位置
  • 目前 ThingNN 模塊所支持可識別的類型都有:
background, aeroplane, bicycle, bird, boat,bottle, bus, car, cat, chair,cow, diningtable, dog, horse,motorbike,person, pottedplant,sheep, sofa, train, tvmonitor
  • thingnn.detect 可以獲取到圖片中事物的類別以及所在圖像中的位置。
  • thingnn.identify(videoBuf, attribute, thingInfo)
    • videoBuf {Buffer} 圖像格式
    • attribute {Object} 圖像屬性
    • width {Integer} 圖像寬度
    • height {Integer} 圖像高度
    • pixelFormat {Integer} 圖像格式
    • thingInfo {Object} 事務對象
  • 返回信息:具體事物的名稱,thingnn.identify 可以獲取到具體 thinginfo 的類型名稱。
  • 以下圖為例子作為演示:

在這里插入圖片描述

const imagecodec = require('imagecodec'); // 圖片解析模塊
const facenn = require('facenn'); function licplatennHandel(imagePath) {
const imageInfo = imagecodec.info(imagePath)
const imageBuf= imagecodec.decode(imagePath, imagecodec.COMPONENTS_RGB).buffer
let videoAttrThingnn = { width: imageInfo.width, height: imageInfo.height, pixelFormat: thingnn.PIX_FMT_BGR24 }const thingInfos = thingnn.detect(imageBuf, videoAttrThingnn);thingInfos.forEach((thingInfo, index) => {const thingName = thingnn.identify(imageBuf, videoAttrThingnn, thingInfo);console.log(index,thingInfo.className, thingName)})
}licplatennHandel('/image/dog.png')// 輸出如下:
// [JSRE-CON]0 dog Labrador retriever

四、ImageCodec

  • FaceNN 模塊在單獨使用時是處理視頻流中的人臉信息的,現在假設我們的場景是一個智能門鎖,首先需要錄入人臉信息,添加為合法的開鎖用戶,門鎖攝像頭再捕獲視頻流檢測出人臉信息進行核對,校驗通過則打開門鎖。在錄入人臉信息的時候,需要將多張人臉照片處理成流信息提供給 FanceNN 模塊進行解析,ImageCodec 模塊剛好就可以勝任此工作。
  • ImageCodec 模塊提供了對多種圖像格式進行編碼和解碼方法,包括:PNG,JPG,BMP,TGA,HDR,接下來具體看一下,如何通過 ImageCodec 處理圖片數據。
const imagecodec = require('imagecodec')

① 區分帶通道的圖片

  • 在對圖片進行解碼的時候需要區別處理帶通道的 PNG 圖片,ImageCodec 模塊上的 decode 方法支持傳入第二個可選參數:
    • imagecodec.decode(path[, opt]):
const image = imagecodec.decode('./test.png', {components: imagecodec.COMPONENTS_RGB_ALPHA})
  • opt 的配置選項 components 可以指定以下值來區別處理不同格式的圖片:
定義描述
imagecodec.COMPONENTS_DEFAULT0使用圖片的默認值
imagecodec.COMPONENTS_GREY1單字節灰度圖像
imagecodec.COMPONENTS_GREY_ALPHA2帶有 Alpha 通道的灰度圖像
imagecodec.COMPONENTS_RGB3三字節 RGB 圖像
imagecodec.COMPONENTS_RGB_ALPHA4帶有 Alpha 通道的 RGB 圖像
  • 如何判斷一個圖片的格式,我們知道計算機實際并不是根據后綴來判斷文件類型的,事實上,有個東西叫魔法數字(Magic Number),它是某一類型的文件的頭一個或幾個字節的內容,可以根據這個來判斷傳入的圖片文件是什么類型的:
const fs = require('fs')
const imagecodec = require('imagecodec')
const imageBuffer = fs.readFile('./human.jpg')let type = ''
const arr = (new Uint8Array(picture)).subarray(0, 4)
const headerString = arr.reduce((acc, cur) => acc+cur.toString(16), '')
switch (headerString) {case "89504e47":type = "png";breakcase "47494638":type = "gif";breakcase "ffd8ffe0":case "ffd8ffe1":case "ffd8ffe2":type = "jpg"breakdefault:console.log('[mime-type] not png/gif/jpg.')break
}
  • 將圖片文件的前 4 個字節(4 個字節的長度已經足夠判斷出圖片的類型了)拿出來進行判斷,一般拍照上傳的照片是 JPG 或 PNG,所以這里只需要判斷出圖片是否是帶有 ALPHA 通道的圖片即可。

② decode 方法解析圖片文件

  • 上面判斷出圖片類型之后,就可以通過 decode 方法解碼圖片文件:
const bitmap = imagecodec.decode(picture, {components: type === 'png' ? imagecodec.COMPONENTS_RGB_ALPHA : imagecodec.COMPONENTS_RGB
})
  • decode解析得到的 bitmap 為一個圖像像素對象,它包含 width,height,components,buffer 4個屬性,也正是 FaceNN 所需要的內容。

③ 解析圖片中的人臉信息

  • 這里跟 AI 識別的內容基本一致:
const facenn = require('facenn')const faces = facenn.detect(bitmap.buffer, {width: bitmap.width,height: bitmap.height,pixelFormat: type === 'png' ? facenn.PIX_FMT_RGBA2RGB24 : facenn.PIX_FMT_RGB24
}, true)
  • 此時得到的 faces 內容就是識別之后的人臉特征信息,從圖片中獲取面部信息的功能就完成。

④ 封裝成包

  • 這個功能已經封裝成一個 jsre 包上傳到了 npm 倉庫,可以通過以下方式進行安裝和使用:
npm install @edgeros/ofiiconst getFaceFeature = require('@edgeros/ofii')
const imageBuffer = fs.readFile('./hunman.png')
const keys = getFaceFeature(imageBuffer)
// 如果沒有檢測到人臉信息則返回 []
  • 在不同的場景中我們需要對圖片進行編碼解碼,來配合完成更加復雜的功能和服務。EdgerOS 在網絡應用,人工智能等場景提供了豐富的接口,能夠極大簡化開發流程。

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

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

相關文章

ArkUI組件

目錄 一、概述 聲明式UI 應用模型 二、常用組件 1、Image:圖片展示組件 示例 配置控制授權申請 2、Text:文本顯示組件 示例 3、TextInput:文本輸入組件 示例 4、Button:按鈕組件 5、Slider:滑動條組件 …

Swagger PHP Thinkphp 接口文檔

安裝 1. 安裝依賴 composer require zircote/swagger-php 2. 下載Swagger UI git clone https://github.com/swagger-api/swagger-ui.git 3. 復制下載好的Swagger UI 中的dist目錄到public目錄中,修改目錄名稱 cp -rf swagger-ui/dist /home/htdocs/public/ m…

vue中設置滾動條的樣式

在vue項目中,想要設置如下圖中所示滾動條的樣式,可以采用如下方式: ?// 直接寫在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑塊部分// border-radius: 5px;background-color: #1890ff;…

【智能家居】智能家居項目

智能家居項目目錄 項目目錄結構 完整而典型的項目目錄結構 CMake模板 CMake編譯運行 README.md 項目說明文檔 智能家居項目目錄 【智能家居】面向對象編程OOP和設計模式(工廠模式) 【智能家居】一、工廠模式實現繼電器燈控制 【智能家居】二、添加火災檢測模塊(…

4-Docker命令之docker ps

1.docker ps介紹 docker ps命令是用來列出容器的相關信息 2.docker ps用法 docker ps [參數] [rootcentos79 ~]# docker ps --helpUsage: docker ps [OPTIONS]List containersAliases:docker container ls, docker container list, docker container ps, docker psOptions…

【重點】【二叉樹】199.二叉樹的右視圖

題目 法1:層次遍歷 最佳方法&#xff0c;牢記&#xff01;&#xff01;&#xff01; class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> res new ArrayList<>();if (root null) {return res;}Queue<TreeNode> q…

Java 克隆:復制構造函數與克隆

為了實現克隆&#xff0c;我們需要配置我們的類并遵循以下步驟&#xff1a; 在我們的類或其超類或接口中實現 Cloneable 接口。 定義一個應處理 CloneNotSupportedException&#xff08;拋出或記錄&#xff09;的 clone() 方法。 并且&#xff0c;在大多數情況下&#xff0c;我…

Ubuntu上svn基本使用(gitee提交下載)

目錄 環境準備 1. 獲取代碼到本地 直接獲取 獲取代碼時加入用戶名密碼 指定版本更新 2. 提交代碼 3. 展示代碼列表 4. 添加代碼文件(目錄) 5. 刪除gitee倉庫中的文件 參考文檔鏈接 環境準備 當前操作系統為Ubuntu22.04LTS gitee 創建倉庫時 需要打開svn的支持 sudo…

GoLong的學習之路,進階,微服務之使用,RPC包(包括源碼分析)

今天這篇是接上上篇RPC原理之后這篇是講如何使用go本身自帶的標準庫RPC。這篇篇幅會比較短。重點在于上一章對的補充。 文章目錄 RPC包的概念使用RPC包服務器代碼分析如何實現的&#xff1f;總結Server還提供了兩個注冊服務的方法 客戶端代碼分析如何實現的&#xff1f;如何異步…

nginx配置正向代理支持https

操作系統版本&#xff1a; Alibaba Cloud Linux 3.2104 LTS 64位 nginx版本&#xff1a; nginx-1.25.3 1. 下載軟件 切換目錄 cd /server wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.1解壓 tar -zxvf nginx-1.25.3.tar.gz 1.2切換到源碼所在目錄…

【探索Linux】—— 強大的命令行工具 P.21(多線程 | 線程同步 | 條件變量 | 線程安全)

閱讀導航 引言一、線程同步1. 競態條件的概念2. 線程同步的概念 二、條件變量1. 條件變量函數?使用前提&#xff08;1&#xff09;初始化條件變量&#xff08;2&#xff09;等待條件滿足&#xff08;3&#xff09;喚醒等待pthread_cond_broadcast()pthread_cond_signal() &…

JavaGUI詳解

GUI Java GUI**1、Java GUI 概述****2、容器****2、1 窗口****2、2 彈窗和對話框****對話框****自定義彈窗** **2、3 面板****普通面板****滾動面板****分隔面板****選項卡面板** **3、布局****3.1、流式布局****3.2、網格布局****3.3、邊框布局****4、組件****4.1、基本組件**…

Steampipe的安裝部署及簡單使用(附帶AWS CLI的安裝與使用)

介紹 Steampipe 將 API 和服務公開為高性能關系數據庫&#xff0c;使您能夠編寫基于 SQL 的查詢來探索動態數據。Mods 通過使用簡單 HCL 構建的儀表板、報告和控件擴展了 Steampipe 的功能。 官網&#xff1a;https://steampipe.io/ steampipe的安裝 下載腳本并執行 sudo /…

Unity優化——批處理的優勢

大家好&#xff0c;這里是七七&#xff0c;前段時間在忙一些事情&#xff0c;最近終于有空來更新優化篇了。本文本打算分為上下兩篇&#xff0c;但為了看更方便&#xff0c;就多花了幾天寫成一文發布&#xff0c;具體是介紹了圖形優化中批處理的具體效果&#xff0c;雖然本文篇…

【Linux】cat 命令使用

cat 命令 cat&#xff08;英文全拼&#xff1a;concatenate&#xff09;命令用于連接文件并打印到標準輸出設備上。 可以使用cat連接多個文件、創建新文件、將內容附加到現有文件、查看文件內容以及重定向終端或文件中的輸出。 cat可用于在不同選項的幫助下格式化文件的輸出…

LV.13 D1 嵌入式系統移植導學 學習筆記

一、嵌入式系統分層 操作系統&#xff1a;向下管理硬件、向上提供接口 操作系統為我們提供了&#xff1a; 1.進程管理 2.內存管理 3.網絡接口 4.文件系統 5.設備管理 那系統移植是干什么呢&#xff1f; 就是將Linux操作系統移植到基于ARM處理器的開發板中。 那為什么要移植系…

【calcitonin ; 降鈣素 ;降鈣素原】

Parathyroid_Hormone -甲狀旁腺激素 PTH &#xff1b; 特立帕肽&#xff1b;

『OPEN3D』1.8.2 全局ICP配準

前文提到的多種icp方式均需要初始的變換函數作為配準過程的初始值,并在該初始值上進行迭代優化得到結果;那么global icp為前面這些精配準的icp提供了初始變換函數。因此global ICP配準后可視化的點云結果可能沒有完全配準,需要再進行一次精配準操作。 global icp需要對點云提…

lightdb plorasql集合類型新增可變數組

文章目錄 背景集合類型可變數組可變數組示例 背景 在信創適配中&#xff0c;從Oracle遷移過來的存儲過程使用到可變數組。因此在LightDB-X 23.4版本中對現有的集合類型進行了增強&#xff0c;添加了可變數組類型。 集合類型 在LightDB-X 23.4版本開始plorasql支持的集合類型…

【SQL開發實戰技巧】系列(四十八):Oracle12C常用新特性?多分區操作和管理

系列文章目錄 【SQL開發實戰技巧】系列&#xff08;一&#xff09;:關于SQL不得不說的那些事 【SQL開發實戰技巧】系列&#xff08;二&#xff09;&#xff1a;簡單單表查詢 【SQL開發實戰技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL開發實戰技巧…