训练 Caffe 对象检测推断网络入门

适用产品

Firefly-DL

应用说明简介

本应用说明描述了如何在 Ubuntu 上安装 SSD-Caffe,以及如何训练和测试为 Firefly-DL 创建兼容网络推断文件所需的文件。

在 Ubuntu 18.04/16.04 上安装 SSD-Caffe

我们强烈建议您先用新安装的 Ubuntu 18.04/16.04 系统。

1. 安装 NCSDK 2.05.00.02 (https://github.com/movidius/ncsdk/tree/v2.05.00.02).

a. 如果要下载该版本,请在终端使用以下代码:

git clone -b v2.05.00.02 --single-branch https://github.com/movidius/ncsdk.git

b. 如果要安装,请导航到 ncsdk-2.05.00.02 文件夹,然后使用以下代码:

$ make install

注意:如果使用 Ubuntu 18.04,请打开 install.sh 文件,32 行的 1604 替换成 1804。

c. caffe 默认安装在 “/opt/movidius/caffe” 目录。 将此设置为 $CAFFE_ROOT:

$ echo "export CAFFE_ROOT=/opt/movidius/caffe/" >> ~/.profile
$ source ~/.profile
  1. d. 设置 PYTHONPATH:
$ export PYTHONPATH="${PYTHONPATH}:/opt/movidius/caffe/python"

2 安装 Boost:

$ sudo apt-get install -y --no-install-recommends libboost-all-dev

3. 安装 Caffe 所需的所有包:

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libopenblas-dev \
libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

4 安装必需的 Python 包:

$ pip3 install scikit-image protobuf
$ cd $CAFFE_ROOT/python
$ pip3 install -r requirements.txt

5 复制 Makefile.config.example 文件:

$ cd $CAFFE_ROOT/
$ cp Makefile.config.example Makefile.config
$ sudo gedit Makefile.config

注意:您也可以使用 vim 或文本编辑器进行编辑。

6. 如下所示修改 Makefile.config:

a. 取消 8 行的注解:CPU_ONLY := 1

b. 取消 21 行的注解:OPENCV_VERSION := 3

c. 我们的测试设置使用 3.6。 为确保 makefile 配置了使用 python 3.6,请取消注解并将 76 - 78 行修改为以下内容:

PYTHON_LIBRARIES := boost_python3 python3.6m
PYTHON_INCLUDE := /usr/include/python3.6m \
/usr/lib/python3.6/list-packages/numpy/core/include

d. 保存退出。

7. 检查 hdf5 库和 hdf5_hl 库的名称。 它可能因 Ubuntu 版本不同而异。

$ cd /usr/lib/x86_64-linux-gnu/
$ ls -al | grep libhdf5_serial
...
libhdf5_serial.so.100.0.1
libhdf5_serial_hl.so.100.0.0
...

8. 关注显示在您系统上的库。 注意,hdf5 和 hdf5_hl 后缀不一样。 然后为它们建立链接:

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libhdf5_serial.so.100.0.1 /usr/lib/x86_64-linux-gnu/libhdf5.so
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libhdf5_serial_hl.so.100.0.0 /usr/lib/x86_64-linux-gnu/libhdf5_hl.so

9. 在 MakeFile.config,将 92 和 93 行修改为以下代码:

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/

10. 导航到 $CAFFE_ROOT 文件夹,然后 make:

$ cd $CAFFE_ROOT
$ make all -j8
$ make test -j8
$ make runtest -j8

每个 make 命令可能需要几分钟完成。

11. 打开 /opt/movidius/caffe/src/caffe/util/math_functions.cpp

$ sudo gedit $CAFFE_ROOT/src/caffe/util/math_functions.cpp

12. 将 247 行的 caffe_rng_uniform() 函数更换为:

void caffe_rng_uniform(const int n, Dtype a, Dtype b, Dtype* r) {
CHECK_GE(n, 0);
CHECK(r);
if(a > b) {
Dtype c = a;
a = b;
b = c;
}
CHECK_LE(a, b);
boost::uniform_real random_distribution(a, caffe_nextafter(b));
boost::variate_generator >
variate_generator(caffe_rng(), random_distribution);
for (int i = 0; i < n; ++i) {
r[i] = variate_generator();
}
}

参考:https://github.com/weiliu89/caffe/issues/669

13. 运行下方命令:

$ make pycaffe

14. 如果要确认安装,请将 caffe 导入 python3.6:

$ python3.6
>>> import caffe

训练和测试

正确设置了 ssd-caffe 后,您可以训练数据,使之生成必需的 .caffemodel 和 .prototxt 文件,以便为 Firefly-DL 创建一个兼容网络推断文件。

准备数据

1. 按照 https://github.com/weiliu89/caffe/tree/ssd 的“准备 - 第 2 步和第 3 步”操作,在下面位置生成 LMDB 文件:

$HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb(大小:约 1.8GB)
$HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb(大小:约 446MB)

2 由于我们使用的是 python3,在 /opt/movidius/caffe/data/VOC0712/create_data.sh:

  • 在 24 行上,将 “python” 更改为 “python3”

3. 如果您收到“python3 无法打开 create_annoset.py 文件,无此类文件或目录”的错误:

a. 对 create_data.sh 进行以下更改:

  • 将 1 行更改为:
cur_dir=$(pwd)
  • 将 2 行更改为:
root_dir=$cur_dir

b. 再次运行 $CAFFE_ROOT 目录的脚本。

labelmap_voc.prototxt 文件生成于 “/opt/movidius/caffe/data/VOC0712”。 labelmap_voc.prototxt 文件列出了待检测的对象,可以用于创建待上传到 FFY_DL 摄像头的标签文件。

本示例中的 voc0712_detection_labels.txt 文件下载自:https://flir.box.com/s/szr8p4n9f5ucoydb3l0jz28mp2pqcdd6

训练脚本及其他文件的准备

1. 下载训练脚本(对于 MobileNet-SSD 模型):

$ cd $CAFFE_ROOT/examples
$ git clone https://github.com/chuanqi305/MobileNet-SSD

使用来自原始 MobileNet-SSD repo 的重新训练和测试代码,在 '/opt/movidius/caffe/examples' 中创建了一个 'MobileNet-SSD' 文件夹。

2 生成您自己的训练(训练/测试/部署)prototxt 文件:

$ cd MobileNet-SSD
$ ./gen_model.sh CLASSNUM

CLASSNUM 是数据集中的类别数量。 labelmap_voc.prototxt 文件也反映该数。 本例的 VOC0712 数据集中,CLASSNUM = 21。

生成了三个文件:

  • MobileNetSSD_train.prototxt
  • MobileNetSSD_test.prototxt
  • MobileNetSSD_deploy.prototxt

它们保存在 "/opt/movidius/caffe/examples/MobileNet-SSD/example/" 目录中。

3. 创建与 lmdb 数据的符号链接:

$ cd $CAFFE_ROOT/examples/MobileNet-SSD
$ ln -s PATH_TO_YOUR_TRAIN_LMDB trainval_lmdb
$ ln -s PATH_TO_YOUR_TEST_LMDB test_lmdb

本示例中:

PATH_TO_YOUR_TRAIN_LMDB 是: $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb

PATH_TO_YOUR_TEST_LMDB 是: $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb

在 “/opt/movidius/caffe/examples/MobileNet-SSD" 目录下,有两个名称为 “trainval_lmdb” 和 “test_lmdb” 的符号链接文件夹,分别指向您的训练数据文件夹和测试数据文件夹。

训练

注意:您也可以使用 vim 或文本编辑器进行编辑。

1. 修改仅 CPU 训练的脚本:

$ sudo gedit solver_train.prototxt

a. 将 13 行更改为:

solver_mode: CPU

b. 保存。

2 编辑 train.sh:

$ sudo gedit train.sh

a. 向最后一行添加注释

#-gpu 0

b. 保存。

3. 运行 train.sh 训练自己的模型:

$ ./train.sh

训练可能要很长时间,不过您可以按下 “Ctrl+C” 暂停训练。

生成了两个输出文件:

  • mobilenet_iter_*.caffemodel
  • mobilenet_iter_*.solverstate

他们保存在 "/opt/movidius/caffe/examples/MobileNet-SSD/snapshot" 目录。

您重复的迭代越多,精确性就越高。 我们测试了 mobilenet_iter_1000(1000 此迭代),结果很好。

转换需要 mobilenet_iter_*.caffemodel 和 MobileNetSSD_deploy.prototxt 文件。 它们位于 "/opt/movidius/caffe/examples/MobileNet-SSD/example/" 目录。转换时,请遵循《Linux 中的 Firefly-DL 入门》的示例 2 操作步骤。

测试(可选)

1. 修改仅 CPU 测试的脚步:

$ sudo gedit solver_test.prototxt

a. 将行 1 更改为:

train_net: "example/MobileNetSSD_train.prototxt"

b. 将行 2 更改为:

test_net: "example/MobileNetSSD_test.prototxt"

c. 将 line 13 更改为:

solver_mode: CPU

d. 保存。

2 编辑 train.sh:

$ sudo gedit train.sh

a. 注释最后一行

#-gpu 0

b. 保存。

3. 运行 test.sh 测试自己的模型,也可能会很久:

$ ./test.sh