Нет описания

Blake Blackshear 262f45c8bc Update sponsorship option 5 лет назад
.github 262f45c8bc Update sponsorship option 5 лет назад
config 3a3afe14bf change the ffmpeg config for global defaults and overrides 5 лет назад
docs 3a3afe14bf change the ffmpeg config for global defaults and overrides 5 лет назад
frigate 3a3afe14bf change the ffmpeg config for global defaults and overrides 5 лет назад
scripts 834a3df0bc added missing scripts 5 лет назад
.dockerignore 806acaf445 update dockerignore and debug option 5 лет назад
.gitignore a659019d1a move config example 5 лет назад
Dockerfile 12d5007b90 add required packages for VAAPI 5 лет назад
LICENSE 72393be6d6 initial commit 6 лет назад
README.md 22bb17b2fd Filename updated but not the reference 5 лет назад
benchmark.py 7028b05856 add a benchmark script 5 лет назад
detect_objects.py 3a3afe14bf change the ffmpeg config for global defaults and overrides 5 лет назад
diagram.png 7a7f507781 update diagram 6 лет назад

README.md

Buy Me a Coffee at ko-fi.com

Frigate - Realtime Object Detection for IP Cameras

Note: This version requires the use of a Google Coral USB Accelerator

Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras. Designed for integration with HomeAssistant or others via MQTT.

  • Leverages multiprocessing and threads heavily with an emphasis on realtime over processing every frame
  • Allows you to define specific regions (squares) in the image to look for objects
  • No motion detection (for now)
  • Object detection with Tensorflow runs in a separate thread
  • Object info is published over MQTT for integration into HomeAssistant as a binary sensor
  • An endpoint is available to view an MJPEG stream for debugging

Diagram

Example video (from older version)

You see multiple bounding boxes because it draws bounding boxes from all frames in the past 1 second where a person was detected. Not all of the bounding boxes were from the current frame.

Getting Started

Build the container with

docker build -t frigate .

The mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite model is included and used by default. You can use your own model and labels by mounting files in the container at /frozen_inference_graph.pb and /label_map.pbtext. Models must be compatible with the Coral according to this.

Run the container with

docker run --rm \
--privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v <path_to_config_dir>:/config:ro \
-v /etc/localtime:/etc/localtime:ro \
-p 5000:5000 \
-e FRIGATE_RTSP_PASSWORD='password' \
frigate:latest

Example docker-compose:

  frigate:
    container_name: frigate
    restart: unless-stopped
    privileged: true
    image: frigate:latest
    volumes:
      - /dev/bus/usb:/dev/bus/usb
      - /etc/localtime:/etc/localtime:ro
      - <path_to_config>:/config
    ports:
      - "5000:5000"
    environment:
      FRIGATE_RTSP_PASSWORD: "password"

A config.yml file must exist in the config directory. See example here and device specific info can be found here.

Access the mjpeg stream at http://localhost:5000/<camera_name> and the best person snapshot at http://localhost:5000/<camera_name>/best_person.jpg

Integration with HomeAssistant

camera:
  - name: Camera Last Person
    platform: mqtt
    topic: frigate/<camera_name>/snapshot

binary_sensor:
  - name: Camera Person
    platform: mqtt
    state_topic: "frigate/<camera_name>/objects"
    value_template: '{{ value_json.person }}'
    device_class: motion
    availability_topic: "frigate/available"

automation:
  - alias: Alert me if a person is detected while armed away
    trigger: 
      platform: state
      entity_id: binary_sensor.camera_person
      from: 'off'
      to: 'on'
    condition:
      - condition: state
        entity_id: alarm_control_panel.home_alarm
        state: armed_away
    action:
      - service: notify.user_telegram
        data:
          message: "A person was detected."
          data:
            photo:
              - url: http://<ip>:5000/<camera_name>/best_person.jpg
                caption: A person was detected.

Tips

  • Lower the framerate of the video feed on the camera to reduce the CPU usage for capturing the feed

Future improvements

  • Remove motion detection for now
  • Try running object detection in a thread rather than a process
  • Implement min person size again
  • Switch to a config file
  • Handle multiple cameras in the same container
  • Attempt to figure out coral symlinking
  • Add object list to config with min scores for mqtt
  • Move mjpeg encoding to a separate process
  • Simplify motion detection (check entire image against mask, resize instead of gaussian blur)
  • See if motion detection is even worth running
  • Scan for people across entire image rather than specfic regions
  • Dynamically resize detection area and follow people
  • Add ability to turn detection on and off via MQTT
  • Output movie clips of people for notifications, etc.
  • Integrate with homeassistant push camera
  • Merge bounding boxes that span multiple regions
  • Implement mode to save labeled objects for training
  • Try and reduce CPU usage by simplifying the tensorflow model to just include the objects we care about
  • Look into GPU accelerated decoding of RTSP stream
  • Send video over a socket and use JSMPEG
  • Look into neural compute stick