因为一些特殊原因,最近要重新配置caffe(之前的配置莫名其妙地gg了,而且需要在新用户下面创建环境,所以就干脆重新搞,只装caffe。
略过重新配置环境变量来让cuda等软件生效的步骤,基本上就是改~/.bashrc
并且让环境变量生效就是了(cuda、显卡驱动安装什么的在上篇博文里面讲过了)。
virtualenv安装
virtualenv是很重要的,最好先安装了,如果已经安装或者不打算将opencv配置在虚拟环境里面的同学可以直接跳过这一步。
安装virtualenv的好处:可以使用不同版本的python版本,而且各个环境中的依赖包可以不同,这样就可以避免包的冲突(例如有些时候caffe会和tensorflow产生冲突。。。玄学问题)。
正式开始安装
安装指令:
先确定安装了pip
、python
等环境(其实应该都已经装好了,但还是确认一下比较好)。
$ python -V # 注意是大写的V!
$ pip -V
$ python3 -V
$ pip3 -V
# 下面这两条其实可以不用管,只是确保`sudo`之后的`python`版本和`pip`版本是你想要的版本而已
$ sudo pip -V
$ sudo python -V
如果没装python的话就:
$ sudo apt-get install python2.7-dev python3.5-dev
如果没安装pip
的话就:
$ cd ~
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
然后就是开始安装virtualenv
了:
$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/get-pip.py ~/.cache/pip
万一上面的没安装好也可以用:
$ sudo apt install python-virtualenv
或者用pip3
来试试(具体怎么知道装好没有看下面)。
运行了上面的指令之后就配置环境变量~/.bashrc
,添加:
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
然后source ~/.bashrc
来让环境变量生效(注意,每次更新之后都会退出虚拟环境,所以要重新workon cv
来进入虚拟环境!),之后再试试mkvirtualenv
指令,如果发现提示没有安装xxx的话那么就是没装好。
创建虚拟环境
$ mkvirtualenv cv -p python3
这里用了python3
作为默认的版本,如果是用python2
的话就把3
改成2
。创建好了的虚拟环境的名字是cv
。
进入环境之后要安装NumPypip install numpy
,因为opencv要用到这个库。
最后用workon cv
来启动这个新创建的虚拟环境。后面的操作都是在虚拟环境下完成。
opencv安装
安装编译需要的包
sudo apt-get install build-essential cmake pkg-config
安装图像相关的包(到时候opencv
要用的):
sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
安装opencv的gui相关的包:
sudo apt-get install libgtk-3-dev
安装优化速度的包:
sudo apt-get install libatlas-base-dev gfortran
下载源代码
首先下载opencv的:
$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.4.0.zip
$ unzip opencv.zip
然后下载opencv_contrib(装了这个里面的包才是完整的opencv,具体的贫僧也不是很清楚。。。):
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.0.zip
$ unzip opencv_contrib.zip
这里下载的是3.4.0
的版本,如果要改版本的话把上面指令里面的数字改改(别改成不存在的版本号。。。)
解压用unzip 要解压的包.zip
就可以了。
编译
首先进入下载好了的源代码目录里面cd ~/opencv-3.4.0
,然后创建并进入目录build:mkdir build && cd build
,最后开始cmake
。
我用了这篇博客里面的命令,但是出了个错误,后来查了查相关资料才发现少了个flag,下面这行命令运行不了的话就试试更下面的那行命令。
出错的指令:
(cv) tank@ubuntu-server:~/opencv-3.4.0/build$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
# 下面是输出
# 省略一大堆乱七八糟的输出
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_CUDA_LIBRARY (ADVANCED)
linked by target "opencv_cudacodec" in directory /usr/tank/opencv-3.4.0/modules/cudacodec
-- Configuring incomplete, errors occurred!
See also "/usr/tank/opencv-3.4.0/build/CMakeFiles/CMakeOutput.log".
See also "/usr/tank/opencv-3.4.0/build/CMakeFiles/CMakeError.log".
(cv) tank@ubuntu-server:~/opencv-3.4.0/build$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85
解决方法:
加上下面这个东西就可以了。
-DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs
上面那个指令还少了点东西,最后贫僧补充成了这样:
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.0/modules \
-D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
-D BUILD_EXAMPLES=ON ..
最后输出了:
-- Configuring done
-- Generating done
这样第一步的cmake
就完成了。
cmake
完成之后就可以开始编译了,不过要先确定已经进入了虚拟环境中(进入虚拟环境之后用户名前面会多一个(虚拟环境名)
,例如会从ubuntu
变成(cv)ubuntu
)。
make -j 4
开始编译,4是因为机器上的cpu是4核。输入了指令后要等一段时间才能跑完(就是说不要看他貌似不动了,没输出东西了就不耐烦地直接停止掉进程,慢慢等编译完成或者因为错误而中断,不要动它)。
如果遇到错误了的话就用make clean
来删除编译出来的东西,然后试试用make
来编译(单线程)。还不行的话就另外找资料吧。。。
成功了之后就可以用sudo make install
来安装了:
$ sudo make install
$ sudo ldconfig
完成安装
这里只有Python 3.5
的例子:
在跑完上面的代码之后OpenCV
和Python3
的链接会生成在/usr/local/lib/python3.5/site-packages/
,用ls
指令可以看得到。
$ ls -l /usr/local/lib/python3.5/site-packages/
这样是没有办法直接用的,要把这个文件改一下名字:
$ cd /usr/local/lib/python3.5/site-packages/
$ sudo mv cv2.cpython-35m-x86_64-linux-gnu.so cv2.so
不改的话其实贫僧觉得问题不大,只是要import
的时候麻烦一点。。。所以还是改了吧。。。
在改名之后就可以把这个链接复制到虚拟环境里面了(不然用不了):
$ cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
$ ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
这样就基本完成了额。
测试安装
python
进入环境,然后:
>>> import cv2
>>> cv2.__version__
上面的指令应该会输出版本号(之类的话就是'3.4.0'
)。
不过贫僧在import
过程中遇到了个小小的问题:
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libhdf5.so.101: cannot open shared object file: No such file or directory
解决方法:
先locate libhdf5.so.101
确定这个文件的位置,例如贫僧输入指令之后就得到了:
$ locate libhdf5_hl.so
/home/ubuntu/anaconda3/lib/libhdf5_hl.so
/home/ubuntu/anaconda3/lib/libhdf5_hl.so.100
/home/ubuntu/anaconda3/lib/libhdf5_hl.so.100.1.0
$ locate libhdf5.so.101
/home/ubuntu/anaconda3/lib/libhdf5.so.101
/home/ubuntu/anaconda3/lib/libhdf5.so.101.1.0
然后复制到/usr/lib
和/usr/lib/x86_64-linux-gnu/
下面:
$ sudo cp -s /home/ubuntu/anaconda3/lib/libhdf5_hl.so.100.1.0 /usr/lib/libhdf5_hl.so.100
$ sudo cp -s /home/ubuntu/anaconda3/lib/libhdf5_hl.so.100.1.0 /usr/lib/x86_64-linux-gnu/libhdf5_hl.so.100
$
再试一次,如果还不行的话就试试重启,可能就可以了。
不过贫僧在成功之前遇到了新的错误“undefined symbol”:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /usr/tank/opencv-3.4.0/build/lib/cv2.so: undefined symbol: PyCObject_Type
解决方法是编辑~/.bashrc
,添加(或者修改):
export PYTHONPATH=/usr/local/lib/python3.5/dist-packages:$PYTHONPATH
source
一下让变量更新,然后就可以了。
如果上面不管怎么样都搞不定都有错误的话就echo "GG"
来向电脑投降(然而并没有什么用)。。。
参考资料
Ubuntu 16.04: How to install OpenCV:这篇博客确实很不错,博主写的东西里面有很多干货。。。而且大部分都挺有意思,不过这篇博文的问题是有点点老,但是里面的内容是可以参考的(而且参考价值还是很高的)。。。
Ubuntu 16.04+CUDA 9.1+cuDNN v7+OpenCV 3.4.0+Caffe+PyCharm 完全安装指南,国内最全!(适用CUDA 9.0):是不是最全不是很清楚。。。但是基本上要讲的都讲到了。