一、前言
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 RGB24 RGB24 pixel format facenn.PIX FMT BGR2RGB24 BGR24 to RBG24 pixel format facenn.PIXFMTGRAY2RGB24 Grayscale to RGB24 pixel format facenn.PIX FMT RGBA2RGB24 RGBA to RGB24 pixel format
facenn.detect(videoBuf, attribute[, quick]) pixelFormat {Integer} 图像格式 返回信息: regreCoord {Array} RegreCoord,非快速模式 landmark {Array} Landmark,非快速模式 facenn.detect 可以识别出一帧图像数据中的人脸个数以及人脸所在图像中的位置。 facenn.feature(videoBuf, attribute, faceInfo[, extra]) pixelFormat {Integer} 图像格式 extra {Object} 需要扩展的人脸信息 default: undefined 返回信息: 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 返回信息: 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')
三、ThingNN
ThingNN 是 EdgerOS 可以从视频流或者图片中捕捉到具体事物,分别标记事务所在图片中的具体位置。 ThingNN 引擎封装在 “thingnn” 模块中,可以通过以下方式来导入:
const facenn= require ( 'thingnn ') ;
同样也需要明确一下被识别的图像格式,目前 ThingNN 引擎支持如下格式:
类型 说明 thingnn.PIX FMT_ RGB24 RGB24 pixel format thingnn.PIX_FMT_BGR2RGB24 BGR24 to RBG24 pixel format thingnn.PIX FMT GRAY2RGB24 Grayscale to RGB24 pixel format thingnn.PIX FMT RGBA2RGB24 RGBA to RGB24 pixel format
接下来看看 ThingNN 接口提供了那些接口: thingnn.detect(videoBuf, attribute) pixelFormat {Integer} 图像格式 返回信息: className{Array} Face keys prob{Boolean} 性别, 需要在扩展中选择 目前 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) pixelFormat {Integer} 图像格式 返回信息:具体事物的名称,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')