- 修复心跳 Bug:应用层 ping 不更新 lastPong,60 秒后连接会被错误断开 - 03-接口文档:audio/mpeg→audio/mp3、STTConfig/TTSConfig 补充 Model 字段、 APP_ENV 环境变量名修正、配置搜索路径补充、.env 加载说明、Vite proxy 说明修正 - 02-系统架构:补充 ConfigPanel/Toast 组件、Model Router/Rate Limiter 标注规划中、 补充 Gin 框架、MVP 存储改为 Memory、AI 服务 provider 更新、Orchestrator 伪代码对齐 - 04-技术选型:新增 AI 服务栈选型章节(STT/LLM/TTS)、PostgreSQL 标注规划中 - 06-语音交互:VAD 参数名修正、STT 改为一次性识别描述、音频编码格式补充 - 07-视觉理解:关键帧检测代码改为 TypeScript、分辨率修正、阈值逻辑统一 - 08-成本控制:变量名修正、未实现功能标注规划中、对话历史裁剪策略补充 - CLAUDE.md:同步更新技术栈、模块结构、存储策略描述
86 lines
2.7 KiB
Markdown
86 lines
2.7 KiB
Markdown
# 视觉理解
|
||
|
||
## 概述
|
||
|
||
从摄像头视频流到 AI 语义理解的技术链路:**帧采样** → **图像编码** → **多模态 LLM** → **语义结果**。
|
||
|
||
摄像头每秒 30 帧,全部送入 LLM 不现实也不经济,帧采样是第一个需要解决的问题。
|
||
|
||
## 帧采样策略
|
||
|
||
| 策略 | 原理 | 适用场景 |
|
||
|------|------|---------|
|
||
| 固定间隔采样 | 每 N 秒取一帧 | 画面变化缓慢 |
|
||
| 关键帧检测 | 对比相邻帧差异,变化超阈值时触发 | 画面动态变化较多 |
|
||
| 事件驱动采样 | 用户主动触发(如拍照按钮) | 精确提问场景 |
|
||
| **混合策略** | 低频定时 + 高频事件触发 | **通用推荐方案** |
|
||
|
||
关键帧检测核心逻辑(TypeScript 实现,`EdgeProcessor/index.tsx`):
|
||
|
||
```typescript
|
||
// 降低分辨率到 160x120 做检测,兼顾速度与精度
|
||
const DETECT_WIDTH = 160;
|
||
const DETECT_HEIGHT = 120;
|
||
|
||
function calcSimilarity(prev: ImageData, curr: ImageData): number {
|
||
const pixelCount = prev.width * prev.height;
|
||
let diffSum = 0;
|
||
// 只比较 RGB 三通道,跳过 Alpha
|
||
for (let i = 0; i < prev.data.length; i += 4) {
|
||
diffSum += Math.abs(prev.data[i] - curr.data[i])
|
||
+ Math.abs(prev.data[i+1] - curr.data[i+1])
|
||
+ Math.abs(prev.data[i+2] - curr.data[i+2]);
|
||
}
|
||
const avgDiff = diffSum / (pixelCount * 3);
|
||
return 1 - avgDiff / 255; // 相似度:1 = 完全相同,0 = 完全不同
|
||
}
|
||
```
|
||
|
||
阈值说明:
|
||
- 对话模式:`similarity > 0.9` 时跳过(视为重复帧)
|
||
- 观察模式:`similarity < 0.85` 时触发变化回调
|
||
|
||
## 图像编码与多模态输入
|
||
|
||
主流多模态 LLM(GPT-4o、Claude)接受图片的两种方式:
|
||
|
||
| 方式 | 适用场景 |
|
||
|------|---------|
|
||
| Base64 内联 | 本地/实时场景 |
|
||
| URL 引用 | 已有图床的场景 |
|
||
|
||
OpenAI 兼容接口调用示例:
|
||
|
||
```typescript
|
||
const response = await openai.chat.completions.create({
|
||
model: "gpt-4o",
|
||
messages: [
|
||
{
|
||
role: "user",
|
||
content: [
|
||
{ type: "text", text: "请描述画面中的内容" },
|
||
{
|
||
type: "image_url",
|
||
image_url: {
|
||
url: `data:image/jpeg;base64,${base64Image}`,
|
||
detail: "low" // "low" | "high" | "auto"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
});
|
||
```
|
||
|
||
**detail 参数影响**:
|
||
- `low`:65x65 缩略图,约 85 tokens,适合快速识别
|
||
- `high`:按 512px 方块切分,细节丰富但 token 数激增
|
||
- 实时对话场景建议默认 `low`,仅在用户追问细节时切换 `high`
|
||
|
||
## 视觉理解的局限性
|
||
|
||
- **运动模糊**:快速移动物体在低帧率下容易模糊
|
||
- **光线变化**:逆光、暗光环境下识别率显著下降
|
||
- **细小文字**:低分辨率下 OCR 能力受限
|
||
- **空间推理**:精确的距离、尺寸判断仍是短板
|