diff --git a/Dockerfile b/Dockerfile index 2fbbdd453..60fc8841e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,109 +1,49 @@ -FROM ubuntu:18.04 - -ARG DEVICE +FROM debian:buster-slim +LABEL maintainer "blakeb@blakeshome.com" +ENV DEBIAN_FRONTEND=noninteractive # Install packages for apt repo -RUN apt-get -qq update && apt-get -qq install --no-install-recommends -y \ - apt-transport-https \ - ca-certificates \ - curl \ - wget \ - gnupg-agent \ - dirmngr \ - software-properties-common \ - && rm -rf /var/lib/apt/lists/* +RUN apt -qq update && apt -qq install --no-install-recommends -y \ + gnupg wget \ + ffmpeg \ + python3 \ + python3-pip \ + # python-prctl + build-essential libcap-dev \ + # pillow-simd + zlib1g-dev libjpeg-dev python3-dev\ + # VAAPI drivers for Intel hardware accel + libva-drm2 libva2 i965-va-driver vainfo \ + && echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" > /etc/apt/sources.list.d/coral-edgetpu.list \ + && wget -q -O - https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \ + && apt -qq update \ + && echo "libedgetpu1-max libedgetpu/accepted-eula boolean true" | debconf-set-selections \ + && apt -qq install --no-install-recommends -y \ + libedgetpu1-max \ + python3-edgetpu \ + && rm -rf /var/lib/apt/lists/* \ + && (apt-get autoremove -y; apt-get autoclean -y) -COPY scripts/install_odroid_repo.sh . +# needs to be installed before others +RUN pip3 install -U wheel setuptools -RUN if [ "$DEVICE" = "odroid" ]; then \ - sh /install_odroid_repo.sh; \ - fi - -RUN apt-get -qq update && apt-get -qq install --no-install-recommends -y \ - python3 \ - # OpenCV dependencies - ffmpeg \ - build-essential \ - cmake \ - unzip \ - pkg-config \ - libjpeg-dev \ - libpng-dev \ - libtiff-dev \ - libavcodec-dev \ - libavformat-dev \ - libswscale-dev \ - libv4l-dev \ - libxvidcore-dev \ - libx264-dev \ - libgtk-3-dev \ - libatlas-base-dev \ - gfortran \ - python3-dev \ - # Coral USB Python API Dependencies - libusb-1.0-0 \ - python3-pip \ - python3-pil \ - python3-numpy \ - python3-prctl \ - libc++1 \ - libc++abi1 \ - libunwind8 \ - libgcc1 \ - # VAAPI drivers for Intel hardware accel - libva-drm2 libva2 i965-va-driver vainfo \ - && rm -rf /var/lib/apt/lists/* - -# Download & build OpenCV -# TODO: use multistage build to reduce image size: -# https://medium.com/@denismakogon/pain-and-gain-running-opencv-application-with-golang-and-docker-on-alpine-3-7-435aa11c7aec -# https://www.merixstudio.com/blog/docker-multi-stage-builds-python-development/ -RUN wget -q -P /usr/local/src/ --no-check-certificate https://github.com/opencv/opencv/archive/4.0.1.zip -RUN cd /usr/local/src/ \ - && unzip 4.0.1.zip \ - && rm 4.0.1.zip \ - && cd /usr/local/src/opencv-4.0.1/ \ - && mkdir build \ - && cd /usr/local/src/opencv-4.0.1/build \ - && cmake -D CMAKE_INSTALL_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/ .. \ - && make -j4 \ - && make install \ - && ldconfig \ - && rm -rf /usr/local/src/opencv-4.0.1 - -# Download and install EdgeTPU libraries for Coral -RUN wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names \ - && tar xzf edgetpu_api.tar.gz - -COPY scripts/install_edgetpu_api.sh edgetpu_api/install.sh - -RUN cd edgetpu_api \ - && /bin/bash install.sh - -# Copy a python 3.6 version -RUN cd /usr/local/lib/python3.6/dist-packages/edgetpu/swig/ \ - && ln -s _edgetpu_cpp_wrapper.cpython-35m-arm-linux-gnueabihf.so _edgetpu_cpp_wrapper.cpython-36m-arm-linux-gnueabihf.so +RUN pip3 install -U \ + opencv-python \ + python-prctl \ + numpy \ + Flask \ + paho-mqtt \ + PyYAML \ + matplotlib \ + scipy \ + pillow-simd # symlink the model and labels -RUN wget https://dl.google.com/coral/canned_models/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite -O mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite --trust-server-names -RUN wget https://dl.google.com/coral/canned_models/coco_labels.txt -O coco_labels.txt --trust-server-names +RUN wget -q https://github.com/google-coral/edgetpu/raw/master/test_data/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite -O mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite --trust-server-names +RUN wget -q https://dl.google.com/coral/canned_models/coco_labels.txt -O coco_labels.txt --trust-server-names RUN ln -s mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite /frozen_inference_graph.pb RUN ln -s /coco_labels.txt /label_map.pbtext -# Minimize image size -RUN (apt-get autoremove -y; \ - apt-get autoclean -y) - -# Install core packages -RUN wget -q -O /tmp/get-pip.py --no-check-certificate https://bootstrap.pypa.io/get-pip.py && python3 /tmp/get-pip.py -RUN pip install -U pip \ - numpy \ - Flask \ - paho-mqtt \ - PyYAML \ - matplotlib \ - scipy - WORKDIR /opt/frigate/ ADD frigate frigate/ COPY detect_objects.py . diff --git a/benchmark.py b/benchmark.py index 4ef1fe9de..81f935005 100644 --- a/benchmark.py +++ b/benchmark.py @@ -14,7 +14,7 @@ flattened_frame = np.expand_dims(frame, axis=0).flatten() detection_times = [] for x in range(0, 1000): - objects = engine.DetectWithInputTensor(flattened_frame, threshold=0.1, top_k=3) + objects = engine.detect_with_input_tensor(flattened_frame, threshold=0.1, top_k=3) detection_times.append(engine.get_inference_time()) print("Average inference time: " + str(statistics.mean(detection_times))) \ No newline at end of file diff --git a/frigate/object_detection.py b/frigate/object_detection.py index 9f0f2e8dd..552ce603d 100644 --- a/frigate/object_detection.py +++ b/frigate/object_detection.py @@ -32,7 +32,7 @@ class PreppedQueueProcessor(threading.Thread): frame = self.prepped_frame_queue.get() # Actual detection. - frame['detected_objects'] = self.engine.DetectWithInputTensor(frame['frame'], threshold=0.2, top_k=5) + frame['detected_objects'] = self.engine.detect_with_input_tensor(frame['frame'], threshold=0.2, top_k=5) self.fps.update() self.avg_inference_speed = (self.avg_inference_speed*9 + self.engine.get_inference_time())/10 diff --git a/frigate/objects.py b/frigate/objects.py index 2ff48e00b..b702af29d 100644 --- a/frigate/objects.py +++ b/frigate/objects.py @@ -152,8 +152,6 @@ class RegionRefiner(threading.Thread): }) self.camera.dynamic_region_fps.update() look_again = True - # TODO: zoom in on unclipped low confidence objects - # else: ... # if we are looking again, then this frame is not ready for processing if look_again: