|
|
Frigate 是本地影像辨識的主流方案。
但它也是最容易設定錯、最吃資源的服務之一。
這篇講實際的數字和設定。

硬體需求:實際數字
沒有 TPU 的情況:
- 一路 640×480 @ 5fps 的物件偵測,大概吃掉一個現代 CPU 核心
- 三台攝影機 → 三個核心,CPU 會長時間高負載
- 不建議,會很熱而且影響其他服務
有 Google Coral TPU 的情況:
- TPU 負責推論,CPU 只負責解碼影像
- 一顆 USB Coral 可以撐十幾路(依解析度和 fps)
- CPU 使用率大幅下降
用 Intel 內顯(QSV)做硬體解碼:
- 解碼交給 GPU,CPU 再省一大截
- 需要 Intel 第六代以上的 CPU
- 群暉的部分機型支援
我的建議配置:
- 1-2 台攝影機 → 一般 x86 CPU(四核以上)就能撐,不用 TPU
- 3 台以上 → 一定要 TPU
- NVR 主機用 N100 / N305 之類的低功耗 CPU —— 有內顯可以硬解,很省電
記憶體:Frigate 本身不太吃,但要注意 /tmp/cache。
Frigate 用記憶體當快取存錄影片段,預設 1GB。
攝影機多的話要調大:
- services:
- frigate:
- shm_size: "512mb" # 共享記憶體,攝影機多要調大
- tmpfs:
- - /tmp/cache:size=2g # 錄影快取
複製代碼
shm_size 不夠的話症狀是攝影機一直斷線重連,
而且日誌會出現 Unable to write to /dev/shm。
計算公式(官方建議):
- shm_size = (解析度寬 × 高 × 1.5 × 9 + 270480) / 1048576 MB
- 每台攝影機算一次,加總起來,最少 128MB
複製代碼
完整的 docker-compose
- services:
- frigate:
- image: ghcr.io/blakeblackshear/frigate:stable
- container_name: frigate
- restart: unless-stopped
- privileged: true # Coral TPU 需要
- shm_size: "512mb"
- devices:
- - /dev/bus/usb:/dev/bus/usb # USB Coral
- - /dev/dri/renderD128:/dev/dri/renderD128 # Intel 硬解
- volumes:
- - /etc/localtime:/etc/localtime:ro
- - /volume1/docker/frigate/config:/config
- - /volume1/docker/frigate/media:/media/frigate
- - type: tmpfs
- target: /tmp/cache
- tmpfs:
- size: 2000000000
- ports:
- - "5000:5000"
- - "8554:8554" # RTSP 重新串流
- - "8555:8555/tcp" # WebRTC
- - "8555:8555/udp"
- environment:
- - FRIGATE_RTSP_PASSWORD_FILE=/run/secrets/rtsp_pw
- - TZ=Asia/Taipei
- secrets:
- - rtsp_pw
- secrets:
- rtsp_pw:
- file: ./secrets/rtsp_pw.txt
複製代碼

設定檔:最重要的觀念是「雙串流」
多數 IP 攝影機有兩條 RTSP 串流:
- 主串流:2K/4K 高畫質 → 用來錄影
- 子串流:640×480 左右 → 用來偵測
用主串流做偵測是最常見的錯誤,
CPU 會爆掉而且完全沒有好處(偵測不需要高解析度)。
- mqtt:
- host: 192.168.1.20
- port: 1883
- user: frigate
- password: "{FRIGATE_MQTT_PASSWORD}"
- detectors:
- coral:
- type: edgetpu
- device: usb
- ffmpeg:
- hwaccel_args: preset-vaapi # Intel 硬體解碼
- # 全域預設,個別攝影機可以覆蓋
- detect:
- width: 640
- height: 480
- fps: 5
- record:
- enabled: true
- retain:
- days: 3
- mode: motion # 只留有動靜的片段
- alerts:
- retain:
- days: 30
- detections:
- retain:
- days: 14
- snapshots:
- enabled: true
- bounding_box: true
- retain:
- default: 14
- objects:
- track:
- - person
- - car
- - dog
- - cat
- cameras:
- front_door:
- ffmpeg:
- inputs:
- - path: rtsp://user:pass@192.168.30.11:554/Streaming/Channels/101
- roles: [record]
- - path: rtsp://user:pass@192.168.30.11:554/Streaming/Channels/102
- roles: [detect]
- detect:
- width: 640
- height: 360
- fps: 5
- # 只偵測這些區域(重點!)
- motion:
- mask:
- - 0,0,0.25,0,0.25,0.15,0,0.15 # 遮掉時間戳
- threshold: 25
- contour_area: 30
- zones:
- 車道:
- coordinates: 0.1,0.9,0.5,0.6,0.9,0.7,0.9,1,0.1,1
- objects:
- - person
- - car
- 門口:
- coordinates: 0.3,0.4,0.7,0.4,0.7,0.8,0.3,0.8
- objects:
- - person
- objects:
- filters:
- person:
- min_area: 3000
- max_area: 100000
- threshold: 0.75
- car:
- min_area: 15000
- threshold: 0.7
- review:
- alerts:
- required_zones:
- - 門口
複製代碼

減少誤報的六個方法(按效果排序)
1. 設定 motion mask(動作遮罩)
這是效果最大的一個。
遮掉會一直變動但你不在意的區域:
- 時間戳記(一直在變)
- 馬路(車子一直經過)
- 會晃的樹
- 鄰居的窗戶
- 天空(雲會動)
怎麼畫:Frigate 的網頁介面 → 那台攝影機 → Debug → Mask & Zone creator,
用滑鼠畫,然後複製產生的座標貼進設定檔。
2. 設定 zones(區域)並用 required_zones
motion mask 是「不看這裡」,zone 是「只有這裡的物件才算數」。
- review:
- alerts:
- required_zones:
- - 門口
複製代碼
有人從畫面邊緣走過不會觸發,走進門口才會。
3. 調整 min_area
物件太小的話多半是誤判(或者太遠不重要)。
- person:
- min_area: 3000 # 像素面積
複製代碼
怎麼決定數字:在 Debug 畫面看實際偵測到的框,
Frigate 會顯示面積。取一個「你在意的最小人物」的面積再打八折。
4. 調整 threshold(信心度門檻)
- person:
- threshold: 0.75 # 0-1,越高越嚴格
複製代碼
- 太低 → 影子、衣架、盆栽都被當成人
- 太高 → 真的有人也抓不到
- 0.7-0.8 是常見的甜蜜點
5. 用 object mask 遮掉固定的誤判
有些地方會固定產生誤判(例如某個雕像一直被當成人)。
- objects:
- filters:
- person:
- mask:
- - 0.6,0.3,0.75,0.3,0.75,0.5,0.6,0.5
複製代碼
6. 改善夜間畫面
夜間誤報通常比白天多很多,原因:
- 紅外線畫面是黑白的,對比低
- 飛蟲貼近鏡頭會變成一大塊白影
- 雨滴反光
對策:
- 裝一盞燈 —— 有彩色畫面的話辨識率會好很多
- 攝影機不要裝在有蟲的地方(燈下面、水邊)
- 夜間提高 threshold(Frigate 目前不能分時段設,但可以在 HA 端過濾)
接進 HA
Frigate 有官方的 HA 整合(透過 HACS 安裝)。
裝了之後會有:
- camera 實體 —— 即時畫面
- binary_sensor —— 每個 zone 和物件類型的偵測狀態
- sensor —— 偵測次數統計
- switch —— 開關偵測、錄影、快照
實用的自動化:
- alias: 有人在門口
- triggers:
- - trigger: mqtt
- topic: frigate/events
- actions:
- - condition: template
- value_template: >
- {{ trigger.payload_json['type'] == 'new'
- and trigger.payload_json['after']['label'] == 'person'
- and '門口' in trigger.payload_json['after']['entered_zones'] }}
- - variables:
- id: "{{ trigger.payload_json['after']['id'] }}"
- - action: notify.mobile_app_charles
- data:
- title: 門口有人
- message: >
- {{ trigger.payload_json['after']['camera'] }}
- 偵測到人(信心度
- {{ (trigger.payload_json['after']['top_score'] * 100) | round(0) }}%)
- data:
- image: "/api/frigate/notifications/{{ id }}/snapshot.jpg"
- tag: "frigate-{{ id }}"
- actions:
- - action: URI
- title: 看即時畫面
- uri: /lovelace/cameras
- mode: parallel
- max: 10
複製代碼
通知帶圖片是 Frigate 最有價值的功能之一 ——
你不用打開 App 就知道是誰。
儲存空間規劃
粗估:
- 1080p @ 15fps,H.264 → 大約 1.5-2 GB / 天 / 台(連續錄影)
- 用 mode: motion 只錄有動靜的 → 可以省 60-80%
- 用 mode: active_objects → 省更多,但可能漏掉東西
三台攝影機、保留 7 天、motion 模式 → 大約 100-150 GB。
用機械硬碟就好(錄影是連續寫入,SSD 會加速耗損)。
---
最後一個建議:不要一開始就追求完美。
我的順序是:
- 先讓一台攝影機能看、能錄
- 跑一週,看誤報有多少
- 根據實際誤報調 mask 和 zone
- 滿意了再加第二台
一口氣設三台然後一起調,你會分不清是哪個設定造成什麼影響。 |
|