admin 管理员组

文章数量: 887019


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  #更新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        #验证 有输出说明noveau驱动正常
cd /etc/modprobe.d
sudo gedit balcklist-nouveau  #写入以下2句保存
blacklist nouveau
options nouveau modset=0
sudo update-initramfs -u    #更新init
sudo reboot                 #重启,发现分辨率掉渣
lsmod | grep nouveau        #验证,无输出说明屏蔽noveau成功

此时再次尝试,进入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   #写入以下2句保存
PATH=/usr/local/cuda/bin:$PATH  
export PATH
source /etc/profile #立即生效


cd /etc/ld.so.conf.d
ls
sudo cp xxx.conf  cuda.conf   #xxx替换成ls出的随便哪个文件
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/s/1c0jaEek 密码: cjvg

安装完成之后,Home下的Matlab文件夹即可删除。


四、BLAS 安装

BLAS可选MKL和altas,安装简单。 mkl-2016下载和安装参见欧新宇。 注意mkl只能安装一次!! 如果没有mkl,就安装默认的 altas !  本文前后2台电脑,分别安装了mkl 和 altas,都OK!.  后面都以安装altas的电脑为例:
sudo apt-get install libatlas-base-dev


五、OpenCV安装

OpenCV大部分使用 Install_OpenCV_Master这个方法,但这个安装过程比较混乱,可以打开安装脚本看看, 各种依赖包装了卸、卸了装,反反复复好几次,而且装完之后与ffmpeg这个包有关的地方全部报错,导致OpenCV安装不完整,后面的caffe编译也出错!! 坑了2天终于找到了救星>>>>>  xuezhisdc. 在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” 但尽管如此,caffe官方还是裂墙推荐 :Python包管理神器----> Anaconda !!! 本文在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                               #验证下原生python版本   
md5sum Anaconda2-4.1.0-Linux-x86_64.sh         #验证md5
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 ~                          #xx用户目录
sudo gedit .bashrc            #找到anconda写在此文件最后的路径,并拷贝。
sudo su                       #获取root权限
cd ~                          #root用户目录
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 貌似有个小错,没管了。。。直接继续后面,貌似不影响!


七、安装google-glog

这个简单,参见欧新宇


八、安装 其他依赖项

这里主要是caffe用到的9个小软件:  protobuf  leveldb  lmdb snappy opencv boost hdf5 gflag google-glog  好多博文在最最开始就安装这些小软件,流程比较混乱,建议放在大块头后面安装,流程比较清晰。
sudo apt-get install -y build-essential  # basic requirement  
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  requirment


九、Caffe 安装 & 编译

Caffe下载,解压至Home目录下。
如本文目录为:/home/xx/caffe-master 。
xx为用户名,home目录默认是当前用户的家目录,所以中间是有用户名的。
进入caffe-master, 右击,在T终端中打开文件夹,然后 pwd命令 ,可以查看当前完整目录。
配置各种路径的时候,最方便是这个办法,直接鼠标找到文件夹,右击在T终端中打开,pwd 出当前目录,复制之!!        


9.1 安装pycaffe的依赖包


若在6.2中,使用原生Python安装的
进入根目录的 python文件夹,打开终端执行:
pip --version                           #验证pip是否已经安装,默认是没有的
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中了,可如下验证
conda list | grep xxx

xxx取requirements.txt中每一行包名字的几个连续字符,注意要小写,比如cython, num, level,gfl等等
经过验证,发现只有 leveldeb 和 python-gflags 等3个无输出,说明没安装。
此时新建一个txt,如req.txt,将requirements.txt 中的内容拷贝进去,别的全删,只留下上面3个无输出的。
然后执行如下:

sudo su                                                   # 必须切换至root
cd /home/xx/caffe-master/python
for req in $(cat req.txt); do pip install $req; done      #用req.txt替换requirements.tx

**** 注意,本文是将anaconda安装到了usr/local 下,当前用户是无法更改Anacoda的。 **** 因此只要涉及到anaconda的写入和删除都需要root权限,或者sudo执行,此处sudo不合语法,只能root. **** 安装中,pip 会在 Anacoda的sit-package文件夹中写入第三方Python包
当然,如果不想这么麻烦,则无需验证,直接执行如下,已安装的会被跳过。
sudo su  #切换至root
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
PYTHON_LIB :=/usr/local/lib            #原生python选择 
PYTHON_INCLUDE := xxxxx                #原生python默认 
## Ananconda
# 先注释掉原生python路径
AanacondaHome=/usr/local/ananconda2  # path to your anaconda
PYTHON_LIB :=$(AanacondaHome)/lib 
PYTHON_INCLUDE := $(AnacondaHome)/xxxx #默认,但注意把Anaconda三行的注释符#全去掉,否则编译caffe报错找不到Python.h
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如下>>>>

## Refer to http://caffe.berkeleyvision/installation.html
# Contributions simplifying and improving our build system are welcome!

# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1

# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
#	You should not set this flag if you will be reading LMDBs with any
#	possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1

# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++

# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 lines for compatibility.
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 choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
# BLAS_LIB := /path/to/your/blas


# This is required only if you will compile the matlab interface.
# MATLAB directory should contain the mex binary in /bin.
MATLAB_DIR := /usr/local/MATLAB/R2014a


# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
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 \

# We need to be able to find libpythonX.X.so or .dylib.
PYTHON_LIB := $(ANACONDA_HOME)/lib

# Uncomment to support layers written in Python (will link against Python libs)
# WITH_PYTHON_LAYER := 1

# Whatever else you find you need goes 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


# Uncomment to use `pkg-config` to specify OpenCV library paths.
# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
# USE_PKG_CONFIG := 1

# N.B. both build and distribute dirs are cleared on `make clean`
BUILD_DIR := build
DISTRIBUTE_DIR := distribute

# Uncomment for debugging. Does not work on OSX due to https://github/BVLC/caffe/issues/171
# DEBUG := 1

# The ID of the GPU that 'make runtest' will use to run unit tests.
TEST_GPUID := 0

# enable pretty build (comment to see full commands)
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/python:$PYTHONPATH              #写入,2选1
PYTHONPATH=/home/xx/caffe-master/destribution/python:$PYTHONPATH  #写入,2选1
export PYTHONPATH
 

最后的profile如下:

#接上原有文本#

#CUDA
PATH=/usr/local/cuda/bin:$PATH
export PATH

#Anaconda
export PATH="/usr/local/anaconda2/bin:$PATH"

#Caffe
#LD_LIBRARY_PATH=/home/xx/caffe-master/build/lib:$LD_LIBRARY_PATH
LD_LIBRARY_PATH=/home/xx/caffe-master/distribute/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH


#Pycaffe
#PYTHONPATH=/home/xx/caffe-master/python:$PYTHONPATH
PYTHONPATH=/home/xx/caffe-master/distribute/python:$PYTHONPATH
export PYTHONPATH

#Matcaffe
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     #创建LevelDB
sh examples/cifar/train_quick.sh            #训练


九、使用Pycaffe

第7步,导入caffe.draw时,出错,百度下原因是缺了2个python包。pydot & graphviz 。 在原生python中,安装如→XXX 在Anaconda中安装如下: 由于此处sudo命令不合语法,只能使用root权限,安装命令如图:

打开终端,输入 spyder, 即可开启Anaconda集成的ython IDE.。 原生Python的可在软件中心下载Spyder. Spyder开启可能会卡出去,多开几次就OK。 新建目录 /home/xx/Spyder/mnist,  床建以下pycaffe训练文件: 首先要按照上面cifar的方法,去mnist下获取源数据,并创建数据文件LevelDB. 其次要自己设定训练参数到mnist_lenet_solver.prototxt文件 
# -*- coding: utf-8 -*-
"""
Created on Tue Jul  5 18:30:56 2016

@author: xx
"""
# 导入caffe
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)))

# -------------------------
# 设计 solver
# modelDir/mnist_lenet_solver.prototxt 
# ------------------------

# 训练网络

caffe.set_device(0)

caffe.set_mode_gpu()   # or cpu

solver = caffe.SGDSolver(modelDir+'/'+'mnist_lenet_solver.prototxt')

solver.solve()
运行即可看到如下训练过程~~~~~~~~~~。
绘制此lenet的网络结构如下。
# -*- coding: utf-8 -*-
"""
Created on Tue Jul  5 20:30:20 2016
绘制网络结构
@author: xx
"""
# 导入 draw
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'  # LR TB RL BT

# 绘制网络
print('Drawing net to %s' % pic_path)
caffe.draw.draw_net_to_file(net,pic_path,rankdir)
print('Done!')

使用caffemodel对任意图片分类 需要到caffe model zoon 下载 bvlc_reference_caffenet.caffemodel
# -*- coding: utf-8 -*-
"""
Created on Tue Jul  5 22:16:37 2016
使用caffemodel进行分类
@author: xx
"""

import caffe

#caffemodel 文件
modelDir = '/home/xx/caffe-master/models/bvlc_reference_caffenet/'
model = modelDir + 'bvlc_reference_caffenet.caffemodel'

#deploy文件
deploy = modelDir + 'deploy.prototxt'

#GPU模式
caffe.set_mode_gpu()
net = caffe.Net(deploy,model,caffe.TEST)

#数据预处理配置
#config infomation from deploy
#top: "data"
#input_param { shape: { dim: 10 dim: 3 dim: 227 dim: 227 } }
#输入尺寸
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})  #data form deploy
#维度调整 HWK-KHW python读取为HWK
transformer.set_transpose('data',(2,0,1))
#值阈调整 python读取图片为[0,1]
transformer.set_raw_scale('data',255)
#通道调整 RGB-BGR caffe与opencv一致为BGR,而原图为RGB
transformer.set_channel_swap('data',(2,1,0))
#尺寸调整 第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']  #prob form deploy
predict = pridects.argmax() 
print predict  #输出265
 net.meta.classes.description(265)

ans = 

    'Cardigan, Cardigan Welsh corgi'    # 羊毛衫、羊毛衫威尔士柯基犬






本文标签: 笔记 Ubuntu caffe