刚入坑小白一枚,第一次写博客,如有不周到的地方请见谅,本人也是躺坑无数才慢慢摸索出来一条比较稳定的道路。
caffe和pyfasterrcnn,尤其fasterrcnn算是挺古老的东西了,不过工作室大家都用的这个网络,也有很多成熟的论文。正因如此,原本官方默认推荐python2+cuda8左右的版本,这就很痛苦了,我又不用python2,又不用GPU,大多数都是摸石头过河。
使用python3是为了不在2020年全面python3的趋势下入国军
使用cpu是因为我原来是双系统安装GPU的环境,可是安装经常出错,重装系统重装到我怕了,每次重装系统都心惊胆战怕把我windows给格了。因此拿虚拟机测试,崩了就崩了,做到重要的部分直接复制整个虚拟机就可以备份然后又可以任搞。
也建议想玩双系统的先玩玩虚拟机,熟悉了再去试。尤其是用GPU的话还要先弄显卡驱动,cuda,cudnn三座大山,cpu的话一上来就可以整caffe和pyfasterrcnn。
VMware还有一个好,安装时会自动装一个VMTools的工具,和windows交流很方便,文字,文件什么的都可以直接复制过去
本人用笔记本,配置是i5-7300hq,16G内存,1050m。
我自己平时配置环境都记录步骤。
这篇博文都是我按照之前的步骤,重新再新开一个虚拟机边配置边写的,梳理过一遍,报错的概率已经很小,而且装出来的系统很纯净。
另外这篇教程有点长,csdn的自动折叠有点烦,这里有一个自动展开的脚本,建议使用Tempermonkey暴力猴安装
使用VMware15,下载镜像Ubuntu18.04.
之后便是漫长的等待,还挺漫长的,等待完之后就会进入桌面,建议这步做完就备个份,就是把虚拟机文件夹整个复制到另外一个地方
在等待过程中不妨先看看下面预习预习
创建一个root账户,因为在普通用户权限下执行命令通常都要加sudo,而在root账户下输入命令前面不用再加sudo,而且有些指令必须要root账户才能用
打开终端,输入下面指令,注意一下在ubuntu的终端里面粘贴是使用ctrl+shift+v
sudo passwd root
输入想要设置的密码两次,就成功创建了root账户,
另外注意一下linux里面输入密码是不会显示的,但确实是有输入
想要提权为root用户的时候输入
su root
再输入密码,前面的用户名就会变成 root
注意一下root 用户的根目录就是在“计算机”看到的目录
普通用户的默认根目录是/home/用户名(也称家目录)
在cd的时候就会知道区别
刚安时候可能是全英的,需要下载中文语言包,不过我们先换源,下载就会更快一点
sudo gedit /etc/apt/sources.list
删除里面所有内容,然后添加
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
更改完成后输入更新源,以后用apt装什么东西之前都要先运行这个更新一下列表
sudo apt update
之后就可以在语言中心改成中文了,
另一个比较必要的操作是改一改分辨率,这么小个窗口看得我眼花
还有时区改为上海,
输入源改成ubuntu的智能拼音,这个输入法还算凑合,换搜狗什么的日后自己再研究
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git cmake build-essential
请认真仔细逐条复制,这些库没有后面会爆各种奇怪错误
sudo gedit ~/.bashrc
在文件最后加入这两行内容
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
重启或输入下面使之生效
source ~/.bashrc
既然是python3,pip是肯定要装的,Ubuntu18自带python27和36两个版本,平时在命令行里面输入python和python2都是打开27,只有输入python3才是打开36
另外想给36来pip安装东西,使用的也是pip3 install xxx,否则只是pip install的话就装给27了
sudo apt install python3-pip
换不换源随意,我不换源速度也挺快的
pip3 install opencv-python
首先卸载numpy,有人会问你,你不是安装嘛,咋卸载呢,你回头一看,发现opencv给拖家带口了一个numpy,但他会给你安一个1.17+的,然而这个1.17+好死不死,很多重要的函数修改了定义,导致很多人工智能相关库都出错,不信你试试导入opencv,保准报错
python3
>>> import cv2
相当愚蠢的设定,如果之后安装什么库把numpy给升级成1.17+,我们就用下面这条命令卸载
pip3 uninstall numpy
再重新指定版本安装,我们就要1.15的
pip3 install numpy==1.15.0
之后再import cv2就不会出错了
这里提一下cv2就是你装的python-opencv,我当时下载到版本是4.1.2
再提一嘴pkg-config opencv --modversion通过这个可以查到opencv版本,结果是3.2.0,我当时也纳闷,后来发现是在装依赖包第一条的时候装上的,这个opencv和py-cv没啥关系。
主要参考该简书教程
做了这么多步骤终于可以开始装caffe了,有人会问,你18的系统,为什么不用这种安装方法呢,不一条代码就可以搞定了吗,编译这么多这么麻烦
sudo apt install caffe-cpu
所言极是,如果你只要caffe的话你可以这样做,如果你要继续往下装fasterrcnn,建议还是用下面的方法
git clone https://github.com/BVLC/caffe.git
这条代码会把caffe文件夹下载到你当前cd的目录,建议自己复制一份到其他地方,然后就可以瞎搞了
下面我就用caffe来表示caffe的主目录了,注意你先复制到一个自己喜欢的专门放库的文件夹(方便起见我是直接用家目录的),因为并不是像windows安装好就万事大吉的可以把安装包删掉的,这个是更类似“绿色安装”的存在,如果你之后为了省空间等把这个文件给删了,你会发现你用不了caffe了
下面先安装库,全给装上准没错,比之后编译时这里没库那里没库到处出错到处要救火好
cd caffe/python
#安装该目录下requirements.txt所需的包
for req in $(cat requirements.txt); do sudo pip3 install $req; done
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1 /usr/local/lib/libboost_python3.so
这句命令,前面的文件是源文件,后面的文件是快捷方式
需要自己看看自己源文件的版本然后修改
cd /usr/lib/x86_64-linux-gnu/
ls libboost_python*
然后看到蓝白色的是快捷方式,白色的是源文件
比如libboost_python3-py36.so
就是libboost_python3-py36.so.1.65.1的一个快捷方式
之后就修改,比如说原主的是libboost_python-py35.so.1.5x.x ,
要改为libboost_python3-py36.so.1.65.1
改的时候一定要注意有空格断开前后两个文件
cd回去caffe的主目录
目录下的example只是caffe给的样例文件,不能拿来编译,只有Makefile.config才能编译
cd caffe/
cp Makefile.config.example Makefile.config
sudo gedit Makefile.config
请按照以下步骤仔细修改Makefile.config,活用ctrl+F搜索
我们用的是cpu,所以要把cpu的注释去掉
将# CPU_ONLY:=1
改为CPU_ONLY:=1
caffe通常都是要用opencv的,不知道官方在想什么把这里默认注释上了,去掉
将# OPENCV_VERSION := 3
改为OPENCV_VERSION := 3
把py2.7的两行注释掉,caffe默认是27,但我们的是36
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
去掉py3.5的注释:
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m \
/usr/local/lib/python3.5/dist-packages/numpy/core/include
然鹅我们的python版本是36,还需要把上面三个3.5的地方改成3.6
这恰恰展现了caffe的更新迟缓 对旧版本的优良兼容性
我们用的是python运行caffe,当然要去掉# WITH_PYTHON_LAYER := 1的注释
将# WITH_PYTHON_LAYER := 1
改为WITH_PYTHON_LAYER := 1
在INCLUDE_DIRS和LIBRARY_DIRS后面分别加上/usr/include/hdf5/serial和/usr/lib/x86_64-linux-gnu/hdf5/serial,效果如下
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
这里也给出我改好的Makefile.config,如果上面有什么不明白还是可以下载看一看,不过也要根据自己电脑实际版本做做修改
下面是激动人心的编译环节,To be? Or not to be?
薛定谔的编译成功概率,这里的快感甚于抽SSR
sudo make all -j4
sudo make test -j4
sudo make runtest -j4
如果报错就复制错误信息自己上网找找
然后就make clean清除编译信息重新编译
我已经反复多次躺坑,按照这个教程来应该不太会出错了
千锤万炼之后看到这一连串的OK简直就是人间极乐
上面的1162难通过后,应该就不会有什么问题了
在python3下import caffe也不会出错
如果出错了,首先尝试一下重启,还有错自己上网查一查
这一篇文章对caffe的示例程序,解释了里面的语句,讲得很仔细,推荐去看看
注意的是下面的这些指令都是要在caffe主目录下运行,不能cd进去详细目录再运行
cd caffe
sudo sh data/mnist/get_mnist.sh #由于省空间,数据集是要自己另外下载的
sudo time sh examples/mnist/train_lenet.sh #将数据集转换成LMDB数据才可以被caffe识别
sudo gedit examples/mnist/lenet_solver.prototxt #修改配置文件
这个是运行的配置文件
有两个地方值得注意
这里是最大迭代层数,按需要改,默认是10000
max_iter: 10000
这里是修改用cpu还是gpu运行,默认是gpu,我们要改过来
将solver_mode: GPU
改为solver_mode: CPU
输入下面就可以开跑了
sudo time sh examples/mnist/train_lenet.sh
加入time参数可以查看运行的时间,我迭代10000层用虚拟机cpu跑大概需要17分钟
对结果的解释请看上面那一篇文章
训练后,会在examples/mnist下生成四个文件,分别是迭代5000次和10000次的模型,如果要重跑,就把这四个删掉
lenet_iter_10000.caffemodel
lenet_iter_10000.solverstate
lenet_iter_5000.caffemodel
lenet_iter_5000.solverstate
sudo rm -r lenet_iter_*
测试准确率
cd caffe/examples/mnist
touch test_lenet.sh #生成空白文件
sudo gedit test_lenet.sh #编辑
加入如下内容
#!/usr/bin/env sh
./build/tools/caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -iterations 100
运行测试
cd ~/caffe
sudo sh ./examples/mnist/test_lenet.sh
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
下载后也是备一下份,下面就用py-faster-rcnn代表FRCN的安装主目录
cd py-faster-rcnn/lib/
gedit setup.py
把下面三个有关cuda的都给注释掉
#CUDA = locate_cuda()
#self.set_executable('compiler_so', CUDA['nvcc'])
#Extension('nms.gpu_nms',
#['nms/nms_kernel.cu', 'nms/gpu_nms.pyx'],
#library_dirs=[CUDA['lib64']],
#libraries=['cudart'],
#language='c++',
#runtime_library_dirs=[CUDA['lib64']],
# this syntax is specific to this build system
# we're only going to use certain compiler args with nvcc and not with
# gcc the implementation of this trick is in customize_compiler() below
#extra_compile_args={'gcc': ["-Wno-unused-function"],
# 'nvcc': ['-arch=sm_35',
# '--ptxas-options=-v',
# '-c',
# '--compiler-options',
# "'-fPIC'"]},
#include_dirs = [numpy_include, CUDA['include']]
#),
gedit Makefile
把python改成python3,代表用36来make,如果不改,就是用27来make,会报错的
all:
python3 setup.py build_ext --inplace
rm -rf build
make
报点小warn,无伤大雅,看到最后他成功执行rm -rf build就成了
cd py-faster-rcnn/caffe-fast-rcnn/
尤其注意此caffe非上面的caffe,FRCN用的应该是旧版的caffe,当时我误以为FRCN自带caffe了那上面的caffe就可以偷懒不用装了吧,结果发现import caffe之后是没有东西的
把刚才我们在caffe修改的Makefile.config复制到py-faster-rcnn/caffe-fast-rcnn/这个目录下面,所以说如果你刚才直接用一条命令装caffe,那你就少了一次锻炼的机会,现在要还回来了
make -j2 && make pycaffe
其实j2, j4, j8都可以,看心情,不过性能跟不上的话有时候编译太快虚拟机会卡死
sudo apt-get install python-numpy
cd py-faster-rcnn/data/scripts/
./fetch_faster_rcnn_models.sh
然后肯定会报错,因为这个要文明上网才能下得了
可以在这个百度云里面下载
下载tgz后解压,放到 py-faster-rcnn/data/目录下
复制和解压要看是否复制好了,ubuntu坑爹的地方是有时候会没有复制完全
里面是两个训练好的model文件,解压后大小应该是785.5MB
文件比较大,在等待下载的时候不妨先做下面的步骤
py-faster-rcnn/lib/fast_rcnn/config.py
将__C.USE_GPU_NMS = True
改为__C.USE_GPU_NMS = False
py-faster-rcnn/lib/fast_rcnn/nms_wrapper.py
from fast_rcnn.config import cfg
# from nms.gpu_nms import gpu_nms
from nms.cpu_nms import cpu_nms
def nms(dets, thresh, force_cpu=True):
"""Dispatch to either CPU or GPU NMS implementations."""
if dets.shape[0] == 0:
return []
# if cfg.USE_GPU_NMS and not force_cpu:
# return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)
else:
return cpu_nms(dets, thresh)
py-faster-rcnn/tools/test_net.py
和 py-faster-rcnn/tools/train_net.py
将caffe.set_mode_gpu()
改为caffe.set_mode_cpu()
有一个很有用的工具叫做2to3,我当时不知道有这个工具,手动修改print语法感觉要疯掉了
sudo apt install 2to3
2to3 -f all -f idioms /home/wu/py-faster-rcnn/ -w
easydict和Matplotlib两个库不在requirement里面,我们还要自己装
pip3 install easydict
pip3 install Matplotlib
又要重装numpy,卸载时可以看到numpy又双叒叕被升级到了1.17+
pip3 uninstall numpy
pip3 install numpy==1.15.0
三二一,发射
cd py-faster-rcnn/tools
python3 demo.py --cpu
如无意外,你应该就可以看到这只小猫咪了!!!!!!!
终于完事了,我好happy啊!!!!!!!!!!!!
有了这个经验就可以开始研究双系统的安装了
内存或者cpu性能不够了,关掉虚拟机给他分多一点内存和cpu吧
https://blog.csdn.net/u013989576/article/details/72667245
https://blog.csdn.net/HUXINY/article/details/83990628(最详细,有setup代码)
https://www.jianshu.com/p/30fcc3df764d
https://blog.csdn.net/zzyincsdn/article/details/83989606(这个是tfFRCN,和pyFRCN略有不同)