所有文档

          EasyDL定制AI训练平台

          专业版视觉任务EdgeBoard(FZ)专用SDK集成文档

          简介

          本文档介绍 EasyEdge/EasyDL在EdgeBoard®边缘计算盒/Lite计算卡上的专用软件的使用流程。

          EdgeBoard系列硬件可直接应用于AI项目研发与部署,具有高性能、易携带、通用性强、开发简单等四大优点。

          详细硬件参数请在AI市场浏览。

          EdgeBoard产品使用手册:https://ai.baidu.com/ai-doc/HWCE/Yk3b86gvp

          内核版本

          SDK版本 对应内核
          0.5.2+ 1.4
          0.5.7+ 1.5

          SDK升级需配合EdgeBoard硬件内核升级,建议升级内核为SDK对应版本,否则可能出现结果错误或者其他异常。

          内核下载地址:https://ai.baidu.com/ai-doc/HWCE/Yk3b95s8o

          获取序列号

          在EasyEdge/EasyDL生成SDK后,点击获取序列号进入控制台获取。EasyEdge控制台、EasyDL控制台

          如果是在AI市场购买的EdgeBoard-FZ软硬一体方案,也可以在AI市场订单详情获取序列号。

          更换序列号、更换设备时,首次使用需要联网激活。激活成功之后,有效期内可离线使用。

          Release Notes

          时间 版本 说明
          2020.10.29 0.5.7 预测引擎切换为PaddleLite
          2020.06.23 0.5.4 支持EasyDL专业版新模型
          2020.04.23 0.5.2 引擎升级,支持zu9/zu5/zu3
          2019.12.27 0.4.5 引擎升级,支持zu5/zu3,支持EasyDL 高精度检测模型
          2019.07.25 0.4.0 EdgeBoard SDK Release!

          快速开始

          开发者从EasyEdge/EasyDL下载的软件部署包中,包含了简单易用的SDK和Demo。只需简单的几个步骤,即可快速部署运行EdgeBoard计算盒。

          部署包文件结构

          baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.4.0_gcc6.2_20190717/
          ├── demo
          │   ├── CMakeLists.txt
          │   ├── demo.cpp
          │   └── easyedge_serving
          ├── include
          │   ├── easyedge
          │   │   └── easyedge.h
          └── lib
              ├── libeasyedge.so -> libeasyedge.so.0.4.0
              ├── libeasyedge.so.0.4.0
              ├── libeasyedge_static.a
              ├── libpaddle-mobile.so
              └── libverify.a

          Demo使用流程

          用户在AI市场购买计算盒之后,请参考以下步骤进行集成和试用。

          1. 将计算盒连接电源

          指示灯亮起,等待约1分钟。

          • 参考EdgeBoard使用文档配置网口或串口连接。登录EdgeBoard计算盒。
          • 加载驱动(开机加载一次即可)。
          insmod /home/root/workspace/driver/{zu9|zu5|zu3}/fpgadrv.ko

          根据购买的版本,选择合适的驱动。若未加载驱动,可能报错:

          Failed to to fpga device: -1
          • 设置系统时间(系统时间必须正确)
          date --set "2019-5-18 20:48:00"

          2. (可选)启动HTTP服务

          部署包中附带了HTTP服务功能,开发者可以进入SDK根目录,运行easyedge_serving程序启动HTTP服务。

          # ./easyedge_serving {RES目录} {序列号} {绑定的host,默认0.0.0.0} {绑定的端口,默认24401}
          cd ${SDK_ROOT}
          export LD_LIBRARY_PATH=./lib
          ./demo/easyedge_serving ../../../RES  "1111-1111-1111-1111"

          日志显示

          2019-07-18 13:27:05,941 INFO [EasyEdge] [http_server.cpp:136] 547974369280 Serving at 0.0.0.0:24401

          则启动成功。此时可直接在浏览器中输入http://{EdgeBoard计算盒ip地址}:24401/,在h5中测试模型效果。

          同时,可以调用HTTP接口来访问盒子。具体参考下文接口说明。

          EdgeBoard HTTP Server 目前使用的是单线程处理请求。

          3. 使用序列号激活

          修改demo/demo.cpp,将前面申请的序列号填入:

          global_controller()->set_licence_key

          4. 编译运行Demo

          编译:

          cd demo
          mkdir build && cd build
          cmake .. && make

          运行

          ./easyedge_demo  {RES资源文件夹路径}  {测试图片路径}

          便可看到识别结果。

          使用说明

          使用流程

          首次使用需要联网激活。激活成功之后,有效期内可离线使用。

          1. 设置序列号global_controller()->set_licence_key
          2. 配置PaddleFluidConfig
          3. 新建Predictor :global_controller()->CreateEdgePredictor(config);
          4. 初始化 predictor->init()
          5. 传入图片开始识别predictor->infer(img, ...);

          目前EdgeBoard暂不支持并行多模型计算。

          接口说明

          预测图片

              /**
               * @brief 同步预测接口
               * inference synchronous
               * Supported by most chip and engine
               * @param image: must be BGR , HWC format (opencv default)
               * @param result
               * @param threshold
               * @return
               */
              virtual int infer(
                      cv::Mat &image, std::vector<EdgeResultData> &result, float threshold = 0.1
              ) = 0;

          识别结果说明

          EdgeResultData中可以获取对应的分类信息、位置信息。

          struct EdgeResultData {
              int index;  // 分类结果的index
              std::string label;  // 分类结果的label
              float prob;  // 置信度
          
              // object detection field
              float x1, y1, x2, y2;  // (x1, y1): 左上角, (x2, y2): 右下角; 均为0~1的长宽比例值。
          };

          关于矩形坐标

          x1 * 图片宽度 = 检测框的左上角的横坐标

          y1 * 图片高度 = 检测框的左上角的纵坐标

          x2 * 图片宽度 = 检测框的右下角的横坐标

          y2 * 图片高度 = 检测框的右下角的纵坐标

          可以参考demo文件中使用opencv绘制矩形的逻辑。

          HTTP 私有服务请求说明

          http 请求参数

          URL中的get参数:

          参数 说明 默认值
          threshold 阈值过滤, 0~1 0.1

          HTTP POST Body即为图片的二进制内容(无需base64, 无需json)

          Python请求示例

          import requests
          
          with open('./1.jpg', 'rb') as f:
              img = f.read()
              result = requests.post(
          	    'http://127.0.0.1:24401/',
          	    params={'threshold': 0.1},
          	    data=img).json()

          Java请求示例

          http 返回数据

          字段 类型说明 其他
          error_code Number 0为成功,非0参考message获得具体错误信息
          results Array 内容为具体的识别结果。其中字段的具体含义请参考预测图像-返回格式一节
          cost_ms Number 预测耗时ms,不含网络交互时间

          返回示例

          {
              "cost_ms": 52,
              "error_code": 0,
              "results": [
                  {
                      "confidence": 0.94482421875,
                      "index": 1,
                      "label": "IronMan",
                      "x1": 0.059185408055782318,
                      "x2": 0.18795496225357056,
                      "y1": 0.14762254059314728,
                      "y2": 0.52510076761245728
                  },
                  {
                      "confidence": 0.94091796875,
                      "index": 1,
                      "label": "IronMan",
                      "x1": 0.79151463508605957,
                      "x2": 0.92310667037963867,
                      "y1": 0.045728668570518494,
                      "y2": 0.42920106649398804
                  }
                ]
          }

          错误说明

          SDK所有主动报出的错误,均覆盖在EdgeStatus枚举中。同时SDK会有详细的错误日志,开发者可以打开Debug日志查看额外说明:

          EdgeLogConfig log_config;
          log_config.enable_debug = true;
          global_controller()->set_log_config(log_config);

          FAQ

          1. 如何处理一些 undefined reference?

          如:undefined reference to `curl_easy_setopt@CURL_OPENSSL_3'

          可以通过安装libcurl3 libcurl-openssl1.0-dev来解决。 如果开发者想不想使用低版本的openssl(如Ubuntu 18.04), 可以link静态库easyedge_static.a,自己指定需要的Library的版本。

          示例:修改CMakeList.txt

          find_package(CURL REQUIRED)
          target_link_libraries(easyedge_demo  ${OpenCV_LIBS} easyedge_static pthread ${CURL_LIBRARIES} paddle-mobile)

          2. error while loading shared libraries: libeasyedge.so.0.4.0: cannot open shared object file: No such file or directory

          类似错误包括libpaddle-mobile.so找不到。

          直接运行SDK自带的二进制可能会有这个问题,设置LD_LIBRARY_PATH为SDK部署包中的lib目录即可。 开发者自行使用CMake编译的二进制可以有效管理.so的依赖。

          2. curl_easy_perform failed: Couldn't resolve host name

          首次使用需要联网激活。 激活后,未联网状态可能会有类似日志,可以忽略。

          3. 使用libcurl请求http服务时,速度明显变慢

          这是因为libcurl请求continue导致server等待数据的问题,添加空的header即可

          headers = curl_slist_append(headers, "Expect:");

          4. 预测过程中报内存不足“Killed”

          此问题仅出现在ZU5,因为FZ5A带vcu,给他预留的内存过大导致,如果用不到VCU可以把这部分改小。修改/run/media/mmcblk1p1/uEnv.txt:

          ethaddr=00:0a:35:00:00:09
          uenvcmd=fatload mmc 1 0x3000000 image.ub && bootm 0x3000000
          
          bootargs=earlycon console=ttyPS0,115200 clk_ignore_unused cpuidle.off=1 root=/dev/mmcblk1p2 rw rootwait cma=128M

          注意中间空行要保留。

          5. 预测结果异常

          如果购买的计算盒较早,驱动文件较旧,先更新驱动,否则可能导致结果异常。参考“内核版本”小节。

          6. 编译过程报错file format not recognized

          libeasyedge.so: file format not recognized; treating as linker script

          下载的SDK zip包需要放到板子内部后,再解压、编译。

          7. 提示 driver_version(1.4.0) not match paddle_lite_version(1.5.1)

          需更新驱动,否则可能导致结果异常。参考“内核版本”小节。

          上一篇
          如何获取软硬一体产品
          下一篇
          EdgeBoard(VMX)专用SDK集成文档