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 frigate5、定制中文 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 -30SSH 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 内存完全够
评论区