From 17d0c0162b7ba5b45f249bb9b9e2fbc11dbe6368 Mon Sep 17 00:00:00 2001 From: Andrew Reiter Date: Tue, 18 Jul 2023 11:09:16 -0400 Subject: [PATCH] Non-Jetson changes Required for later commits: - Allow base image to be overridden (and don't assume its WORKDIR) - Ensure python3.9 - Map hwaccel decode presets as strings instead of lists Not required: - Fix existing documentation - Simplify hwaccel scale logic --- docker-compose.yml | 2 - docker/main/Dockerfile | 19 +++-- docker/main/install_deps.sh | 10 ++- docs/docs/configuration/index.md | 4 +- docs/docs/configuration/object_detectors.md | 2 +- frigate/ffmpeg_presets.py | 86 +++++---------------- 6 files changed, 45 insertions(+), 78 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b16f652f0..0f4ddf55a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,8 +30,6 @@ services: - /etc/localtime:/etc/localtime:ro - ./config:/config - ./debug:/media/frigate - # Create the trt-models folder using the documented method of generating TRT models - # - ./debug/trt-models:/trt-models - /dev/bus/usb:/dev/bus/usb mqtt: container_name: mqtt diff --git a/docker/main/Dockerfile b/docker/main/Dockerfile index 06bc71c06..43795d864 100644 --- a/docker/main/Dockerfile +++ b/docker/main/Dockerfile @@ -3,11 +3,14 @@ # https://askubuntu.com/questions/972516/debian-frontend-environment-variable ARG DEBIAN_FRONTEND=noninteractive -FROM debian:11 AS base +ARG BASE_IMAGE=debian:11 +ARG SLIM_BASE=debian:11-slim + +FROM ${BASE_IMAGE} AS base FROM --platform=linux/amd64 debian:11 AS base_amd64 -FROM debian:11-slim AS slim-base +FROM ${SLIM_BASE} AS slim-base FROM slim-base AS wget ARG DEBIAN_FRONTEND @@ -123,8 +126,8 @@ RUN apt-get -qq update \ && echo "deb http://deb.debian.org/debian bullseye main contrib non-free" | tee /etc/apt/sources.list.d/raspi.list \ && apt-get -qq update \ && apt-get -qq install -y \ - python3 \ - python3-dev \ + python3.9 \ + python3.9-dev \ wget \ # opencv dependencies build-essential cmake git pkg-config libgtk-3-dev \ @@ -137,14 +140,17 @@ RUN apt-get -qq update \ gcc gfortran libopenblas-dev liblapack-dev && \ rm -rf /var/lib/apt/lists/* +# Ensure python3 defaults to python3.9 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 + RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ && python3 get-pip.py "pip" COPY docker/main/requirements.txt /requirements.txt -RUN pip3 install -r requirements.txt +RUN pip3 install -r /requirements.txt COPY docker/main/requirements-wheels.txt /requirements-wheels.txt -RUN pip3 wheel --wheel-dir=/wheels -r requirements-wheels.txt +RUN pip3 wheel --wheel-dir=/wheels -r /requirements-wheels.txt # Collect deps in a single layer @@ -176,6 +182,7 @@ RUN --mount=type=bind,source=docker/main/install_deps.sh,target=/deps/install_de /deps/install_deps.sh RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \ + python3 -m pip install --upgrade pip && \ pip3 install -U /deps/wheels/*.whl COPY --from=deps-rootfs / / diff --git a/docker/main/install_deps.sh b/docker/main/install_deps.sh index 9eb784ec8..61ece1b76 100755 --- a/docker/main/install_deps.sh +++ b/docker/main/install_deps.sh @@ -10,11 +10,15 @@ apt-get -qq install --no-install-recommends -y \ wget \ procps vainfo \ unzip locales tzdata libxml2 xz-utils \ + python3.9 \ python3-pip \ curl \ jq \ nethogs +# ensure python3 defaults to python3.9 +update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 + mkdir -p -m 600 /root/.gnupg # add coral repo @@ -23,8 +27,10 @@ curl -fsSLo - https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | tee /etc/apt/sources.list.d/coral-edgetpu.list echo "libedgetpu1-max libedgetpu/accepted-eula select true" | debconf-set-selections -# enable non-free repo -sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list +# enable non-free repo in Debian +if grep -q "Debian" /etc/issue; then + sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list +fi # coral drivers apt-get -qq update diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md index eef00550d..d3b6e6a40 100644 --- a/docs/docs/configuration/index.md +++ b/docs/docs/configuration/index.md @@ -101,7 +101,7 @@ detectors: # Required: name of the detector detector_name: # Required: type of the detector - # Frigate provided types include 'cpu', 'edgetpu', and 'openvino' (default: shown below) + # Frigate provided types include 'cpu', 'edgetpu', 'openvino' and 'tensorrt' (default: shown below) # Additional detector types can also be plugged in. # Detectors may require additional configuration. # Refer to the Detectors configuration page for more information. @@ -414,6 +414,8 @@ snapshots: # Optional: Per object retention days objects: person: 15 + # Optional: quality of the encoded jpeg, 0-100 (default: shown below) + quality: 70 # Optional: RTMP configuration # NOTE: RTMP is deprecated in favor of restream diff --git a/docs/docs/configuration/object_detectors.md b/docs/docs/configuration/object_detectors.md index 93c439b64..a7cf9db77 100644 --- a/docs/docs/configuration/object_detectors.md +++ b/docs/docs/configuration/object_detectors.md @@ -196,7 +196,7 @@ The model used for TensorRT must be preprocessed on the same hardware platform t The Frigate image will generate model files during startup if the specified model is not found. Processed models are stored in the `/config/model_cache` folder. Typically the `/config` path is mapped to a directory on the host already and the `model_cache` does not need to be mapped separately unless the user wants to store it in a different location on the host. -To by default, the `yolov7-tiny-416` model will be generated, but this can be overridden by specifying the `YOLO_MODELS` environment variable in Docker. One or more models may be listed in a comma-separated format, and each one will be generated. To select no model generation, set the variable to an empty string, `YOLO_MODELS=""`. Models will only be generated if the corresponding `{model}.trt` file is not present in the `model_cache` folder, so you can force a model to be regenerated by deleting it from your Frigate data folder. +By default, the `yolov7-tiny-416` model will be generated, but this can be overridden by specifying the `YOLO_MODELS` environment variable in Docker. One or more models may be listed in a comma-separated format, and each one will be generated. To select no model generation, set the variable to an empty string, `YOLO_MODELS=""`. Models will only be generated if the corresponding `{model}.trt` file is not present in the `model_cache` folder, so you can force a model to be regenerated by deleting it from your Frigate data folder. If your GPU does not support FP16 operations, you can pass the environment variable `USE_FP16=False` to disable it. diff --git a/frigate/ffmpeg_presets.py b/frigate/ffmpeg_presets.py index 43d2504bd..a48b4a209 100644 --- a/frigate/ffmpeg_presets.py +++ b/frigate/ffmpeg_presets.py @@ -55,58 +55,14 @@ _user_agent_args = [ ] PRESETS_HW_ACCEL_DECODE = { - "preset-rpi-32-h264": ["-c:v:1", "h264_v4l2m2m"], - "preset-rpi-64-h264": ["-c:v:1", "h264_v4l2m2m"], - "preset-vaapi": [ - "-hwaccel_flags", - "allow_profile_mismatch", - "-hwaccel", - "vaapi", - "-hwaccel_device", - _gpu_selector.get_selected_gpu(), - "-hwaccel_output_format", - "vaapi", - ], - "preset-intel-qsv-h264": [ - "-hwaccel", - "qsv", - "-qsv_device", - _gpu_selector.get_selected_gpu(), - "-hwaccel_output_format", - "qsv", - "-c:v", - "h264_qsv", - ], - "preset-intel-qsv-h265": [ - "-load_plugin", - "hevc_hw", - "-hwaccel", - "qsv", - "-qsv_device", - _gpu_selector.get_selected_gpu(), - "-hwaccel_output_format", - "qsv", - "-c:v", - "hevc_qsv", - ], - "preset-nvidia-h264": [ - "-hwaccel", - "cuda", - "-hwaccel_output_format", - "cuda", - ], - "preset-nvidia-h265": [ - "-hwaccel", - "cuda", - "-hwaccel_output_format", - "cuda", - ], - "preset-nvidia-mjpeg": [ - "-hwaccel", - "cuda", - "-hwaccel_output_format", - "cuda", - ], + "preset-rpi-32-h264": "-c:v:1 h264_v4l2m2m", + "preset-rpi-64-h264": "-c:v:1 h264_v4l2m2m", + "preset-vaapi": f"-hwaccel_flags allow_profile_mismatch -hwaccel vaapi -hwaccel_devic {_gpu_selector.get_selected_gpu()} -hwaccel_output_format vaapi", + "preset-intel-qsv-h264": f"-hwaccel qsv -qsv_devic {_gpu_selector.get_selected_gpu()} -hwaccel_output_format qsv -c:v h264_qsv", + "preset-intel-qsv-h265": f"-load_plugin hevc_hw -hwaccel qsv -qsv_device {_gpu_selector.get_selected_gpu()} -hwaccel_output_format qsv -c:v hevc_qsv", + "preset-nvidia-h264": "-hwaccel cuda -hwaccel_output_format cuda", + "preset-nvidia-h265": "-hwaccel cuda -hwaccel_output_format cuda", + "preset-nvidia-mjpeg": "-hwaccel cuda -hwaccel_output_format cuda", } PRESETS_HW_ACCEL_SCALE = { @@ -148,7 +104,12 @@ def parse_preset_hardware_acceleration_decode(arg: Any) -> list[str]: if not isinstance(arg, str): return None - return PRESETS_HW_ACCEL_DECODE.get(arg, None) + decode = PRESETS_HW_ACCEL_DECODE.get(arg, None) + + if not decode: + return None + + return decode.split(" ") def parse_preset_hardware_acceleration_scale( @@ -160,20 +121,13 @@ def parse_preset_hardware_acceleration_scale( ) -> list[str]: """Return the correct scaling preset or default preset if none is set.""" if not isinstance(arg, str) or " " in arg: - scale = PRESETS_HW_ACCEL_SCALE["default"].format(fps, width, height).split(" ") - scale.extend(detect_args) - return scale - - scale = PRESETS_HW_ACCEL_SCALE.get(arg, "") - - if scale: - scale = scale.format(fps, width, height).split(" ") - scale.extend(detect_args) - return scale + scale = PRESETS_HW_ACCEL_SCALE["default"] else: - scale = scale.format(fps, width, height).split(" ") - scale.extend(detect_args) - return scale + scale = PRESETS_HW_ACCEL_SCALE.get(arg, "") + + scale = scale.format(fps, width, height).split(" ") + scale.extend(detect_args) + return scale class EncodeTypeEnum(str, Enum):