rrc 是论文 Accurate Single Stage Detector Using Recurrent Rolling Convolution 中提出的。
论文地址为:rrc_detection
github 地址为:xiaohaoChen/rrc_detection
0. 环境
- Ubuntu 16.04
- cuda 8.0 + cudnn 5.1
- python 2.7
- protobuf 2.6.1
- opencv 3.1
因为 rrc_detection 年代比较久远了,所以用的都是一些比较旧的环境。
以上这些配置都是在我踩了无数次坑以后才得出来的,都是泪。
0.1 cuda7.5+cudnn 5.0
rrc-github 里面是说需要 cuda7.5+cudnn5.0
,我一开始也是那么装的,但是因为我的显卡是 Titan Xp
,根据维基百科上的 CUDA ,cuda7.5
并不支持 Titan Xp
,导致了后面 make runtest
的时候出现了错误:
Check failed: error == cudaSuccess (8 vs. 0) invalid device function
忽略这个错误直接跑训练,或者直接使用作者的预训练模型跑测试,都会出现这个错误。
0.2 cuda8.0+cudnn6.0
于是我切换到了cuda8.0,详情可见:Ubuntu 多版本 CUDA 共存
在编译的时候就会出错。
0.3 cuda8.0+不使用cudnn
然后我尝试将Makefile.config
里面的:
USE_CUDNN := 1
注释掉,然后可以正常编译和测试,但是在跑训练的时候会出现:
Check failed: error == cudaSuccess (2 vs. 0) out of memory
就是显存不够用了,但是我已经修改了 rrc_kitti_car.py
:
batch_size = 4 --> batch_size = 1
accum_batch_size = 8 --> accum_batch_size = 1
已经没办法再小了,所以我猜是因为没有 cudnn
的优化,所以占用的内存太大了。
0.4 cuda8.0 + cudnn 5.1
这个配置可以正常编译,但是在 make runtest
的时候还是会出错:
Check failed: datum.encoded() Datum not encoded
我不管这个错误,直接去跑训练,发现可以正常跑起来,虽然还不知道结果。
而且在:
batch_size = 1
accum_batch_size = 1
的情况下,12GB 的显存也几乎都占满了:
>> nvidia-smi
Thu Apr 25 12:56:33 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.87 Driver Version: 390.87 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 TITAN Xp Off | 00000000:01:00.0 On | N/A |
| 45% 72C P2 79W / 250W | 11065MiB / 12194MiB | 5% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 999 G /usr/lib/xorg/Xorg 116MiB |
| 0 1702 C ./build/tools/caffe 10937MiB |
+-----------------------------------------------------------------------------+
注意:因为我是 zsh 用户,所以配置文件使用的是
~/.zshrc
,下文中遇到~/.zshrc
的地方,bash 用户请自行更换为~/.bashrc
。
1. 安装caffe
1.1 安装依赖包
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 libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
安装完以后,自动拥有了 protobuf 2.6.1了。
将代码克隆到本地:
git clone https://github.com/xiaohaoChen/rrc_detection.git
我这里的目录是:
/home/memory/code/rrc_detection
后面我们称之为 $CAFFE_ROOT
,遇到 $CAFFE_ROOT
的地方,请自行更换为自己的路径。将其添加到配置文件中:
sudo gedit ~/.zshrc # zsh 用户
sudo gedit ~/.bashrc # bash 用户
在后面添加:
export PYTHONPATH=$CAFFE_ROOT/python:$PYTHO