最近看简书文章,可能因为大数据的原因,一直给我推送人工智能方面的文章,前两天就一直在想,都说python用来开发人工智能很热门,Java大数据也是应用广泛,那抛弃用户量不提,我能否使用Node.js去实现人工智能的某些功能呢?我查了查百度AI开放平台,发现人脸识别其实官方文档就有集成Node.js版本。刚好这两天不是很忙,遂想着亲自动手尝试一下百度AI人脸识别接口。
既然百度提供了Node.js版的SDK,那我们可以使用SDK先快速进入开发。首先进入百度AI:
> https://ai.baidu.com/
登录成功进入控制台,点击左侧人脸识别,进入开始创建应用
创建成功后进入管理应用,可以得到开发需要的APPID,API KEY,SECRET KEY,得到这三个参数值之后我们去下载一份Node.js版本的人脸识别SDK:
> https://ai.baidu.com/sdk#bfr
准备工作全部完成,我们接下来新建一个Node.js项目。然后将解压后的SDK放进Node项目中。
可以看到我们已经将解压后的SDK放到我们的项目中,现在在终端进入SDK,然后安装SDK所需的依赖,命令为:
> npm install
然后回到项目主目录,将整个SDK作为依赖,在主目录安装依赖,命令为:
> npm install baidu-aip.sdk
到这里引入SDK到我们本地项目就完成了,接下来我们来看下SDK文档:
我们可以先写个接口测试下第一个接口:人脸检测:
首先,我们将我们应用的三个秘钥保存在config.js中
创建一个client对象,调用服务接口进行使用。
发送网络请求SDK中已经对request模块进行了封装,我们可以根据自己需要对request的参数进行设置。
接下来我们可以进行人脸检测的调用,SDK已经将接口给我们封装好了,人脸检测的接口分为带可选参数与不带可选参数。有什么区别呢?我们可以看下接口请求参数:
可以看到我们必传的参数有两个:image和imageType:
> image就是图片可以为url, base64以及FACE_TOKEN
> imageType就是图片类型,可选值有URL, BASE64, FACE_TOKEN。
image就是图片可以为url, base64以及FACE_TOKEN
而imageType就是图片类型,可选值有URL, BASE64, FACE_TOKEN。
其他三个参数是可选的参数,所以我们先来看看不带可选参数的接口如何进行调用:
> client.detect(image, imageType)
我们调用该方法,传参image为网络图片url以及imageType为URL,看看会有什么效果
调用下接口我们可以看到对图片进行了解析,返回了一系列数据
这么多参数究竟干嘛的呢?我们可以看下官方文档对返回参数的说明:
因为返回参数过多,我就不一一截屏,这里贴下Node版SDK文档,可以自行查看:
> https://cloud.baidu.com/doc/FACE/Face-Node-SDK.html#.E4.BA.BA.E8.84.B8.E6.A3.80.E6.B5.8B
有了文档我们就可以知道返回参数的意思了
> face_num代表在图片中检测到一张人脸
> face_list就包含人脸的具体信息
> location对人脸相对于图片位置进行了定位,客户端就可以根据位置信息对人脸进行特效的展示。
> face_token就是图片解析生成的一个唯一标识的字符串,解析image可以直接传入face_token
> face_probability代表图片是一张人脸的可能程度,1为概率最大
> angle则为人脸旋转程度
解析结果会返回人脸相对于图片的定位,客户端就可以针对位置信息对人脸进行聚焦等操作。第二个接口可选参数又是什么样的呢?我们可以再看看刚才请求参数:
我们有三个可选传的参数:
> face_field:指定返回信息
> max_face_num:可检测最多人脸数量
> face_type:照片类型
我们调用detect方法就需要多传options参数,方法为:
> client.detect(image, imageType, options)
我们使用该方法指定返回年龄,指定最大检测人脸为2,照片类型为生活照
我们可以看下运行效果:
我们可以看到返回多了一个age字段,解析返回的预估年龄。
第一个接口到这里没问题了,但是会有一个疑问?我们就是调用了detect方法,为什么就直接返回解析信息呢?其实完整的流程应该是:
> 通过appID及api_secret获取access_token凭证
> 发起http请求人脸检测接口,检测成功返回数据
但是获取access_token以及发起http请求这部分SDK其实都已经封装完成,所以我们可以直接使用。我们可以在刚才调用封装的http请求里面打印请求参数,然后再次发起请求:
我们会看到请求人脸检测的接口已经完全封装好了,你只需要调用detect方法,中间的步骤SDK全部帮你进行处理了。
然后接下来我们来看看人脸注册接口,人脸注册该人脸就会与我们设置的groupId与userId进行绑定,人脸注册可以调用方法:
> client.addUser(image, imageType, groupId, userId)
我们先看看发起请求需要携带的参数列表:
前两个参数就不多说了,group_id是组id,user_id为用户id。我们可以写个接口看下效果:
我们调用client.addUser()方法,进行人脸注册,我们看下运行效果:
老规矩,贴下文档关于返回参数的解释:
与人脸解析一样,选传参数可以对用户资料,图片质量等参数进行选传,注册成功该人脸就会绑定传的用户资料。这里就不过多解释了,具体可以看下文档自行测试。
上一个接口我们注册了一个人脸,我们可以调用人脸搜索接口看看是否能搜索到该人脸。首先看看人脸搜索需要调用的方法:
> client.search(image, imageType, groupIdList)
这个方法需要解释的第三个参数,在指定的组里进行搜索人脸,如果同时在多个组里搜索就用,隔开。老规矩我们先看下调用本方法的请求参数列表:
我们使用不带选传参数调用人脸搜索接口测试:
接下来调用下看下人脸搜索是否有效果:
可以看到我们在组1中找到了该人脸,我们可以测试下如果在不存在该人脸的组中查询会有什么效果呢?
我在组2中搜索该人脸,未找到人脸信息。所以只有经过人脸注册,将人脸信息保存到指定的组中,才可以在指定的组中找到该人脸。
本篇文章暂时先介绍这三个接口供大家借鉴,下一篇将继续介绍人脸识别其他的API。如果喜欢,请关注我的个人公众号:周先生自留地。一个未来的NodeJS践行者。