天天看點

産品百科 | 如何快速內建阿裡雲 RACE 美顔功能

産品介紹

RACE 是渲染計算平台(Render And Compute Everything Engine)的簡寫。RACE 美顔包含圖像及視訊渲染能力,如濾鏡、特效、貼紙,以及美顔美型、人臉檢測等算法能力,覆寫多種拍攝、剪輯場景,滿足客戶豐富的産品需求。

快速內建

  • Android 端,支援 maven 與 aar 離線內建兩種方式:
    • maven 依賴內建方式:maven { url "https://maven.aliyun.com/nexus/content/repositories/releases" } implementation 'com.aliyun.race:AliyunRace:1.1.1'。
    • 本地內建方式:擷取 AliyunRace.aar 檔案并添加到工程中。
  • iOS 端,支援 pod 與 framework 離線內建兩種方式:
    • pod 依賴內建方式:pod 'AliyunRace', '1.1.1'。
    • 本地內建方式:将 AliyunRace.framework、Face3D.framwork、opencv2.framework 添加到工程中。

接入指南

  • RACE 美顔 Android 端的內建方式、接口說明和實作步驟請參照 RACE 美顔 Android 端接入指南
  • RACE 美顔 iOS 端的內建方式、接口說明和實作步驟請參照

美顔美型功能

  • 功能介紹。進階美顔包含美白、磨皮、銳化等功能,美型預設包含優雅、精緻、網紅、可愛、嬰兒五種臉型。該功能提供包括眼睛、鼻子、嘴形等 22 種預置形狀,便于客戶根據産品需求擴充豐富的功能。
  • 資料結構及接口介紹。
    • 美型形狀類型。
/**
 * 美型形狀類型
 */
typedef enum ALRFaceShape
{
    ALR_FACE_TYPE_CUT_CHEEK       = 0, //顴骨      [0,1]
    ALR_FACE_TYPE_CUT_FACE        = 1, //削臉      [0,1]
    ALR_FACE_TYPE_THIN_FACE       = 2, //瘦臉      [0,1]
    ALR_FACE_TYPE_LONG_FACE       = 3, //臉長      [0,1]
    ALR_FACE_TYPE_LOWER_JAW       = 4, //下巴縮短  [-1,1]
    ALR_FACE_TYPE_HIGHER_JAW      = 5, //下巴拉長  [-1,1]
    ALR_FACE_TYPE_THIN_JAW        = 6, //瘦下巴    [-1,1]
    ALR_FACE_TYPE_THIN_MANDIBLE   = 7, //瘦下颌    [0,1]
    ALR_FACE_TYPE_BIG_EYE         = 8, //大眼     [0,1]
    ALR_FACE_TYPE_EYE_ANGLE1      = 9, //眼角1     [0,1]
    ALR_FACE_TYPE_CANTHUS         = 10,//眼距     [-1,1]
    ALR_FACE_TYPE_CANTHUS1        = 11,//拉寬眼距 [-1,1]
    ALR_FACE_TYPE_EYE_ANGLE2      = 12,//眼角2    [-1,1]
    ALR_FACE_TYPE_EYE_TDANGLE     = 13,//眼睛高度 [-1,1]
    ALR_FACE_TYPE_THIN_NOSE       = 14,//瘦鼻     [0,1]
    ALR_FACE_TYPE_NOSE_WING       = 15,//鼻翼     [0,1]
    ALR_FACE_TYPE_NASAL_HEIGHT    = 16,//鼻長     [-1,1]
    ALR_FACE_TYPE_NOSE_TIP_HEIGHT = 17,//鼻頭長   [-1,1]
    ALR_FACE_TYPE_MOUTH_WIDTH     = 18,//唇寬     [-1,1]
    ALR_FACE_TYPE_MOUTH_SIZE      = 19,//嘴唇大小 [-1,1]
    ALR_FACE_TYPE_MOUTH_HIGH      = 20,//唇高     [-1,1]
    ALR_FACE_TYPE_PHILTRUM        = 21, //人中
    ALR_FACE_TYPE_MAX             = 22
} ALRFaceShape;      
    • 說明 對于每一種形狀,可設定參數值超出上述定義的 [-1, 1] 的範圍綜合調試效果。
    • 建立進階美顔執行個體。
/**
 * 建立美顔美型執行個體
 * @param handle 美顔美型句柄指針
 * @param resDir 資源檔案目錄絕對路徑
 * @param rid 資料上報辨別符
 * @param lid 日志上報辨別符
 * @return 成功傳回 ALR_OK,否則傳回 < 0
 */
int aliyun_beautify_create(race_t *handle, const char *resDir, int64_t rid = -1, int64_t lid = -1);      
    • 銷毀進階美顔執行個體。
/**
 * 銷毀美顔美型執行個體
 * @param handle 美顔美型句柄
 */
void aliyun_beautify_destroy(race_t handle);      
    • 進階美顔調試開關。
/**
 * 美顔美型調試開關
 * @param handle 美顔美型句柄
 * @param enable 調試開啟标志
 * @return 成功傳回 ALR_OK,否則傳回 < 0
 */
int aliyun_beautify_setFaceDebug(race_t handle, bool enable);      
    • 美型開關。
/**
 * 美型開關
 * @param handle 美顔美型句柄
 * @param switchOn 是否開啟人臉檢測及美型處理
 */
void aliyun_beautify_setFaceSwitch(race_t handle, bool switchOn);      
    • 設定美型參數。
/**
 * 設定美型參數
 * @param handle 美顔美型句柄
 * @param level 美型等級參數,可以超出 ALRFaceShape 中定義的參數範圍
 * @return 成功傳回 ALR_OK,否則傳回 < 0
 */
int aliyun_beautify_setFaceShape(race_t handle, ALRFaceShape type, float level);      
    • 進階美顔渲染。
/**
 *  進階美顔,輸入是類型 CMSampleBufferRef 的圖像資料,傳回與輸入同樣大小的紋理 id
 *  @param handle 建立成功的句柄
 *  @param sampleBuffer 圖像資料 CMSampleBufferRef
 *  @return 成功則傳回渲染紋理 id,失敗傳回 0
 */
int aliyun_beautify_processSampleBuffer(race_t handle, void *sampleBuffer);
/**
 * 單輸入美顔美型渲染
 * @param handle 美顔美型句柄
 * @param buffer CPU圖像記憶體位址
 * @param bufferSize CPU圖像記憶體位元組數
 * @param format 圖像像素格式
 * @param width 圖像寬度
 * @param height 圖像高度
 * @param bytesPerRow CPU圖像記憶體一行的位元組數
 * @param rotation 圖像旋轉角度(順進針方向)
 * @param range 顔色色域範圍
 * @param standard 色彩标準
 * @param flags 詳見 ALR_FLAG_XXX 定義,如 OES 紋理、鏡像、輸出圖像旋轉等
 * @return 成功則傳回輸出紋理句柄,否則傳回 < 0
 */
int aliyun_beautify_processBufferToTexture(race_t handle,
                                           uint8_t *buffer,
                                           uint32_t bufferSize,
                                           aliyun_image_format_t format,
                                           uint32_t width,
                                           uint32_t height,
                                           uint32_t bytesPerRow,
                                           aliyun_rotation_t rotation,
                                           aliyun_color_range_t range,
                                           aliyun_color_standard_t standard,
                                           uint8_t flags);
/**
 * 美顔美型紋理輸入渲染
 * @param handle 美顔美型句柄
 * @param textureIn 輸入圖像紋理
 * @param width 輸入圖像紋理寬度
 * @param height 輸入圖像紋理高度
 * @param rotation 輸入圖像紋理旋轉角度(順時針)
 * @param flags 詳見 ALR_FLAG_XXX 定義,如 OES 紋理、鏡像、輸出圖像旋轉等
 * @return 成功則傳回輸出紋理句柄,否則傳回 < 0
 */
int aliyun_beautify_processTextureToTexture(race_t handle,
                                            uint32_t textureIn,
                                            uint32_t width,
                                            uint32_t height,
                                            aliyun_rotation_t rotation,
                                            uint8_t flags);
/**
 * 雙輸入美顔美型渲染
 * @param handle 美顔美型句柄
 * @param textureIn GPU紋理 id
 * @param buffer CPU圖像記憶體位址
 * @param bufferSize CPU圖像記憶體位元組數
 * @param format 圖像像素格式
 * @param width 圖像寬度
 * @param height 圖像高度
 * @param bytesPerRow CPU圖像記憶體一行的位元組數
 * @param rotation 圖像旋轉角度(順進針方向)
 * @param flags 詳見 ALR_FLAG_XXX 定義,如 OES 紋理、鏡像、輸出圖像旋轉等
 * @return 成功則傳回輸出紋理句柄,否則傳回 < 0
 */
int aliyun_beautify_processDualInputToTexture(race_t handle,
                                              uint32_t textureIn,
                                              uint8_t *buffer,
                                              uint32_t bufferSize,
                                              aliyun_image_format_t format,
                                              uint32_t width,
                                              uint32_t height,
                                              uint32_t bytesPerRow,
                                              aliyun_rotation_t rotation,
                                              uint8_t flags);      
  • 接口內建示例。
#include "aliyun_beautify.h"
race_t beautify = nullptr;
// 建立進階美顔執行個體
// iOS: RACE内部自動從Framework讀取,可傳空字串。
// Android: 外部需将asserts/race_res目錄拷貝到sdcard或者可通路的路徑,并将此路徑作為參數傳入如/sdcard
aliyun_beautify_create(&beautify, "");
// 設定美顔參數
aliyun_beautify_setSkinBuffing(beautify, skinBuffingValue); //磨皮
aliyun_beautify_setSkinWhitening(beautify, skinWhiteningValue); //美白
aliyun_beautify_setSharpen(beautify, sharpenValue); //銳化
// 設定美型參數
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_BIG_EYE, bigEyeValue);//大眼
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_LONG_FACE, longFaceValue);//臉長
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_CUT_FACE, cutFaceValue);//削臉
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_THIN_FACE, thinFaceValue);//瘦臉
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_LOWER_JAW, lowerJawValue);//下巴
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_MOUTH_WIDTH, mouthWidthValue);//唇寬
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_THIN_NOSE, thinNoseValue);//瘦鼻
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_THIN_MANDIBLE, thinMandibleValue);//下颌
aliyun_beautify_setFaceShape(beautify, ALR_FACE_TYPE_CUT_CHEEK, cutCheekValue);//顴骨
// iOS: 美顔美型效果處理,傳回渲染後的結果紋理id。
textureOut = aliyun_beautify_processSampleBuffer(beautify, sampleBuffer);
// Android & iOS: 單紋理輸入
textureOut = aliyun_beautify_processTextureToTexture(beautify,
                                                     textureIn,
                                                     width, height,
                                                     rotation, flags);
// Android & iOS: CPU記憶體+GPU紋理雙輸入
textureOut = aliyun_beautify_processDualInputToTexture(beautify,
                                                       textureIn,
                                                       buffer, bufferSize, 
                                                       format, width, height,
                                                       bytePerRow,
                                                       rotation, flags);
// 銷毀美顔美型執行個體
aliyun_beautify_destroy(beautify);      

人臉檢測

  • 功能介紹。在靜态的照片、圖像或動态的視訊流中,使用人臉檢測技術可以快速準确地辨識出單張或多張人臉,并檢測出人臉所在的位置。
// 宏定義
#define ALR_FACE_DETECT_MODE_VIDEO           0x10000000  // video
#define ALR_FACE_DETECT_MODE_IMAGE           0x20000000  // image
/// 網絡模型
#define ALR_FACE_DETECT_NETWORK_HBN          0x00000001  // HBN
#define ALR_FACE_DETECT_NETWORK_FASTERRCNN   0x00000002  // Faster RCNN
// 人臉區域
typedef struct aliyun_rect_t
{
    int left;    //left of face rectangle
    int top;     //top of face rectangle
    int right;   //right of face rectangle
    int bottom;  //bottom of face rectangle
} aliyun_rect_t;
// 點的資料結構
typedef struct aliyun_point_t
{
    float x;
    float y;
} aliyun_point_t;
// 一張人臉的資料結構
typedef struct aliyun_face_t
{
    aliyun_rect_t rect;                   // 人臉區域
    float score;                          // 置信度
    aliyun_point_t landmarks_array[106];  // 106關鍵點
    float landmarks_visible_array[106];  // 106關鍵點遮擋情況
    float yaw;                           // 水準轉角,真實度量的左負右正
    float pitch;                         // 俯仰角,真實度量的上負下正
    float roll;                          // 旋轉角,真實度量的左負右正
    float eye_distance;                  // 兩眼間距
    int faceID;
} aliyun_face_t;
// 多張人臉的資料結構
typedef struct aliyun_face_info_t
{
    aliyun_face_t *p_faces;                 //face info
    int face_count;                      //face detection num
} aliyun_face_info_t;
// 人臉檢測參數類型 
typedef enum
{
    ALR_FACE_PARAM_DETECT_INTERVAL        = 1,  // 人臉檢測的幀率(預設值30,即每隔30幀檢測一次)
    ALR_FACE_PARAM_SMOOTH_THRESHOLD       = 2,  // 人臉關鍵點平滑系數(預設值0.25)
    ALR_FACE_PARAM_POSE_SMOOTH_THRESHOLD  = 4,  // 姿态平衡系數(0,1],越大平滑程度越大
    ALR_FACE_PARAM_DETECT_THRESHOLD       = 5,  // 人臉檢測門檻值(0,1),門檻值越大,誤檢越少,但漏檢測會增加, default 0.95 for faster rcnn; default 0.3 for SSD
    ALR_FACE_PARAM_ALIGNMENT_INTERVAL     = 11, // 人臉檢測對齊間隔,預設1,一般不要超過5
    ALR_FACE_PARAM_MAX_FACE_SUPPORT       = 12, // 最多支援檢出的人臉個數,最大設為32, 主要針對faster rcnn
    ALR_FACE_PARAM_DETECT_IMG_SIZE        = 13, // 人臉檢測輸入的圖像大小,default: 240 for faster rcnn, recommend set 320 for tiny face detection
} aliyun_face_param_type_t;      
    • 建立人臉檢測執行個體。Android 端 C 接口:
/**
 * 建立人臉檢測句柄
 * @param handle
 * @param det_paraPath 人臉檢測模型的路徑
 * @param pts_paraPath 關鍵點檢測模型的路徑
 * @param config
 * @return == 0 OK; < 0 error
 */
RACE_EXTERN int aliyun_face_create(race_t* handle,
                                   JNIEnv* env,
                                   const char* det_paraPath,
                                   const char* pts_paraPath,
                                   unsigned int config);      
    • iOS 端 C 接口:
/**
 * 建立人臉檢測句柄
 * iOS端推薦使用接口
 * @param handle with initialed
 * @param config 檢測圖檔:ALR_FACE_DETECT_MODE_IMAGE,檢測視訊:ALR_FACE_DETECT_MODE_VIDEO
 * @return == 0 OK;  < 0 error
 */
RACE_EXTERN int aliyun_face_default_create(race_t* handle, unsigned int config);
/**
 * 建立人臉檢測句柄
 * @param handle with initialed
 * @param det_paraPath 人臉檢測模型的絕對路徑
 * @param pts_paraPath 關鍵點檢測模型的絕對路徑
 * @param config 檢測圖檔:ALR_FACE_DETECT_MODE_IMAGE,檢測視訊:ALR_FACE_DETECT_MODE_VIDEO,人臉檢測模型選擇模型1,則增加ALR_FACE_DETECT_NETWORK_HBN,選擇模型3,則增加ALR_FACE_DETECT_NETWORK_FASTERRCNN
 * @return == 0 OK; < 0 error
 */
RACE_EXTERN int aliyun_face_create(race_t* handle,
                       const char* det_paraPath,
                       const char* pts_paraPath,
                       unsigned int config);      
    • 設定人臉檢測參數。
/**
 * 設定人臉檢測參數
 * @param handle with initialed
 * @param type face_param_type
 * @param value new threshold
 * @return = 0 OK; < 0 error
 */
RACE_EXTERN int aliyun_face_setParam(race_t handle, aliyun_face_param_type_t type, float value);      
    • 調用人臉檢測接口。
/**
 * 人臉檢測
 * @param handle with initialed
 * @param buffer input image
 * @param format support type BGR、RGBA、RGB、Y(GRAY),推薦使用RGBA
 * @param width  width
 * @param height height
 * @param bytesPerRow 用于檢測的圖像的跨度(以像素為機關),即每行的位元組數
 * @param rotation rotate image to frontalization for face detection
 * @param config MOBILE_FACE_DETECT, or MOBILE_FACE_DETECT|MOBILE_EYE_BLINK et.al 預設值0
 * @param outRotation result process rotate specific angle first, angle =  0/90/180/270
 * @param outFlipAxis  flip x/y 0(no flip)/1(flip X axis)/2(flip Y axis)
 * @param faceInfo store face detetion result
 * @return = 0 OK; < 0 error
 */
RACE_EXTERN int aliyun_face_detect(race_t handle,
                                   uint8_t *buffer,
                                   aliyun_image_format_t format,
                                   uint32_t width,
                                   uint32_t height,
                                   uint32_t bytesPerRow,
                                   aliyun_rotation_t rotation,
                                   uint32_t config,
                                   aliyun_rotation_t outRotation,
                                   uint32_t outFlipAxis,
                                   aliyun_face_info_t* faceInfo);      
    • 銷毀人臉檢測執行個體。
/**
 * 銷毀人臉檢測句柄
 * @param handle  with initialed
 */
RACE_EXTERN void aliyun_face_destroy(race_t handle);      
race_t handle = nullptr;
// for Android
aliyun_face_create(handle,
                   "/sdcard/race_res/models/0_3/fd_00002_3",
                   "/sdcard/race_res/models/0_3/fd_00002_12",
                   ALR_FACE_DETECT_NETWORK_FASTERRCNN | ALR_FACE_DETECT_MODE_VIDEO);
// for iOS
aliyun_face_default_create(handle, ALR_FACE_DETECT_MODE_VIDEO);
// 設定檢測間隔,推薦設定為5
aliyun_face_setParam(handle, ALR_FACE_PARAM_DETECT_INTERVAL, 5);
aliyun_face_info_t info;
aliyun_face_detect(handle,
                   buffer,
                   ALR_IMAGE_FORMAT_NV21,
                   1280,
                   720,
                   1280,
                   ALR_ROTATE_90_CW,
                   0,
                   ALR_ROTATE_90_CW,
                   0,
                   &info);
aliyun_face_destroy(handle);      
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
産品百科 | 如何快速內建阿裡雲 RACE 美顔功能