首页 > 其他 > 详细

Docker中配置OpenCV-FFmpeg-CUDA 以及Anaconda虚拟环境调用

时间:2021-05-13 20:23:51      阅读:31      评论:0      收藏:0      [点我收藏+]

一、 前言

1. 背景说明

目的是Anaconda虚拟环境中调用支持GPU的OpenCV和支持CUVID的FFmpeg,且支持H264视频编码格式。前面文字都是踩坑记录,如果想看详细命令,直接查看文末Dockerfile.

2. GPU架构说明

Geforce系列 核心代号 ( Code Name ) 年代 ( time ) 例 ( Instance )
更早 (无科学家名称代号) 远古~2006 GeForce 7800 GTX
8000系 特斯拉 ( Tesla ) 2007~2008 GeForce 8800 GTS
9000系 特斯拉 ( Tesla ) 2008~2009 GeForce 9600 GSO
100系 特斯拉 ( Tesla ) 2009~2009 GeForce GTS 150
200系 特斯拉 ( Tesla ) 2009~2009 GeForce GTX 295
300系 特斯拉 ( Tesla ) 2009~2010 GeForce GT 335
400系 费米 ( Fermi ) 2010~2011 GeForce GTX 460
500系 费米 ( Fermi ) 2011~2012 GeForce GTX 555
600系 开普勒 ( Kepler ) 2012~2013 GeForce GTX 690
700系 麦克斯韦尔 ( Maxwell ) 2013~2014 GeForce GTX 750 Ti
900系 麦克斯韦尔 ( Maxwell ) 2014~2016 GeForce GTX 960
10系 帕斯卡 ( Pascal ) 2016~2018 GeForce GTX 1080 Ti
20系 图灵 ( Turing ) 2018~2020 GeForce RTX 2080 Ti
30系 安培 ( Ampere ) 2020~未来 GeForce RTX? 3080

3. 显卡算力的CUDA_ARCH_BIN和 CUDA_ARCH_PTX 的解释

参考文档

  • NVIDIA*编译器允许生成二进制代码(cubin and fatbin)和中间代码(Parallel Thread eXecution,PTX)。 BIN二进制代码通为特定的GPU架构生成,因此不能保证与其他GPU的兼容性。PTX中间代码是编译后的GPU代码的一种中间形式,它可以再次编译为原生的GPU二进制码。PTX代码针对我们指定的显卡算力所对应虚拟平台。 在第一次调用时使用JIT编译器转化为二进制代码(实际物理显卡算力需要大于等于指定的算力,否则编译失败)

  • CUDA_ARCH_BIN一般需要指定,且最好不要把所有版本都编译,如CUDA_ARCH_BIN="3.0 3.5 3.7 5.0 5.2 6.0 6.1 7.0 7.5 8.6".
    最好根据上面的说明,查一下当前显卡的型号,以及对应的显卡算力,然后在这里指定一个即可,如3080显卡可以保持 CUDA_ARCH_BIN="8.6"。否则全部编译一遍速度会很慢。

  • CUDA_ARCH_PTX 中间代码一般使用得少,如3080显卡可以保持 CUDA_ARCH_PTX =""

4. 关于OpenCV编译选项的一些说明

详细可以看:

  1. CMake编译opencv各选项的含义
  2. 官方配置教程

二、安装过程说明


以下只叙述流程,详细的步骤请参考文末Dockerfile


1. NVIDIA-Driver、CUDA、Cudnn安装

这部分是常识,这里不做赘述

2. 基础库安装

也可以apt包管理工具(Ubuntu)安装(不排除有冗余包):

apt-get clean && apt-get -y update && apt-get         -o Acquire::BrokenProxy="true"         -o Acquire::http::No-Cache="true" \ 
        -o Acquire::http::Pipeline-Depth="0"     -y install         python3         python3-dev         make         cmake         build-essential         pkg-config         libatlas-base-dev         gfortran         libgl1-mesa-glx         libjasper-dev         libgtk2.0-dev         libtbb2         libtbb-dev         libavcodec-dev         libavformat-dev         libswscale-dev         libjpeg-dev         libpng-dev         libtiff5-dev         libdc1394-22-dev         libtiff-dev         libv4l-dev         liblapacke-dev         libx264-dev         software-properties-common         yasm         nasm         ninja-build         sysstat         libtcmalloc-minimal4         autoconf         libtool         flex         bison         libsm6         libxext6         libxrender1         libx264-dev         libx265-dev         libsndfile1         libmp3lame-dev         gcc         g++         libavutil-dev         libavcodec-dev         libavformat-dev         libswscale-dev         libavresample-dev

3. FFmpeg安装

可以使用官方Docker镜像,也可以从源码编译。

3.1 直接使用容器

本人为了方便使用了这个方法,https://hub.docker.com/r/jrottenberg/ffmpeg/,参考该镜像的Dockerfile在https://github.com/jrottenberg/ffmpeg。然后上面第一步镜像已经安装好,第二部进行了手动安装,详见Dockerfile。

3.2 从源码编译

这步可以参考
使用GPU硬件加速FFmpeg视频转码, 写的详细且亲测通过。

  • x264库在上一步已经安装,请确保 编译时--enable-libx264
  • 为了支持GPU编解码,需要确保 --enable-cuda --enable-cuvid --enable-nvenc. 编译完成后执行ffmpeg -codecs | grep cuvid查看cuvid提供的GPU编解码器,应当有类似如下结果:
    技术分享图片

4. OpenCV安装

详细命令见Dockerfile。这里有几个坑需要注意:

1. 如果安装了Anaconda,最好先把环境变量注释掉(重要),否则很容易出未定义的引用 XXX;

可以先获取虚拟环境的信息,然后取消激活

    source activate torch_37  &&     OPENCV_PYTHON_EXECUTABLE_ANACONDA=$(which python${PYTHON_VERSION}) &&     OPENCV_INSTALL_PATH=$(python -c "import sys; print(sys.prefix)") &&     OPENCV_INCLUDE_DIR_ANACONDA=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") &&     OPENCV_PACKAGE_ANACONDA=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") &&     conda deactivate && 

之后Cmake时候指定这些变量即可,如:

      -D PYTHON${PYTHON_VERSION%%.*}_EXECUTABLE=$${OPENCV_PYTHON_EXECUTABLE_ANACONDA}       -D PYTHON_DEFAULT_EXECUTABLE=${OPENCV_PYTHON_EXECUTABLE_ANACONDA}       -D CMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_PATH}       -D PYTHON${PYTHON_VERSION%%.*}_INCLUDE_DIR=${OPENCV_INCLUDE_DIR_ANACONDA}       -D PYTHON${PYTHON_VERSION%%.*}_PACKAGES_PATH=${OPENCV_PACKAGE_ANACONDA} 

2.如果添加了opencv_contrib , 有可能缺少文件,是Cmake配置时候下载失败导致的。错误信息如下:

/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No such file or directory

解决办法: 参考[安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带百度云资源)](https://blog.csdn.net/AlexWang30/article/details/99612188?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-### #### 3.control) 把资源下载下来拷贝到opencv_contrib/modules/xfeatures2d/src/目录下。(Dockerfile中我的链接有可能超时失效,请从这里下载)

4. CUDA_ARCH_BIN请根据上文所述显卡算力进行修改

各个型号的显卡算力【CUDA_ARCH_BIN】如下图,该部分主要用于OpenCV编译时指定, 也可以从链接对应官网查询(以下为截图)。
技术分享图片

5. 解释器路径

Dockerfile中,python库安装到了Torch_37虚拟环境,这里可以根据实际python解释器情况修改。

三、详细Dockerfile

# ffmpeg - http://ffmpeg.org/download.html
#
# From https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
#
# ffmpeg docker - https://hub.docker.com/r/jrottenberg/ffmpeg/
#
# opencv docker - https://github.com/Valian/docker-python-opencv-ffmpeg and https://github.com/Borda/docker_python-opencv-ffmpeg/blob/master/gpu/Dockerfile

FROM    tigerdockermediocore/cuda-ffmpeg-docker:4.2.3-cu102

COPY env.yml env.yml

SHELL ["/bin/bash", "-c"]
ENV PATH="/root/miniconda3/bin:$PATH"


# Install OpenCV
ARG PYTHON_VERSION=3.7
ARG OPENCV_VERSION=4.3.0

# Install all dependencies for OpenCV
RUN source ~/.bashrc &&     sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list &&     sed -i ‘$a\deb http://security.ubuntu.com/ubuntu xenial-security main‘ /etc/apt/sources.list &&     apt-get -y update -qq --fix-missing &&     apt-get         -o Acquire::BrokenProxy="true"         -o Acquire::http::No-Cache="true"         -o Acquire::http::Pipeline-Depth="0"         -y install --no-install-recommends         python${PYTHON_VERSION}         python${PYTHON_VERSION}-dev         $( [ ${PYTHON_VERSION%%.*} -ge 3 ] && echo "python${PYTHON_VERSION%%.*}-distutils" )         git         wget         unzip         make         cmake         libtbb2         gfortran         apt-utils         pkg-config         checkinstall         qt5-default         build-essential         libatlas-base-dev         libgtk2.0-dev         libavcodec57         libjasper-dev         libgl1-mesa-glx         libavcodec-dev         libavformat57         libavformat-dev         libavutil-dev         libswscale4         libswscale-dev         libjpeg8-dev         libpng-dev         libtiff5-dev         libdc1394-22         libdc1394-22-dev         libxine2-dev         libv4l-dev         libgstreamer1.0         libgstreamer1.0-dev         libgstreamer-plugins-base1.0-0         libgstreamer-plugins-base1.0-dev         libglew-dev         libpostproc-dev         libeigen3-dev         libtbb-dev         zlib1g-dev         yasm         nasm         ninja-build         curl         vim         sysstat         libtcmalloc-minimal4         autoconf         libtool         flex         bison         libsm6         libxext6         libxrender1         apt-utils         rsync         openssh-server         mysql-server         wget         gcc         g++ &&     # 解决VIM中文乱码
    sed -i ‘$a \set encoding=UTF-8\nset langmenu=zh_CN.UTF-8\nset fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1\nset fileencoding=utf-8‘ /etc/vim/vimrc && # install python dependencies
    sysctl -w net.ipv4.ip_forward=1 &&     wget https://bootstrap.pypa.io/get-pip.py --progress=bar:force:noscroll &&     python${PYTHON_VERSION} get-pip.py &&     rm get-pip.py &&     pip${PYTHON_VERSION} install numpy && # Install Anaconda
    wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh &&     /bin/bash Miniconda3-py39_4.9.2-Linux-x86_64.sh -b -p /root/miniconda3 &&     rm Miniconda3-py39_4.9.2-Linux-x86_64.sh &&     sed -i ‘$a \export PATH="/root/miniconda3/bin:$PATH"‘ ~/.bashrc &&     export PATH="/root/miniconda3/bin:$PATH" &&     # echo ‘export PATH="/root/miniconda3/bin:$PATH"‘ >> ~/.bashrc &&     source ~/.bashrc &&     conda env create -f env.yml &&     # pip install tritonclient-2.4.0-py3-none-any.whl && # Get OpenCV
    cd / &&     wget https://github.com/opencv/opencv/archive/$OPENCV_VERSION.zip -O opencv.zip --progress=bar:force:noscroll &&     unzip -q opencv.zip &&     mv /opencv-$OPENCV_VERSION /opencv &&     rm opencv.zip &&     wget https://github.com/opencv/opencv_contrib/archive/$OPENCV_VERSION.zip -O opencv_contrib.zip --progress=bar:force:noscroll &&     unzip -q opencv_contrib.zip &&     mv /opencv_contrib-$OPENCV_VERSION /opencv_contrib &&     rm opencv_contrib.zip &&     wget https://shield.mlamp.cn/task/api/file/space/download/84d6450f9ad9921e4b4ae23bc2e95d37JMCTS9Ed/235054/boostdesc.zip &&     unzip -q boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/src/  &&     unzip -q boostdesc.zip -d /opencv_contrib/modules/xfeatures2d/test/  &&     rm -rf boostdesc.zip && # Python Path
    source activate torch_37  &&     OPENCV_PYTHON_EXECUTABLE_ANACONDA=$(which python${PYTHON_VERSION}) &&     OPENCV_INSTALL_PATH=$(python -c "import sys; print(sys.prefix)") &&     OPENCV_INCLUDE_DIR_ANACONDA=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") &&     OPENCV_PACKAGE_ANACONDA=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") &&     conda deactivate && # Prepare Build
    mkdir /opencv/build &&     cd /opencv/build &&     cmake       -D CMAKE_BUILD_TYPE=RELEASE       -D BUILD_PYTHON_SUPPORT=ON       -D BUILD_DOCS=ON       -D BUILD_PERF_TESTS=OFF       -D BUILD_TESTS=OFF     #   -D CMAKE_INSTALL_PREFIX=/usr/local       -D OPENCV_EXTRA_MODULES_PATH=/opencv_contrib/modules       -D BUILD_opencv_python3=ON       -D BUILD_opencv_python2=OFF       -D PYTHON${PYTHON_VERSION%%.*}_EXECUTABLE=$${OPENCV_PYTHON_EXECUTABLE_ANACONDA}       -D PYTHON_DEFAULT_EXECUTABLE=${OPENCV_PYTHON_EXECUTABLE_ANACONDA}       -D CMAKE_INSTALL_PREFIX=${OPENCV_INSTALL_PATH}       -D PYTHON${PYTHON_VERSION%%.*}_INCLUDE_DIR=${OPENCV_INCLUDE_DIR_ANACONDA}       -D PYTHON${PYTHON_VERSION%%.*}_PACKAGES_PATH=${OPENCV_PACKAGE_ANACONDA}       -D BUILD_EXAMPLES=OFF       -D WITH_IPP=OFF       -D WITH_FFMPEG=ON       -D WITH_GSTREAMER=ON       -D WITH_V4L=ON       -D WITH_LIBV4L=ON       -D WITH_TBB=ON       -D WITH_QT=ON       -D WITH_OPENGL=ON       -D WITH_CUDA=ON       -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda       -D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs       # https://kezunlin.me/post/6580691f
      # https://stackoverflow.com/questions/28010399/build-opencv-with-cuda-support
      # https://en.wikipedia.org/wiki/CUDA#GPUs_supported
      # https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications
    #   -D CUDA_ARCH_BIN="3.0 3.5 3.7 5.0 5.2 6.0 6.1 7.0 7.5"       -D CUDA_ARCH_BIN="7.5"       -D CUDA_ARCH_PTX=""       -D WITH_CUBLAS=ON       -D WITH_NVCUVID=ON       -D ENABLE_FAST_MATH=1       -D CUDA_FAST_MATH=1       -D ENABLE_PRECOMPILED_HEADERS=OFF       .. && # Build, Test and Install
    cd /opencv/build &&     make -j$(nproc) &&     make install &&     ldconfig && # cleaning
   apt-get -y remove         unzip         gfortran         apt-utils         checkinstall         libatlas-base-dev         libgtk2.0-dev         libavcodec-dev         libavformat-dev         libavutil-dev         libswscale-dev         libjpeg8-dev         libpng12-dev         libtiff5-dev         libdc1394-22-dev         libxine2-dev         libgstreamer1.0-dev         libgstreamer-plugins-base1.0-dev         libglew-dev         libpostproc-dev         libeigen3-dev         libtbb-dev &&     apt-get autoremove -y &&     apt-get clean &&     rm -rf /opencv /opencv_contrib /var/lib/apt/lists/*

CMD  ["/bin/bash"]
ENV  LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

cmake配置结果类似如下:
技术分享图片

Docker中配置OpenCV-FFmpeg-CUDA 以及Anaconda虚拟环境调用

原文:https://www.cnblogs.com/geoffreyone/p/14765124.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!