Hi头像

Hi头像

  • 网站首页
  • 技术博客
  • 教程小册

›2-项目配置

标题

  • 《从0到1开发一个智能头像识别小程序》

1-前言

  • 1.1 产品需求设计、页面流程图及项目规划
  • 1.2 技术选型的依据

2-项目配置

  • 2.1 小程序开启云开发模式
  • 2.2 人脸五官分析的环境配置

3-知识储备

  • 3.1 图片裁剪、模糊、保存、分享的技巧
  • 3.2 Canvas绘制技巧,包含小程序与 Web 端
  • 3.2 云开发图像处理的使用方法

4-实战开发

  • 4.1.1 上篇:借助云存储和图像处理扩展人脸智能裁剪
  • 4.1.2 下篇:图像识别流程——图片裁剪、图片压缩、base64转换
  • 4.2 云开发必备——图像安全审核
  • 4.3 通过五官分析实现为人脸佩戴贴纸
  • 4.4 人脸贴纸移动技巧
  • 4.5 头像绘制和图片保存弹窗
  • 4.6【未写】海报分享页面
  • 4.7 CMS扩展实战-节日主题贴纸放在云开发
  • 4.8 【第二期】个人中心的制作
  • 4.9【第二期】小程序与Web端的账户体系摸索

云开发-公众号外发

  • 图片识别加速,从10秒变为1秒,是怎么做到的呢?
  • 简单几步,让微信小程序变身 H5 网页
  • 【草稿】借助云存储,让大图识别转换真正加速
  • 云开发CMS实战-Hi头像节日主题贴纸大升级
  • 小程序云开发环境部署静态网站托管的实战
  • Web 云开发实战之盲水印添加工具(核心版)
  • Web 云开发实战之盲水印添加工具(步骤版)

更多探索

  • 【草稿】深色模式在Web端的适配技巧,附带小程序侧的思考
  • 【草稿】小程序框架:Taro 2.0与Taro 3.0的核心分析

2.2 人脸五官分析的环境配置

v2 版中使用微信平台市场上优图的方案,具体代码在 taro/src/utils/image-analyze-face.js 内。

本文知识点

  • 腾讯云人脸五官分析的调用方法
  • 腾讯云人工智能服务介绍

腾讯云上除了有基本的域名、云服务器、云数据库以外,还有非常多的人工智能服务,这些服务都是有免费额度的,比如我所使用的人脸识别每个月就有10000次调用额度,还支持按量付费。关键是,这些功能都可以用 tencentcloud-sdk-nodejs 来直接调用。

在 tencentcloud-sdk-nodejs 中给出了详细的使用方法,而我这里把我的配置思路来讲解一下,把其中的一些细节优化点给写出来。

人脸五官分析的配置及调用

环境配置步骤大致为

  • 申请安全凭证,即 SecretID 和 SecretKey,链接
  • 将安全凭证放在config.js文件中
  • 在主要功能里面调用安全凭证,并按照 tencentcloud-sdk-nodejs 给出的示例代码来编写功能

配置安全密钥

将关键性配置抽离出来,在 .gitignore 将该文件忽略

// cloud/functions/analyze-face/config.js
module.exports = {
  SecretId: '',
  SecretKey: ''
}

封装云函数:人脸五官分析

将人脸五官分析的主要源码给简单分析一下

对请求图片进行五官定位(也称人脸关键点定位),计算构成人脸轮廓的 90 个点,包括眉毛(左右各 8 点)、眼睛(左右各 8 点)、鼻子(13 点)、嘴巴(22 点)、脸型轮廓(21 点)、眼珠[或瞳孔](2点)。

// cloud/functions/analyze-face/index.js

const tencentcloud = require('tencentcloud-sdk-nodejs')
const config = require('./config')
const status = require('./status')

// 腾讯云的 SecretId 和 SecretKey
let secretId = config.SecretId || ''
let secretKey = config.SecretKey || ''


const IaIClient = tencentcloud.iai.v20180301.Client;
const models = tencentcloud.iai.v20180301.Models;

const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;

let httpProfile = new HttpProfile();
// 设置endpoint,对应的是具体产品所在的接口位置
httpProfile.endpoint = "iai.tencentcloudapi.com";
let clientProfile = new ClientProfile();

/*
推荐使用 V3 鉴权。当内容超过 1M 时,必须使用 V3 签名鉴权。https://cloud.tencent.com/document/product/1093/39964
*/
clientProfile.signMethod = "TC3-HMAC-SHA256";
clientProfile.httpProfile = httpProfile;

// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
let cred = new Credential(secretId, secretKey);

// 实例化要请求产品(以cvm为例)的client对象
let client = new IaIClient(cred, "ap-shanghai", clientProfile);


const analyzeFace = (Image) => {
  let faceReq = new models.DetectFaceRequest()

  let query_string = JSON.stringify({
    Image
  })
  // 传入json参数
  faceReq.from_json_string(query_string);

  return new Promise((resolve, reject) => {
    // 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
    client.AnalyzeFace(faceReq, function (error, response) {
      // 请求异常返回,打印异常信息
      if (error) {
        const { code = '' } = error
        console.log('code :', code);

        resolve({
          data: {},
          time: new Date(),
          status: -10086,
          // 在 status 中将错误码中做一个中英文对应,以方便调用者查看
          message: 'AnalyzeFace '+ status.FACE_CODE[code] + Image || code || '图片解析失败'
        })
        return
      }
      console.log('AnalyzeFace response :', response)
      // 请求正常返回,打印response对象
      resolve({
        data: response,
        time: new Date(),
        status: 0,
        message: ''
      })
    })
  });
}

module.exports = {
  analyzeFace
}

在云函数主入口调用

云函数主入口,调用analyzeFace功能

// cloud/functions/analyze-face/index.js
const reqFace = require('./req-iai-face').analyzeFace


exports.main = async (event) => {
  const { fileID = '', base64Main = '' } = event

  return analyzeFace(base64Main)
}

其实,在小程序审核时,图片上传或分析时,都是要求鉴别黄暴类的,所以,我这里还尝试使用了微信小程序开放能力的的imgSecCheck来完整这个目标,但发现所支持的图片体积大约为100Kb(官方标注500Kb),后来又换用了腾讯云所提供的类似功能。

腾讯云人工智能的特色功能

五官识别

体验网址:https://ai.qq.com/product/face.shtml#shape

其实,启发我做这个小程序的是这两个文章,《「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽》和《我要戴口罩 – 为微信、微博等社交网络头像戴口罩》。

因为新冠病毒疫情蔓延,而戴口罩就是一个必备的预防措施啦。那怎样才能创新呢,我在使用“我要戴口罩”小程序过程中发现,口罩的位置是手动移动的,我就想如何自动戴过去呢,正好先前看到的“自动识别戴圣诞帽”,那我来一个戴口罩就好了。

在“自动佩戴圣诞帽”中,使用的方案是纯前端的 face-api,想放到小程序中就会有如下几个小问题:

  • face-api 的识别模型有 5M 大小还多,即使纯前端加载,也显得比较大。而小程序的 canvas 与 web 网页中的还是有差异的,没法直接用 face-api。
  • face-api 放在 nodejs 上加载,还需要配合tensorflow和canvas模拟。实际实现后发现,图片识别过程还是比较慢的(图片上传后、获取图片内容、识别五官位置、返回五官数据),容易让接口请求发生超时的情况。

在使用腾讯云的过程中,我就发现,腾讯云的人工智能大类目下居然有人脸识别功能,细致推究发现里面有“五官分析”,其返回的数据跟face-api返回的数据格式还是非常像的,“人脸识别”的每月免费额度 10000 次,当时就让我开心了一大把。

当然,使用过程中非常大的坑就是,我的实现过程是需要上传 1M 以上大小的图片,而“五官分析”签名方法需要TC3-HMAC-SHA256,官方提供 npm 版本tencentcloud-sdk-nodejs是不支持这个签名方法的,需要从官方 GitHub库的signature3分支上下载对应的代码。

人脸识别

体验网址:https://ai.qq.com/product/face.shtml#detect

检测给定图片中的人脸(Face)的位置、相应的面部属性和人脸质量信息,位置包括 (x,y,w,h),面部属性包括性别(gender)、年龄(age)、表情(expression)、魅力(beauty)、眼镜(glass)、发型(hair)、口罩(mask)和姿态 (pitch,roll,yaw),人脸质量信息包括整体质量分(score)、模糊分(sharpness)、光照分(brightness)和五官遮挡分(completeness)。

简单来说就是识别出人脸主要位置,以及给出相应的测评分数。

更多特色功能及对应链接

  • 人像变换,包含年龄、性别 https://cloud.tencent.com/product/ft
  • 人脸美妆,比智能美颜更容易一些 https://ai.qq.com/product/facemakeup.shtml
  • 滤镜效果很不错 https://ai.qq.com/product/imgfilter.shtml
  • 大头贴 https://ai.qq.com/product/sticker.shtml
  • QQ AI的SDK
    • https://www.npmjs.com/package/tencent-ai-nodejs-sdk
    • https://github.com/w89612b/qqai-api-sdk
← 2.1 小程序开启云开发模式3.1 图片裁剪、模糊、保存、分享的技巧 →
  • 人脸五官分析的配置及调用
    • 配置安全密钥
    • 封装云函数:人脸五官分析
    • 在云函数主入口调用
  • 腾讯云人工智能的特色功能
    • 五官识别
    • 人脸识别
    • 更多特色功能及对应链接
Hi头像
文档
开篇介绍
相关资源
云开发 CloudBaseTaro
关于
联系我们GitHub主页Star
Copyright © 2020. All Rights Reserved.
沪ICP备2022023998号