Files
note/课题一/AI 视觉对话助手/视觉理解.md
2026-06-12 11:51:07 +08:00

3.3 KiB
Raw Blame History

tags, create time
tags create time
AI
视觉
多模态
计算机视觉
帧采样
GPT-4V
2026-06-12 11:13

视觉理解

概述

让 AI "看见"摄像头画面并理解其内容,是视觉对话助手的基础能力。本节探讨从摄像头视频流到 AI 语义理解之间的技术链路,重点关注帧采样策略图像编码方式以及多模态大模型的视觉输入机制

正文

整体流程

graph LR
    A["摄像头视频流"] --> B["帧采样"]
    B --> C["图像编码"]
    C --> D["多模态 LLM"]
    D --> E["语义理解结果"]

摄像头每秒产生 30 帧原始画面,全部送入 LLM 既不现实也不经济。因此,帧采样是第一个需要解决的问题。

帧采样策略

[!question] 思考 如果每秒都向 LLM 发送一帧1 分钟对话就是 60 张图。考虑到 API 调用的延迟和成本,这个频率是否合理?

常见的采样策略对比:

策略 原理 适用场景
固定间隔采样 每 N 秒取一帧 画面变化缓慢的场景
关键帧检测 对比相邻帧差异,变化超阈值时触发 画面动态变化较多
事件驱动采样 用户主动触发(如拍照按钮) 精确提问场景
混合策略 低频定时 + 高频事件触发 通用推荐方案

关键帧检测的核心逻辑:

import numpy as np

def is_keyframe(prev_frame, curr_frame, threshold=30):
    """通过帧间像素差异判断是否为关键帧"""
    diff = np.mean(np.abs(prev_frame.astype(int) - curr_frame.astype(int)))
    return diff > threshold

[!tip] 实用建议 实际开发中,可以先降低分辨率(如 320x240做关键帧检测再对命中帧保留原始分辨率送入 LLM兼顾速度与精度。

图像编码与多模态输入

当前主流多模态 LLM如 GPT-4o、Claude接受图片的方式有两种

graph TD
    A["原始图像"] --> B{"编码方式"}
    B --> C["Base64 内联"]
    B --> D["URL 引用"]
    C --> E["适合本地/实时场景"]
    D --> F["适合已有图床的场景"]

实际调用示例OpenAI 兼容接口):

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"
          }
        }
      ]
    }
  ]
});

[!info] detail 参数的影响

  • low:模型使用 65x65 的缩略图token 消耗少(约 85 tokens适合快速识别
  • high:按 512px 方块切分,细节丰富但 token 数激增
  • 对于实时对话场景,建议默认 low,仅在用户明确追问细节时切换 high

视觉理解的局限性

多模态 LLM 并非万能,以下场景需要额外注意:

  • 运动模糊:快速移动的物体在低帧率下容易模糊
  • 光线变化:逆光、暗光环境下识别率显著下降
  • 细小文字:低分辨率下 OCR 能力受限
  • 空间推理:精确的距离、尺寸判断仍是短板

关联笔记