GoLang и OpenCV (OpenVino && Cuda)

в 12:18, , рубрики: CUDA, Go, gocv, golang, intel, Nvidia, OpenVINO, Работа с видео

Всем доброго времени суток. На хабре (да и вообще в интернете) уже не мало статей о работе с OpenCV на Go.

Готовый код — это конечно интересно, а более подробную информацию об установке драйверов приходится собирать по кусочкам — постараюсь объединить все нужные телодвижения в одну статью.

image

У меня имеется ноутбук с Ubuntu 18.04 на борту,

  • CPU: intel
  • GPU: Intel/Nvidia

Nvidia и Intel пытаются превзойти друг друга, а я постараюсь одновременно использовать все преимущества OpenVino и Cuda.

Сразу предупреждаю, для использования Cuda нужно минимально Compute capability (version) 5.3, посмотреть для своей видеокарты можно тут

Cuda

Я выбрал Cuda 10.0, чтобы можно было еще и Tensorflow использовать.

Сначала нужно скачать пакет с developer.nvidia.com (например runtime (local))

image

Устанавливаем командой

sudo sh cuda_10.0.130_410.48_linux.run

cudNN

Ссылка на пакеты
Нужно выбрать версию, соответствующую Cuda, то есть

Download cuDNN v7.5.0 (Feb 21, 2019), for CUDA 10.0

image

И скачать два deb-пакета

cuDNN Runtime Library for Ubuntu18.04 (Deb)
cuDNN Developer Library for Ubuntu18.04 (Deb)

Если у Вас не аккаунта https://developer.nvidia.com/, Вам предложат зарегистрироваться

image

Установка:

sudo dpkg -i libcudnn7-dev_7.5.0.56-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7_7.5.0.56-1+cuda10.0_amd64.deb

Intel OpenCL Driver

Ссылка на репозиторий.

Установка:

wget https://github.com/intel/compute-runtime/releases/download/20.04.15428/intel-gmmlib_19.4.1_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/20.04.15428/intel-igc-core_1.0.3151_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/20.04.15428/intel-igc-opencl_1.0.3151_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/20.04.15428/intel-opencl_20.04.15428_amd64.deb
wget https://github.com/intel/compute-runtime/releases/download/20.04.15428/intel-ocloc_20.04.15428_amd64.deb

sudo dpkg -i *.deb

Opencv+OpenVino

Cкрипт (естественно с костылями), который соберет все сам.

run.sh

#!/bin/bash
git clone https://github.com/opencv/dldt && 
            (cd dldt/inference-engine && 
            git submodule init && 
            git submodule update --recursive && 
            ./install_dependencies.sh && 
            mv -f thirdparty/clDNN/common/intel_ocl_icd/6.3/linux/Release thirdparty/clDNN/common/intel_ocl_icd/6.3/linux/RELEASE && 
            mkdir -p build && 
            cd build && 
            cmake -D CMAKE_BUILD_TYPE=RELEASE 
                  -D CMAKE_INSTALL_PREFIX=/usr/local 
                  -D BUILD_SHARED_LIBS=ON 
                  -D ENABLE_TESTS=OFF 
                  -D ENABLE_VPU=ON 
                  -D ENABLE_MKL_DNN=ON 
                  -D ENABLE_CLDNN=ON .. && 
                  make -j $(nproc --all) && 
                  touch VERSION && 
                  mkdir -p src/ngraph && 
                  sudo cp -r ../bin/intel64/RELEASE/lib/* /usr/local/lib && 
                  cp thirdparty/ngraph/src/ngraph/version.hpp src/ngraph && 
                  sudo make install)

OPENCV_VERSION="4.2.0"

# install opencv
curl -Lo opencv.zip https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && 
            unzip -q opencv.zip && 
            curl -Lo opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip && 
            unzip -q opencv_contrib.zip && 
            rm opencv.zip opencv_contrib.zip && 
            (cd opencv-${OPENCV_VERSION} && 
            mkdir build && cd build && 
            cmake -D CMAKE_BUILD_TYPE=RELEASE 
                  -D CMAKE_INSTALL_PREFIX=/usr/local 
                  -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${OPENCV_VERSION}/modules 
                  -D InferenceEngine_DIR=../../../dldt/inference-engine/build 
                  -D WITH_JASPER=OFF 
                  -D BUILD_DOCS=OFF 
                  -D BUILD_EXAMPLES=OFF 
                  -D ENABLE_CXX11=ON 
                  -D WITH_INF_ENGINE=ON 
                  -D WITH_QT=OFF 
                  -D WITH_GTK=ON 
                  -D WITH_FFMPEG=OFF 
                  -D WITH_TIFF=OFF 
                  -D WITH_WEBP=OFF 
                  -D WITH_QT=OFF 
                  -D WITH_PNG=OFF 
                  -D WITH_1394=OFF 
                  -D HAVE_OPENEXR=OFF 
                  -D BUILD_TESTS=OFF 
                  -D BUILD_PERF_TESTS=OFF 
                  -D BUILD_opencv_java=NO 
                  -D BUILD_opencv_python=NO 
                  -D BUILD_opencv_python2=NO 
                  -D BUILD_opencv_python3=NO 
                  -D BUILD_SHARED_LIBS=no 
                  -D OPENCV_GENERATE_PKGCONFIG=ON .. && 
            make -j $(nproc --all) && 
            sudo make preinstall && sudo make install && sudo ldconfig )

А теперь проверим, как будет работать это все!

Клонируем себе исходный код:

git clone https://github.com/Danile71/go_realtime_object_recognition
cd go_realtime_object_recognition
go get -d
go build
./go_realtime_object_recognition

Видеораспознавание будет работать на CPU,VulkanAPI и/или Cuda.

Сейчас я сделал несколько pull request'ов в

github.com/hybridgroup/gocv

для поддержки OpenVino+Cuda, но неизвестно сколько они будут идти до master ветки, поэтому сделаем небольшую хитрость:

#!/bin/bash
cd $GOPATH/src/gocv.io/x/gocv
wget https://patch-diff.githubusercontent.com/raw/hybridgroup/gocv/pull/607.patch
wget https://patch-diff.githubusercontent.com/raw/hybridgroup/gocv/pull/609.patch
wget https://patch-diff.githubusercontent.com/raw/hybridgroup/gocv/pull/610.patch
wget https://patch-diff.githubusercontent.com/raw/hybridgroup/gocv/pull/612.patch

patch -p1 < 607.patch
patch -p1 < 609.patch
patch -p1 < 610.patch
patch -p1 < 612.patch

Чтобы можно было использовать OpenVino/CPU/VulkanAPI/Cuda одновременно

go build -tags openvino
./go_realtime_object_recognition

А для выбора устройства, меняем

  • CPU
    modelNet.SetPreferableBackend(gocv.NetBackendDefault)
    modelNet.SetPreferableTarget(gocv.NetTargetCPU)
    

  • VulkanAPI
    modelNet.SetPreferableBackend(gocv.NetBackendVKCOM)
    modelNet.SetPreferableTarget(gocv.NetTargetVulkan)
    

  • Cuda
    modelNet.SetPreferableBackend(gocv.NetBackendCUDA)
    modelNet.SetPreferableTarget(gocv.NetTargetCUDA)
    

  • Intel GPU
    modelNet.SetPreferableBackend(gocv.NetBackendOpenVINO)
    modelNet.SetPreferableTarget(gocv.NetTargetFP16)
    

  • Intel Neural Compute Stick 2
    modelNet.SetPreferableBackend(gocv.NetBackendOpenVINO)
    modelNet.SetPreferableTarget(gocv.NetTargetVPU)
    

Вот еще небольшой пример, с распознаванием пола/возраста/эмоций.

А тут распознавание объекта «человек» с использованием Cuda

Если у кому это интересно, и что-либо не получилось, пишите, с радостью помогу :-)

Чукча не писатель, однако но я старался.

Автор: Даниил

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js