test

admin · 3 天前

基于我们完整的讨论,以下是最终版技术文档。


项目技术任务说明(完整版 v3.0)

一、项目概述

开发一套头显下半脸面部追踪系统,包含训练软件产品软件两个独立程序。硬件已确定:头显挂载摄像头,支持1080p MJPEG硬件输出,通过UVC协议连接头显,经5GHz Wi-Fi以UDP/RTP协议推送视频流至PC端进行推理。

核心目标

维度目标
追踪精度嘴部动作连续值回归,对标顶级动画公司面捕标准
输出标准严格对齐Unified Expressions标准(127个参数完整输出框架)
硬件范围只输出下半脸相关参数(42个Base Shapes + 43个Blended Shapes)
开放生态不输出眼动相关参数,主动兼容其他品牌眼动追踪设备,合并为完整127维输出
延迟端到端 < 15ms(v1.0),< 10ms(v2.0)
分辨率优势1080p采集(竞品QVGA),像素数27倍优势
目标用户VRChat玩家 + 虚拟直播 + 专业动画制作

二、核心竞争力

  1. 1080p高清采集:竞品仅支持QVGA(320×240),像素数27倍,能捕捉微表情和肌肉纹理细节

  2. 连续值回归:输出为[0-1]连续强度值,可驱动专业级3D角色

  3. Unified Expressions全标准合规:127个参数框架完整覆盖,消费端无任何妥协

  4. 标注效率创新:带原点滚动条设计,标注效率提升2倍,左右对称天然保证

  5. 开放硬件生态:不输出眼动参数,主动兼容其他品牌眼动追踪设备,自动合并为完整面捕方案

  6. OTA升级潜力:当前降采样推理保证速度,未来可切换高分辨率推理

三、技术理论基础

3.1 FACS(面部动作编码系统)

FACS是科学描述面部肌肉运动的标准,将表情拆解为动作单元(AU),每个AU的强度在A-E(或0-1)连续尺度上量化。

3.2 Blendshape(混合变形)

CG行业实现FACS的标准技术。每个Blendshape代表一个局部动作的“极值”形态,最终表情由所有Blendshape系数(0-1)加权组合。

3.3 Unified Expressions

VRChat面捕生态的事实标准,由VRCFaceTracking等工具广泛采用。共包含84个Base Shapes43个Blended Shapes,总计127个参数。

3.4 三者关系

FACS(科学理论)
    ↓ 工程实现
Blendshape(CG技术)
    ↓ VRChat生态具体化
Unified Expressions(行业标准)

四、硬件范围界定:你输出什么,不输出什么

4.1 你的摄像头能看到什么

下半脸1080p摄像头覆盖范围:嘴部、下巴、脸颊、舌头、部分鼻子(鼻孔边缘)

4.2 你的产品输出的参数(42个Base Shapes)

类别Base Shapes数量
下颌系列JawOpen, JawRight, JawLeft, JawForward, JawBackward5
嘴部动作系列MouthUpperUpRight, MouthUpperUpLeft, MouthLowerDownRight, MouthLowerDownLeft, MouthCornerPullRight, MouthCornerPullLeft, MouthFrownRight, MouthFrownLeft, MouthStretchRight, MouthStretchLeft, MouthDimpleRight, MouthDimpleLeft, MouthUpperDeepenRight, MouthUpperDeepenLeft, MouthPressRight, MouthPressLeft, MouthTightenerRight, MouthTightenerLeft18
唇部系列LipSuckCornerRight, LipSuckCornerLeft, LipSuckUpperRight, LipSuckUpperLeft, LipSuckLowerRight, LipSuckLowerLeft, LipPuckerUpperRight, LipPuckerUpperLeft, LipPuckerLowerRight, LipPuckerLowerLeft10
舌头系列TongueOut, TongueUp, TongueDown, TongueRight, TongueLeft, TongueRoll, TongueFlat7
脸颊系列CheekPuffRight, CheekPuffLeft2
合计42

4.3 你的产品不输出的参数(让给眼动追踪设备)

类别Base Shapes数量
眼部系列EyeLookOutRight, EyeLookInRight, EyeLookUpRight, EyeLookDownRight, EyeLookOutLeft, EyeLookInLeft, EyeLookUpLeft, EyeLookDownLeft, EyeClosedRight, EyeClosedLeft, EyeSquintRight, EyeSquintLeft, EyeWideRight, EyeWideLeft, EyeDilationRight, EyeDilationLeft, EyeConstrictRight, EyeConstrictLeft18
眉毛系列BrowPinchRight, BrowPinchLeft, BrowLowererRight, BrowLowererLeft, BrowInnerUpRight, BrowInnerUpLeft, BrowOuterUpRight, BrowOuterUpLeft8
鼻子系列(部分)NoseSneerRight, NoseSneerLeft, NasalDilationRight, NasalDilationLeft, NasalConstrictRight, NasalConstrictLeft6
合计32

4.4 Blended Shapes的处理方式

所有43个Blended Shapes不经过模型预测,由产品软件层根据42个Base Shapes的值数学计算得出(参照Unified Expressions官方文档的Basis映射关系)。

五、训练软件需求(离线侧)

5.1 开发环境

项目规格
语言Python 3.8+
框架PyTorch 或 TensorFlow
硬件NVIDIA GPU(CUDA支持)
依赖库OpenCV、Albumentations、ONNX、TensorBoard、NumPy

5.2 数据管理

输入:下半脸裁剪图片(112×112×3,RGB),从1080p采集视频中抽帧获得。

5.3 标注方案:带原点滚动条(核心创新)

设计原则:不是标注42个独立参数,而是标注约20个「带原点的滚动条」,软件自动拆分为42个Unified Expressions。

标注控件类型

控件类型标注员操作软件自动拆分为
强度滑块 + 左右偏移拖动强度 + 拖动偏移原点*Right = max(0, 强度 + 偏移) × 0.5;*Left = max(0, 强度 - 偏移) × 0.5
强度滑块(无偏移)拖动强度直接赋值(如JawOpen = 强度)
二维方向拖拽在平面拖拽方向点映射到TongueUp/Down/Right/Left

标注控件完整列表

#控件名称控件类型拆分为(Unified Expressions)
1下颌张合强度滑块(无偏移)JawOpen
2下颌左右移动强度+偏移JawRight, JawLeft
3下颌前后移动强度滑块(无偏移)JawForward, JawBackward
4嘴角上扬强度+偏移MouthCornerPullRight, MouthCornerPullLeft
5嘴角下压强度+偏移MouthFrownRight, MouthFrownLeft
6嘴角外拉强度+偏移MouthStretchRight, MouthStretchLeft
7上唇上提强度+偏移MouthUpperUpRight, MouthUpperUpLeft
8下唇下压强度+偏移MouthLowerDownRight, MouthLowerDownLeft
9唇部内吸强度+偏移LipSuckCorner/Upper/Lower R/L(2个控件:上唇+下唇)
10噘嘴强度+偏移LipPuckerUpper/Lower R/L(2个控件:上唇+下唇)
11舌头伸出强度滑块(无偏移)TongueOut
12舌头方向二维方向拖拽TongueUp/Down/Right/Left
13舌头卷曲强度滑块TongueRoll
14舌头平展强度滑块TongueFlat
15鼓腮强度+偏移CheekPuffRight, CheekPuffLeft
16唇部加深强度+偏移MouthUpperDeepenRight, MouthUpperDeepenLeft
17唇部压紧强度+偏移MouthPressRight, MouthPressLeft
18唇部收紧强度+偏移MouthTightenerRight, MouthTightenerLeft
19酒窝强度+偏移MouthDimpleRight, MouthDimpleLeft

标注效率提升

  • 传统方式:42个独立滑块

  • 你的方式:19个组合控件

  • 标注效率提升:2.2倍

  • 左右对称一致性:软件自动保证

5.4 标注存储格式

每张图片的标注存储为JSON:

{
  "image_id": "frame_0001.jpg",
  "annotations": {
    "JawOpen": 0.72,
    "JawRight": 0.0,
    "JawLeft": 0.0,
    "JawForward": 0.10,
    "JawBackward": 0.0,
    "MouthCornerPullRight": 0.88,
    "MouthCornerPullLeft": 0.85,
    "MouthFrownRight": 0.02,
    "MouthFrownLeft": 0.01,
    // ... 全部42个Base Shapes
  },
  "meta": {
    "annotator": "user_01",
    "timestamp": 1234567890,
    "confidence": 0.95
  }
}

5.5 数据集采集

采集设备:产品硬件本身(头显挂载1080p摄像头)

采集人数:至少50人(不同性别、年龄、脸型),每人完成全套动作

采集动作序列(引导式录制程序):

步骤动作时长目的
1中性脸(自然状态)5秒基线参照
2张嘴→闭嘴循环(慢→快)15秒JawOpen覆盖
3微笑→大笑→收回15秒嘴角上扬覆盖
4悲伤/撇嘴→收回15秒嘴角下压覆盖
5歪嘴(左→右交替)15秒Jaw左右覆盖
6噘嘴→放松→噘嘴15秒LipPucker覆盖
7唇内吸(各种角度)15秒LipSuck覆盖
8吐舌(正中→左→右→上→下)20秒舌头全方向覆盖
9舌头卷曲/平展10秒TongueRoll/Flat覆盖
10鼓腮→泄气循环15秒CheekPuff覆盖
11自由表情组合(自然说话)30秒自然状态组合

5.6 模型架构(多输出回归)

                    ┌─────────────────────────────────────┐
                    │       输入:112×112×3 RGB          │
                    └─────────────────┬───────────────────┘
                                      ▼
                    ┌─────────────────────────────────────┐
                    │   骨干网络:EfficientNet-Lite       │
                    │   (预训练权重,ImageNet)           │
                    └─────────────────┬───────────────────┘
                                      ▼
                    ┌─────────────────────────────────────┐
                    │      全局平均池化 → 1280维特征      │
                    └─────────────────┬───────────────────┘
                                      ▼
                    ┌─────────────────────────────────────┐
                    │   全连接层 → 256维 + ReLU + Dropout │
                    └─────────────────┬───────────────────┘
                                      ▼
                    ┌─────────────────────────────────────┐
                    │   输出层:42维线性输出              │
                    │   激活函数:Sigmoid(严格[0-1])    │
                    └─────────────────────────────────────┘

5.7 训练策略

损失函数:组合损失

Loss = MSE(pred, target) 
     + 0.1 * 相关系数损失(保证参数间自然相关性)
     + 0.05 * 边界惩罚(强制输出在[0,1]区间)

两阶段训练

阶段操作学习率Epochs
阶段一冻结骨干网络,只训练全连接+输出层0.00130-50
阶段二解冻骨干网络最后5层,全模型微调0.000115-25

优化器:AdamW 批大小:32 早停策略:验证集损失连续5个epoch不下降则停止

5.8 评估指标

指标说明v1.0目标
MSE均方误差< 0.01
MAE平均绝对误差< 0.08
Pearson r预测值与真值的相关性> 0.85
单帧推理延迟模型推理耗时< 5ms

5.9 导出物

release_vX.Y.Z/
├── model_vX.Y.Z.onnx              # 标准ONNX模型(明文,内部使用)
├── config.yaml                    # 输入尺寸、归一化参数
├── unified_expressions_42.json    # 42个Base Shapes名称+索引映射
├── blended_shapes_formulas.json   # 43个Blended Shapes计算公式
├── validation_report.html         # 测试集评估报告
└── training_curves.png            # 训练损失曲线

六、产品软件需求(在线侧)

6.1 开发环境

项目规格
语言C++17
推理引擎TensorRT(NVIDIA GPU)
图像处理libjpeg-turbo + OpenCV
网络Socket编程(UDP/RTP)
构建工具CMake
目标平台Windows 10/11

6.2 核心流程

UDP/RTP接收MJPEG流 
    → JPEG解码(libjpeg-turbo) 
    → BGR→RGB转换 
    → 下半脸ROI裁剪 
    → 缩放到112×112 
    → 归一化 
    → TensorRT推理(输出42维)
    → 软件计算43个Blended Shapes
    → 检测其他眼动设备(通过共享内存)
    → 合并数据为127维完整Unified Expressions
    → API输出

6.3 视频接收模块

项目规格
协议UDP + RTP(MJPEG-RTP标准流)
默认端口5000(可配置)
接收线程独立线程,非阻塞
缓冲策略环形缓冲区缓存最近3-5帧
目标帧率30fps
超时处理5秒无数据触发重连

6.4 预处理模块

步骤技术方案性能目标
JPEG解码libjpeg-turbo(硬件加速)< 2ms
颜色转换OpenCV cvtColor< 0.5ms
ROI裁剪固定比例裁剪下半脸< 0.5ms
缩放双线性插值至112×112< 1ms
归一化(pixel/255 - mean)/std< 0.5ms
合计< 5ms

6.5 推理引擎模块

项目规格
推理引擎TensorRT
精度模式FP16
批处理batch_size = 1
输入尺寸3×112×112
输出维度42维(下半脸Base Shapes)
推理延迟目标< 5ms
GPU显存占用< 500MB

模型加载安全流程

读取加密模型(.enc) → AES-256-GCM内存解密 → 加载至TensorRT Engine → 创建推理上下文 → 预热 → 主循环

6.6 Blended Shapes计算层

43个Blended Shapes由软件层根据42个Base Shapes计算得出,不经过模型

计算逻辑示例:

// 示例:MouthSmile = (MouthCornerPullRight + MouthCornerPullLeft) / 2
float MouthSmile = (params["MouthCornerPullRight"] + params["MouthCornerPullLeft"]) * 0.5f;

// 示例:MouthOpen = JawOpen
float MouthOpen = params["JawOpen"];

// 示例:CheekPuff = (CheekPuffRight + CheekPuffLeft) / 2
float CheekPuff = (params["CheekPuffRight"] + params["CheekPuffLeft"]) * 0.5f;

完整43个Blended Shapes的计算公式,严格参照Unified Expressions官方文档的Basis列。

6.7 设备发现与数据合并模块(核心创新)

设计目标:自动检测系统中其他面捕设备,合并数据为完整127维Unified Expressions。

设备发现机制

发现方式检测内容优先级
VRCFaceTracking共享内存扫描检测是否有其他设备已写入眼动参数
Windows设备枚举检测USB/蓝牙连接的已知眼动设备
配置文件手动指定用户手动添加设备IP/端口低(兜底)

数据合并逻辑

// 伪代码
UnifiedOutput MergeData(
    YourDeviceOutput下半脸,    // 42个Base Shapes + 43个Blended
    OtherDeviceOutput上半脸    // 眼动设备输出的Eye+Brow参数
) {
    UnifiedOutput result;
    
    // 1. 所有参数初始化为默认值0
    result.InitAllZero();
    
    // 2. 填充你产品的下半脸数据(覆盖所有嘴部/下巴/脸颊/舌头参数)
    result.Merge(下半脸, OverwriteStrategy.PREFER_YOUR_DEVICE);
    
    // 3. 检测可用的眼动设备
    auto eyeTracker = DetectEyeTracker();
    if (eyeTracker.available) {
        // 合并眼动数据(只填充Eye和Brow系列)
        result.Merge(eyeTracker.data, OverwriteStrategy.PREFER_EYE_TRACKER);
        result.meta.eye_tracker_detected = true;
        result.meta.eye_tracker_name = eyeTracker.name;
    } else {
        result.meta.eye_tracker_detected = false;
        // 眼动参数保持0值
    }
    
    // 4. 时间戳对齐
    result.timestamp = AlignTimestamps(下半脸.timestamp, eyeTracker.timestamp);
    
    // 5. 计算整体置信度
    result.confidence = ComputeConfidence(下半脸, eyeTracker);
    
    return result;
}

6.8 输出接口

最终输出:严格对齐Unified Expressions标准,127个参数完整输出框架。

参数来源数量说明
你的产品直接预测42个Base Shapes下半脸
软件层计算43个Blended Shapes由Base Shapes推导
眼动设备提供32个Base ShapesEye+Brow系列(如无则置0)
合计127个完整Unified Expressions

本地API(共享内存,供VRCFaceTracking调用):

共享内存名称: Local\FacialTracking_Unified
数据结构:
struct UnifiedOutput {
    double timestamp;
    float values[127];         // 完整127维Unified Expressions
    uint8_t valid_count;       // 有效参数数量
    float confidence;          // 整体置信度
    uint8_t eye_tracker_present; // 是否有眼动设备
    char eye_tracker_name[64];   // 眼动设备名称
};

网络回调(HTTP/WebSocket):

POST /api/facial_output
{
  "timestamp": 1234567890.123,
  "standard": "unified_expressions",
  "version": "5.0",
  "values": {
    // 127个参数完整输出
    "JawOpen": 0.72,
    "MouthCornerPullRight": 0.88,
    // ... (全部127个)
  },
  "meta": {
    "total_params": 127,
    "params_from_your_device": 42,
    "params_blended_calculated": 43,
    "params_from_eye_tracker": 32,
    "eye_tracker_detected": true,
    "eye_tracker_name": "OtherBrand EyeTracker Pro",
    "confidence": 0.94
  }
}

6.9 安全防护

防护措施实现方式触发时机
模型加密AES-256-GCM内存解密加载模型加载时
代码混淆Chakravyuha/OaaS编译阶段
完整性校验启动时校验自身二进制SHA256程序启动
反调试检测ptrace/IsDebuggerPresent启动+周期性检查
内存保护推理完成后清零模型权重内存页每次推理结束

七、技术架构总览图

┌─────────────────────────────────────────────────────────────────────────────┐
│                           完整技术架构                                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   ┌──────────────────────────────────────────────────────────────────────┐  │
│   │                    训练软件(离线)                                 │  │
│   │                                                                      │  │
│   │   数据采集(1080p录制)→ 标注(19个带原点滚动条)→ 训练 → 导出ONNX │  │
│   │                                                                      │  │
│   │   标注效率:2.2倍提升    模型输出:42维Base Shapes                   │  │
│   └──────────────────────────────────────────────────────────────────────┘  │
│                                      │                                      │
│                                      ▼                                      │
│   ┌──────────────────────────────────────────────────────────────────────┐  │
│   │                    产品软件(在线)                                 │  │
│   │                                                                      │  │
│   │   ┌────────────┐  ┌────────────┐  ┌────────────┐  ┌────────────┐ │  │
│   │   │ UDP/RTP   │→ │ 预处理     │→ │ TensorRT   │→ │ Base      │ │  │
│   │   │ 接收MJPEG │  │ (解码+裁切)│  │ 推理       │  │ Shapes    │ │  │
│   │   │           │  │           │  │ 42维输出   │  │ (42个)    │ │  │
│   │   └────────────┘  └────────────┘  └────────────┘  └─────┬──────┘ │  │
│   │                                                           │        │  │
│   │                  ┌────────────────────────────────────────┼────┐   │  │
│   │                  │                                        ▼    │   │  │
│   │                  │   ┌────────────────────────────────────────┐ │   │  │
│   │                  │   │  Blended Shapes计算层                 │ │   │  │
│   │   ┌──────────────┤   │  42个Base → 43个Blended(软件计算)  │ │   │  │
│   │   │              │   └────────────────────────────────────────┘ │   │  │
│   │   │              │                      ▼                       │   │  │
│   │   │              │   ┌────────────────────────────────────────┐ │   │  │
│   │   │              │   │  设备发现与数据合并层                  │ │   │  │
│   │   │              │   │  • 检测眼动设备(共享内存扫描)        │ │   │  │
│   │   │              │   │  • 合并下半脸+上半脸                   │ │   │  │
│   │   │              │   │  • 输出127维完整Unified Expressions   │ │   │  │
│   │   │              │   └────────────────────────────────────────┘ │   │  │
│   │   │              │                      ▼                       │   │  │
│   │   └──────────────┼───   ┌────────────────────────────────────────┐ │   │
│   │                  │     │  API输出层                              │ │   │
│   │                  │     │  • 共享内存(VRCFaceTracking)          │ │   │
│   │                  │     │  • HTTP/WebSocket                       │ │   │
│   │                  │     └────────────────────────────────────────┘ │   │
│   │                  │                                                │   │
│   └──────────────────────────────────────────────────────────────────┘   │
│                                                                             │
│   ┌──────────────────────────────────────────────────────────────────────┐  │
│   │                    外部生态(可选)                                 │  │
│   │                                                                      │  │
│   │   ┌─────────────────┐          ┌──────────────────────────────┐   │  │
│   │   │ 其他品牌眼动设备 │ ──合并─→│ VRCFaceTracking / VRChat    │   │  │
│   │   │ (Eye+Brow参数)  │          │ 127维Unified Expressions    │   │  │
│   │   └─────────────────┘          └──────────────────────────────┘   │  │
│   └──────────────────────────────────────────────────────────────────────┘  │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

八、版本规划

v1.0(MVP,5-6周)

训练软件产品软件
标注工具(带原点滚动条原型)UDP接收 + libjpeg-turbo解码
42维Base Shapes回归模型TensorRT推理引擎(FP16)
EfficientNet-Lite迁移学习42维Base Shapes输出
20,000张标注数据(50人×部分动作)43个Blended Shapes计算层
模型精度:MAE < 0.10本地API(共享内存)
ONNX导出设备发现(基础版)
推理延迟:< 15ms

v2.0(8-10周后)

训练软件产品软件
数据集扩充至100,000张完整数据合并层(含眼动设备适配)
引入时序模型(LSTM/GRU)支持多品牌眼动设备自动识别
模型精度:MAE < 0.06输出127维完整Unified Expressions
支持TongueRoll/TongueFlatHTTP/WebSocket扩展接口
推理延迟:< 10ms
安全防护完整版

v3.0(长期规划)

训练软件产品软件
自监督学习 + 数据飞轮VRCFaceTracking v5.0深度集成
云端训练 + OTA推送多设备时间戳精确同步
全量84个Base Shapes(含鼻子系列)实时参数平滑与预测

v3.0(长期规划)

| 云端训练 + OTA推送 | 多设备时间戳精确同步 |

| 全量84个Base Shapes(含鼻子系列) | 实时参数平滑与预测 |

九、接口契约(训练软件 ⇄ 产品软件)

项目规格
模型输入112 × 112 × 3(RGB),归一化值域[0-1]
模型输出42维浮点数数组,[0-1]连续值
输出顺序按Unified Expressions官方Base Shapes顺序排列
配置文件config.yaml:包含inputmean、inputstd、输出维度
参数映射unified_expressions_42.json:索引→参数名称映射
Blended计算blended_shapes_formulas.json:43个Blended计算公式
版本命名语义化版本号(vX.Y.Z)
模型文件model_{version}.enc(AES加密)

十、开发阶段任务分解

周次训练软件任务产品软件任务
第1周搭建Python环境,数据加载pipeline,标注工具原型开发搭建C++工程(CMake),UDP/RTP接收模块
第2周EfficientNet-Lite模型搭建,公开数据集验证JPEG解码(libjpeg-turbo)+ 预处理pipeline
第3周数据采集启动(50人引导式录制),标注工具正式使用TensorRT集成,模型加载+推理循环(42维)
第4周首轮20,000张数据标注完成,正式训练启动Blended Shapes计算层实现
第5周模型评估、导出ONNX、AES加密设备发现模块开发,本地API(共享内存)
第6周交付v1.0模型端到端联调,性能压测,v1.0发布

十一、注意事项

  1. 代码完全隔离:训练代码与产品代码完全分离,产品发布包不含明文模型

  2. 1080p数据保留:推理时降采样至112×112,原始1080p视频全部存档作为后续训练素材

  3. 标注工具是关键路径:带原点滚动条的标注工具直接决定数据质量和标注效率,建议优先开发

  4. 开放生态优先:主动兼容其他品牌眼动设备是核心卖点,设备发现与合并模块需提前设计

  5. Unified Expressions全标准合规:127个参数框架完整输出,消费端无任何妥协

  6. 数据合规:面部视频涉及生物特征数据,采集需获得用户知情同意

这份文档涵盖了从技术选型到开发落地的完整路径,可直接作为团队开发指南和对外技术沟通文档。如需进一步细化某个模块,随时告诉我。