当前位置: 首页 > news >正文

爱智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 在网络应用,人工智能等场景提供了丰富的接口,能够极大简化开发流程。

相关文章:

爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发

一、前言 AI 视觉是为了让计算机利用摄像机来替代人眼对目标进行识别,跟踪并进一步完成一些更加复杂的图像处理。这一领域的学术研究已经存在了很长时间,但直到 20 世纪 70 年代后期,当计算机的性能提高到足以处理图片这样大规模的数据时&am…...

Pytest+Allure生成自动化测试报告!

前言 在自动化测试中,有unittestHTMLTestRunner自动化测试报告,但是生成的测试报告不够美观详细,今天我们来学习一下PytestAllure生成自动化测试报告。 一:安装python中的allure依赖库 在dos窗口中,输入下面三个命令…...

HTMLTestRunner

HTMLTestRunner是Python的标准库unittest单元测试框架的一个扩 展,用于生成HTML测试报告 下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html HTML测试结果 HTMLTestRunner.py下载地址http://tungwaiyip.info/software/HTMLTestRunner.htm…...

ELK架构监控MySQL慢日志

目录 一、架构概述 二、安装部署 三、Filebeat配置 四、Logstash配置 一、架构概述 本文使用将使用filebeat收集mysql日志信息,发送到redis中缓存,由logstash从redis中取出,发送es中存储,再从kibana中展示。 二、安装部署 ELK…...

Linux命令---关机

介绍 使用命令关闭linux服务器或计算机 命令 立即关机: shutdown -h now指定十分钟后关机: shutdown -h 10...

点云从入门到精通技术详解100篇-基于拓扑约束的3D点云实例分割(续)

目录 3.6实验结果与分析 3.6.1实验数据集 3.6.2实验设置 3.6.3定量结果 3.6.4定性评价...

java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…...

Java之时间类2(JDK8新增)

一、Date类 &#xff08;一&#xff09;、ZoneId&#xff1a;时区 1、概述 ZoneId是Java 8中处理时区的类。它用于表示时区标识符&#xff0c;例如“America/New_York”或“Asia/Tokyo”。一共有600个时区。 2、常用方法: static Set<String> getAvailableZoneIds()获…...

MySQL InnoDB Replication部署方案与实践

1. 概述 MySQL Innodb ReplicaSet 是 MySQL 团队在 2020 年推出的一款产品&#xff0c;用来帮助用户快速部署和管理主从复制&#xff0c;在数据库层仍然使用的是主从复制技术。 ReplicaSet 主要包含三个组件&#xff1a;MySQL Router、MySQL Server 以及 MySQL Shell 高级客户…...

进程的同步和异步、进程互斥

一、进程同步和异步 同步&#xff08;Synchronous&#xff09;&#xff1a; 同步指的是程序按照顺序执行&#xff0c;一个操作完成后才能进行下一个操作。在多进程或多线程的环境中&#xff0c;同步意味着一个进程&#xff08;或线程&#xff09;在执行某个任务时&#xff0c;…...

搞定课件录制,新手必备指南!

“有人知道课件怎么录制吗&#xff1f;学校要求我们师范专业的学生出去实习&#xff0c;现在需要录制一个课件视频&#xff0c;以便在课堂上播放&#xff0c;可是我不会录制教学视频&#xff0c;真的很头疼&#xff0c;有人能帮帮我吗。” 随着在线教育的崛起&#xff0c;课件…...

DevOps搭建(九)-Jenkins实现基础CI、CD详细操作

1、创建可运行SpringBoot项目 1.1、创建一个新工程 在idea里创建一个项目,这里叫devops-test,如下图: String Boot版本要选择2.x的,依赖直选中Spring Web选项即可: 修改pom.xml文件,在build标签中增加如下内容,目的是简化jar包名称。 <finalName>devops-test&l…...

十指波课堂:让学习编程不再是难事

十指波课堂是一家致力于发展线上私教平台的教育机构&#xff0c;主要的科目是计算机编程相关语言。由于学习编程的过程较为困难&#xff0c;学习者没有具体的学习方向&#xff0c;将要达到的就业水平不明&#xff0c;总会因为一些小问题困扰几个小时&#xff0c;这样会严重的影…...

IDEA卡顿,进行性能优化设置(亲测有效)——情况二

问题背景与现象 IDEA今天突然显示到期&#xff0c;于是从同事那边搞到一个很好用的破解方式&#xff0c;说实话&#xff0c;非常方便&#xff08;后续在安前码后中分享&#xff09; 破解之后呢&#xff0c;香了一阵子&#xff0c;但是突然显示开始卡顿&#xff0c;界面几乎是…...

利用Python和OpenCV实现将图像识别为Excel表格的便捷方法

当今社会&#xff0c;图像识别技术的发展为我们提供了许多便利&#xff0c;比如将图像中的文本信息转化为可编辑的电子表格。在本文中&#xff0c;我们将介绍如何利用Python结合OpenCV和pytesseract库&#xff0c;来实现将图像识别为Excel表格的过程。 首先&#xff0c;我们需…...

mysql:查看一个表的索引信息

可以使用命令SHOW INDEX FROM table_name;查看一个表的索引信息&#xff0c;例如&#xff1a;...

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…...

HTTP协议在Linux上进行数据库访问代码示例

在Linux上使用HTTP协议进行数据库访问通常涉及到使用库如requests来进行HTTP请求&#xff0c;以及使用json或类似的库来处理返回的数据。下面是一个使用Python的简单示例&#xff0c;展示如何通过HTTP协议在Linux上访问数据库。 首先&#xff0c;你需要确保你的Linux系统上已经…...

CS.DEEP | 基于 openGauss 实现的计算机论坛项目

前言 本项目是一个基于前后端分离&#xff08;后端&#xff1a;SpringBoot openGauss&#xff0c;前端&#xff1a;Vue3 Element Plus&#xff09;实现的开源计算机博客论坛项目&#xff0c;旨在为用户提供一个方便、高效的博客发布和交流平台。 本平台支持 Markdown 编辑&…...

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…...

快速排序(2)

一、快速排序有三种方法&#xff1a;hoare版本、挖坑法、前后指针版本 但是三种方法的核心思想都是一样的&#xff0c;都是将该数组分为左右两半递归式的排序。 1.hoare版本 该方法是先保存a[keyi]位置的值&#xff0c;然后右边先开动找小&#xff0c;找到小后&#xff0c;左…...

持续集成和持续交付

引言 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案&#xff0c;CI/CD 主要针对在集成新代码时所引发的问题&#xff08;亦称&#xff1a;“集成地狱”&#…...

C#、JavaScript、VBScript解析JSON数据源码

本示例使用设备&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) C#解析JSON数据 string dispstr "{" getChinesecode("扫码") ":}" data; //显示信息,注意中文汉字一定要转换为设备能显…...

JVM面试连环炮:你准备好迎接挑战了吗?

在Java开发领域&#xff0c;JVM面试一直是一个热门话题。作为一名优秀的开发者&#xff0c;你是否已经准备好迎接这场挑战了呢&#xff1f;今天&#xff0c;我们就来深度解析一下JVM面试的热点问题&#xff0c;帮助你更好地应对面试&#xff0c;一举拿下offer&#xff01; 1、…...

Ansible通过kubernetes.core.k8s_info和kubernetes.core.k8s访问OCP

文章目录 环境OCPClient&#xff08;Ansible控制节点&#xff09; 步骤准备工作在client端配置ssh免密登录OCP端在client端安装Ansible kubernetes.core.k8s_info第1次尝试在OCP端安装python和pip3在OCP端安装kubernetes在OCP端安装PyYAML第2次尝试在OCP端配置config文件第3次尝…...

vscode汉化

安装插件 Chinese (Simplified) (简体中文) Language Pack for 重新打开&#xff0c;若还是没有汉化&#xff1a; 【CtrlShiftp】 输入“configure display language”&#xff0c;回车键 选择刚刚安装的 中文(简体)...

美易投资:美国圣诞树价格飙升,涨价的问题所在?

美国圣诞树价格飙升&#xff0c;商家称“拜登经济学”是导致涨价的罪魁祸首 随着圣诞节的临近&#xff0c;美国各地的家庭开始准备庆祝这一传统佳节。然而&#xff0c;今年美国的圣诞树价格却呈现出了明显的上涨趋势。据一些商家反映&#xff0c;这主要是由于“拜登经济学”所致…...

国内外聊天AI大比拼,你知道几个?一键了解最火聊天AI应用!

国内类ChatGPT的AI工具一网打尽 2022年&#xff0c;是一个不平凡的一年。ChatGPT迅速崭露头角&#xff0c;成为备受瞩目的热门话题。特别是在OpenAI发布了基于GPT-3.5模型的ChatGPT版本后&#xff0c;这一产品因其卓越的对话能力和广泛的应用潜力&#xff0c;很快引起了大众的…...

C++STL的vector模拟实现

文章目录 前言成员变量成员函数构造函数push_backpop_backinserterase析构函数拷贝构造 前言 成员变量 namespace but {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; }我们之前实…...

openssl 常用命令 pkcs12

openssl pkcs12 openssl pkcs12 官方文档 1. 描述 The pkcs12 command allows PKCS#12 files (sometimes referred to as PFX files) to be created and parsed. PKCS#12 files are used by several programs including Netscape, MSIE and MS Outlook. pkcs12 命令是用来创…...