4. 使用Docker镜像快速开始工作¶
Note
请在Docker中完成以下操作。
在上一章内容中,您已经搭建好了算法工具包和编译器工具包环境。
本章内容介绍如何在Docker镜像中开发二阶段对象检测和分类应用。
首先,需要分别定义检测和分类的网络和训练模型。
检测部分需要使用 YOLO with MobileNet v1 作为 backbone 网络。
分类部分,使用 MobileNet v2。
关于检测和分类训练说明,参见 Horizon Plugin Tensorflow 用户指南。
4.1. Tensorflow 模型训练¶
4.1.1. 准备训练环境¶
请按照以下步骤完成本节任务。
运行以下命令从获取的软件包中解压 Tensorflow 算法包(例如,~/tf_toolkit-v0.8.2.tgz)。
Tensorflow 算法包括 tensorflow 包。算法包的具体名称,参见 3.1 技术准备。
tar -xvf tf_toolkit-v0.8.2.tgz
运行 pip install 命令安装依赖中的 whl 文件(例如,horizon_plugin_tensorflow-0.8.2-py2.py3-none-manylinux1_x86_64.whl)用于环境测试。
sh packages/install.sh [--user]
安装完成后进行环境测试:
root@e678f1f794c7:/# python3 Python 3.6.8 (default, Jan 14 2019, 11:02:34) [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import horizon_plugin_tensorflow 2019-07-13 11:39:21.443277: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcudart.so.10.0 >>> horizon_plugin_tensorflow.__version__ '0.8.2' >>> import tensorflow >>> tensorflow.__version__ '1.14.0' >>> import hbdk >>> hbdk.__version__ '3.6.4' >>>
准备数据集。
4.1.2. Tensorflow 算法包结构¶
TensorFlow 算法文件夹的简单目录结构如下图,其中主要包含文档、安装包、pretrain 模型和示例脚本几个部分:
horizon_plugin_tensorflow/ . ├── docs │ ├── api │ ├── build │ ├── _downloads │ ├── faq │ ├── genindex.html │ ├── _images │ ├── index.html │ ├── model_zoo │ ├── _modules │ ├── objects.inv │ ├── py-modindex.html │ ├── search.html │ ├── searchindex.js │ ├── _sources │ └── _static ├── packages │ ├── bpu_sim-3.2.5-py2.py3-none-any.whl │ ├── horizon_plugin_tensorflow-0.8.2-py2.py3-none-manylinux1_x86_64.whl │ ├── horizon_plugin_tensorflow_gpu-0.8.2-py2.py3-none-manylinux1_x86_64.whl │ ├── install.sh │ └── widerface_evaluation-0.0.2.tar.gz ├── pretrain-models │ ├── darknet53 │ ├── mobilenetv1_0.25 │ ├── mobilenetv1_0.5 │ ├── mobilenetv1_0.75 │ ├── mobilenetv1_1.0 │ ├── mobilenetv2_0.25 │ ├── mobilenetv2_1.0 │ ├── resnet18 │ ├── resnet50 │ ├── varg_darknet53 │ ├── varg_darknet53_small │ ├── vargnetv2_g4_1.0 │ └── vargnetv2_g8_1.0 └── scripts ├── beginner_guide ├── classification ├── dataset ├── detection ├── det_patch_cls ├── instance └── segmentation
在算法包中,
/docs/ 目录下的 index.html 文件提供了 Tensorflow 用户指南。
/packages/ 目录下的 install.sh 文件是步骤 2 中执行的脚本文件。
执行 install.sh 之后,就已经完成对 package 文件中所有依赖包的安装。
/pretrain-models/ 目录包含 pretrained backbone 模型。
/scripts/ 目录的子文件夹包含各种模型的示例代码。
4.1.3. 开始训练¶
本节以 mobilenetv1 为例介绍模型训练。相关代码示例存放在 /scripts/classification/ 中。请按照以下步骤完成本节任务。
Note
由于 BPU 的输入格式为 YUV444,需要将 RGB 格式的数据转换成 YUV 格式。
详情参见 Horizon Plugin Tensorflow用户手册>Beginner Guide> Train the Network Step by Step。
根据以下结构修改配置中的数据集路径。
完成所有任务后,模型训练已经完成。
4.2. 模型编译¶
参考以下脚本编译所选模型。编译示例脚本如下。
4.2.1. 准备编译环境¶
如果使用 pip install 命令进行环境安装,则可以完成 hbdk 安装。
如果想要测试 hbdk 相关的功能,可使用如下命令进行安装:
pip3 install [--no-deps] [--user] hbdk-3.6.4-py2.py3-none-linux_x86_64.whl -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
4.2.2. 编译模型¶
运行以下命令编译检测模型:
hbdk-cc --march bernoulli -m yolo.pb -f tf -s 1x704x1280x3 -o yolo.hbm -i pyramid -g --O3
运行以下命令编译 mobilenetv2 模型:
hbdk-cc --march bernoulli -m mobilenetv2.pb -f tf -s 1x128x128x3 -o mobileNetV2.hbm -i resizer -g --O3
运行以下命令链接模型:
hbdk-pack yolo.hbm mobileNetV2.hbm -o yolo_mobileNetV2.hbm
由某个模型或包生成的 .hbm 文件可以用于后续模型链接或部署。
4.3. 嵌入式开发¶
4.3.1. 配置开发板¶
通过串口修改 IP
安装串口驱动。
使用交付物中的 CP2103_Serial_Drivers.zip (支持 Win 10)进行驱动安装。
连接串口。连接示例如下:
使用工具(例如,Xshell)连接串口,登录开发板。
串口配置如下:
连接成功效果如下图:
root@X2-DEV:/userdata/ruxin.song/hbdk3/app# cat /etc/issue Horizon Robotic System Ver:x2j2_lnx_db_20191226 debug \n \l
如果需要修改 IP,请执行以下命令:
hrut_ipfull s ip mask gateway
修改完成后,reboot 重启开发板。
重启完成后,通过 ifconfig 验证修改是否生效。
通过串口+网口刷 image
操作流程参见 (可选)准备嵌入式开发环境。
SSH 登录验证
使用 SSH IP 登录开发板,验证配置是否生效。
Note
默认使用 root 账号,没有密码。
关于开发板配置详情,参见《MU-2020-2-C-X2J2平台系统软件用户手册》。
4.3.2. (可选)准备嵌入式开发环境¶
如果您使用的是默认配置,此步骤为可选操作。如果您不使用默认配置,则按照以下步骤准备嵌入式开发环境。
下载嵌入式开发应用包。
解压 hbupdate-win64-v0.6.1.zip 文件,找到启动程序 hbupdate.exe。
双击 hbupdate.exe。
配置升级工具参数。
地平线升级工具配置说明,参见《地平线产品升级工具使用手册》。
分别解压应用包 embedded_release_sdk-v3.3.0.3.tar.gz`和`embedded_contrib_sdk-v3.3.0.3.tar.gz。
tar -xvf embedded_release_sdk-v3.3.0.3.tar.gz tar -xvf embedded_contrib_sdk-v3.3.0.3.tar.gz
应用包目录结构如下:
embedded-release-sdk.tar.gz . ├── embedded_model_zoo │ ├── fasterrcnn │ ├── fasterrcnn_mobilenetv2 │ ├── maskrcnn │ ├── mobileNetV1 │ ├── mobileNetV2 │ ├── parsing │ ├── resNet18 │ ├── resNet50 │ ├── s3fd │ ├── shuffleNetV2 │ ├── ssd │ ├── ssd_mobilenetv2 │ ├── vargNetV2 │ ├── yolo │ ├── yolo_origin │ └── yolo_parsing ├── example_code │ ├── analysis │ ├── app_code │ ├── common │ ├── demo_code │ ├── functional_example │ ├── runtime_example │ ├── time_consuming_test │ └── x86_code └── example_prebuilt ├── analysis ├── app ├── demo ├── functional_example ├── time_consuming_test └── x86 embedded-contrib-sdk.tar.gz . ├── embedded_contrib_model_zoo ├── example_code └── example_prebuilt
app 包含基于 hobotsdk 的预置应用,以共时方式运行。包括以下运行模式供参考:
摄像头模式:使用 720p/1080p 摄像头作为输入。经 X2/J2 处理后,通过以太网发出。
回灌模式:使用 720p/1080p 图像经以太网传入(算法包中我们提供了回灌工具 pc-sender)。经 X2/J2 处理然后通过以太网发出。有些输入会发送至 std-out。
静态模式:使用 720p/1080p jpeg image 作为输入,在 X2/J2 处理,结果输出到 std-out 或发回客户端。
demo 包含基于 c++ stl 的 demo 应用,为单线程。该 demo 应用帮助理解 bpu_predict 接口。
eval 使用网络发送图像,对精度进行验证的应用。
perf 包含一些应用。这些应用基于 hobotsdk,因此共时运行。能在性能报告上产生结果。
xxx_code 包含示例对应的源码。
runtime_example 包含基于 hbrt api 和 platform api 开发的示例。详情参见 API 参考。
lidar3D:雷达 3D 点云示例。
pyramid:pyramid 耗时测试示例。关于如何进行 Pyramid 模块耗时测试,参见 9.6 如何进行金字塔模块耗时测试?
resizer:roi resizer 耗时测试示例。关于如何进行 ROIresizer 模块耗时测试,参见 9.7 如何进行 ROIresizer 模块耗时测试?
roi_detection_test:roi detection 测试示例。
x86:功能与 app 相同,区别是在 CPU 上运行。
camera_input_demo:同步接口示例程序,支持720p的camera作为输入。
resize_input_demo:同步接口示例程序,其输入通过硬件对图片进行 resize。
static_input_demo:同步接口示例程序,支持多种颜色空间的图片作为输入。
pure_c_demo:同步接口示例程序,展示了bpu_predict可支持 C 语言编译。
功能描述
在 app 中:
- start_fasterrcnn.sh
支持摄像头模式、回灌模式和静态图模式的 fasterrcnn 检测。
- start_fasterrcnn_mobileNetV2.sh
支持摄像头模式,回灌模式和静态图模式的 fasterrcnn 检测 +mobileNetV2 分类。
- start_maskrcnn.sh
支持摄像头模式,回灌模式和静态图模式的 maskrcnn 检测。
- start_parsing.sh
支持摄像头模式,回灌模式和静态图模式的 parsing 分割。
- start_ssd.sh
支持摄像头模式,回灌模式和静态图模式的 ssd 检测。
- start_yolo.sh
支持支持摄像头模式,回灌模式和静态图模式的 yolo 检测。
- start_ssd_mobileNetV2.sh
支持摄像头模式,回灌模式和静态图模式的 ssd 检测 +mobileNetV2 分类。
Note
要改变 app 的运行模式,请在 start_xxx.sh 中编辑命令。
#!/bin/bash LIB_DIR='./lib' export LD_LIBRARY_PATH=${LIB_DIR}:${LD_LIBRARY_PATH} export BMEM_CACHEABLE=true echo 105000 >/sys/devices/virtual/thermal/thermal_zone0/trip_point_1_temp echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor # FasterRCNN detection #./app --camera-id=0 --run-type=camera --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_704x1280 --board-name=x2 --input-platform=tensorflow --score-thresh=0.7 #./app --camera-id=0 --run-type=camera --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_540x960 --image-size=1080P --pyramid-level=4 --board-name=x2 --input-platform=tensorflow --score-threshh =0.7 #./app --camera-id=0 --run-type=feedback --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_704x1280 --image-size=720P --input-platform=tensorflow --score-thresh=0.7 #./app --camera-id=0 --run-type=feedback --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_540x960 --image-size=1080P --pyramid-level=4 --input-platform=tensorflow --score-thresh=0.7 ./app --camera-id=0 --run-type=static --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_704x1280 --image-size=720P --test-image=test_720P.jpg --input-platform=tensorflow --score-thresh=0.7 #./app --camera-id=0 --run-type=static --task-type=main --main-type=detection --detection-model-name=fasterrcnn --model-file=./model_zoo/fasterrcnn.hbm_mobileNetV1_540x960 --image-size=1080P --test-image=test_1080P.jpg --pyramid-level=4 --input-platform=tensorflow --- score-thresh=0.7
在 demo 中:
- start_mobileNetV1.sh
静态图的 mobileNetV1 分类。
- start_mobileNetV2.sh
静态图的 mobileNetV2 分类。
- start_resNet18.sh
静态图的 resNet18 分类。
- start_resNet50.sh
静态图的 resNet50 分类。
Note
模型的 .sh 文件随发布而有变化。请在 hbm 所在的目录中替换模型或根据需要修改 .sh 文件。
app/config 目录下的摄像头应配置对应的板子名称。例如,x2 对应 x2dev,j2 对应 j2dev。
在 runtime_example 中:
为示例代码,便于开发者熟悉 hbdk 运行时 API。
Note
在使用示例前请将交付物中的 embedded_model_zoo 软链链接到示例目录 model_zoo 下。例如,ln -s ../embedded_model_zoo/ model_zoo,
当 hbm 大小超过 128M 时,可能因为 ddr 大小限制导致示例启动失败。请注意报错关键字:hbrtErrorCannotOpenFile。
编译嵌入式应用。
配置环境
使用前,请使用交付物中的 cmake 和交叉编译工具,将交叉编译工具 CC 和 CXX 及 cmake 配置到 PATH 中。
示例:
export CC=/root/env/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
export CXX=/root/env/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
export PATH=/root/cmake-3.7.2-Linux-x86_64/bin:$PATH
交叉编译可执行文件
命令行示例:
mkdir build; cd build; cmake ..; make
部署
将编译之后生成的 app 替换示例包中的 app 文件,使修改的代码生效。
Note
请根据开发环境修改文件路径。
使用 xxx_code 中的示例。
4.3.3. 启动嵌入式应用¶
请按照以下步骤进行某一个模型的嵌入式开发。以 YOLO 模型为例。
运行以下命令启动 .sh 文件用于 YOLO。
sh start_yolo.sh
#!/bin/bash
LIB_DIR='./lib'
export LD_LIBRARY_PATH=${LIB_DIR}:${LD_LIBRARY_PATH}
export BMEM_CACHEABLE=true
# YOLO detection
#./app --camera-id=0 --run-type=camera --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_704x1280 --board-name=x2
#./app --camera-id=0 --run-type=camera --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_540x960 --image-size=1080P --pyramid-level=4 --board-name=x2
#./app --camera-id=0 --run-type=feedback --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_704x1280 --image-size=720P
#./app --camera-id=0 --run-type=feedback --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_540x960 --image-size=1080P --pyramid-level=4
./app --camera-id=0 --run-type=static --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_704x1280 --image-size=720P --test-image=test_720P.jpg
#./app --camera-id=0 --run-type=static --task-type=main --main-type=detection --detection-model-name=yolo --model-file=./lib/yolo.hbm_mobileNetV1_540x960 --image-size=1080P --test-image=test_1080P.jpg --pyramid-level=4
Note
[camera | feedback | static] 是可选参数,分别对应摄像头模式,回灌模式和静态图模式。
默认使用摄像头模式。可以根据需要注释回灌模式和静态图模式的参数来修改某一模型的 .sh 文件。
启动模型后,可以通过客户端进行效果查看。
4.4. 验证¶
源码示例基于 Hobot 框架。更多信息,参见 11.1 Hobot Framework SDK。
4.4.1. 模块信息流¶
下图展示了模块间的信息流:

Camera Input:从摄像头中读取帧。
FakeCamera Input:从网络中读取帧。
Static Input:从本地文件读取帧。
YOLO Det:运行 YOLO 网络。
Post process:提取 BPU 输出,生成框。
ResizerCNN:使用框缩放具体事例,用于 mobileNetV2 分类模型。
Output:通过网络发送结果。详情参见 12.1 应用输出协议。
4.4.2. 示例代码验证¶
我们提供几种工具用于验证摄像头模式,回灌模式和静态图模式中的应用结果。请按照以下方式配置客户端。
解压 client.zip。
双击 Horizon Robotics 图标,打开客户端。
Note
对于 Windows 系统,客户端应该在 Windows 10(64bit)中打开。
对于 Linux 系统,客户端应该在 Ubuntu14.04 中打开。
在 Horizon OpenExplorer 2019 Client 中,单击 Record 图标。
在 Setup 页面,单击 Record Settings。
在 Adas Devices 中,配置 IP、Record 和 Type。
在 Record Options 中,单击 Save Dir 之后的 … 选择存储路径。
结果显示如下:
客户端配置完成后,可以进行三种模式的输入操作。
摄像头模式:
如果使用摄像头模式进行测试,无需其他操作。
如果使用回灌模式,请按照以下步骤操作。
回灌模式:回灌模式主要用于验证。
PC 回灌工具:pc-sender.zip。img.lst 文件用于列出图片文件清单。
Note
时间间隔为2000ms。建议设置的值不要过小。
img.lst 文件后缀名必须为 .lst。
回灌模式中,图片将以此顺序发送到 X2/J2 开发板。收到图片数据后 X2/J2 开发板将获取结果并最终将图片通过以太网发送到 PC 端显示。
从交付包中提取 pc-sender.zip。
在 run.bat 中修改 img.lst 路径。
双击 run.bat。
检查客户端中结果。