Frigate ist natürlich im Bereich der zentralen Kameraüberwachung absolut ein guter Name. Doch es gibt einiges was man an Frigate einstellen, konfigurieren und optimieren kann. Besonders das Optimieren ist hier wichtig, denn schnell kann es passieren das die CPU-Last ins unendliche steigt. Zum Glück haben wir GPU & TPU, welche uns hier deutlich entlasten und die Leistungsaufnahme verringern.

Frigate mit GPU & TPU

Die Software muss Bildmaterial verarbeiten und das auch noch in Echtzeit. Solche Prozesse benötigen Rechenkapazität und bestenfalls sogar noch Rechenkapazität welche dafür ausgelegt und optimiert ist. Alles spricht also für eine GPU um das Videosignal direkt durch Hardware dekodieren zu können. Frigate bietet dort einige Optionen an und ich habe mich für die Variante mit der Intel CPU gewählt. Meine Intel CPU unterstützt VAAPI (Video Accelerator API). Damit kann direkt durch den Hardware-Chip in der CPU das Videosignal verarbeitet werden, ohne das dabei die CPU belastet wird.

Wer jetzt sogar noch eine vollständige Objekterkennung haben möchte, der muss ein vorab trainiertes Neuronales Netz verwenden. Auch hier ist die CPU eigentlich der falsche Ort zur Berechnung, dafür gibt es TPU Chips. Mit dem Google Coral über USB gibt es hier eine super einfache Methode dies in diesen Chip auszulagern.

Frigate installieren und einrichten

Frigate selber ist super einfach mit Hilfe von Docker zu betreiben, also eine “Installation” entfällt hier. Die Dokumentation von Frigate ist hervorragend beschrieben. Diese findet Ihr hier.

Jetzt kommen aber 1-2 wichtige Informationen. Zu diesem Zeitpunkt sollte dir klar sein ob du auch wie oben beschrieben eine GPU & TPU einsetzen möchtest. Denn es müssen entsprechende Flags gesetzt werden wenn ihr diese benutzen möchtet.

Die eigentliche Einrichtung passiert dann aber über die Konfigurations-Datei. Dort wird definiert wie welche Kamera angebunden wird. Mit was für einem Hardware Accelerator der Videostream dekodiert werden soll und ob du über einen VAAPI und einen TPU Stick verfügst.

Wer genauer in meine Konfig rein schaut, dem wird auffallen das ich das “Detecten” von Objekten mit dem Substream von der Reolink Kamera mache. Objekte können auch in Videomaterial erkannt werden, welches nicht 4K ist, sondern meistens reicht dafür ein 720p Stream. Also benutzen wird den Stream mit der weniger guten Qualität für das aufspüren von Objekten, aber zeichnen für die Aufnahme den mit der hohen 4K Auflösung auf. Also das Bildmaterial was du dir später ansiehst, ist wieder mit super Qualität.

config.yaml – Frigate

mqtt:
  enabled: True
  host: 192.168.10.20
  port: 1883
  topic_prefix: frigate
  client_id: frigate
cameras:
  E1-Pro:
    ffmpeg:
      hwaccel_args: preset-vaapi
      inputs:
        - path: rtsp://video:Test1234!@192.168.75.172:554/h264Preview_01_main
          roles:
            - record
            - rtmp
        - path: rtsp://video:Test1234!@192.168.75.172:554/h264Preview_01_sub
          roles:
            - detect
    detect:
      height: 360
      width: 640
      fps: 5
    objects:
      track:
        - person
        - cat
        - dog
        - car
        - bus
        - train
        - cup
  RLC-410:
    ffmpeg:
      hwaccel_args: preset-vaapi
      inputs:
        - path: rtsp://admin:Test1234@192.168.20.34:554/h264Preview_01_main
          roles:
            - record
            - rtmp
        - path: rtsp://admin:Test1234@192.168.20.34:554/h264Preview_01_sub
          roles:
            - detect
    detect:
      height: 360
      width: 640
      fps: 5
    objects:
      track:
        - person
        - cat
        - dog
        - car
        - bus
        - train
        - cup
detectors:
  coral:
    type: edgetpu
    device: usb
birdseye:
  enabled: True
  mode: continuous
  width: 1920
  height: 1080
record:
  enabled: True
  expire_interval: 30
  sync_recordings: True
  retain:
    days: 1
    mode: all
  events:
    pre_capture: 10
    post_capture: 10

snapshots:
  enabled: True
  clean_copy: True
  timestamp: True

telemetry:
  network_interfaces:
    - eth
    - enp
    - eno
    - ens
    - wl
    - lo
  stats:
    amd_gpu_stats: True
    intel_gpu_stats: True
    network_bandwidth: False