从本地检测到云端视觉理解:视障辅助 Demo2 的一次工程推进记录

0 阅读5分钟

在 Demo1 阶段,系统已经具备了基础的端侧能力:实时检测、方位判断、语音播报以及深度流接入。

但在真实辅助场景中,仅依靠目标检测并不足够。很多信息无法通过检测框表达,例如:

  • 标识牌上的文字
  • 场景整体结构
  • 环境中的复杂物体关系
  • 用户主动寻找的特定物品

因此在 Demo2 阶段,系统开始引入 云端视觉理解能力

今天完成的工作,主要围绕一条新的端到端链路展开:

拍照 → 上传图片 → URL 识图 → 流式返回结果 → 语音播报

这使系统从“检测物体”逐步扩展为 理解环境信息的辅助工具


一、Demo2 的系统目标

在 Demo2 阶段,系统开始引入云端视觉模型能力,用于补充端侧检测无法提供的信息。

当前阶段的核心能力包括:

  • 拍照后自动上传图片到对象存储
  • 使用预签名 URL 调用视觉模型识图
  • 支持“简洁识图 / 详细识图”两种模式
  • 支持语音触发的场景分析
  • 支持语音触发的“寻找物品”任务
  • 结果流式返回并自动语音播报

整体链路已经形成完整闭环。


二、端到端识图链路

当前系统的识图流程如下:

拍照
 ↓
上传图片到对象存储
 ↓
获取预签名 URL
 ↓
调用视觉模型识图
 ↓
流式返回分析结果
 ↓
语音播报

与传统做法不同的是:

系统 不直接上传图片给模型接口,而是先上传到对象存储,再通过 URL 访问。

这样做有两个优势:

  1. 同一张图片可以复用 URL,多次识图
  2. 模型请求体更小,接口更加稳定

三、拍照后立即上传(链路解耦)

在 Demo2 中,图片上传被提前到了拍照阶段。

拍照函数内部流程为:

  1. 相机捕获 UIImage
  2. 压缩图片
  3. 上传到对象存储
  4. 保存返回的 URL

关键逻辑位于:

capturePhoto(...)

上传成功后,系统会保存:

  • uploadedImageURL
  • uploadedImageUploadedAt

后续识图请求可以直接复用该 URL。

这样可以避免:

每次识图都重新上传图片。


四、简洁识图 / 详细识图

用户可以手动选择两种识图模式:

  • 简洁识图:快速概括图片信息
  • 详细识图:更完整的视觉描述

为了减少请求次数,当前实现采用 一次请求返回两种结果 的策略。

模型返回 JSON:

{
  "simple": "...",
  "detailed": "..."
}

系统会分别缓存:

cachedManualSimpleResult
cachedManualDetailedResult

如果用户再次点击相同模式,将直接读取缓存,而不会重新调用模型。


五、语音触发任务

Demo2 中增加了两种语音任务。

1 场景分析

用户可以触发:

“当前环境是什么?”

系统会返回:

  • 场景类型
  • 主要物体
  • 大致方位

例如:

Indoor scene, desk in front, laptop and cups on the table.

输出限制为 1–2 句英文描述,避免语音过长。


2 寻找物品

用户也可以询问:

“Where is the chair?”

模型会返回结构化 JSON:

{
  "found": true,
  "direction": "left",
  "distance_level": "near",
  "passability": "clear",
  "description": "...",
  "guidance": "...",
  "narration": "..."
}

系统解析后可以生成更自然的语音提示。

这种结构化输出为未来导航能力提供了基础。


六、图片上传策略

为了保证网络效率,图片在上传前会进行压缩。

当前策略:

  • 最大边:1280
  • 目标大小:≤ 500KB
  • 多级压缩策略

如果图片仍然过大,系统会执行最终压缩。

这样可以保证:

  • 上传时间可控
  • 模型推理输入稳定

七、预签名 URL 机制

对象存储通过 预签名 URL 提供图片访问。

签名算法:

TOS4-HMAC-SHA256

流程包括:

  • 生成 PUT URL(用于上传图片)
  • 生成 GET URL(供视觉模型访问)

关键参数包括:

  • X-Tos-Algorithm
  • X-Tos-Credential
  • X-Tos-Date
  • X-Tos-Expires

URL 默认有效期为:

60 秒

如果 URL 即将过期,系统会自动重新上传图片。


八、视觉模型调用

当前视觉识图调用使用云端视觉模型接口:

POST /api/v3/chat/completions

请求结构为:

{
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "<prompt>" },
        {
          "type": "image_url",
          "image_url": {
            "url": "<presigned_image_url>"
          }
        }
      ]
    }
  ]
}

关键参数包括:

temperature: 0.2
stream: true
thinking: disabled

关闭 thinking 可以显著减少响应延迟。


九、Token 限制策略

不同任务使用不同的 token 上限:

任务max_output_tokens
简洁 + 详细识图220
简洁识图64
详细识图128
场景分析96
寻找物品120

这样可以在保证信息完整的同时控制响应时间。


十、当前性能状态

当前链路中已经完成的优化包括:

  • 拍照后立即上传
  • URL 复用
  • 图片压缩到 500KB 内
  • 按任务限制输出 token
  • 关闭模型 thinking

在实际测试中,主要耗时仍然来自:

上传完成到模型返回首 token 之间的推理等待。

这也是后续需要继续优化的部分。


十一、安全注意事项

当前 Demo 为了简化实现,客户端直接配置了对象存储和模型服务的访问凭证。

在实际产品中,应避免在客户端存储长期密钥,建议采用:

  • 服务端签发临时上传凭证
  • 或通过后端代理生成预签名 URL

这样可以避免密钥泄露带来的安全风险。


结语

如果说 Demo1 解决的是:

如何稳定地检测环境中的物体。

那么 Demo2 开始尝试解决的是:

如何理解环境本身。

通过引入云端视觉模型,系统不再只依赖检测框,而是能够:

  • 识别文本信息
  • 分析场景结构
  • 响应用户提问

这使辅助系统逐渐从“视觉工具”向“环境理解助手”演进。

下一阶段的重点将放在:

  • 响应延迟优化
  • 语音交互流程优化
  • 结构化结果与导航能力结合

Demo2 的目标,是让系统开始具备真正的 视觉理解能力