Доброго времени, уважаемые Хабровчане. Я занимаю должность Computer Vision Engineer, поэтому часто возникает потребность в запуске различных моделей с использованием разнообразных Inference Engine. В этой статье:
соберём OpenCV с поддержкой OpenVINO в качестве backend'а для моделей;
узнаем разницу в скорости инференса модели на C++ и Python при прочих равных.
Статья будет больше технической, без сложных речевых оборотов и лишней воды.
Сразу приведу полезные ссылки, которые помогли мне разобраться в данной теме:
Сборка будет осуществляться под управлением операционной системы Ubuntu.
Системные зависимости
sudo apt remove --purge cmake
sudo apt update
sudo apt install -y cmake unzip wget
Базовый репозиторий
Данный репозиторий содержит:
полную инструкцию по сборке;
bash
-скрипт для сборки;скрипты инференса модели
person-detection-0200
используя OpenCV DNN на С++ и Python;CMakeLists.txt
для сборки примера на C++.
Также стоит отметить, что дальнейшие шаги инструкции подразумевают, что Вы находитесь в корне репозитория.
git clone git@github.com:DanilZittser/opencv-python-openvino-backend.git
cd opencv-python-openvino-backend
Объявляем переменные окружения
OPENCV_DIR_NAME=opencv-4.6.0
OPENCV_DIR_PATH=$(pwd)/${OPENCV_DIR_NAME}
OPENVINO_DIR_NAME=openvino-2022.1.1
OPENVINO_DIR_PATH=$(pwd)/${OPENVINO_DIR_NAME}
INSTALL_DIR_PATH=$(pwd)/install
Скачиваем исходники OpenCV и OpenVINO
# opencv-4.6.0
wget https://github.com/opencv/opencv/archive/refs/tags/4.6.0.zip
unzip 4.6.0.zip
# openvino-2022.1.1
wget https://github.com/openvinotoolkit/openvino/releases/download/2022.1.1/l_openvino_toolkit_ubuntu20_2022.1.1.7030.39aba80957e.tgz
tar -xf l_openvino_toolkit_ubuntu20_2022.1.1.7030.39aba80957e.tgz
mv l_openvino_toolkit_ubuntu20_2022.1.1.7030.39aba80957e/ ${OPENVINO_DIR_NAME}
Сборка и установка
Несколько моментов:
установка библиотеки будет происходить по кастомному пути, смотри флаг
-DCMAKE_INSTALL_PREFIX
;OpenCV по умолчанию собирается вместе с питоновскими биндингами.
mkdir build && cd build
cmake \
-DWITH_OPENVINO=ON \
-DINF_ENGINE_RELEASE=2022010100 \
-DInferenceEngine_DIR=${OPENVINO_DIR_PATH}/runtime/cmake \
-DOpenVINO_DIR=${OPENVINO_DIR_PATH}/runtime/cmake \
-Dngraph_DIR=${OPENVINO_DIR_PATH}/runtime/cmake \
-DOPENCV_GAPI_WITH_OPENVINO=OFF \
-DOPENCV_DNN_OPENVINO=ON \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR_PATH} \
${OPENCV_DIR_PATH}
make -j$(nproc) && make install
cd ..
Инференс модели person-detection-0200.
Скачиваем модель:
wget https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.1/models_bin/3/person-detection-0200/FP32/person-detection-0200.xml
wget https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.1/models_bin/3/person-detection-0200/FP32/person-detection-0200.bin
Подробное описание модели находится здесь - person-detection-0200.
При желании для скачивания модели можно воспользоваться утилитой omz_downloader из экосистемы OpenVINO.
Ниже представлены результаты инференса модели на HP OMEN Laptop 15-en1021ur.
Python inference
# указываем где искать собранный OpenCV
export PYTHONPATH=${INSTALL_DIR_PATH}/lib/python3.8/site-packages/cv2/python-3.8/:$PYTHONPATH
python3 samples/main.py --xml person-detection-0200.xml --bin person-detection-0200.bin --video person.mp4
>>> Throughput = 259.16 fps
C++ inference
export OpenCV_DIR=${INSTALL_DIR_PATH}/lib/cmake/opencv4
# сборка примера
mkdir cmake-build && cd $_
cmake ../
make -j$(nproc)
# запуск примера
./opencv_python_openvino_backend --xml ../person-detection-0200.xml --bin ../person-detection-0200.bin --video ../person.mp4
>>> Throughput = 269.25 fps
Моё почтение, C++.