---
title: '树莓派3B+ 64位Ubuntu安装caffe'
pubDate: 2018-05-16
tags:
  - 'caffe'
  - 'raspberry'
description: '树莓派3B+ 64位Ubuntu安装caffe'
---

**_树莓派3B+到货了，当然要把玩一番。_**

## 背景

树莓派从3代开始就用上了64位的处理器，奈何却没有更新上64位的系统。据说用上64位的系统，能提升不少的性能，甚至有人用[RPi3B测试最快能提高30倍](http://www.52pi.net/archives/307)。

拿着RPi3B+的我就对这个更感兴趣了，先折腾一下64位系统，再装个caffe吧。

我知道一个大大搞了个[Ubuntu64位系统](https://github.com/chainsx/ubuntu64-rpi)。

虽然说64位系统提升很大，但是由于缺乏官方的支持，民间高手研究出来的64位系统可能也略欠火候。

比如说，没有针对于3B+完美的稳定的Ubuntu64位系统。

由于缺乏官方网卡的驱动的支持，用大大的64位系统甚至还不能使用官方网卡，我只能掏出我的USB网卡。至于怎么配置wifi就不说了。

再比如说，尽管大大的系统很牛逼了，但是Ubuntu16.04系统依然没法在RPi3B+上用，而Ubuntu18.04可以。

## 安装

### 依赖包

首先先把这一大堆东西装了吧，当然，你一次性全部装完也行都一个样。

apt自带安装的python是2.7.15的，我觉得随意吧还行。

```
sudo apt update
sudo apt install -y gfortran cython
sudo apt install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler git
sudo apt install --no-install-recommends libboost-all-dev
sudo apt install -y python-dev libgflags-dev libgoogle-glog-dev liblmdb-dev libatlas-base-dev python-skimage
sudo apt install -y python-pip
sudo apt install -y build-essential
sudo apt install -y cmake libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install -y python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
```

### 建立SWAP

安装后我发现该系统没有自带SWAP，SWAP分区对于1G小内存的树莓派来说，是至关重要的。

我提前放个图，这个图是我在编译的时候截的，表示内存使用最严重的时候，用了900+的Memory和800+的SWAP。

![](https://source.mkshell.com/15264723720807.jpg)

如果没有SWAP，那么编译就可能不会成功，因为会被杀掉。

首先我们在系统中划分1G空间来做SWAP，我用的位置的`/var/swap`：

```
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo mkswap /var/swap
sudo swapon /var/swap
```

如果以后还想开机自动挂载SWAP的话，可以这样：

```
sudo vim /etc/fstab
# 添加 /var/swap swap swap defaults 0 0
```

如下图：

![](https://source.mkshell.com/15264559134642.jpg)

### 安装OpenCV

OpenCV还是必须要装的，这里我选一个2.4的OpenCV。

少废话，安pip包。

```
pip install pyzmq jsonschema pillow
pip install numpy scipy
pip install ipython jupyter pyyaml
```

其中numpy和scipy的编译难度可能较大，难在时间长、所需内存大造成SWAP换入换出严重阻塞IO。如果实在不行，可以使用apt之类的方法安装。

然后是下载OpenCV的包，并解压：

```
# 不喜欢的话，可以用aria2c
wget https://github.com/opencv/opencv/archive/2.4.13.6.zip
sudo apt install unzip
unzip -o -d . 2.4.13.6.zip
```

开始编译OpenCV，这个是十分耗时的，一般是几个小时。

对于树莓派3B+，编译OpenCV的主要问题有两个：

1. 内存不够，不够SWAP加了
2. 太热，自备小风扇或水冷谢谢（水冷真的不是开玩笑。。）

```
cd opencv-2.4.13.6
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
sudo apt install python-opencv
```

接下来我们检验一下Python中能不能正常导入OpenCV：

![](https://source.mkshell.com/15264729064951.jpg)

导入正常。

### 编译Caffe

先把Caffe拉下来：

```
cd
git clone https://github.com/BVLC/caffe
cd caffe
cp Makefile.config.example Makefile.config
vim Makefile.config
```

需要修改Makefile.config包括这几行：

```
# CPU_ONLY := 1
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
```

改成：

```
CPU_ONLY := 1
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/aarch64-linux-gnu/hdf5/serial/
```

P.S. 修改这3行的意思是：

1. 修改为CPU模式，RPi没有GPU
2. 添加hdf5的include
3. 添加hdf5的lib，其中`aarch64-linux-gnu`是因为我用的是64位系统，如果是32位系统，可能是`arm-linux-gnueabihf`。

#### 开始编译

```
make all -j4
make test -j4
make runtest -j4
```

然后就是漫长的等待，结束后加上也把Python的给编译了

```
cd python
pip install -r requirements.txt
make pycaffe -j4
```

然后在zsh或者bash环境中添加pycaffe的环境：

```
export PYTHONPATH=/home/ubuntu/extra/caffe/python:$PYTHONPATH
```

#### 编译Caffe可能出现的错误：

##### 可能错误1：`undefined reference to cv::imread(cv::String const&, int)`

错误详情：

```
CXX/LD -o .build_release/tools/convert_imageset.bin .build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)’ .build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector >&, std::vector > const&)’ .build_release/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)’ collect2: error: ld returned 1 exit status make: * [.build_release/tools/convert_imageset.bin] Error 1
```

方法： 修改Makefile

```
LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m
```

改成

```
LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
```

##### 可能错误2：`cannot find -lopencv_***`

错误详情：

```
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/aarch64-linux-gnu-ld: cannot find -lopencv_imgcodecs
collect2: error: ld returned 1 exit stauts
Makefile:572: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1
```

方法：

```
sudo vim /etc/ld.so.conf.d/opencv.conf
# 添加 /usr/local/lib
```

_先这样吧_

若有错误之处请指出，更多地关注[煎鱼](http://www.jianyujianyu.com)。
