本人硬件环境 titanx ubuntu 14.04 win7双系统
参考:http://blog.youkuaiyun.com/zhjm07054115/article/details/51811495
Ubuntu 15.04 + CUDA7.5 + Caffe 配置笔记
一、Ubuntu 安装
安装Ubuntu 15.04x64 + Win7x64 双系统,让二者在启动引导上相互隔离, 删除Ubuntu时不至Win7躺枪,就必须讲究安装方法。
最easy的就是使用EasyBCD安装。这可以将Ubuntu的启动引导(Grub2)安装在其自己的boot分区,而Win7的启动引导则安装在C盘或其保留分区,相互隔离,不存在用Ubuntu引导Win7启动的问题,重装和卸载互不影响。这个策略非常干净。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
那么,问题来了,如果你主板比较新,使用的是 "UFEI启动 + GPT磁盘" 这个组合,那么使用EasyBCD就有问题,如下所述.
问题始于,万恶的windows推出一个称之为UFEI的东东,美其名曰:大一统安全启动引导接口!!此接口位于主板和系统之间,用于启动时进行软硬件对接,即在主板上加载系统内核,以及向系统内核注册硬件。电脑一启动,操作系统必须向主板出示一个安全密钥,主板才会加载这个系统,可用于杜绝boot病毒,从Win8开始这个标准开始执行。。。 然就坑了Ubuntu等一大批Linux系统,因为这些系统必须向MS购买密钥。。。但是!!为了防止被诉垄断,微软要求所有主板厂商必须在提供UFEI的同时,以这样或那样的方式提供传统的BISO启动。。。微软关上了一扇门,上帝打开了一扇窗 .,美帝的反垄断大法果然强。。。
因此,新型的主板上一般都能找到禁止UFEI,以及打开BIOS的办法,各家主板不一样。
启动方式: UFEI or Legacy BIOS
不用UFEI的原因是,EasyBCD 2.3 目前还无法在ufei中注入Ubuntu的grub2启动,所以在UFEI引导下安装的Win7,当安装完EasyBCD后,软件会提示:注意到你正在使用ufei,EasyBCD的许多特性都无法使用!而屏蔽ufei,在BIOS下重装win7之后,EasyBCD一切正常。这样后面安装ubuntu时,EasyBCD才能在其boot分区上注入grub2启动引导程序。
....不用UFEI的另一个好处时,不会在Win7的保留分区内额外生成一个ufei文件夹,从而可以用DsikGenius为win7的这个保留分区分配盘符使其可见,激活win7就十分Easy了....
....若非要用ufei就要用其他方式解决双系统隔离的问题,但百度之后发现都比较繁琐 。
关掉UFEI的办法看主板什么类型,我的华硕Z170-AR/-P,进入高级设置,启动页面,打开CMOS选项设定为仅Legacy,打开安全选项设定操作系统为others。
....重启,插启动U盘,启动选项里面彻底不见了UFEI字样,,说明UFEI被成功屏蔽!!
....装完Win7之后,用DiskGnius查看隐藏分区,其中无ufei文件夹,只有boot文件夹,OK!
分区表类型: GPT or MBR
....GPT可以管理大于1.8T以上的磁盘,MBR不行,所以单盘超限的另寻解决办法。
用Win7光盘在裸机上装完系统之后,启动方式+分区表 被默认处理为 UFEI+GPT 这样的组合。可以用Diskgnis查看Win7隐藏分区,隐藏分区中有个ufei文件夹,然后点各个磁盘查看信息,分区表类型都为GPT,这说明是UFEI+GPT的组合。
....进入按上步用BIOS安装的Win7之后,打开DiskGnius可转换各GPT盘为MBR盘。但注意:不能直接转换系统所在的C盘,因为会导致系统引导丢失,还有可能整坏硬盘。解决办法是“腾笼换鸟”,在另一个已经转换为MBR的空闲盘上用硬盘安装的方式先安装一个Win7上去,然后重启进入这个新系统;再用DISK转换原来的系统C盘为MBR,再用硬盘安装方法在C盘装上Win7,装完之后进入C盘Win7,删掉掉刚才空闲盘的那个临时Win7即可。。。
....好消息是:在非系统盘上用DISK转换GPT为MBR时,不会格式化磁盘,所以数据仍然在
....之所以要转换成MBR是因为装Ubuntu出问题,啥问题忘了,不转换应该也有解决办法。。
OK! 这样就得到了 BIOS启动 + MBR磁盘 + Win7×64系统 的经典组合!!可以开始安装 Ubuntu了。。。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下载Ubuntu 15.04 64位
下载UltraISO制作启动U盘
在Win7某盘下压缩出 300G~500G 空间,不新建分区、使其空闲
重启进入BIOS,选择U盘启动
开始安装》》。。。
分区:/ 90G~120G , /boot 200M~400M , swap 内存大小左右 ,/home 剩余
分区顺序按此方式、且全部设定为逻辑分区,其他方式也可但发现容易出问题........
注意::分区完成之后,安装开始之前,切记要在下方的启动器安装选项(boot installer)上,手动选择,将启动器安装到你的上述boot分区中,否则默认的话就是用ubuntu引导win7了
....另外::若需重装ubuntu的时候,要进入Win7重新删除四个分区,格式化该盘,使其空闲。进入安装界面后,还要改变上述分区的相对大小,不然ubuntu会一直卡在creating ext4 ... 安装不下去。
....另外::若上述办法还是继续卡在creating ext4上,则在Win7下重新格式化该区,并预先分好4个区的大小,进入Ubuntu安装界面后,将四个对应分区挂载上去即可,可顺利安装......
....另外::重装Ubuntu之后,进入Win7,用EasyBCD删掉上次的grub2启动,重新建一个即可
....但是::这样还是有可能会碰到安装进度条卡在 creating etx4...这里,百度了好久没找到办法,我在这都卡疯了。看到的有解决办法,还请留言分享下啊*&……*&*&
最好选择英文安装,方便安装caffe相关软件时路径全英文,进入之后再安装中文包和fcitx中文输入法....
最好断开网络安装,否则会下载语言包和更新/.///
等待安装完成,系统提示:重启电脑
重启之后会直接进入Win7,这时打开EasyBCD,在刚才的boot目录上添加linux的gub2启动。
OK !!
重启之后,界面出现系统选择 ......... 进入ubuntu ..................
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入系统之后,
打开终端,右击桌面,
设定root用户密码,sudo passward
修改apt-get源为阿里云,sudo gedit /etc/apt/sources.list
遇到自动推送的系统更新,不要同意,也不要不同意,直接x掉!
语言设置中安装中文包,自带fcitx拼音输入法
注意不要用中文替换原英文文件夹,
开始caffe安装 。。。
二、CUDA 安装
CUDA 安装会出各种奇妙问题,显卡、系统各不一样,所以虽然问题的表现形式一样,但解决办法可能不一样,因为驱动跟硬件紧密相关,在软件层面很难统一解决,所以多百度几种方法试吧。。。
CUDA的官方安装文档,小白的一大原罪就是不喜官方资料,想偷懒结果还绕了个大弯……*&*%!!!
2.1 关闭xWindow,开启tty1
安装cuda的同时会安装显卡驱动,因此要进入ubuntu的纯字符界面才行 。
方法是 ctrl + alt + F1 进入tty1,登录,
输入init 3,进入纯字符界面。
可以按ctrl+alt+F7验证,无法返回xWindow了,说明关闭成功。
再次 ctrl + alt + F1 返回tty1。
输入startx , 会再次恢复启动xWinow。 ctrl+atl +f7 即可进入。
如果 init 3 & startx 不行,可以用 sudo service lightdm start/stop 命令。
如果中间哪一步卡住了,强制重启,再试一次,仍然不行说明有问题。
注意,关闭xWindow后,切换到xWin时应该只显示一行219的版本号,没有[ok]start lightdm maneger之类的。
否则,后续安装会有错误。
——————————————————————
如果上面这个操作,完全没问题,OK,可以开始CUDA安装了
——————————————————————
但我这遇到问题:
安装cuda前,进入tty1黑屏,返回xWindow正常. 。。。
安装cuda后,登陆xWindow异常,进入tty1正常 。 。。
安装cuda中,爆出“ Error: can't xxx kernel xxx ”。。。
方法一:网上有用sudo stop lightdm关闭xWindow的,但是需要自己生成和修改xorg文件,ubuntu15.04安装完默认是没有这玩意的。参考好多博客后,没弄成,非常不适合linux新手。
方法二:还有用stop gdm的,gdm是相对于lightdm的另一套xWindow,现在不流行了,所以默认没安装上,需要自己 apt-get install gdm,然后从lightdm切换到gdm。在gdm下可用sudo gdm stop, 来关闭xWIndow。这个的好处是不用修改xorg文件。但这个也有点问题,忘了。
方法三:浪费一天google来的,非常简单,原文中这个办法用来解决“装完nvidia驱动,重启后卡在登陆界面,无法进入xWindow”这个问题的。在我这是被用来解决“装nvidia驱动或cuda前,进入tty1黑屏”这个问题。 方法流程如下:
- cd /etc/default
- sudo cp grub grub.bk
- sudo gedit grub
- GRUB_CMDLINE_LINUX="nomodeset"
- sudo update-grub
- sudo reboot
重启之后,发现桌面分辨率掉到渣,说明奏效了。。
先登陆 xWindow, 尝试切换到 tty1,果然成功刷出登陆提示,tty1黑屏的问题解决!
可以验证下, xWindow 和 tty1 是否可毫无障碍的 反复自由 切换。。。验证OK!
接下来就可关闭xWindow,只使用tty1了。
登陆tty1→输入 init 3 /或者 sudo service lightdm stop→xWindow被关闭,→可能会卡屏,ctr+alt+f1 就可以了。。
可以验证下, ctr+alt+f7 打开xWindow 失效,显示且只显示一个版本号 。。。验证OK!
可以安装cuda了 !!!
方法四: 本文是单显卡titanx,按方法三第一天装完cuda正常,装opencv时出问题,因此第二天重装按方法三再整,结果出了新问题 。安装完cuda后,无法正常登陆xWindow,只能进入tty1。 重新整了好多次无果!
最后在cuda的官方安装教程中,发现方法四~~~终于成功~~~ 操作如下:
#打开终端
- lsmod | grep nouveau
- cd /etc/modprobe.d
- sudo gedit balcklist-nouveau
- blacklist nouveau
- options nouveau modset=0
- sudo update-initramfs -u
- sudo reboot
- lsmod | grep nouveau
此时再次尝试,进入tty1,无黑屏bug。再返回xWindow,也无障碍。
在tty1下,sudo service lightdm stop. → xWindow被关闭!
可以验证,ctr+alt+f7返回xWindow时,只显示一版本号。
在tty1下, sudo service lightdm start. → 打开xWindow成功!
可以验证,ctrl+alt+f7成功返回xWindow.
再重启后,仍可循环切换,完美关闭或打开xWindow。
说明终于完美实现了 字符终端和图形终端的切换。
开始安装cuda~~~~~~~
方法五:本文另一台式机,GTX970单显卡,按照上述方法三和方法四安装cuda,安装之前能正常切换tty1和xWindow。 但是,安装之后,竟然就进不去xWindow了,一直卡在登陆界面,输入密码死循环!!而在安装过程中曾爆出一个“ Error: can't return kernel xxx” ,据查,这个是安装驱动的时候需要linux 内核参与编译。在tty1下验证显卡驱动是否存在,ls /proc/drivers/nvidia, 无任何输出,说明显卡驱动确实没写进去。 最后的解决办法如下:
1.完全重装ubuntu15.04
2.未降级gcc/g++-4.9到gcc/g++-4.7
(这个是导致产生kernel错误的原因。)
3.未更换阿里源,使用系统自带的apt源。
(这个估计更换后无影响,因为我后面安装opencv时为加快速度,还是换成阿里源了)
(cuda安装过程中会自动验证kernel的版本信息,阿里源只是原生源的镜像,差异有一点点,但kernel-header应该是一致的,另一台titanx的就在阿里源下安装的cuda).
4.弹出系统升级提示时,不要接受,也不要拒绝,直接x掉。
据我推断,接受升级肯定会修改内核,但拒绝升级坑能也会!!。 (最有可能是这个原因)
5.官方安装指导的 pre-installation中,需要验证系统类型x86_64,以及更新kernel-header,这些都没做。
因为ubuntu15.04_x86_64安装完,默认是最新的kernel-header.
6.按方法三,修改GRUB_CMDLINE_LINUX="nomodeset",并sudo update-grub,再重启!
7.分辨率掉渣,进入tty1, sudo service lightdm stop 关闭xWindow.
注意验证下,返回xWindow时,显示且仅显示一行219版本号,说明才是彻底关闭了。
8.开始安装cuda。
终于进入油意义的第一步!! ----------------------
2.2 安装cuda 7.5
预先下载并拷贝cuda7.5_linux_64_.deb安装包到home下。
关于是否要先独立安装nvidia驱动的问题,本人尝试几次重装都失败了,无法打开内核什么的。。
因此直接cuda走起,安装cuda的时候会自动安装驱动。。。
安装过程中要编译,因此先对gcc和g++进行降级,至-4.7版本。
后面安装各种包都要用到gcc, 所以一开始降级可让全部软件包的安装都比较一致。降级方法参见欧新宇。
进入tty1,关闭xWindow,开始安装
- cd ~
- sudo dpkg -i install cuda---x-x-x.deb
- sudo apt-get update
- sudo apt-get install -y cuda
等待安装完成 》》》》
注意:安装的过程中,可能会刷出ERROR,卸载掉或重装来过......
重启:sudo reboot!
配置cuda bin & lib 目录
- cd /etc
- sudo gedit profile
- PATH=/usr/local/cuda/bin:$PATH
- export PATH
- source /etc/profile
- cd /etc/ld.so.conf.d
- ls
- sudo cp xxx.conf cuda.conf
- sudo gedit cuda.conf
- /usr/local/cuda/lib64
- sudo ldconfig -v
- nvcc --version
注意:此处可先重启电脑,不重启就要在这个终端内继续,不更换新的终端窗口。
因为上面的立即生效是针对当前终端这个shell的,不是整个系统,只有重启才能应用到整个系统。
可以验证,在不重启时,另开一终端,nvcc --version 是无输出的。
2.3 安装cuda sample
- cd /usr/local/cuda/samples
- sudo make all -j8
- cd ./bin/x86_64/linux/release
- ./deviceQuery
2.4 安装cudnn-v4
由于是cuda7.5 所以安装 cudnn-v4.0比较好
下载 cudnn-7.0-linux-x64-v4.0-prod.tgz 放到home下
- tar zxvf cudnn-7.0-linux-x86-v4.0-prod.taz
- sudo cp include/cudnn.h /usr/local/include
- sudo cp lib64/libcudnn.* /usr/local/lib
- sudo ln -sf /usr/local/lib/libcudnn.so.7.0.64 /usr/local/lib/libcudnn.so.7.0 #建立链接
- sudo ln -sf /usr/local/lib/libcudnn.so.7.0 /usr/local/lib/libcudnn.so
- sudo ldconfig -v
重启 .......
三、Matlab 安装
Matlab安装简单,参见欧新宇。
注意拷贝matlab至home文件夹时,使用欧的挂在方法,sudo cp 之后,安装时出现权限不足,且无法更改?
网上找的链接: http://pan.baidu.com/s/1c0jaEek 密码: cjvg
安装完成之后,Home下的Matlab文件夹即可删除。
四、BLAS 安装
BLAS可选MKL和altas,安装简单。
注意mkl只能安装一次!!
如果没有mkl,就安装默认的 altas !
本文前后2台电脑,分别安装了mkl 和 altas,都OK!.
后面都以安装altas的电脑为例:
- sudo apt-get install libatlas-base-dev
五、OpenCV安装
OpenCV大部分使用 Install_OpenCV_Master这个方法,但这个安装过程比较混乱,可以打开安装脚本看看, 各种依赖包装了卸、卸了装,反反复复好几次,而且装完之后与ffmpeg这个包有关的地方全部报错,导致OpenCV安装不完整,后面的caffe编译也出错!!
在Home下新建文件夹OpenCV,再于其中新建5个sh文档, 拷贝救星给出的各个shell到这几个文档中保存。
安装过程中把OpenCV拷贝到 /usr/local目录下,(与cuda和matlab看齐,好看好管理×××),,
本文是cuda7.5,所以使用比较新的 opencv3.0与之搭配,不容易出莫名奇妙的bug,3.0的shell可仿照2.4.11那个改一下××××
依次运行 1 2 3 4 5 五个shell ........直到安装完成,且无bug报错!
注意:安装过程全程联网,而且网速不能太慢,否则下载的包会有损失。
本文安装过程中,下载的 3rdparty中的ICV组件始终报错!! MD5不匹配!!
最后打开脚本文件找到下载地址,手动下载ICV后放到对应目录下。。。终于通过!!
出错后,可以重新来过,会覆盖掉前次的,我安装了好几次~~
脚本安装和编译的好处就在于,碰到问题立马停止,能精准定位错误源~~~~~
所以出错之后,可研究下 Error Information ~~~~~~~
六、Python安装
安装Pyhton主要是为caffe的pycaffe接口提供一个python环境。
Python被其他软件广泛依赖,在安装这些软件的时候可能已经安装过了,而且同一个包的版本还不太一致。
---------------这导致非常混乱----------比如,:
安装前面 opencv的时候就需要 numpy 和 scipy,在那里已经安装过了!
但安装此处的Python环境的时候,会再被安装一次!
然后面安装caffe的时候,还会被再安装一次!
好多cafee安装教程上都是装了又装,不知道多少次。。
---------------------------------------------
但幸好,Ubuntu 的 apt-get 能够自动管理各种版本,以及依赖关系,方法是检查版本号,若最新则跳过!!
“xxx is already the newest version”
本文在2台电脑上试了下2种方案都可通过。。
6.1 Anaconda 方案
下载 Anaconda2-4.1.0-Linux-x86_64.sh
Anaconda很多博文都安装在/Home/usrname目录下,这样吧/目录的空间都浪费了,因此本文安装到/usr/local
这与 Matlab / CUDA / OpenCV 保持风格一致,比较赏心悦目。。
用Chrome下载Ananconda,放到/home下,开始安装。
- python --version
- md5sum Anaconda2-4.1.0-Linux-x86_64.sh
- sudo bash Anaconda2-4.1.0-Linux-x86_64.sh
安装中间,会提示是否安装在/home/xx/ananconda2目录下,或于下方输入自定义路径,输入:/usr/local/Anaconda
安装末尾,会提示是否在 /home/xx/.bashrc 中创建bin目录,yes!
安装之后,开始配置Anacoda的路径。
在全局变量中配置其lib&bin路径!
- sudo gedit /etc/profile
- export PATH=/usr/local/anaconda2/bin:$PATH"
- source /etc/profile
-
- sudo gedit /etc/ld.so.conf
- /usr/local/anaconda2/lib
- sudo ldconfig -v
-
- cd ~
- sudo gedit .bashrc
- sudo su
- cd ~
- sudo gedit .bashrc
conda --version # 验证
conda list # 列出 conda安装的所有Python包
python --version # conda-python 生效 ,原生的Python被屏蔽
重启,使路径完全生效....
6.2 原生Python方案
也可使用原生Python方案,再继续往Unbuntu的python中添加三方包就可以,如下
- sudo apt-get install -y python-numpy python-scipy python-matplotlib python-sklearn python-skimage python-h5py python-protobuf python-leveldb python-networkx python-nose python-pandas python-gflags cython ipython
安装过程中,大部分都会提示 “scuceessfly installing xxx....”,
python-pandas 貌似有个小错,没管了。。。直接继续后面,貌似不影响!
八、安装 其他依赖项
这里主要是caffe用到的9个小软件: protobuf leveldb lmdb snappy opencv boost hdf5 gflag google-glog
好多博文在最最开始就安装这些小软件,流程比较混乱,建议放在大块头后面安装,流程比较清晰。
- sudo apt-get install -y build-essential
- sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
九、Caffe 安装 & 编译
Caffe下载,解压至Home目录下。
如本文目录为:/home/xx/caffe-master 。
xx为用户名,home目录默认是当前用户的家目录,所以中间是有用户名的。
进入caffe-master, 右击,在T终端中打开文件夹,然后 pwd命令 ,可以查看当前完整目录。
配置各种路径的时候,最方便是这个办法,直接鼠标找到文件夹,右击在T终端中打开,pwd 出当前目录,复制之!!
9.1 安装pycaffe的依赖包
若在6.2中,使用原生Python安装的
进入根目录的 python文件夹,打开终端执行:
[此需]
sudo su
- pip --version
- sudo apt-get install pip
- cd /home/xx/caffe-master/python
- for req in $(cat requirements.txt); do pip install $req; done
可打开 python/requirements.txt , 里面绝大部分依赖包其实与上面6.2中是重复的。
直接覆盖安装,pip 会自动处理,已经安装的只是验证版本号,并更新!
若在6.2中,使用Anaconda方案的
事实上,requirements.txt中的绝大部分包,已经在Anaconda中了,可如下验证
xxx取requirements.txt中每一行包名字的几个连续字符,注意要小写,比如cython, num, level,gfl等等
经过验证,发现只有 leveldeb 和 python-gflags 等3个无输出,说明没安装。
此时新建一个txt,如req.txt,将requirements.txt 中的内容拷贝进去,别的全删,只留下上面3个无输出的。
然后执行如下:
- sudo su
- cd /home/xx/caffe-master/python
- for req in $(cat req.txt); do pip install $req; done
**** 注意,本文是将anaconda安装到了usr/local 下,当前用户是无法更改Anacoda的。
**** 因此只要涉及到anaconda的写入和删除都需要root权限,或者sudo执行,此处sudo不合语法,只能root.
**** 安装中,pip 会在 Anacoda的sit-package文件夹中写入第三方Python包。
当然,如果不想这么麻烦,则无需验证,直接执行如下,已安装的会被跳过。
- sudo su
- cd /home/xx/caffe-master/python
- for req in $(cat requirements.txt); do pip install $req; done
可见,Anaconda 可以更灵活更完备的处理Python的各种版本,以及各种包,这就是caffe列强推荐的原因。
建议使用Anaconda,越到后面越方便,而且理得清。
9.2 配置Makefile.config
此文件中全部都是关于 CUDA cudnn BLAS Matlab python hdf5 opencv 这7个部分的路径信息。
--------------------------------------------------------
那我么先检查下这些软件都安装在啥地方。。
CUDA 默认安装,位于/usr/local/cuda-7.5 /usr/local/cuda是其链接
Matlab 默认安装,位于/usr/local/MATLAB/R2014a
BLAS 默认安装,mkl位于/opt/intel,altas default
hdf5 默认安装,位于/usr/lib/x86_64-linux-gnu/
OpenCV 默认安装,位于usr/local下
注意OpenCV被打散在 usr/local/include/xxx.h /usr/local/lib/xxx.lib /usr/share/opencv/samples这三个目录下
Python
如果不用anaconda则是系统默认自带,目录到处都有,不用管了。。
如果是Ananconda 则在这个文件夹下,/usr/local/ananconda2/lib /usr/local/anaconda2/bin
前面每步在安装完上述软件后,已经对其路径信息进行了配置,在以下3个文件中
/etc/ld.so.conf.d /etc/ld.so.conf /etc/profile
-----------------------------------------------------------------------
现在即可按照上述信息配置Makefile.config
- cd ~/caffer-master
- sudo cp Makefile.config.example Makefile.config
- sudo gedit Makefile.config
1. 去注释
USE_CUDNN=1
2. 加注释
# CPU_ONLY:=1
3. 修改BLAS
BLAS = altas & mkl(maybe)
4. 配置 python & matlab
-
- PYTHON_LIB :=/usr/local/lib
- PYTHON_INCLUDE := xxxxx
-
-
- AanacondaHome=/usr/local/ananconda2
- PYTHON_LIB :=$(AanacondaHome)/lib
- PYTHON_INCLUDE := $(AnacondaHome)/xxxx
- MATLAB_DIR :=/usr/local/MATLAB/R2014a
5. 补充hdf5路径,红色
# what ever else you find, you can add it to here ---------
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
/usr/lib/x86_64-linux-gnu/hdf5/serial/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
6. 启用OpenCV3.0.0
去注释:OPENCV_VERSION=3
lib&bin路径已经在上面5.中做了配置:usr/local/include & usr/local/lib
使用OpenCV3.x需要额外修改 Makefile文件,现在版本的caffe已经对Makefile做了修改,因此不用手动修改也可。
在Makefile文件中查找“Derive include and lib directories”一节,
修改“LIBRARIES +=”的最后一行,增加 opencv_imgcodecs,
修改之后为: LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
最终的完整Makefile.config如下>>>>
-
-
-
-
- USE_CUDNN := 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- OPENCV_VERSION := 3
-
-
-
-
-
-
- CUDA_DIR := /usr/local/cuda
-
-
-
- CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
- -gencode arch=compute_20,code=sm_21 \
- -gencode arch=compute_30,code=sm_30 \
- -gencode arch=compute_35,code=sm_35 \
- -gencode arch=compute_50,code=sm_50 \
- -gencode arch=compute_50,code=compute_50
-
-
-
-
-
- BLAS := atlas
-
-
-
-
-
-
-
-
-
- MATLAB_DIR := /usr/local/MATLAB/R2014a
-
-
-
-
-
-
- ANACONDA_HOME := /usr/local/anaconda2
- PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
- $(ANACONDA_HOME)/include/python2.7 \
- $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
-
-
- PYTHON_LIB := $(ANACONDA_HOME)/lib
-
-
-
-
-
- INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/lib/x86_64-linux-gnu/hdf5/serial/include
- LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
-
-
-
-
-
-
-
- BUILD_DIR := build
- DISTRIBUTE_DIR := distribute
-
-
-
-
-
- TEST_GPUID := 0
-
-
- Q ?= @
7.3 编译caffe
- make all -j8
- make test -j8
- make runtest -j8
7.4 编译pycaffe & matcaffe
- make pycaffe -j8
- make matcaffe -j8
- make destribution #发布,可不执行
编译完成之后,需设置python环境变量,将caffe配置为Python或Anaconda的一个包。
办法是将caffe/python路径,或者caffe/destribution/python路径添加到python环境变量中.
下面的路径只添加一个,本文用destribution这个
- sudo gedit /etc/profile
-
- PYTHONPATH=/home/xx/caffe-master/destribution/python:$PYTHONPATH
- export PYTHONPATH
最后的profile如下:
-
-
-
- PATH=/usr/local/cuda/bin:$PATH
- export PATH
-
-
- export PATH="/usr/local/anaconda2/bin:$PATH"
-
-
-
- LD_LIBRARY_PATH=/home/xx/caffe-master/distribute/lib:$LD_LIBRARY_PATH
- export LD_LIBRARY_PATH
-
-
-
-
- PYTHONPATH=/home/xx/caffe-master/distribute/python:$PYTHONPATH
- export PYTHONPATH
-
-
- LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:$LD_PRELOAD
- export LD_PRELOAD
→→ 测试matcaffe
运行 caffe-master/matlab/demo/classification_demo.m
需要提前下载个berkely.caffemodel到caffe-master/models的对应文件夹下。
刷出一连串得分数字,显示测试成功!
*******补充!如果在运行classcifcation_demo时出错:
Invalid mex: xxxxxxxx “libstdc++ , GLIBCXX-versionxxx不存在” xxxxxxx
则是因为matlab自带的gcc版本较低,而编译matcaffe并生成caffe_.mexa64时的gcc版本较高,
从而编译时标准c++库和运行时标准c++库不一致,导致的。
办法是添加路径,让matlab运行时引用系统gcc,而非自带gcc。
修改方法:
sudo gedit /etc/profile
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6:$LD_PRELOAD #加入此句 保存
source /etc/profile
然后在此终端窗口内,打开matlab,运行其demo,则错误消失。
或者重启,让预加载路径彻底生效,打开matlab,运行demo,错误消失。


→→ 测试pycaffe
在Python中导入caffe,进行验证。
现在可以看到 Python 2.7成为Ananconda下的一个包,caffe又成为Python的一个包。

八、Cifar10数据集测试
- cd ~
- cd caffe-master
- sh data/cifar/get_cifar10_data.sh
- sh examples/cifar/creat_cifar10_data.sh
- sh examples/cifar/train_quick.sh

九、使用Pycaffe
第7步,导入caffe.draw时,出错,百度下原因是缺了2个python包。pydot & graphviz 。
在Anaconda中安装如下: 由于此处sudo命令不合语法,只能使用root权限,安装命令如图:
打开终端,输入 spyder, 即可开启Anaconda集成的ython IDE.。 原生Python的可在软件中心下载Spyder.
Spyder开启可能会卡出去,多开几次就OK。
新建目录 /home/xx/Spyder/mnist, 床建以下pycaffe训练文件:
首先要按照上面cifar的方法,去mnist下获取源数据,并创建数据文件LevelDB.
其次要自己设定训练参数到mnist_lenet_solver.prototxt文件
-
-
-
-
-
-
-
- import caffe
-
- from caffe import layers as L
- from caffe import params as P
-
-
- dataDir = '/home/xx/caffe-master/examples/mnist'
-
-
- def lenet(lmdb,batch_size):
- n = caffe.NetSpec()
-
- n.data, n.label = L.Data(batch_size = batch_size,
- backend = P.Data.LMDB,source=lmdb,
- transform_param = dict(scale=1./255),ntop=2)
- n.conv1 = L.Convolution(n.data, kernel_size=5,
- num_output=20, weight_filler=dict(type='xavier'))
- n.pool1 = L.Pooling(n.conv1, kernel_size=2,
- stride=2, pool=P.Pooling.MAX)
- n.conv2 = L.Convolution(n.pool1, kernel_size=5,
- num_output=50, weight_filler=dict(type='xavier'))
- n.pool2 = L.Pooling(n.conv2, kernel_size=2,
- stride=2, pool=P.Pooling.MAX)
- n.ip1 = L.InnerProduct(n.pool2, num_output=500,
- weight_filler=dict(type='xavier'))
- n.relu1 = L.ReLU(n.ip1, in_place=True)
-
- n.ip2 = L.InnerProduct(n.relu1, num_output=10,
- weight_filler=dict(type='xavier'))
- n.loss = L.SoftmaxWithLoss(n.ip2, n.label)
-
- return n.to_proto()
-
-
-
- modelDir = '/home/xx/Spyder/mnist'
-
- with open(modelDir+'/mnist_lenet_train.prototxt','w') as f:
- f.write(str(lenet(dataDir+'/'+'mnist_train_lmdb',64)))
-
- with open(modelDir+'/mnist_lenet_test.prototxt','w') as f:
- f.write(str(lenet(dataDir+'/'+'mnist_test_lmdb',100)))
-
-
-
-
-
-
-
-
- caffe.set_device(0)
-
- caffe.set_mode_gpu()
-
- solver = caffe.SGDSolver(modelDir+'/'+'mnist_lenet_solver.prototxt')
-
- solver.solve()
运行即可看到如下训练过程~~~~~~~~~~。
绘制此lenet的网络结构如下。
-
-
-
-
-
-
-
- import caffe
- import caffe.draw
- from caffe.proto import caffe_pb2
- from google.protobuf import text_format
-
-
- model_path = '/home/xx/Spyder/mnist/mnist_lenet_train.prototxt'
-
- net = caffe_pb2.NetParameter()
- text_format.Merge(open(model_path).read(),net)
-
-
- pic_path = '/home/xx/Spyder/mnist/lenet_pic.png'
-
- rankdir = 'LR'
-
-
- print('Drawing net to %s' % pic_path)
- caffe.draw.draw_net_to_file(net,pic_path,rankdir)
- print('Done!')
使用caffemodel对任意图片分类
-
-
-
-
-
-
-
- import caffe
-
-
- modelDir = '/home/xx/caffe-master/models/bvlc_reference_caffenet/'
- model = modelDir + 'bvlc_reference_caffenet.caffemodel'
-
-
- deploy = modelDir + 'deploy.prototxt'
-
-
- caffe.set_mode_gpu()
- net = caffe.Net(deploy,model,caffe.TEST)
-
-
-
-
-
-
- transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
-
- transformer.set_transpose('data',(2,0,1))
-
- transformer.set_raw_scale('data',255)
-
- transformer.set_channel_swap('data',(2,1,0))
-
- net.blobs['data'].reshape(10,3,227,227)
-
-
- pic = '/home/xx/Spyder/mnist/dog.jpg'
- img = caffe.io.load_image(pic);
-
-
- net.blobs['data'].data[...] = transformer.preprocess('data',img)
- out = net.forward()
- pridects = out['prob']
- predict = pridects.argmax()
- print predict
- net.meta.classes.description(265)
-
- ns =
-
- 'Cardigan, Cardigan Welsh corgi'