概述
OrangeCloud Beauty SDK 是一套自研的商业级实时美颜开发工具包,提供高精度人脸关键点检测、实时美颜滤镜、瘦脸/大眼变形算法和AR贴纸引擎。支持 Flutter、iOS(Metal)、Android(OpenGL ES)三端统一接口。
核心能力
- AI98点人脸关键点实时检测(基于轻量级CNN模型)
- GPU商业级磨皮/美白滤镜(Metal / OpenGL ES Shader)
- GPUMLS移动最小二乘法瘦脸/大眼变形
- 实时AR贴纸引擎(2D/3D贴纸跟踪渲染)
- 实时30fps+ 全链路实时处理
架构总览
┌─────────────────────────────────────────────────────┐
│ Flutter Dart API │
│ (BeautySDK unified interface) │
├─────────────────────────────────────────────────────┤
│ Platform Channel Bridge │
├──────────────────────┬──────────────────────────────┤
│ iOS (Metal) │ Android (OpenGL ES) │
├──────────────────────┼──────────────────────────────┤
│ ┌────────────────┐ │ ┌────────────────┐ │
│ │ Face Detector │ │ │ Face Detector │ │
│ │ (CNN Model) │ │ │ (CNN Model) │ │
│ ├────────────────┤ │ ├────────────────┤ │
│ │ Beauty Filter │ │ │ Beauty Filter │ │
│ │ (Metal Shader) │ │ │ (GLES Shader) │ │
│ ├────────────────┤ │ ├────────────────┤ │
│ │ Face Deformer │ │ │ Face Deformer │ │
│ │ (MLS Mesh) │ │ │ (MLS Mesh) │ │
│ ├────────────────┤ │ ├────────────────┤ │
│ │ AR Sticker │ │ │ AR Sticker │ │
│ │ Engine │ │ │ Engine │ │
│ └────────────────┘ │ └────────────────┘ │
├──────────────────────┴──────────────────────────────┤
│ Camera Frame Input │
└─────────────────────────────────────────────────────┘
平台支持
| 平台 | 最低版本 | GPU API | 包大小 |
|---|---|---|---|
| iOS | iOS 13.0+ | Metal | ~12MB |
| Android | API 24+ (Android 7.0) | OpenGL ES 3.0 | ~14MB |
| Flutter | Flutter 3.10+ | Platform Channel | 依赖原生层 |
快速集成(3步)
- 添加 SDK 依赖到项目
- 初始化 SDK 并配置美颜参数
- 将相机帧接入 SDK 渲染管线
💡 SDK 初始化时会自动检测设备GPU能力,如果GPU不可用会自动降级到CPU处理模式。
Flutter SDK
安装
在 pubspec.yaml 中添加依赖:
dependencies:
orange_beauty_sdk:
path: ./packages/orange_beauty_sdk
然后执行:
flutter pub get
初始化
import 'package:orange_beauty_sdk/orange_beauty_sdk.dart';
// 初始化 SDK
final beautySDK = OrangeBeautySDK();
await beautySDK.init(BeautyConfig(
locale: 'zh_CN', // 语言设置
enableFaceDetect: true, // 启用人脸检测
enableBeautyFilter: true, // 启用美颜滤镜
enableDeformer: true, // 启用变形
enableSticker: true, // 启用AR贴纸
maxFaces: 5, // 最大检测人脸数
));
相机接入
// 使用 BeautyTextureView 替代普通相机预览
BeautyTextureView(
sdk: beautySDK,
cameraFacing: CameraFacing.front,
onFrameProcessed: (ProcessedFrame frame) {
// 每帧处理完成回调
print('FPS: ${frame.fps}, Faces: ${frame.faceCount}');
},
)
美颜参数
// 设置美颜参数(所有参数范围 0.0 ~ 1.0)
await beautySDK.setBeautyParams(BeautyParams(
smoothing: 0.7, // 磨皮强度
whitening: 0.5, // 美白强度
slimFace: 0.4, // 瘦脸强度
enlargeEye: 0.3, // 大眼强度
));
// 单独调整某个参数
await beautySDK.setSmoothing(0.8);
await beautySDK.setWhitening(0.6);
await beautySDK.setSlimFace(0.5);
await beautySDK.setEnlargeEye(0.4);
AR贴纸
// 加载贴纸资源包
await beautySDK.loadSticker('assets/stickers/cat_ears.json');
// 移除当前贴纸
await beautySDK.removeSticker();
// 获取可用贴纸列表
final stickers = await beautySDK.getAvailableStickers();
完整示例
import 'package:flutter/material.dart';
import 'package:orange_beauty_sdk/orange_beauty_sdk.dart';
class LiveBeautyPage extends StatefulWidget {
@override
State<LiveBeautyPage> createState() => _LiveBeautyPageState();
}
class _LiveBeautyPageState extends State<LiveBeautyPage> {
late OrangeBeautySDK _sdk;
double _smoothing = 0.7;
double _whitening = 0.5;
@override
void initState() {
super.initState();
_initSDK();
}
Future<void> _initSDK() async {
_sdk = OrangeBeautySDK();
await _sdk.init(BeautyConfig(locale: 'zh_CN'));
await _sdk.setBeautyParams(BeautyParams(
smoothing: _smoothing,
whitening: _whitening,
slimFace: 0.4,
enlargeEye: 0.3,
));
}
@override
void dispose() {
_sdk.release(); // 释放所有GPU资源
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
// 美颜相机预览
BeautyTextureView(sdk: _sdk, cameraFacing: CameraFacing.front),
// 美颜参数调节面板
Positioned(
bottom: 100,
left: 20,
right: 20,
child: Column(
children: [
_buildSlider('磨皮', _smoothing, (v) {
setState(() => _smoothing = v);
_sdk.setSmoothing(v);
}),
_buildSlider('美白', _whitening, (v) {
setState(() => _whitening = v);
_sdk.setWhitening(v);
}),
],
),
),
],
),
);
}
Widget _buildSlider(String label, double value, ValueChanged<double> onChanged) {
return Row(
children: [
Text(label, style: TextStyle(color: Colors.white)),
Expanded(child: Slider(value: value, onChanged: onChanged)),
Text('${(value * 100).toInt()}%', style: TextStyle(color: Colors.white)),
],
);
}
}
iOS SDK (Metal)
安装
使用 Swift Package Manager,在 Package.swift 中添加:
dependencies: [
.package(path: "./packages/OrangeBeautySDK")
]
初始化
import OrangeBeautySDK
let config = BeautyConfig(
locale: "zh_CN",
enableFaceDetect: true,
enableBeautyFilter: true,
enableDeformer: true,
enableSticker: true,
maxFaces: 5
)
let beautySDK = try OrangeBeautySDK(config: config)
相机接入
// 实现 BeautyFrameDelegate 协议
class LiveViewController: UIViewController, BeautyFrameDelegate {
func setupCamera() {
beautySDK.frameDelegate = self
beautySDK.startCapture(position: .front)
}
// 处理后的帧回调
func beautySDK(_ sdk: OrangeBeautySDK, didProcess frame: ProcessedFrame) {
// frame.texture 为处理后的 Metal 纹理
// frame.landmarks 为检测到的人脸关键点
metalView.currentTexture = frame.texture
}
}
美颜参数
// 设置美颜参数
beautySDK.setBeautyParams(BeautyParams(
smoothing: 0.7,
whitening: 0.5,
slimFace: 0.4,
enlargeEye: 0.3
))
// 单独调整
beautySDK.setSmoothing(0.8)
beautySDK.setWhitening(0.6)
AR贴纸
// 加载贴纸
try beautySDK.loadSticker(bundlePath: "stickers/cat_ears.json")
// 移除贴纸
beautySDK.removeSticker()
完整示例
import UIKit
import OrangeBeautySDK
class LiveBeautyViewController: UIViewController, BeautyFrameDelegate {
private var beautySDK: OrangeBeautySDK!
private var metalView: MetalPreviewView!
override func viewDidLoad() {
super.viewDidLoad()
setupSDK()
setupUI()
}
private func setupSDK() {
let config = BeautyConfig(locale: "zh_CN")
beautySDK = try! OrangeBeautySDK(config: config)
beautySDK.frameDelegate = self
beautySDK.setBeautyParams(BeautyParams(
smoothing: 0.7, whitening: 0.5,
slimFace: 0.4, enlargeEye: 0.3
))
beautySDK.startCapture(position: .front)
}
func beautySDK(_ sdk: OrangeBeautySDK, didProcess frame: ProcessedFrame) {
metalView.currentTexture = frame.texture
}
deinit {
beautySDK.release()
}
}
Android SDK (OpenGL ES)
安装
在模块级 build.gradle.kts 中添加依赖:
dependencies {
implementation(project(":orange-beauty-sdk"))
}
初始化
import com.orangecloud.beauty.OrangeBeautySDK
import com.orangecloud.beauty.BeautyConfig
val config = BeautyConfig(
locale = "zh_CN",
enableFaceDetect = true,
enableBeautyFilter = true,
enableDeformer = true,
enableSticker = true,
maxFaces = 5
)
val beautySDK = OrangeBeautySDK(context, config)
相机接入
// 使用 BeautyGLSurfaceView
val beautyView = BeautyGLSurfaceView(context)
beautyView.setSDK(beautySDK)
beautyView.setCameraFacing(CameraFacing.FRONT)
beautyView.setFrameCallback { frame ->
// frame.textureId 为处理后的 OpenGL 纹理ID
// frame.landmarks 为检测到的人脸关键点
Log.d("Beauty", "FPS: ${frame.fps}, Faces: ${frame.faceCount}")
}
美颜参数
// 设置美颜参数
beautySDK.setBeautyParams(BeautyParams(
smoothing = 0.7f,
whitening = 0.5f,
slimFace = 0.4f,
enlargeEye = 0.3f
))
// 单独调整
beautySDK.setSmoothing(0.8f)
beautySDK.setWhitening(0.6f)
AR贴纸
// 加载贴纸
beautySDK.loadSticker("stickers/cat_ears.json")
// 移除贴纸
beautySDK.removeSticker()
完整示例
import com.orangecloud.beauty.*
class LiveBeautyActivity : AppCompatActivity() {
private lateinit var beautySDK: OrangeBeautySDK
private lateinit var beautyView: BeautyGLSurfaceView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val config = BeautyConfig(locale = "zh_CN")
beautySDK = OrangeBeautySDK(this, config)
beautySDK.setBeautyParams(BeautyParams(
smoothing = 0.7f, whitening = 0.5f,
slimFace = 0.4f, enlargeEye = 0.3f
))
beautyView = BeautyGLSurfaceView(this)
beautyView.setSDK(beautySDK)
beautyView.setCameraFacing(CameraFacing.FRONT)
setContentView(beautyView)
}
override fun onDestroy() {
super.onDestroy()
beautySDK.release()
}
}
核心模块
人脸关键点检测
基于轻量级CNN模型(MobileNet架构),支持移动端实时推理。使用 300W、WFLW 开源数据集训练,检测98个人脸关键点。
技术指标
| 指标 | 数值 | 说明 |
|---|---|---|
| 关键点数量 | 98点 | 覆盖眉毛、眼睛、鼻子、嘴巴、下颌线、面部轮廓 |
| 推理延迟 | ≤15ms | 中端移动设备 |
| 精度 (NME) | ≤5.0% | WFLW测试集,瞳距归一化 |
| 多人脸支持 | 最多5张 | 同时检测和跟踪 |
| 模型大小 | ≤5MB | 量化后的模型文件 |
| 遮挡容忍 | 30% | 部分遮挡仍可检测 |
美颜滤镜
基于GPU Shader管线实现的实时美颜效果,iOS使用Metal Shader,Android使用OpenGL ES Shader。
滤镜类型
| 滤镜 | 参数名 | 范围 | 说明 |
|---|---|---|---|
| 磨皮 | smoothing | 0.0 ~ 1.0 | 降低皮肤纹理噪声,保留五官边缘细节 |
| 美白 | whitening | 0.0 ~ 1.0 | 均匀调整皮肤区域亮度和饱和度 |
💡 当参数设为 0.0 时,滤镜为直通模式(pass-through),不消耗额外GPU资源。
瘦脸/大眼变形
基于MLS(Moving Least Squares)移动最小二乘法的Mesh变形算法,通过控制人脸关键点实现自然的面部变形效果。
变形类型
| 效果 | 参数名 | 范围 | 说明 |
|---|---|---|---|
| 瘦脸 | slimFace | 0.0 ~ 1.0 | 收窄面部轮廓 |
| 大眼 | enlargeEye | 0.0 ~ 1.0 | 放大眼部区域 |
算法特性
- 单人脸变形计算 ≤5ms
- Mesh三角形边界无撕裂/不连续
- 帧间时间平滑,防止抖动
- 多人脸独立变形参数
AR贴纸引擎
支持2D/3D贴纸的实时渲染与人脸跟踪,贴纸跟随人脸位置、角度、缩放实时更新。
功能特性
- 2D贴纸:基于关键点锚定,支持旋转/缩放/透明度
- 3D贴纸:透视投影渲染,跟随人脸姿态
- 贴纸加载:资源包解析 ≤500ms
- 跟踪同步:30fps+ 无延迟跟踪
- 人脸进出:退出1帧移除,进入3帧内重新附着
贴纸资源包格式
贴纸资源使用JSON格式定义,包含锚点、动画序列和渲染层级信息。
资源包结构
{
"name": "cat_ears",
"version": "1.0.0",
"type": "2d",
"anchors": [
{
"id": "left_ear",
"landmarkIndex": 68,
"offset": { "x": -0.1, "y": -0.3 },
"scale": 1.2
},
{
"id": "right_ear",
"landmarkIndex": 54,
"offset": { "x": 0.1, "y": -0.3 },
"scale": 1.2
}
],
"layers": [
{
"id": "ears_layer",
"resource": "cat_ears.png",
"anchor": "left_ear",
"zIndex": 1,
"blendMode": "normal"
}
],
"animations": [
{
"id": "idle",
"frames": ["frame_01.png", "frame_02.png", "frame_03.png"],
"fps": 12,
"loop": true
}
]
}
制作贴纸
- 准备贴纸素材图片(PNG格式,支持透明通道)
- 确定锚点对应的关键点索引(参考98点关键点图)
- 编写JSON配置文件,定义锚点、层级和动画
- 将所有资源打包到同一目录
加载与卸载
// 加载贴纸(异步,≤500ms完成)
await beautySDK.loadSticker('path/to/sticker.json');
// 切换贴纸(自动卸载旧贴纸)
await beautySDK.loadSticker('path/to/another_sticker.json');
// 移除贴纸
await beautySDK.removeSticker();
// 释放所有贴纸缓存
await beautySDK.clearStickerCache();
多语言支持
Beauty SDK 支持6种语言,与OMS平台保持一致。所有用户可见文本(错误提示、滤镜名称、参数标签等)均支持本地化。
支持的语言
| Locale | 语言 | 示例(磨皮) |
|---|---|---|
en_US |
English | Skin Smoothing |
zh_CN |
中文简体 | 磨皮 |
zh_TW |
中文繁體(台灣) | 磨皮 |
zh_HK |
中文繁體(香港) | 磨皮 |
ko_KR |
한국어 | 피부 보정 |
vi_VN |
Tiếng Việt | Làm mịn da |
配置语言
// 初始化时设置
await beautySDK.init(BeautyConfig(locale: 'zh_CN'));
// 运行时切换(无需重新初始化)
await beautySDK.setLocale('ko_KR');
// 不设置时自动匹配设备系统语言,不匹配则回退到 en_US
性能指标
基准测试(中端设备)
| 指标 | 目标值 | 说明 |
|---|---|---|
| 端到端延迟 | ≤33ms | 相机输入到渲染输出 |
| 帧率 | ≥30fps | 全功能开启 |
| 内存占用 | ≤150MB | 全模块激活时的额外内存 |
| CPU占用 | ≤25% | 单核占比,稳态运行 |
| 丢帧率 | ≤5% | 任意10秒窗口内 |
| 包体大小 | ≤15MB | 单平台(含模型+Shader+原生库) |
优化建议
- 低端设备可关闭AR贴纸模块,仅保留美颜滤镜
- 减少
maxFaces到1可显著降低CPU开销 - 应用进入后台时SDK会自动暂停GPU操作
- 设备低电量模式下检测频率自动降至15fps
⚠️ 如果GPU初始化失败,SDK会自动降级到CPU处理模式,帧率可能降至15fps以下。
错误码
初始化错误
| 错误码 | 名称 | 说明 |
|---|---|---|
| 1001 | INIT_FAILED | SDK初始化失败 |
| 1002 | ALREADY_INITIALIZED | SDK已初始化,请勿重复调用 |
| 1003 | SESSION_ENDED | SDK会话已结束,请重新初始化 |
GPU错误
| 错误码 | 名称 | 说明 |
|---|---|---|
| 2001 | GPU_UNAVAILABLE | GPU设备不可用,已降级到CPU模式 |
| 2002 | SHADER_COMPILE_FAILED | Shader编译失败 |
| 2003 | TEXTURE_CREATE_FAILED | 纹理创建失败,可能内存不足 |
| 2004 | RENDER_PIPELINE_ERROR | 渲染管线执行错误 |
模型错误
| 错误码 | 名称 | 说明 |
|---|---|---|
| 3001 | MODEL_LOAD_FAILED | 人脸检测模型加载失败 |
| 3002 | MODEL_INFERENCE_ERROR | 模型推理执行错误 |
| 3003 | STICKER_PARSE_FAILED | 贴纸资源包解析失败 |
| 3004 | STICKER_RESOURCE_MISSING | 贴纸资源文件缺失 |
| 3005 | INVALID_PARAMETER | 无效参数(超出范围或类型错误) |