侧边栏壁纸
博主头像
龍騰博客 博主等级

行动起来,活在当下

  • 累计撰写 154 篇文章
  • 累计创建 31 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

让摄像头读懂画面里发生了什么

管理员
2026-06-16 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

Frigate 检测到目标 → Ollama 视觉模型生成中文描述 → Home Assistant 推送到小爱音箱
全部在 SER8 本地运行,不上传任何画面

设备 Beelink SER8 · 48GBIP 192.168.0.188Ollama 已有 ROCm 加速Frigate 需 0.15+摄像头 5路已接入

📷摄像头RTSP流🔍Frigate检测目标🧠Ollama VLM理解画面💬中文描述写入数据库🏠HA+小爱播报提醒

1、检查 Frigate 版本

GenAI 功能从 0.15 版本才有,先确认版本号

为什么要做这步?如果 Frigate 版本太旧,下面所有配置都会报错,需要先升级。

用浏览器打开 Frigate 界面,地址是 http://192.168.0.188:5000(或你自己的端口)

点右上角 ⚙ 设置图标 → 看页面底部版本号,或者直接访问:

复制

浏览器地址栏 / SSH 均可

http://192.168.0.188:5000/api/version

会看到类似这样的返回:

http://192.168.0.188:5000/api/version

"0.15.1" ← 这样就可以,≥ 0.15 都行

⚠️如果版本低于 0.15,需要先在 fnOS 的 Docker 管理里把 Frigate 镜像更新到最新版。更新前先备份 /vol3/1000/docker/frigate/config/config.yml

2、确认 Ollama 可以被 Frigate 访问

让 Ollama 监听局域网,而不只是自己

为什么要做这步?Ollama 默认只监听 127.0.0.1(只有本机能访问),但 Frigate 容器是另一个进程,需要通过局域网 IP 访问 Ollama。

去 fnOS → Docker → 找到你的 Ollama 容器 → 点"编辑"或"详情"

找到"环境变量"部分,检查是否已经有这个变量:

复制

Ollama 容器环境变量(在 Docker 管理界面添加)

OLLAMA_HOST=0.0.0.0:11434

💡如果你之前已经让 Ollama 能从手机或其他设备访问,这步可能已经做过了,跳到验证就行。

添加后重启 Ollama 容器,然后在 SER8 上用 SSH 登录,输入这个命令验证:

复制

SSH 终端验证命令

curl http://192.168.0.188:11434/api/tags

如果看到类似这样的返回,说明 Ollama 已经可以被访问:

SSH Terminal

$ curl http://192.168.0.188:11434/api/tags

{"models":[{"name":"deepseek-r1:7b","...

↑ 能看到你现有的模型列表就对了

3、取视觉模型(VLM)

给 Ollama 下载一个能"看图"的模型

为什么要做这步?普通的文字大模型(比如 deepseek)看不了图片。我们需要"视觉语言模型"(VLM),它既能理解图片,也能输出文字描述。推荐先用 qwen2.5vl:3b,占用约 3GB 显存/内存,780M iGPU 能跑。

打开 SSH 终端,登录到 SER8,输入以下命令(需要几分钟下载):

复制

SSH 终端 · 拉取视觉模型

ollama pull qwen2.5vl:3b

下载完成后,验证模型是否可以看图:

复制

SSH 终端 · 快速测试(发一张图给模型)

curl http://localhost:11434/api/generate \
  -d '{
    "model": "qwen2.5vl:3b",
    "prompt": "用中文描述这张图里有什么人在做什么",
    "images": ["把一张图片的base64贴这里,或跳过直接进下一步"]
  }'

📦模型大小参考:qwen2.5vl:3b ≈ 2.5GB,适合先试。如果效果满意且内存够用,后续可换 qwen2.5vl:7b(约6GB),描述质量会明显提升。

确认模型出现在列表里:

复制

SSH 终端

ollama list

# 应该看到类似:
# NAME                  ID            SIZE   MODIFIED
# qwen2.5vl:3b         xxxx          2.5 GB  just now
# deepseek-r1:7b       xxxx          4.7 GB  ...

4、修改 Frigate 配置文件

在 config.yml 里加几行,告诉 Frigate 去调用 Ollama

为什么要做这步?Frigate 的 GenAI 功能默认是关闭的,需要手动在配置文件里开启并指定用哪个模型。

方法一(推荐):直接在 Frigate 的 Web UI 里编辑

浏览器打开 Frigate → 左侧菜单点 ⚙ Configuration → 选 Configuration Editor

方法二:SSH 编辑文件

复制

SSH 终端 · 打开配置文件

nano /vol3/1000/docker/frigate/config/config.yml

在配置文件里找一个空行,加入以下内容(不要破坏已有的缩进结构):

复制

config.yml · 新增 genai 和 semantic_search 块

# ===== 新增:开启语义搜索 =====
semantic_search:
  enabled: True

# ===== 新增:GenAI 视觉描述 =====
genai:
  provider: ollama
  base_url: http://192.168.0.188:11434
  model: qwen2.5vl:3b
  provider_options:
    keep_alive: -1     # 让模型常驻内存,不每次重新加载
    options:
      num_ctx: 4096  # 上下文长度,4096 够用

YAML 格式对缩进非常敏感,必须用空格,不能用 Tab。每一级缩进是 2 个空格。如果粘贴后缩进乱了,Frigate 重启会报错。

完整的 config.yml 大概长这个样子(你的摄像头配置保持不变,只是新增了上面两块):

config.yml · 示例结构(你的文件里已有 cameras 部分,只加新内容)

mqtt:
  host: 192.168.0.9   # 你的 HA/MQTT 地址,已有

semantic_search:       # ← 新增
  enabled: True

genai:                 # ← 新增
  provider: ollama
  base_url: http://192.168.0.188:11434
  model: qwen2.5vl:3b
  provider_options:
    keep_alive: -1
    options:
      num_ctx: 4096

cameras:              # ← 已有,不用动
  front_door:
    ...
  living_room:
    ...

保存后,在 Frigate UI 里点 Save → Restart,或者 SSH 执行:

复制

SSH 终端 · 重启 Frigate 容器

docker restart frigate

5、定制中文 Prompt(让模型说人话)

默认 Prompt 是英文,改成中文效果更好

为什么要做这步?Frigate 默认的提示词是英文,模型会用英文回答。加上中文 Prompt 后,描述会更自然,还可以针对不同目标(人、车)定制关注点。

genai 块里继续添加 objects 部分:

复制

config.yml · genai 块完整版(含中文 Prompt)

genai:
  provider: ollama
  base_url: http://192.168.0.188:11434
  model: qwen2.5vl:3b
  provider_options:
    keep_alive: -1
    options:
      num_ctx: 4096
  objects:
    genai:
      prompt: "用简洁中文(1-2句话)描述{label}在{camera}摄像头画面中的行为和意图,不要描述外观和背景环境。"
      object_prompts:
        person: "这个人在做什么?是路过、停留观察、还是在操作什么(比如门锁、快递柜)?用中文1句话回答。"
        car: "这辆车在做什么?是经过、停车等待还是正在离开?如果能看出是快递/外卖车请注明。用中文1句话回答。"
        dog: "这只狗在做什么?用中文1句话描述它的行为。"

💡{label} 会被自动替换成检测到的目标类型(person/car/dog),{camera} 会替换成摄像头名称。不用手动改,直接复制粘贴就行。

6、验证效果

触发一个事件,看看描述是否出现

怎么验证?在摄像头前走一下,触发 Frigate 的人员检测事件。等事件结束后(人离开画面),Frigate 会把截图发给 Ollama,等几秒钟就能在 UI 里看到描述。

1. 在摄像头前走动,触发事件

2. 打开 Frigate → 左侧菜单点 Explore(探索)

3. 找到刚刚的事件,点开缩略图

4. 在右侧或下方找 Description 字段

成功的样子:

✅ Frigate Explore · 事件描述示例

🚶

📷 front_door · person · 14:32:10 · 持续 8 秒

一个人从左侧走向大门,在门口短暂停留后按下门铃,随后静待回应。

🚗

📷 driveway · car · 14:28:03 · 持续 45 秒

一辆快递车停在车道右侧,驾驶员下车后从后备厢取出包裹向门口走去。

注意:描述不是实时的。Frigate 会在事件结束(目标离开画面)后才把截图发给 Ollama。首次使用时模型加载可能需要 10-30 秒,后续因为 keep_alive: -1 模型常驻内存,会快很多。

如果没看到描述,查看 Frigate 日志:

复制

SSH 终端 · 查看 Frigate 日志(过滤 genai 相关)

docker logs frigate 2>&1 | grep -i genai | tail -30

SSH Terminal · Frigate logs

[2024-xx] INFO genai: Sending 3 frames to ollama for person...

[2024-xx] INFO genai: Generated description in 4.2s

↑ 看到这两行说明正常工作

[2024-xx] ERROR genai: Connection refused to http://192.168.0.188:11434

↑ 这说明 Ollama 没开放网络,回到第 2 步检查

进阶:接入 Home Assistant + 小爱播报

7、HA 自动化:有人触发 → 小爱播报描述

通过 MQTT 监听 Frigate 事件,提取描述后推送给小爱音箱

思路:Frigate 会把所有事件通过 MQTT 发出去,HA 订阅这个 Topic,拿到事件后再去 Frigate API 查这个事件的描述,最后调用小爱的 TTS 播报。

在 HA 里点 设置 → 自动化 → 创建自动化 → 编辑为 YAML,粘贴:

🏠 Home Assistant · 自动化 YAML

复制

alias: "Frigate 事件 → 小爱播报"
trigger:
  - platform: mqtt
    topic: "frigate/events"

condition:
  - condition: template
    # 只在事件"结束"时触发(这时候描述已经生成好了)
    value_template: "{{ trigger.payload_json.type == 'end' }}"

action:
  - delay: "00:00:05"  # 等5秒让 Ollama 生成完描述

  - service: rest_command.get_frigate_description
    data:
      event_id: "{{ trigger.payload_json.after.id }}"

  - service: tts.speak
    target:
      entity_id: media_player.xiaomi_speaker  # 改成你小爱的实体ID
    data:
      message: "{{ trigger.payload_json.after.camera }}摄像头检测到动静"

💡更完整的方案是用 Frigate HA 集成(HACS 安装 frigate integration),它会自动同步事件和描述到 HA 实体,比直接解析 MQTT 更稳定。如果需要,告诉我,我再单独出一份教程。

8、常见问题排查

遇到问题先看这里

  • 描述一直不出现
    先跑 docker logs frigate 2>&1 | grep -i "genai\|ollama" | tail -20,看日志里有没有报错。最常见原因是 Ollama 地址写错,或者模型名字和 ollama list 里的不一致(大小写要完全一样)。

  • 描述是英文的
    说明没读到中文 Prompt,检查第 5 步的缩进格式,objects: 下面要有 genai:,再下面才是 prompt:

  • YAML 格式错误,Frigate 无法启动
    把整个 config.yml 的内容粘贴到 yamllint.com 检查,有红色提示说明哪行有问题。最常见是 Tab 和空格混用。

  • 模型推理很慢(每次等很久)
    检查 Ollama 容器是否挂载了 GPU 设备(/dev/kfd/dev/dri/renderD128),以及 ROCm 环境变量 HSA_OVERRIDE_GFX_VERSION=11.0.0 是否设置。你之前已经验证过 780M ROCm 可以工作,确保 Ollama 容器配置和之前一致。

  • Explore 页面没有,找不到描述在哪
    确认 semantic_search: enabled: True 这块已经加进去,并且重启了 Frigate。Explore 是 0.14+ 才有的菜单项。

+效果好了之后,下一步可以做什么

跑通基础版后的扩展方向

🔍

语义搜索

在 Frigate Explore 里搜索"快递员"、"骑车的人",能找到对应的历史画面,不用一帧帧翻录像

📱

HA 通知带描述

手机推送不只是"检测到人",而是"门口有人正在开快递"——更有信息量

📋

每日安防日报

定时让 LLM 汇总今天所有事件描述,生成"家庭安防日报",小爱晚上播报

🆙

升级到 7B 模型

验证流程后换 qwen2.5vl:7b,描述质量大幅提升,48G 内存完全够

0

评论区