当前位置: 首页 > 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,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...