---
document_type: "benchmark_plan"
title: "CLIP ViT-L/14 Embedding 性能基准测试计划"
service: "MOMENTRY_CORE"
date: "2026-04-28"
status: "active"
current_state: "planning"
owner: "Warren"
created_by: "OpenCode"
created_at: "2026-04-28"
version: "V1.0"
tags:
  - "clip"
  - "vit-l/14"
  - "embedding"
  - "benchmark"
  - "logo_detection"
  - "mps"
  - "accusys_logo"
related_documents:
  - "IDENTITY_REFERENCE_VECTOR_DESIGN.md"
  - "MOMENTRY_CORE_ARCHITECTURE_V2.md"
  - "IMPLEMENTATION/FILE_IDENTITY_API_DESIGN.md"
ai_query_hints:
  - "查詢 CLIP ViT-L/14 性能测试计划"
  - "查詢 Accusys Logo 测试方案"
  - "查詢 MPS vs CPU 性能对比"
  - "查詢 Logo 檢測 + embedding + 匹配流程"
---

# CLIP ViT-L/14 Embedding 性能基准测试计划

| 項目 | 內容 |
|------|------|
| 建立者 | OpenCode |
| 建立時間 | 2026-04-28 |
| 文件版本 | V1.0 |

---

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|------|------|------|--------|-----------|
| V1.0 | 2026-04-28 | 創建 CLIP ViT-L/14 性能基准测试计划 | OpenCode | OpenCode |

---

## 概述

本文檔定義 Momentry Core Identity 系統的 **CLIP ViT-L/14 Embedding 性能基准测试计划**，测试对象为 **Accusys Storage Logo**。

---

## 测试目标

### 核心目标

| 目標 | 說明 |
|------|------|
| **Logo 檢測** | 使用 OWL-ViT 檢測 Accusys Logo 在视频中的出现 |
| **Embedding 提取** | 使用 CLIP ViT-L/14 提取 Logo 的 768-dim embedding |
| **Identity 注册** | 将 Logo 注册为 Identity (identity_type='logo') |
| **相似度搜索** | 在视频帧中搜索与 Logo 相似的内容 |
| **性能基准** | 测量 CLIP 在 MPS vs CPU 的性能差异 |
| **1对多匹配** | 测试 1对多匹配算法的效果 |

### 测试对象

| 对象 | URL | 尺寸 | 说明 |
|------|-----|------|------|
| **Accusys Logo** | https://www.accusys.com.tw/wp-content/uploads/2023/03/Accusys-Orange-2017.png | 3269x747px | Orange 品牌色 (#EE7632) |

---

## 测试环境

### 系统配置

| 配置 | 说明 |
|------|------|
| **OS** | macOS (darwin) |
| **Python** | 3.11 (MOMENTRY_PYTHON_PATH=/opt/homebrew/bin/python3.11) |
| **PyTorch** | MPS backend support ✅ |
| **CLIP Model** | ViT-L/14 (laion/CLIP-ViT-L-14-laion2B-s32B-b82K) |
| **GPU** | Apple Silicon (MPS) |

### 模型信息

| 模型 | 参数 | 说明 |
|------|------|------|
| **CLIP ViT-L/14** | 768-dim embedding | 适合 logo/symbol/object 识别 |
| **OWL-ViT** | 开放词汇检测器 | 检测任意 Logo/Symbol/Object |
| **InsightFace ArcFace** | 512-dim embedding | 人脸识别（对比基准） |

---

## 测试计划

### Phase 1: Logo 檢測 (OWL-ViT)

**目标**: 使用 OWL-ViT 检测 Accusys Logo 在视频帧中的出现

**测试步骤**:
1. 准备测试视频（包含 Accusys Logo）
2. 使用 OWL-ViT 检测 Logo：
   ```python
   from transformers import owl_vit
   
   # 检测文本提示
   prompts = ["Accusys Storage Logo", "orange logo", "brand logo"]
   
   # 检测结果
   detections = owl_vit.detect(video_frame, prompts)
   ```
3. 记录检测结果：
   - bbox 坐标
   - confidence score
   - 检测速度

**预期输出**:
- Logo 检测成功率 > 90%
- 检测速度 < 1s/frame

---

### Phase 2: Embedding 提取 (CLIP ViT-L/14)

**目标**: 使用 CLIP ViT-L/14 提取 Logo 的 768-dim embedding

**测试步骤**:
1. 下载 Accusys Logo 图片
2. 使用 CLIP 提取 embedding：
   ```python
   import torch
   from transformers import CLIPModel, CLIPProcessor
   
   # 加载模型 (MPS backend)
   device = torch.device("mps")
   model = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device)
   processor = CLIPProcessor.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K")
   
   # 提取 embedding
   image = Image.open("accusys_logo.png")
   inputs = processor(images=image, return_tensors="pt").to(device)
   embedding = model.get_image_features(**inputs)
   
   # 输出: 768-dim vector
   print(f"Embedding shape: {embedding.shape}")  # [1, 768]
   ```
3. 记录提取速度：
   - MPS 模式
   - CPU 模式

**预期输出**:
- Embedding 提取成功
- MPS vs CPU 性能对比

---

### Phase 3: Identity 注册

**目标**: 将 Accusys Logo 注册为 Identity

**测试步骤**:
1. 创建 Identity:
   ```python
   identity = {
       "identity_id": generate_uuid(),
       "name": "Accusys Storage Logo",
       "identity_type": "logo",
       "source": "manual",
       "reference_data": {
           "identity_embeddings": [
               {
                   "embedding": embedding.tolist(),
                   "source": "logo_image",
                   "image_url": "https://www.accusys.com.tw/wp-content/uploads/2023/03/Accusys-Orange-2017.png",
                   "context": "brand_logo",
                   "created_at": datetime.now().isoformat()
               }
           ],
           "image_urls": ["https://www.accusys.com.tw/wp-content/uploads/2023/03/Accusys-Orange-2017.png"]
       },
       "identity_embedding": embedding.tolist()
   }
   ```
2. 存储到 identities 表
3. 验证存储成功

**预期输出**:
- Identity 注册成功
- reference_data JSONB 结构正确
- identity_embedding VECTOR(768) 存储正确

---

### Phase 4: 相似度搜索

**目标**: 在视频帧中搜索与 Logo 相似的内容

**测试步骤**:
1. 提取视频帧的 CLIP embedding
2. 计算与 Identity 的相似度：
   ```python
   def search_similar_frames(video_frames, identity_embedding):
       results = []
       for frame in video_frames:
           # 提取帧 embedding
           frame_embedding = clip_model.extract_embedding(frame)
           
           # 计算相似度
           similarity = cosine_similarity(frame_embedding, identity_embedding)
           
           if similarity >= 0.85:
               results.append({
                   "frame": frame,
                   "similarity": similarity
               })
       return results
   ```
3. 测试 1对多匹配算法：
   - Strategy 1: Best Match
   - Strategy 2: Voting
   - Strategy 3: Weighted Average
   - Strategy 4: Combined

**预期输出**:
- 相似度搜索成功率
- 匹配算法对比

---

### Phase 5: 性能基准测试

**目标**: 测量 CLIP 在 MPS vs CPU 的性能差异

**测试步骤**:
1. **MPS 模式性能测试**:
   ```python
   device = torch.device("mps")
   model = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device)
   
   # 测试 1000 次提取
   start_time = time.time()
   for i in range(1000):
       embedding = model.get_image_features(**inputs)
   mps_time = time.time() - start_time
   ```
2. **CPU 模式性能测试**:
   ```python
   device = torch.device("cpu")
   model = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device)
   
   # 测试 1000 次提取
   start_time = time.time()
   for i in range(1000):
       embedding = model.get_image_features(**inputs)
   cpu_time = time.time() - start_time
   ```
3. **对比分析**:
   - 提取速度 (mps_time vs cpu_time)
   - 内存使用
   - GPU 使用率

**预期输出**:
- MPS 性能提升倍数
- CPU fallback 性能基准
- 推荐使用场景

---

### Phase 6: 与 ArcFace 对比

**目标**: 对比 CLIP ViT-L/14 与 ArcFace 的性能差异

**测试对象**:
- **CLIP ViT-L/14**: Logo/Symbol/Object 识别 (768-dim)
- **ArcFace**: 人脸识别 (512-dim)

**测试步骤**:
1. 使用相同测试集（包含人脸和 Logo）
2. 测量两种模型的：
   - Embedding 提取速度
   - 匹配准确率
   - 匹配速度
3. 对比分析

**预期输出**:
| 模型 | 用途 | 维度 | 提取速度 | 匹配准确率 |
|------|------|------|----------|-----------|
| CLIP ViT-L/14 | Logo/Symbol/Object | 768 | TBD | TBD |
| ArcFace | 人脸识别 | 512 | TBD | TBD |

---

## 测试脚本

### scripts/clip_benchmark_test.py

```python
"""
CLIP ViT-L/14 性能基准测试脚本

测试内容:
1. Logo 檢測 (OWL-ViT)
2. Embedding 提取 (CLIP ViT-L/14)
3. Identity 注册
4. 相似度搜索
5. MPS vs CPU 性能对比
6. 与 ArcFace 对比
"""

import torch
import time
import numpy as np
from PIL import Image
from transformers import CLIPModel, CLIPProcessor

def test_clip_embedding_extraction():
    """Phase 2: Embedding 提取测试"""
    
    # 加载模型
    device_mps = torch.device("mps")
    device_cpu = torch.device("cpu")
    
    model_mps = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device_mps)
    model_cpu = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device_cpu)
    
    processor = CLIPProcessor.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K")
    
    # 加载 Accusys Logo
    image = Image.open("accusys_logo.png")
    
    # MPS 测试
    inputs_mps = processor(images=image, return_tensors="pt").to(device_mps)
    start_time = time.time()
    for i in range(100):
        embedding_mps = model_mps.get_image_features(**inputs_mps)
    mps_time = time.time() - start_time
    
    # CPU 测试
    inputs_cpu = processor(images=image, return_tensors="pt").to(device_cpu)
    start_time = time.time()
    for i in range(100):
        embedding_cpu = model_cpu.get_image_features(**inputs_cpu)
    cpu_time = time.time() - start_time
    
    # 输出结果
    print(f"MPS 提取速度: {mps_time/100:.4f} s/image")
    print(f"CPU 提取速度: {cpu_time/100:.4f} s/image")
    print(f"MPS 性能提升: {cpu_time/mps_time:.2f}x")
    print(f"Embedding shape: {embedding_mps.shape}")
    
    return {
        "mps_time": mps_time/100,
        "cpu_time": cpu_time/100,
        "mps_speedup": cpu_time/mps_time,
        "embedding_shape": embedding_mps.shape
    }

def test_similarity_search(identity_embedding, test_frames):
    """Phase 4: 相似度搜索测试"""
    
    device = torch.device("mps")
    model = CLIPModel.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K").to(device)
    processor = CLIPProcessor.from_pretrained("laion/CLIP-ViT-L-14-laion2B-s32B-b82K")
    
    results = []
    for frame in test_frames:
        inputs = processor(images=frame, return_tensors="pt").to(device)
        frame_embedding = model.get_image_features(**inputs)
        
        similarity = cosine_similarity(frame_embedding, identity_embedding)
        
        if similarity >= 0.85:
            results.append({
                "frame": frame,
                "similarity": similarity
            })
    
    return results

def cosine_similarity(a, b):
    """计算余弦相似度"""
    a = a.detach().cpu().numpy().flatten()
    b = np.array(b).flatten()
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

if __name__ == "__main__":
    print("=== CLIP ViT-L/14 性能基准测试 ===")
    
    # Phase 2: Embedding 提取
    print("\n=== Phase 2: Embedding 提取测试 ===")
    result = test_clip_embedding_extraction()
    
    # Phase 3: Identity 注册 (需要数据库连接)
    print("\n=== Phase 3: Identity 注册 ===")
    print("待實作: 需要資料庫連接")
    
    # Phase 4: 相似度搜索 (需要测试帧)
    print("\n=== Phase 4: 相似度搜索 ===")
    print("待實作: 需要测试帧")
    
    print("\n=== 测试完成 ===")
```

---

## 测试数据

### Accusys Logo 信息

| 属性 | 值 |
|------|-----|
| **Logo URL** | https://www.accusys.com.tw/wp-content/uploads/2023/03/Accusys-Orange-2017.png |
| **尺寸** | 3269x747px |
| **品牌色** | Orange (#EE7632) |
| **公司** | Accusys Storage |
| **产品线** | ExaSAN Series, Gamma Series, T-Share Series |
| **Momentry Studio** | 网站首页有介绍（AI Video Search） |

### 测试视频需求

| 需求 | 说明 |
|------|------|
| **包含 Logo** | 视频中需包含 Accusys Logo |
| **不同场景** | 白底、黑底、复杂背景 |
| **不同大小** | 大、中、小 Logo |
| **不同角度** | 正面、侧面、倾斜 |
| **时长** | 建议 30-60 秒 |

---

## 预期结果

### 性能基准预期

| 指标 | 预期值 | 说明 |
|------|--------|------|
| **MPS 提取速度** | < 0.05 s/image | MPS 加速 |
| **CPU 提取速度** | < 0.2 s/image | CPU fallback |
| **MPS 性能提升** | > 2x | MPS vs CPU |
| **Logo 检测成功率** | > 90% | OWL-ViT 检测 |
| **匹配准确率** | > 85% | 相似度搜索 |
| **匹配速度** | < 1s/query | 相似度计算 |

### 1对多匹配预期

| 算法 | 预期准确率 | 说明 |
|------|-----------|------|
| **Strategy 1 (Best Match)** | 85% | 快速匹配 |
| **Strategy 2 (Voting)** | 88% | 投票机制 |
| **Strategy 3 (Weighted)** | 90% | 加权平均 |
| **Strategy 4 (Combined)** | 92% | 综合评分 |

---

## 实作计划

### Phase 1: 准备测试环境

- [ ] 下载 Accusys Logo 图片
- [ ] 准备测试视频
- [ ] 安装 CLIP ViT-L/14 模型
- [ ] 安装 OWL-ViT 模型

### Phase 2: Logo 檢測测试

- [ ] OWL-ViT 检测脚本编写
- [ ] 检测结果记录
- [ ] 检测速度测量

### Phase 3: Embedding 提取测试

- [ ] CLIP ViT-L/14 embedding 提取脚本编写
- [ ] MPS vs CPU 性能对比
- [ ] Embedding 存储测试

### Phase 4: Identity 注册测试

- [ ] Identity 注册脚本编写
- [ ] reference_data JSONB 存储测试
- [ ] identity_embedding VECTOR(768) 存储测试

### Phase 5: 相似度搜索测试

- [ ] 相似度搜索脚本编写
- [ ] 1对多匹配算法测试
- [ ] 搜索结果记录

### Phase 6: 性能基准测试

- [ ] MPS vs CPU 性能对比脚本
- [ ] 1000 次提取测试
- [ ] 性能基准报告生成

---

## 待辦事項

| 項目 | 優先級 | 說明 |
|------|--------|------|
| 准备测试环境 | 高 | Phase 1 |
| Logo 檢測测试 | 高 | Phase 2 |
| Embedding 提取测试 | 高 | Phase 3 |
| Identity 注册测试 | 中 | Phase 4 |
| 相似度搜索测试 | 中 | Phase 5 |
| 性能基准测试 | 中 | Phase 6 |

---

## 限制條件

- CLIP ViT-L/14 需要 MPS 或 CUDA 支持
- OWL-ViT 需要 Transformers 库
- 测试视频需包含 Accusys Logo
- 需要 PostgreSQL + pgvector 支持

---

## 相关文件

- `docs_v1.0/ARCHITECTURE/IDENTITY_REFERENCE_VECTOR_DESIGN.md` - 1对多参考向量设计
- `docs_v1.0/ARCHITECTURE/MOMENTRY_CORE_ARCHITECTURE_V2.md` - 核心架构设计
- `docs_v1.0/IMPLEMENTATION/FILE_IDENTITY_API_DESIGN.md` - API 设计
- `scripts/fast_stamp_search.py` - OWL-ViT Logo 检测脚本（已集成）

---

## 版本信息

- 版本: V1.0
- 建立日期: 2026-04-28
- 文件更新: 2026-04-28
