训练 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 |
- 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 \ |
4 安装必需的 Python 包:
$ pip3 install scikit-image protobuf |
5 复制 Makefile.config.example 文件:
$ cd $CAFFE_ROOT/ |
注意:您也可以使用 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 |
d. 保存退出。
7. 检查 hdf5 库和 hdf5_hl 库的名称。 它可能因 Ubuntu 版本不同而异。
$ cd /usr/lib/x86_64-linux-gnu/ |
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 |
9. 在 MakeFile.config,将 92 和 93 行修改为以下代码:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/ |
10. 导航到 $CAFFE_ROOT 文件夹,然后 make:
$ cd $CAFFE_ROOT |
每个 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) { |
参考:https://github.com/weiliu89/caffe/issues/669
13. 运行下方命令:
$ make pycaffe |
14. 如果要确认安装,请将 caffe 导入 python3.6:
$ python3.6 |
训练和测试
正确设置了 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) |
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 |
使用来自原始 MobileNet-SSD repo 的重新训练和测试代码,在 '/opt/movidius/caffe/examples' 中创建了一个 'MobileNet-SSD' 文件夹。
2 生成您自己的训练(训练/测试/部署)prototxt 文件:
$ cd MobileNet-SSD |
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 |
本示例中:
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 |