---
document_type: "experiment_report"
service: "MOMENTRY_CORE"
title: "兒童偵測與年齡估算模型選型報告"
date: "2026-05-06"
version: "V1.0"
status: "completed"
owner: "Warren"
created_by: "OpenCode"
---

# 兒童偵測與年齡估算模型選型報告

## 1. 實驗目標

在 Momentry Core 的 Face Trace 資料中，尋找「非主要演員中的兒童角色」並評估三種年齡估算方案的可行性：
1. **DeepFace AgeNet** — 深度學習年齡估算（MIT License）
2. **Apple Vision 頭肩比** — 用頭寬/肩寬比例推測年齡（系統內建）
3. **MiVOLO** — HuggingFace 年齡模型（Apache 2.0）

## 2. 實驗環境

| 項目 | 內容 |
|------|------|
| 測試影片 | Charade (1963), 113 min, 24fps |
| Face detections | 6182 faces, 2347 traces |
| Face 偵測 | Apple Vision `VNDetectFaceRectanglesRequest` (swift_face) |
| Face 嵌入 | CoreML FaceNet512 |
| 取樣間隔 | 60 幀 (2.5 秒) |
| 體態偵測 | Apple Vision `VNDetectHumanBodyPoseRequest` |

## 3. 實驗方法

### 3.1 主要角色年齡估算

從 2347 個 trace 中挑選 face_count ≥ 5 的 12 個主要 trace，提取中間幀進行 DeepFace 年齡估算 + Apple Vision 頭肩比計算。

### 3.2 非主要角色搜尋

搜尋小臉（< 60px）、低 face_count（≤ 2）的 trace，找出群眾演員（可能包含兒童）。

### 3.3 滑雪場水槍場景

Charade 開場 Megève 滑雪場有一名男孩用水槍噴灑女主角的場景。對此場景進行密集幀掃描（30 幀間隔）搜尋兒童臉。

## 4. 模型選型結果

### 4.1 模型可用性

| 方案 | 可用 | 速度/face | License | 結論 |
|------|------|----------|---------|------|
| **DeepFace AgeNet** | ✓ | 0.2s（快取後） | MIT | **推薦** |
| Apple Vision 年齡 | ✗ | — | 系統內建 | Vision 無年齡 API |
| Apple Vision 頭肩比 | ✓ | 即時 | 系統內建 | 僅成人/兒童分類 |
| MiVOLO | ✗ | — | Apache 2.0 | 模型不可用（HuggingFace 不存在） |

### 4.2 DeepFace 年齡估算（12 主要角色取樣）

| Trace | Faces | 出現時間 | 臉寬 | DeepFace 年齡 | 性別 | 情緒 |
|-------|-------|----------|------|-------------|------|------|
| 0 | 45 | 35s | 160px | 35 | Man | sad |
| 24 | 6 | 708s | 100px | 34 | Man | neutral |
| 26 | 5 | 728s | 100px | 31 | Woman | neutral |
| 39 | 14 | 760s | 120px | 30 | Man | sad |
| 43 | 12 | 765s | 120px | 25 | Man | sad |
| 45 | 8 | 775s | — | 36 | Woman | neutral |
| 46 | 9 | 795s | — | 29 | Woman | neutral |
| 48 | 6 | 818s | 140px | 50 | Man | angry |
| 76 | 13 | 908s | — | 29 | Man | sad |
| 87 | 5 | 972s | — | 35 | Man | sad |
| 103 | 7 | 1022s | — | 35 | Woman | neutral |
| 132 | 5 | 1158s | — | 27 | Man | surprise |

**年齡範圍：25–50 歲，全成人。**

### 4.3 Apple Vision 頭肩比

| Frame | 臉寬 | 肩寬 | 頭肩比 | DeepFace 年齡 | 場景 |
|-------|------|------|--------|-------------|------|
| 840 | 160px | 407px | **0.39** | 35 | 滑雪場（主角） |
| 17460 | 100px | 354px | **0.28** | 31 | 中段場景 |
| 18360 | 120px | 306px | **0.39** | 25 | 中段場景 |
| 19620 | 140px | 425px | **0.33** | 50 | 最年長角色 |
| 27780 | 110px | 381px | **0.29** | 27 | 後段場景 |

**頭肩比範圍：0.28–0.39（全成人範圍）。兒童預期 > 0.6。**

### 4.4 非主要演員（群眾）

| Trace | Faces | 臉寬 | DeepFace 年齡 | 性別 | 頭肩比 | 場景 |
|-------|-------|------|-------------|------|--------|------|
| 129 | 1 | 42px | 37 | Man | 0.13 | 遠景群眾 |
| 172 | 2 | 51px | 31 | Man | 0.22 | 遠景群眾 |
| 304 | 2 | 47px | 41 | Man | 0.14 | 遠景群眾 |
| 57 | 1 | 52px | 35 | Woman | — | 遠景群眾 |
| 322 | 1 | 52px | 34 | Man | 0.18 | 遠景群眾 |

**全成人。遠景群眾頭肩比更低 (0.13–0.22)，因相機距離影響 > 體型差異。**

## 5. 水槍場景搜尋結果

**成功找到小孩，但無法可靠估算年齡。**

| 參數 | 數值 |
|------|------|
| 影片 | Charade (1963) |
| 場景 | Megève 滑雪場戶外餐廳 |
| 時間 | Frame 2450 (102 秒 / 1:42) |
| 臉部尺寸 | **29 × 29 px** |
| Swift Face 偵測 | ✓ 已偵測（trace_id 未分配，單幀） |
| DeepFace 年齡 | 33 Man ❌ **誤判**（解析度不足） |
| Apple Vision 頭肩比 | 無法計算（身體被遮擋） |

### 誤判原因

29×29px 遠低於年齡估算模型的最低解析度需求（一般需 ≥ 50×50px）。在遠景中，兒童的臉太小，神經網路無法提取足夠的年齡特徵，導致：
- DeepFace 將兒童誤判為成人
- 頭肩比受距離影響大於實際年齡

## 6. 結論與建議

| 發現 | 說明 |
|------|------|
| Charade 無兒童主要角色 | 全卡司成人，DeepFace 年齡範圍 25–50 |
| 水槍小孩已找到 | Frame 2450，102 秒，但 29px 太小無法估齡 |
| DeepFace 可行 | MIT license，0.2s/face，適合 ≥ 50px 臉部 |
| Apple Vision 頭肩比 | 僅適合作近景成人/兒童分類（非精確年齡） |
| MiVOLO | 不可用（HuggingFace 模型不存在） |

### 建議

1. **整合 DeepFace** 年齡估算入 `face_processor.py` pipeline，對 ≥ 50px 的臉進行年齡標記
2. **保留頭肩比** 做為輔助驗證（成人/兒童二元分類）
3. **降低取樣間隔** 從 60 幀降至 10–15 幀以捕捉更多短暫出現的角色
4. **若需測試兒童年齡**：使用片庫中的 `Alice Comedies (1926)`，該片有近景小女孩（Virginia Davis，6–8 歲），臉部可達 150px+

---

## 附錄：測試資料

| 檔案 | 路徑 |
|------|------|
| DeepFace 年齡 JSON | `output_dev/experiments/age_benchmark/age_benchmark_report.json` |
| 頭肩比 JSON | `output_dev/experiments/head_shoulder/head_shoulder_report.json` |
| 水槍場景幀 | `output_dev/experiments/head_shoulder/child_f2450.jpg` |
| 年齡基準腳本 | `scripts/age_benchmark.py` |
| 頭肩比腳本 | `scripts/head_shoulder_quick.py` |
| Face trace 排序 API | `POST /api/v1/file/:file_uuid/face_trace/sortby` |
