4. 使用Docker镜像快速开始工作

Note

请在Docker中完成以下操作。

在上一章内容中,您已经搭建好了算法工具包和编译器工具包环境。

本章内容介绍如何在Docker镜像中开发二阶段对象检测和分类应用。

首先,需要分别定义检测和分类的网络和训练模型。

检测部分需要使用 YOLO with MobileNet v1 作为 backbone 网络。

分类部分,使用 MobileNet v2。

关于检测和分类训练说明,参见 Horizon Plugin Tensorflow 用户指南

4.1. Tensorflow 模型训练

4.1.1. 准备训练环境

请按照以下步骤完成本节任务。

  1. 运行以下命令从获取的软件包中解压 Tensorflow 算法包(例如,~/tf_toolkit-v0.8.2.tgz)。

    Tensorflow 算法包括 tensorflow 包。算法包的具体名称,参见 3.1 技术准备

    tar -xvf tf_toolkit-v0.8.2.tgz
    
  2. 运行 pip install 命令安装依赖中的 whl 文件(例如,horizon_plugin_tensorflow-0.8.2-py2.py3-none-manylinux1_x86_64.whl)用于环境测试。

    sh packages/install.sh [--user]
    
  3. 安装完成后进行环境测试:

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'
>>>
  1. 准备数据集。

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

  1. 根据以下结构修改配置中的数据集路径。

../_images/tensorflow_model_training_1.png
  1. 根据以下结构修改配置中的显卡和 batch_size

    ../_images/tensorflow_model_training_2.png
  2. 运行以下命令开始模型训练。

    sh pipeline.sh
    

    训练完成后,得到以下系统输出:

    ../_images/tensorflow_model_training_3.png

完成所有任务后,模型训练已经完成。

4.2. 模型编译

参考以下脚本编译所选模型。编译示例脚本如下。

4.2.1. 准备编译环境

  1. 如果使用 pip install 命令进行环境安装,则可以完成 hbdk 安装。

  2. 如果想要测试 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

    1. 安装串口驱动。

      使用交付物中的 CP2103_Serial_Drivers.zip (支持 Win 10)进行驱动安装。

    2. 连接串口。连接示例如下:

      ../_images/com_connect.png
    3. 使用工具(例如,Xshell)连接串口,登录开发板。

      串口配置如下:

      ../_images/com_conf.png

      连接成功效果如下图:

      root@X2-DEV:/userdata/ruxin.song/hbdk3/app# cat /etc/issue
      Horizon Robotic System Ver:x2j2_lnx_db_20191226 debug  \n \l
      
    4. 如果需要修改 IP,请执行以下命令:

      hrut_ipfull s ip mask gateway
      
    5. 修改完成后,reboot 重启开发板。

    6. 重启完成后,通过 ifconfig 验证修改是否生效。

  • 通过串口+网口刷 image

    操作流程参见 (可选)准备嵌入式开发环境

  • SSH 登录验证

    使用 SSH IP 登录开发板,验证配置是否生效。

    Note

    默认使用 root 账号,没有密码。

关于开发板配置详情,参见《MU-2020-2-C-X2J2平台系统软件用户手册》。

4.3.2. (可选)准备嵌入式开发环境

如果您使用的是默认配置,此步骤为可选操作。如果您不使用默认配置,则按照以下步骤准备嵌入式开发环境。

  1. 下载嵌入式开发应用包。

  2. 解压 hbupdate-win64-v0.6.1.zip 文件,找到启动程序 hbupdate.exe

  3. 双击 hbupdate.exe

  4. 配置升级工具参数。

    地平线升级工具配置说明,参见《地平线产品升级工具使用手册》。

  5. 分别解压应用包 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。

  1. 编译嵌入式应用。

    • 配置环境

      使用前,请使用交付物中的 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 文件。

启动模型后,可以通过客户端进行效果查看。

../_images/example_camera.png

4.4. 验证

源码示例基于 Hobot 框架。更多信息,参见 11.1 Hobot Framework SDK

4.4.1. 模块信息流

下图展示了模块间的信息流:

../_images/module_flow.png
  • Camera Input:从摄像头中读取帧。

  • FakeCamera Input:从网络中读取帧。

  • Static Input:从本地文件读取帧。

  • YOLO Det:运行 YOLO 网络。

  • Post process:提取 BPU 输出,生成框。

  • ResizerCNN:使用框缩放具体事例,用于 mobileNetV2 分类模型。

  • Output:通过网络发送结果。详情参见 12.1 应用输出协议

4.4.2. 示例代码验证

我们提供几种工具用于验证摄像头模式,回灌模式和静态图模式中的应用结果。请按照以下方式配置客户端。

  1. 解压 client.zip

  2. 双击 Horizon Robotics 图标,打开客户端。

    Note

    • 对于 Windows 系统,客户端应该在 Windows 10(64bit)中打开。

    • 对于 Linux 系统,客户端应该在 Ubuntu14.04 中打开。

  3. Horizon OpenExplorer 2019 Client 中,单击 Record 图标。

    ../_images/client_start_page.png
  4. Setup 页面,单击 Record Settings

    ../_images/client_start_page_2.png
    • Adas Devices 中,配置 IPRecordType

    • Record Options 中,单击 Save Dir 之后的 选择存储路径。

    结果显示如下:

    ../_images/client_start_page_3.png

客户端配置完成后,可以进行三种模式的输入操作。

  • 摄像头模式

    • 如果使用摄像头模式进行测试,无需其他操作。

    • 如果使用回灌模式,请按照以下步骤操作。

  • 回灌模式:回灌模式主要用于验证。

    PC 回灌工具:pc-sender.zip。img.lst 文件用于列出图片文件清单。

    Note

    • 时间间隔为2000ms。建议设置的值不要过小。

    • img.lst 文件后缀名必须为 .lst。

    ../_images/lst.png

    回灌模式中,图片将以此顺序发送到 X2/J2 开发板。收到图片数据后 X2/J2 开发板将获取结果并最终将图片通过以太网发送到 PC 端显示。

  1. 从交付包中提取 pc-sender.zip

  2. 在 run.bat 中修改 img.lst 路径。

  3. 双击 run.bat

  4. 检查客户端中结果。

../_images/demo_fillback.png
  • 静态图模式

    ../_images/demo_static.png