mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-05 18:55:23 +03:00
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
This commit is contained in:
parent
680198148b
commit
17d0c0162b
@ -30,8 +30,6 @@ services:
|
|||||||
- /etc/localtime:/etc/localtime:ro
|
- /etc/localtime:/etc/localtime:ro
|
||||||
- ./config:/config
|
- ./config:/config
|
||||||
- ./debug:/media/frigate
|
- ./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
|
- /dev/bus/usb:/dev/bus/usb
|
||||||
mqtt:
|
mqtt:
|
||||||
container_name: mqtt
|
container_name: mqtt
|
||||||
|
|||||||
@ -3,11 +3,14 @@
|
|||||||
# https://askubuntu.com/questions/972516/debian-frontend-environment-variable
|
# https://askubuntu.com/questions/972516/debian-frontend-environment-variable
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
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 --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
|
FROM slim-base AS wget
|
||||||
ARG DEBIAN_FRONTEND
|
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 \
|
&& 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 update \
|
||||||
&& apt-get -qq install -y \
|
&& apt-get -qq install -y \
|
||||||
python3 \
|
python3.9 \
|
||||||
python3-dev \
|
python3.9-dev \
|
||||||
wget \
|
wget \
|
||||||
# opencv dependencies
|
# opencv dependencies
|
||||||
build-essential cmake git pkg-config libgtk-3-dev \
|
build-essential cmake git pkg-config libgtk-3-dev \
|
||||||
@ -137,14 +140,17 @@ RUN apt-get -qq update \
|
|||||||
gcc gfortran libopenblas-dev liblapack-dev && \
|
gcc gfortran libopenblas-dev liblapack-dev && \
|
||||||
rm -rf /var/lib/apt/lists/*
|
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 \
|
RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \
|
||||||
&& python3 get-pip.py "pip"
|
&& python3 get-pip.py "pip"
|
||||||
|
|
||||||
COPY docker/main/requirements.txt /requirements.txt
|
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
|
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
|
# 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
|
/deps/install_deps.sh
|
||||||
|
|
||||||
RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \
|
RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \
|
||||||
|
python3 -m pip install --upgrade pip && \
|
||||||
pip3 install -U /deps/wheels/*.whl
|
pip3 install -U /deps/wheels/*.whl
|
||||||
|
|
||||||
COPY --from=deps-rootfs / /
|
COPY --from=deps-rootfs / /
|
||||||
|
|||||||
@ -10,11 +10,15 @@ apt-get -qq install --no-install-recommends -y \
|
|||||||
wget \
|
wget \
|
||||||
procps vainfo \
|
procps vainfo \
|
||||||
unzip locales tzdata libxml2 xz-utils \
|
unzip locales tzdata libxml2 xz-utils \
|
||||||
|
python3.9 \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
curl \
|
curl \
|
||||||
jq \
|
jq \
|
||||||
nethogs
|
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
|
mkdir -p -m 600 /root/.gnupg
|
||||||
|
|
||||||
# add coral repo
|
# 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 "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
|
echo "libedgetpu1-max libedgetpu/accepted-eula select true" | debconf-set-selections
|
||||||
|
|
||||||
# enable non-free repo
|
# enable non-free repo in Debian
|
||||||
sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list
|
if grep -q "Debian" /etc/issue; then
|
||||||
|
sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list
|
||||||
|
fi
|
||||||
|
|
||||||
# coral drivers
|
# coral drivers
|
||||||
apt-get -qq update
|
apt-get -qq update
|
||||||
|
|||||||
@ -101,7 +101,7 @@ detectors:
|
|||||||
# Required: name of the detector
|
# Required: name of the detector
|
||||||
detector_name:
|
detector_name:
|
||||||
# Required: type of the detector
|
# 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.
|
# Additional detector types can also be plugged in.
|
||||||
# Detectors may require additional configuration.
|
# Detectors may require additional configuration.
|
||||||
# Refer to the Detectors configuration page for more information.
|
# Refer to the Detectors configuration page for more information.
|
||||||
@ -414,6 +414,8 @@ snapshots:
|
|||||||
# Optional: Per object retention days
|
# Optional: Per object retention days
|
||||||
objects:
|
objects:
|
||||||
person: 15
|
person: 15
|
||||||
|
# Optional: quality of the encoded jpeg, 0-100 (default: shown below)
|
||||||
|
quality: 70
|
||||||
|
|
||||||
# Optional: RTMP configuration
|
# Optional: RTMP configuration
|
||||||
# NOTE: RTMP is deprecated in favor of restream
|
# NOTE: RTMP is deprecated in favor of restream
|
||||||
|
|||||||
@ -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.
|
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.
|
If your GPU does not support FP16 operations, you can pass the environment variable `USE_FP16=False` to disable it.
|
||||||
|
|
||||||
|
|||||||
@ -55,58 +55,14 @@ _user_agent_args = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
PRESETS_HW_ACCEL_DECODE = {
|
PRESETS_HW_ACCEL_DECODE = {
|
||||||
"preset-rpi-32-h264": ["-c:v:1", "h264_v4l2m2m"],
|
"preset-rpi-32-h264": "-c:v:1 h264_v4l2m2m",
|
||||||
"preset-rpi-64-h264": ["-c:v:1", "h264_v4l2m2m"],
|
"preset-rpi-64-h264": "-c:v:1 h264_v4l2m2m",
|
||||||
"preset-vaapi": [
|
"preset-vaapi": f"-hwaccel_flags allow_profile_mismatch -hwaccel vaapi -hwaccel_devic {_gpu_selector.get_selected_gpu()} -hwaccel_output_format vaapi",
|
||||||
"-hwaccel_flags",
|
"preset-intel-qsv-h264": f"-hwaccel qsv -qsv_devic {_gpu_selector.get_selected_gpu()} -hwaccel_output_format qsv -c:v h264_qsv",
|
||||||
"allow_profile_mismatch",
|
"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",
|
||||||
"-hwaccel",
|
"preset-nvidia-h264": "-hwaccel cuda -hwaccel_output_format cuda",
|
||||||
"vaapi",
|
"preset-nvidia-h265": "-hwaccel cuda -hwaccel_output_format cuda",
|
||||||
"-hwaccel_device",
|
"preset-nvidia-mjpeg": "-hwaccel cuda -hwaccel_output_format cuda",
|
||||||
_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",
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PRESETS_HW_ACCEL_SCALE = {
|
PRESETS_HW_ACCEL_SCALE = {
|
||||||
@ -148,7 +104,12 @@ def parse_preset_hardware_acceleration_decode(arg: Any) -> list[str]:
|
|||||||
if not isinstance(arg, str):
|
if not isinstance(arg, str):
|
||||||
return None
|
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(
|
def parse_preset_hardware_acceleration_scale(
|
||||||
@ -160,20 +121,13 @@ def parse_preset_hardware_acceleration_scale(
|
|||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
"""Return the correct scaling preset or default preset if none is set."""
|
"""Return the correct scaling preset or default preset if none is set."""
|
||||||
if not isinstance(arg, str) or " " in arg:
|
if not isinstance(arg, str) or " " in arg:
|
||||||
scale = PRESETS_HW_ACCEL_SCALE["default"].format(fps, width, height).split(" ")
|
scale = PRESETS_HW_ACCEL_SCALE["default"]
|
||||||
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
|
|
||||||
else:
|
else:
|
||||||
scale = scale.format(fps, width, height).split(" ")
|
scale = PRESETS_HW_ACCEL_SCALE.get(arg, "")
|
||||||
scale.extend(detect_args)
|
|
||||||
return scale
|
scale = scale.format(fps, width, height).split(" ")
|
||||||
|
scale.extend(detect_args)
|
||||||
|
return scale
|
||||||
|
|
||||||
|
|
||||||
class EncodeTypeEnum(str, Enum):
|
class EncodeTypeEnum(str, Enum):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user