# Face Tracker 功能文档

> 创建日期: 2026-04-28
> 脚本路径: `scripts/utils/face_tracker.py`

---

## 功能概述

**Face Tracker** 追踪视频中同一人脸在不同帧之间的连续性，为每个人脸分配唯一的 `trace_id`。

---

## 核心功能

### 1. 人脸追踪

| 功能 | 说明 |
|------|------|
| **trace_id 分配** | 每个追踪的人脸获得唯一 ID |
| **跨帧匹配** | 使用 bbox IoU + embedding similarity |
| **路径记录** | 记录人脸位置、置信度、pose 变化 |

### 2. 匹配算法

```
匹配条件（优先级）:
1. bbox IoU > 0.3 AND embedding similarity > 0.7  → 最佳匹配
2. bbox IoU > 0.5                                   → 位置匹配
3. embedding similarity > 0.85                      → 高置信度匹配
4. distance < 100 AND similarity > 0.6             → fallback 匹配
```

---

## 使用方式

### 基础用法

```bash
# 追踪人脸
python3 scripts/utils/face_tracker.py \
  --face-json output/video.face.json \
  --output output/video.face_traced.json

# 仅分析（不输出）
python3 scripts/utils/face_tracker.py \
  --face-json output/video.face.json \
  --analyze-only
```

### 参数调整

```bash
# 调整匹配阈值
python3 scripts/utils/face_tracker.py \
  --face-json output/video.face.json \
  --iou-threshold 0.4 \
  --similarity-threshold 0.75 \
  --distance-threshold 80

# 禁用 embedding 匹配（仅使用位置）
python3 scripts/utils/face_tracker.py \
  --face-json output/video.face.json \
  --no-embedding
```

---

## 输出结构

### 1. face.json 结构变化

**Before**:
```json
{
  "frames": {
    "210": {
      "faces": [
        {"x": 208, "y": 71, "embedding": [...], "pose_angle": {...}}
      ]
    }
  }
}
```

**After**:
```json
{
  "frames": {
    "210": {
      "faces": [
        {
          "x": 208,
          "y": 71,
          "embedding": [...],
          "pose_angle": {...},
          "trace_id": 2  // 新增
        }
      ]
    }
  },
  "traces": {  // 新增
    "2": {
      "trace_id": 2,
      "start_frame": 155,
      "end_frame": 297,
      "duration_frames": 143,
      "duration_seconds": 6.5,
      "total_appearances": 143,
      "avg_confidence": 0.862,
      "pose_angles": ["profile_right", ...],
      "path": [
        {"frame": 155, "bbox": {...}, "confidence": 0.87, "pose_angle": "profile_right"},
        ...
      ]
    }
  },
  "metadata": {  // 新增统计
    "trace_stats": {
      "total_traces": 4,
      "active_traces": 4,
      "long_traces": 3
    }
  }
}
```

### 2. traces 结构详解

| 字段 | 说明 |
|------|------|
| **trace_id** | 唯一追踪 ID |
| **start_frame** | 首次出现帧号 |
| **end_frame** | 最后出现帧号 |
| **duration_frames** | 持续帧数 |
| **duration_seconds** | 持续时间（秒） |
| **total_appearances** | 总出现次数 |
| **avg_confidence** | 平均检测置信度 |
| **pose_angles** | Pose 变化序列 |
| **path** | 详细路径（bbox, confidence, pose） |

---

## 可视化工具

### face_trace_visualizer.py

```bash
# 生成可视化图表 + CSV
python3 scripts/utils/face_trace_visualizer.py \
  --face-json output/video.face_traced.json \
  --output-plot output/face_trace_visualization.png \
  --output-csv output/face_trace_stats.csv
```

### 输出图表

| 图表 | 说明 |
|------|------|
| **X Position** | 人脸 X 坐标随时间变化 |
| **Y Position** | 人脸 Y 坐标随时间变化 |
| **Confidence** | 检测置信度随时间变化 |
| **Pose Distribution** | 各 trace 的 pose 分布 |

---

## 实测案例

### preview.mp4 (15秒, 329帧)

| Trace | Frames | Duration | Appearances | Avg Confidence | Pose Distribution |
|-------|--------|----------|-------------|----------------|-------------------|
| **0** | 1-146 | 6.64s | 146 | 0.76 | three_quarter (144), profile_left (2) |
| **1** | 147 | 0.05s | 1 | - | single appearance |
| **2** | 155-297 | 6.50s | 143 | 0.86 | profile_right (125), three_quarter (18) |
| **3** | 298-329 | 1.45s | 32 | 0.69 | profile_left (32) |

**分析结论**:
- Trace 0: 主要人物 A（前半段）
- Trace 2: 主要人物 B（后半段，高置信度）
- Trace 3: 主要人物 C（结尾，侧脸）
- Gap: frames 148-154 (7帧无人脸检测)

---

## 应用场景

| 场景 | 用途 |
|------|------|
| **Identity Registration** | 从 longest trace 选择参考向量 |
| **Person Tracking** | 追踪视频中的人物轨迹 |
| **Scene Analysis** | 分析人物在不同场景的出现 |
| **Quality Control** | 识别低置信度 trace（需重新处理） |

---

## 与 Identity Registration 整合

### 建议流程

```bash
# Step 1: Face detection + pose
python3 scripts/face_processor.py video.mp4 video.face.json --sample-interval 1

# Step 2: Face tracking
python3 scripts/utils/face_tracker.py --face-json video.face.json --output video.face_traced.json

# Step 3: Select reference vectors from longest trace
python3 scripts/select_face_reference_vectors_v2.py \
  --face-json video.face_traced.json \
  --trace-id-filter 2 \
  --identity-name "Person Name" \
  --register
```

### trace-id-filter 逻辑

仅从指定 trace_id 的人脸中选择参考向量：
- 确保同一人物的多角度参考
- 避免不同人物的 embedding 混合
- 选择 longest trace 作为主要 identity

---

## 参数优化建议

| 场景 | 参数调整 |
|------|---------|
| **快速移动人脸** | `--distance-threshold 150` (更宽容) |
| **低质量视频** | `--similarity-threshold 0.65` (降低阈值) |
| **多人场景** | `--iou-threshold 0.5` (更严格位置匹配) |
| **稳定人脸** | 默认参数即可 |

---

## 未来改进

| Phase | 功能 | 优先级 |
|-------|------|--------|
| **Phase 1** | 基础追踪（已完成） | ✅ |
| **Phase 2** | 3D pose estimation | 中 |
| **Phase 3** | Multi-face interaction tracking | 低 |
| **Phase 4** | Real-time tracking API | 低 |

---

## 参考文档

- `scripts/utils/face_tracker.py`: 人脸追踪脚本
- `scripts/utils/face_trace_visualizer.py`: 可视化脚本
- `scripts/face_processor.py`: 人脸检测脚本
- `scripts/select_face_reference_vectors_v2.py`: 参考向量选择

---

## 版本信息

- 版本: 1.0
- 创建日期: 2026-04-28
- 状态: ✅ 已完成基础功能
