一、前言
最近在做一个视频理解的项目,需要使用 MMaction 对 ActivityNet 进行抽帧。
根据 MMaction/data/activitynet/ 下的 md 文件,看到需要提前安装 denseflow,而 denseflow 需要带 CUDA 版本的 OpenCV,反复装了很多次终于装好了。
算是安装最长时间的环境(满打满算有五天,遭遇无数问题,根本上是版本兼容的问题),故在此记录。希望有帮助。
二、准备工作
CUDA:11.8+ (个人尝试 11.8、12.4 均成功)
CMake:3.29.0 没有的可以 sudo apt-get install cmake 安装
gcc、g++:10.5.0 很重要(高版本可能会报错,但是低版本我没有尝试), 可采用这个
方法进行 gcc、g++ 版本的切换:gcc/g++ 多版本之间切换_gcc 版本切换-优快云博客
CUDNN:不是必须,如有需要,可以自行选择安装
三、正式安装
写在前面:我是全程挂的代理,确保所有脚本、编译时需要的文件都被完整下载。否则可能导致xxx.i 文件缺失,这个可能需要自行百度。
教程:我的安装时参考这个来的
https://github.com/open-mmlab/denseflow/blob/master/INSTALL.md
a、conda 创建虚拟环境并进入(python = 3.9.19)
conda create --name env_name python=3.9.19
conda activate env_name
b、安装 OpenCV 所需的相关依赖
# find one dir, example: /baihuple/test
cd /baihuple/test
# ZZROOT is the root dir of all the installation
# you may put these lines into your `.bashrc` or `.zshrc`.
vim ~/.bashrc
export ZZROOT=$HOME/app
export PATH=$ZZROOT/bin:$PATH
export LD_LIBRARY_PATH=$ZZROOT/lib:$ZZROOT/lib64:$LD_LIBRARY_PATH
# wq! the file
source ~/.bashrc
# go back to the environment
conda activate env_name
# fetch install scripts
git clone https://github.com/innerlee/setup.git
cd setup
# opencv depends on ffmpeg for video decoding
# ffmpeg depends on nasm, yasm, libx264, libx265, libvpx
./zznasm.sh
./zzyasm.sh
./zzlibx264.sh
./zzlibx265.sh
./zzlibvpx.sh
# finally install ffmpeg
./zzffmpeg.sh
c、安装 OpenCV4,使用 setup/zzopencv.sh 脚本【最关键部分,容易出错在 cmake】
注意:我在执行 zzopen.sh 经常报错,是它脚本里的 opencv、opencv_contrib 的版本太 老了,我采用的方法是在 github 上 opencv/opencv、opencv/opencv_contrib 直接拉取,下载到 ~/app/src 下。服务器配上梯子最好哦
# 切换到脚本本来解压下载的 tar 文件的目标文件夹
cd ~/app/src/
# 下载 opencv
git clone https://github.com/opencv/opencv.git
# 下载 opencv_contrib
git clone https://github.com/opencv/opencv_contrib.git
# back to the dir
cd /baihuple/test/setup
在此之后,由于我们不用根据原脚本下载 tar 和解压,故需要对 zzopencv.sh 中的代码进行修改,下面直接贴修改后的代码。
# edited code for the zzopencv.sh
#!/bin/bash
# install opencv
set -e
ROOTDIR=${ZZROOT:-$HOME/app}
mkdir -p src/$NAME1
mkdir -p src/$NAME2
cd src/$NAME1
mkdir -p build
cd build
export PKG_CONFIG_PATH="$ROOTDIR"/lib/pkgconfig:$PKG_CONFIG_PATH
cmake \
-DBUILD_EXAMPLES=OFF \
-DWITH_QT=OFF \
-DCUDA_GENERATION=Auto \
-DOpenGL_GL_PREFERENCE=GLVND \
-DBUILD_opencv_hdf=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_TESTS=OFF \
-DCMAKE_BUILD_TYPE=RELEASE \
-DBUILD_opencv_cnn_3dobj=OFF \
-DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_datasets=OFF \
-DBUILD_opencv_aruco=OFF \
-DBUILD_opencv_tracking=OFF \
-DBUILD_opencv_text=OFF \
-DBUILD_opencv_stereo=OFF \
-DBUILD_opencv_saliency=OFF \
-DBUILD_opencv_rgbd=OFF \
-DBUILD_opencv_reg=OFF \
-DBUILD_opencv_ovis=OFF \
-DBUILD_opencv_matlab=OFF \
-DBUILD_opencv_freetype=OFF \
-DBUILD_opencv_dpm=OFF \
-DBUILD_opencv_face=OFF \
-DBUILD_opencv_dnn_superres=OFF \
-DBUILD_opencv_dnn_objdetect=OFF \
-DBUILD_opencv_bgsegm=OFF \
-DBUILD_opencv_cvv=OFF \
-DBUILD_opencv_ccalib=OFF \
-DBUILD_opencv_bioinspired=OFF \
-DBUILD_opencv_dnn_modern=OFF \
-DBUILD_opencv_dnns_easily_fooled=OFF \
-DBUILD_JAVA=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_NEW_PYTHON_SUPPORT=ON \
-DBUILD_opencv_python3=OFF \
-DHAVE_opencv_python3=OFF \
-DPYTHON_DEFAULT_EXECUTABLE="$(which python)" \
-DWITH_OPENGL=ON \
-DWITH_VTK=OFF \
-DFORCE_VTK=OFF \
-DWITH_TBB=ON \
-DWITH_GDAL=ON \
-DCUDA_FAST_MATH=ON \
-DWITH_CUBLAS=ON \
-DWITH_MKL=ON \
-DMKL_USE_MULTITHREAD=ON \
-DOPENCV_ENABLE_NONFREE=ON \
-DWITH_CUDA=ON \
-DNVCC_FLAGS_EXTRA="--default-stream per-thread" \
-DWITH_NVCUVID=OFF \
-DBUILD_opencv_cudacodec=OFF \
-DMKL_WITH_TBB=ON \
-DWITH_FFMPEG=ON \
-DMKL_WITH_OPENMP=ON \
-DWITH_XINE=ON \
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DCMAKE_INSTALL_PREFIX="$ROOTDIR" \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
..
make -j"$(nproc)" && make install
echo "$NAME1" installed on "$ROOTDIR"
echo add following line to .zshrc
echo export OpenCV_DIR="$ROOTDIR"
修改后,直接执行该脚本 zzopencv.sh,编译正常就能看见进度条终于到达 100% 啦!如果你成功安装,那么恭喜你🎉🎉🎉,opencv 完全安装好了!
# install opencv 4.3.0
./zzopencv.sh
# you may put this line into your .bashrc
vim ~/.bashrc
export OpenCV_DIR=$ZZROOT
source ~/.bashrc
# back to env
conda activate my_env
配置 OpenCV 路径,以便后续查看 OpenCV 相关信息
# into ~/.bashrc
vim ~/.bashrc
# 添加下面在 ~/.bashrc 最后
# /path/to/opencv/lib/pkgconfig 里面有 opencv4.pc
# ~/app/lib/ 下
export PKG_CONFIG_PATH=/path/to/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
# 生效,回到 my_env 环境
source ~/.bashrc
conda activate my_env
通过下面命令,查看 OpenCV 安装信息,若有输出,则配置路径成功。
# check opencv4
pkg-config --libs opencv4
d、 安装 Boost Libray、HDF5 Libary(Optional)
# install boost
./zzboost.sh
# you may put this line into your .bashrc
vim ~/.bashrc
export BOOST_ROOT=$ZZROOT
source ~/.bashrc
conda activate my_env
# install hdf5
./zzhdf5.sh
e、安装 Denseflow
# finally, install denseflow
./zzdenseflow.sh
安装完成后,出现如下界面,那么继续恭喜你,DenseFlow 完全安装好了,路径在 ~/app/src/denseflow 里面,相关生成的库文件在 ~/app/lib 中:
四、遭遇 Bug 记录
1、在 ./zzopencv.sh 执行过程中,出现 Error Generating File 问题(最主要)
原因:CUDA 版本、Opencv 版本、GCC、G++ 版本不匹配
解决:参考我的配置情况,重新安装,完成后删除 ~/app/src 下的所有文件,从三b重 新执行后续步骤
2、软链接找不到问题 libvpx、lib256
原因:三b 前几行写入 ~/.bashrc 有问题
解决:删除 ~/app/src 下的所有文件,三b开始重新执行
命令:sudo ln -sf xxx xxx
3、编译过程中缺失文件问题
原因:从外网下载文件被墙了
解决:配节点 or 问百度
4、解释一下 zzopencv.sh 的 CMAKE 命令
若编译 CUDA 版本的,相关参数一定要带上,网上有些教程没带 CUDA_ON 的,能够 编译成功,但是到最后编译 denseflow 时,会报错缺少 cudaarith.hpp 文件等问题。
CMAKE 命令及参数没问题,不要轻易更改。
五、总结
刚上手项目,没想到卡在这卡了快一周,果真程序员最难的是配环境。不过只要坚持找问题,一定能够解决的。希望这篇博客能够帮助大家,欢迎评论区讨论!!