В области компьютерного зрения видеоалгоритмы являются важной частью.В отличие от изображений, видео требуют нескольких кадров изображений с функциями временных рядов, и в то же время они также включают определенную информацию о движении, такую как оптический поток. Во время предварительной обработки изображение и оптический поток в видео должны быть извлечены, разработка с открытым исходным кодомdense_flowЭта функция была реализована для поддержки операций графического процессора.
В CUDA 9 и OpenCV 3 настройте проект плотности_потока, расширенную версию временных сегментов сети. В то же время проект Benchmark для рекомендуемых видеоmmaction.
Ссылаться на:
dense_flow: https://github.com/yjxiong/dense_flow
temporal-segment-networks: https://github.com/yjxiong/temporal-segment-networks
mmaction: https://github.com/open-mmlab/mmaction
Скомпилировать OpenCV
Шаги компиляции OpenCV следующие:
- Загрузите opencv, загрузите opencv_contrib;
- Измените 2 файла cmake и 1 файл hpp;
- Измените hdf5, ffmpeg, nonfree (необязательно);
- сделать, установить opencv;
OpenCV 3
CUDA 9 не поддерживает OpenCV2.x, можно выбрать только 3.x, например 3.1.0,Ссылаться на
Исходный код OpenCV
Загрузите исходный файл OpenCV и разархивируйте его:
wget https://github.com/opencv/opencv/archive/3.1.0.zip
unzip 3.1.0.zip
cd opencv-3.1.0
opencv_contrib
В opencv-3.1.0 загрузите файл opencv_contrib и разархивируйте его:
wget https://github.com/opencv/opencv_contrib/archive/3.1.0.zip
unzip 3.1.0.zip
Места следующие:
Причина в том, что алгоритм SURF или SIFT смещается вopencv_contrib
, необходимо участвовать в компиляции исходного кода, вdense_flow
, вызовите алгоритм SURF, иначе SURF не может быть найден,Ссылаться на.
Ошибка:
undefined reference to `cv::xfeatures2d::SURF::create(double, int, int, bool, bool)'
Измените файл cmake
Ошибка CMake:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)
Причина в том, что от nppi отказались и другие CUDA нуждаются в замене, в то же время CUDA 2.0 больше не совместима с текущей версией и подлежит удалению.
необходимо изменитьпапка cmakeНайдите CUDA.cmake и OpenCVDetectCUDA.cmake и измените common.hpp.
ИсправлятьFindCUDA.cmakeфайл, заменить в 3-х местах:
заменять
find_cuda_helper_libs(nppi)
за
find_cuda_helper_libs(nppial)
find_cuda_helper_libs(nppicc)
find_cuda_helper_libs(nppicom)
find_cuda_helper_libs(nppidei)
find_cuda_helper_libs(nppif)
find_cuda_helper_libs(nppig)
find_cuda_helper_libs(nppim)
find_cuda_helper_libs(nppist)
find_cuda_helper_libs(nppisu)
find_cuda_helper_libs(nppitc)
заменять
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")
за
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")
заменять
unset(CUDA_nppi_LIBRARY CACHE)
за
unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
ИсправлятьOpenCVDetectCUDA.cmakeФайл, удален в 2-х местах:
Аннотировать «Fermi» и продвигать «Kepler», то есть удалить ветвь if «Fermi», главным образом, чтобы удалить совместимость с CUDA версии 2.0.
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "2.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
превратиться в
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
Когда версия CUDA выше 6.5, совместимость с версией 2.0 удаляется, а модификация выполняется следующим образом:
elseif(${CUDA_VERSION} VERSION_GREATER "6.5")
set(__cuda_arch_bin "3.0 3.5")
существуетopencv-3.1.0/modules/cudev/include/opencv2/cudev/common.hpp
в заголовочный файл добавьте:
#include <cuda_fp16.h>
hdf5 error
Error:
hdf5.hpp:40:18: fatal error: hdf5.h: No such file or directory
Измените файл opencv-3.1.0/modules/python/common.cmake, в заголовок файла добавьте
find_package(HDF5)
include_directories(${HDF5_INCLUDE_DIRS})
nonfree error
Error:
fatal error: opencv2/nonfree/nonfree.hpp: No such file or directory
Установите пакет libopencv-nonfree-dev:
sudo apt-get update
sudo add-apt-repository --yes ppa:xqms/opencv-nonfree
sudo apt-get update
sudo apt-get install libopencv-nonfree-dev
В случае неудачи замените источник ppa:
sudo add-apt-repository --remove ppa:xqms/opencv-nonfree
sudo add-apt-repository --yes ppa:jeff250/opencv
sudo apt-get update
sudo apt-get install libopencv-dev
sudo apt-get install libopencv-nonfree-dev
ffmpeg error
Error:
c->flags |= CODEC_FLAG_GLOBAL_HEADER
существуетopencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp
, добавлять:
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
make
Выполните операцию make вOPENCV_EXTRA_MODULES_PATH
, необходимо ввестиopencv_contrib
:
make -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/data1/wcl/workspace/opencv-3.1.0/opencv_contrib-3.1.0/modules/ ..
Выполнить make, 32 процесса:
make -j32
Установите и импортируйте opencv в системную среду.
sudo make install
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
Скомпилируйте DenseFlow
установить libzip-dev
apt-get install libzip-dev
Скачайте проект плотно_flow и переключитесьOpenCV 3.1Филиал:
git clone --recursive http://github.com/yjxiong/dense_flow
git checkout remotes/origin/opencv-3.1
Указываем OpenCV_DIR и компилируем проект:
mkdir build && cd build
OpenCV_DIR=/opencv-3.1.0/build cmake .. -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
make -j32
После успешной компиляции в папке сборки:
- 869956383.mp4 — тестовое видео, создайте папку tmp.
- Выполните команду, обратите внимание на все пробелызаменятьдля "=",Ссылаться наиСсылаться на.
- В папке tmp сгенерированные видеокадры имеют префикс image, а оптический поток по оси X имеет префикс
flow_x
префикс, оптический поток по оси Y начинается сflow_y
префикс, остальные параметрыСсылаться на.
./extract_gpu -f=980044841.mp4 -x=./tmp/flow_x -y=./tmp/flow_y -i=./tmp/image -b=20 -t=1 -d=0 -s=1 -o=dir
Ошибка, указывающая на невозможность открытия видео, замените пробел на "=".
FATAL [default] Check failed: [video_stream.isOpened()]
Тестовое видео:
Выходной результат:
Использование графического процессора
OK, that's all! Enjoy it!