Frigate - NVR z funkcją wykrywania obiektów w czasie rzeczywistym dla kamer IP HA

Gdzie jest ta kluczowa informacja? Jak mogłem ją ominąć :face_with_monocle:

@szopen - sokole oko

Świeży poradnik jak to zrobić w kontenerze LXC na PVE:

I jest to zapewne dużo wydajniejsze podejście niż kontener w wirtualnej maszynie, która stanowi kolejna warstwę wirtualizacji, bez bezpośredniego dostępu do zasobów hosta.

Jednak się udało


Do końca sam nie wiem w czym był problem, zrobiłem wszystko od początku, łącznie z passtrough iGpu z proxmox do vm debiana (po za tylko jedną różnicą, ba najpierw zainstalowałem na proxmox intel-media-va-driver i sprawdziłem vainfo). Ważne, że działa, teraz muszę się "dokształcić we frigate i poprawnie to skonfigurować.
Wielkie dzięki dla @angler za pomoc i wskazówki.

2 polubienia

Czy ktoś może mi potwierdzić, że openvino i openvino-model są wbudowane we frigate i nie ma potrzeby dodatkowych instalacji w host, czy docker? Bez względu czy frigate jest zainstalowane na CT czy VM Proxmox?
Zainstalowałem testowo obie wersje, passthrough gpu wykonane poprawnie w obu instalacjach.

intel-gpu-top: Intel Alderlake_n (Gen12) @ /dev/dri/card1 -   30/ 596 MHz;  61% RC6;       53 irqs/s

         ENGINES     BUSY                                                                                                                                MI_SEMA MI_WAIT
       Render/3D    0.00% |                                                                                                                            |      0%      0%
         Blitter    0.00% |                                                                                                                            |      0%      0%
           Video    1.46% |█▉                                                                                                                          |      0%      0%
    VideoEnhance    0.00% |                                                                                                                            |      0%      0%

^Z
[1]+  Stopped                 intel_gpu_top

Przy konfiguracji:

detectors:
  ov:
    type: openvino
    device: GPU

model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  path: /openvino-model/ssdlite_mobilenet_v2.xml
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt

Wyniki niemal identyczne dla obu wariantów instalacji: Detector Inference Speed = 10-15ms. Tu akurat screenz instalacji Proxmox → VM (debian12) → docker frigate:


U mnie kluczowa była konfiguracja:

    detect:
      width: 640
      height: 360

przy rozdzielczości moich kamer 1280x720 (gdzieś wyczytałem żeby zmniejszyć o połowę).

root@media:~# ffprobe rtsp://192.168.10.115
ffprobe version 5.1.6-0+deb12u1 Copyright (c) 2007-2024 the FFmpeg developers
  built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr --extra-version=0+deb12u1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared
  libavutil      57. 28.100 / 57. 28.100
  libavcodec     59. 37.100 / 59. 37.100
  libavformat    59. 27.100 / 59. 27.100
  libavdevice    59.  7.100 / 59.  7.100
  libavfilter     8. 44.100 /  8. 44.100
  libswscale      6.  7.100 /  6.  7.100
  libswresample   4.  7.100 /  4.  7.100
  libpostproc    56.  6.100 / 56.  6.100
Input #0, rtsp, from 'rtsp://192.168.10.115':
  Metadata:
    title           : streamed by the macro-video rtsp server
  Duration: N/A, start: 0.019000, bitrate: N/A
  Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1280x720, 20 fps, 50 tbr, 90k tbn
root@media:~#

Dopiero uczę się konfiguracji frigate i docelowo pewnie będzie to na lepszym sprzęcie z porządnymi kamerami, ale do tego czasu chciałbym już mieć to rozpracowane :).
Proszę więc o potwierdzenie moich przemyśleń, lub ewentualne poprawienie ich.

EDIT: Udało sie ogarnąć w LXC i śmiga :slight_smile:

Nie ma żadnych problemów, wszystko działa ok. Poradnik ja zrobić passthrough jest na forum Proxmoxa https://pve.proxmox.com/wiki/PCI_Passthrough

Może już za niedługo będzie jeszcze łatwiej, bo bez edycji YAML

3 polubienia

Witajcie jak zrobić aby głowny strumien nagrywał a podglad mial ze strumienia z ktorego robi detect w rozdzielczosci 1920x608 miałbym podglad w HA integracja Webrtc Alex kombinuje i nie wiem co dalej

mqtt:
  host: 192.168.1.185
  port: 1883
  user: z2m
  password: z
  topic_prefix: frigate

ffmpeg:
  hwaccel_args: preset-vaapi


detectors:
  ov:
    type: openvino
    device: GPU
  ov1:
    type: openvino
    device: GPU

#model:
  #width: 300
  #height: 300
  #input_tensor: nhwc
  #input_pixel_format: bgr
 # path: /openvino-model/ssdlite_mobilenet_v2.xml
  #labelmap_path: /openvino-model/coco_91cl_bkgr.txt

model:
  model_type: yolo-generic
  width: 320
  height: 320
  input_tensor: nchw
  input_dtype: float
  path: /config/model_cache/openvino/models/yolo11s_openvino_model/yolo11s.xml
  labelmap_path: /config/model_cache/openvino/models/labelmap/coco-80.txt

go2rtc:

  streams:
    bramyfrigata:
      - ffmpeg:rtsp://192.168.1.227:554/user=admin&password=Z&channel=0&stream=0.sdp

    tylfrigata:
      - ffmpeg:rtsp://192.168.1.168:554/user=admin&password=Z&channel=0&stream=0.sdp
  api:
    listen: :1984 #dopasuj do swojej konfiguracji portów, pamiętaj żę w HAOS masz dwa go2rtc, jeden w frigate a drugi w HA i nie mogą być na tych samych portach
  webrtc:
    listen: :8556 #dopasuj do swojej konfiguracji portów, pamiętaj żę w HAOS masz dwa go2rtc, jeden w frigate a drugi w HA i nie mogą być na tych samych portach
    ice_servers:
      - urls: [stun:stun.cloudflare.com:3478] #moźesz zamienić na Google.
    candidates:
      - stun:8556 #dopasuj do swojej konfiguracji portów, pamiętaj żę w HAOS masz dwa go2rtc, jeden w frigate a drugi w HA i nie mogą być na tych samych portach


cameras:
  bramyfrigata:
    enabled: true
    ffmpeg:
      output_args:
        record: preset-record-generic-audio-copy #jeśli masz inny dzwięk niż aac zamień to na preset-record-generic lub preset-record-generic-audio-aac
      inputs:
        - path: rtsp://127.0.0.1:8554/bramyfrigata
          input_args: preset-rtsp-restream
          roles:
            - detect

    live:
      streams:
        bramyfrigata: bramyfrigata

    detect:
      width: 1920
      height: 608
      fps: 6
      min_initialized: 2
      max_disappeared: 25
      stationary:
        interval: 50
        threshold: 50
      annotation_offset: 0
    snapshots:
      enabled: true
      quality: 100
      bounding_box: true
      timestamp: false
      required_zones:
        - brama1 ## główna brama
        - dzwonek ## strefa przy dzwonku
        - brama2 ## boczna brama
        - Nocna  ## strefa nocna
      retain:
        default: 2
    record:
      enabled: true
      expire_interval: 2
      sync_recordings: true
      retain:
        days: 2
        mode: motion
      preview:
        quality: high
      alerts:
        retain:
          days: 2
          mode: motion
        pre_capture: 5
        post_capture: 5
      detections:
        retain:
          days: 2
          mode: motion
        pre_capture: 5
        post_capture: 5

    objects:
      track:
        - person
        - car
      filters:
        person:
          min_score: 0.8
        car:
          min_score: 0.8
      mask:
        - 0.114,0.411,0.178,0.394,0.17,0.341,0.436,0.188,0.859,0.309,0.87,0.44,0.894,0.548,1,0.937,0.998,0.005,0.002,0.007,0.001,0.483
        - 0.098,1,0.234,0.565,0.074,0.593,0.02,0.839,0.076,1
    zones:
      brama1:
        coordinates: 
          0.254,0.445,0.395,0.451,0.4,0.51,0.394,0.562,0.254,0.538,0.259,0.511
        loitering_time: 0
        objects:
          - car
          - person
        inertia: 1
        min_area: 0.1
      dzwonek:
        coordinates: 0.405,0.534,0.395,0.319,0.545,0.325,0.545,0.546
        loitering_time: 0
        objects:
          - person
          - car
        inertia: 1
        min_area: 0.1
      brama2:
        coordinates: 0.722,0.587,0.837,0.594,0.811,0.483,0.698,0.469
        loitering_time: 0
        objects:
          - person
          - car
        inertia: 1
        min_area: 0.1
      Nocna:
        coordinates: 
          0.234,0.544,0.167,0.78,0.102,1,1,1,0.994,0.925,0.89,0.557,0.856,0.561,0.855,0.61,0.705,0.599,0.572,0.551,0.392,0.578
        loitering_time: 0
        objects:
          - person
          - car
        inertia: 1

    motion:
      threshold: 30
      lightning_threshold: 0.8
      contour_area: 10
      frame_alpha: 0.01
      frame_height: 100
      improve_contrast: true
      mqtt_off_delay: 30
      mask:
        - 0.18,0.392,0.241,0.374,0.253,0.399,0.388,0.4,0.383,0.315,0.607,0.314,0.69,0.426,0.871,0.458,0.857,0.314,0.436,0.18,0.173,0.292
        - 0.153,0.003,0.089,0.272,0.002,0.481,0.001,0.012
        - 0.997,0.412,0.858,0.157,0.855,0.006,0.997,0.006
    review:
      detections:
        required_zones:
          - brama1
          - dzwonek
          - brama2
          - Nocna
      alerts:
        required_zones:
          - brama1
          - dzwonek
          - brama2
          - Nocna
  tylfrigata:
    enabled: true
    ffmpeg:
      output_args:
        record: preset-record-generic-audio-copy #jeśli masz inny dzwięk niż aac zamień to na preset-record-generic lub preset-record-generic-audio-aac
      inputs:
        - path: rtsp://127.0.0.1:8554/tylfrigata
          input_args: preset-rtsp-restream
          roles:
            - detect
    detect:
      width: 1600
      height: 558
      fps: 3
    snapshots:
      enabled: true
      bounding_box: true
      timestamp: false
      retain:
        default: 2
    record:
      enabled: true
      expire_interval: 2
      sync_recordings: true
      retain:
        days: 2
        mode: motion
      preview:
        quality: high
      alerts:
        retain:
          days: 2
          mode: motion
        pre_capture: 5
        post_capture: 5
      detections:
        retain:
          days: 2
          mode: motion
        pre_capture: 5
        post_capture: 5
    objects:
      track:
        - person
        - car
      filters:
        person:
          min_score: 0.8
        car:
          min_score: 0.8
      mask:
        - 0,1,0.365,0.124,0.762,0.148,0.995,0.589,0.997,0.002,0.003,0.004
        - 0.705,0.495,0.773,0.514,0.826,0.45,0.791,0.269,0.697,0.275,0.679,0.409
    zones:
      Tyl:
        coordinates: 1,0.736,0.76,0.168,0.37,0.148,0.024,1,1,1
        loitering_time: 0
        objects:
          - car
          - person
        inertia: 2
    motion:
      mask:
        - 0.026,0.852,0.365,0.126,0.757,0.143,0.996,0.698,0.998,0.589,1,0,0,0,0.011,0.855
        - 0.666,0.339,0.701,0.275,0.773,0.27,0.826,0.45,0.773,0.514,0.725,0.501,0.705,0.495,0.691,0.448
    review:
      alerts:
        required_zones: Tyl
      detections:
        required_zones: Tyl
detect:
  enabled: true

objects:
  track:
    - person
    - car
    - bus




semantic_search:
  enabled: false
  model_size: small
face_recognition:
  enabled: true
  model_size: small
  detection_threshold: 0.7      # minimalna pewność wykrycia twarzy (lekko podnosimy z 0.7)
  min_area: 20       # minimalny rozmiar twarzy w pikselach                                # większa odległość = twarze 
  unknown_score: 0.8             # pozostawiamy domyślne
  recognition_threshold: 0.85     # domyślne, można obniżyć np. 0.85 jeśli czasem nie wykrywa
  min_faces: 1
  save_attempts: 100
  blur_confidence_filter: false


lpr:
  enabled: true
  model_size: small
  device: GPU
  min_plate_length: 4 # Only recognize plates with 4 or more characters
  recognition_threshold: 0.6
  match_distance: 1
  min_area: 45
  known_plates:
    michal:
      - ZBI-20358
      - 2B1-20358
      - 2BI-20358
      - ZBI20358
      - ZB120358
      - 2B120358
      - 2BI20358
      - 281-20358
      - C781-20358
      - 51-20358
      - 4-1320358


    ilona:
      - ZBI-30609
      - ZB130609
      - 2B130609
      - 2BI30609
      - 78-30609
      - 281-30609



classification:
  bird:
    enabled: false


version: 0.16-0

Tu masz przykład, musisz zrobić analogicznie (głównemu streamowi z kamery nadajesz rolę record a pobocznemu o zmniejszonych parametrach rolę detect)

Dziękuję będę próbował to zrobić