资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

6-进阶应用

  1. EasyDL-EdgeBoard软硬一体方案部署

    1.1 EasyDL模型训练

    1.2 EasyDL模型发布

    1.3 EasyDL模型SDK部署

    1.4 EasyDL模型SDK自动加载

  2. PaddlePaddle模型部署
  3. 第三方框架模型部署

EasyDL-EdgeBoard软硬一体方案部署

EasyDL面向企业开发者提供零门槛AI开发平台,一站式支持智能标注、模型训练、服务部署等全流程功能,内置丰富的预训练模型,支持公有云/私有化/设备端等灵活部署方式。EasyDL面向不同人群提供经典版、专业版、零售版三款产品,已在工业、零售、制造、医疗等领域落地。EasyDL和EdgeBoard合作推出软硬一体方案。将EdgeBoard与EasyDL图像分类/物体检测模型深度适配,可应用于工业分拣、视频监控等多种设备端离线计算场景,让离线AI落地更轻松。


EasyDL模型训练

EasyDL和EdgeBoard合作推出软硬一体方案,将EdgeBoard与EasyDL图像分类/物体检测模型深度适配,现支持:经典版图像分类、经典版物体检测和专业版视觉任务。


经典版图像分类

  1. 图像分类介绍
  2. 数据准备

    创建数据集

    上传数据并在线标注

    数据集管理API

  3. 创建模型
  4. 模型训练

    训练操作说明

    模型效果评估

    如何提升效果


经典版物体检测

  1. 物体检测介绍
  2. 数据准备

    创建数据集

    上传数据并在线标注

    智能标注

    多人标注

    数据集管理API

  3. 创建模型
  4. 模型训练

    训练操作说明

    模型效果评估

    如何提升效果


专业版视觉任务

  1. 专业版服务介绍
  2. 图像分类数据导入与标注

    导入已标注数据

    导入未标注数据

    数据标注说明

  3. 物体检测数据导入与标注

    导入已标注数据

    导入未标注数据

    数据标注说明

  4. 智能标注

    图像智能标注介绍说明

  5. 视觉-脚本调参

    视觉任务与预置算法简介

  6. 视觉模型训练

    视觉任务使用流程说明

    创建视觉任务

    配置视觉任务

    训练高级配置

    模型效果评估报告


EasyDL模型发布


获取SDK

如何获取软硬一体产品:经典版图像分类经典版物体检测专业版视觉任务

EasyDL SDK需要专用序列号激活才可使用,模型发布后,点击我的模型-服务详情,下载SDK,如果是购买的软硬一体套件,点击管理序列号,查看用于激活专用SDK的专用序列号,如果还没有专用序列号,需点击前往AI市场购买


获取专用序列号

经典版模型和专业版模型需要不同的序列号激活:

经典版专用序列号入口直达

专业版专用序列号入口直达

用户还可以通过AI市场订单详情查看对应版本的专项硬件适配服务,如下图所示:

img

如果连接中没有专用序列号,还请确认订单是否为EdgeBoard&EasyDL软硬一体方案,以及购买账户和模型训练账户是否是同一个。

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


EasyDL模型SDK部署

开发者从EasyDL训练模型之后,下载的SDK中,包含了简单易用的Demo和http服务接口。只需简单的几个步骤,即可快速部署运行EdgeBoard。

SDK文件结构如下:

EasyEdge-m1800-EdgeBoard/
├── cpp
|   └── baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.3.2_gcc6.2_20190518
|       ├── 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_full_api_shared.so
|           └── libverify.alib
├── RES
│   ├── conf.json
│   ├── label_list.txt
│   ├── model  
│   ├── params 
│   └── preprocess_args.json
|
└── tools

1、EdgeBoard环境搭建

  • 连接设备
  • 加载驱动,系统启动后加载一次即可(系统默认已自启动,此步骤可省略)

    insmod /home/root/workspace/driver/fpgadrv.ko

    若未加载驱动,可能报错:

    	Failed to to fpga device: -1
  • 设置系统时间(系统时间必须正确)

    date --set "2020-5-18 20:48:00"
  • 设置EdgeBoard能够联网,参照EdgeBoard连接外网方式

2、使用序列号License 激活SDK

将SDK放到EdgeBoard系统/home/root/workspace/目录下,使用unzip以及tar命令解压zip包和tar.gz文件,然后编辑demo.cpp文件

//打开demo目录
cd EasyEdge-m1800-EdgeBoard/cpp/baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.3.2_gcc6.2_20190518 /demo
//编辑demo.cpp文件
vim demo.cpp

将set_licence_key函数中的字符串参数"set your license here"替换为序列号License即可,如下图所示

Demo

3、编译运行demo

编译:

//进入cpp文件的demo文件夹
cd /home/root/workspace/EasyEdge-m1800-edgeboard/cpp/baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.3.2_gcc6.2_20190518/demo

// 如果没有build目录,创建一个
mkdir build
cd build

//调用cmake 创建 Makefile
cmake ..
// 编译工程
make

运行

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

便可看到识别结果。

例:在SDK中放入需要预测的图片,如将预测图片放入RES文件夹中,执行命令如下

//进入demo目录
cd /home/root/workspace/EasyEdge-m1800-edgeboard/cpp/baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.3.2_gcc6.2_20190518/demo

//执行示例
./easyedge_demo ../../../../RES/ ../../../../RES/1.jpg           

4、(可选)启动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中测试模型效果。

img

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

5、接口使用说明

使用流程:

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

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

接口说明:

预测图片

    /**
     * @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绘制矩形的逻辑。

6、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);

EasyDL模型SDK自动加载

如需开机自启 EasyDL SDK,可参考如何设置文件自启动中的『EasyDL sdk自动加载』部分。

PaddlePaddle模型部署

目前EdgeBoard仅支持PaddlePaddle训练的模型,用户可以使用PaddlePaddle开源深度学习框架训练自己的模型,也可以通过AI studio平台训练模型

PaddlePaddle模型部署流程参考视频入口

部署步骤:

1、将模型上传至系统自带的sample的不同示例工程中;

EdgeBoard支持图像分类和物体检测两类模型

1)如果是图像分类模型,模型需上传到/home/root/workspace/sample/classification/models目录,

2)如果是物体检测模型,模型需上传到/home/root/workspace/sample/detection/models目录。

2、模型结构和参数的名称与sample中的模型名称须对应

EdgeBoards示例工程中modes目录的模型文件名称为model和params,如果训练出的模型不一致,需改下模型名称,可以对模型直接重命名,或者在保存模型的API fluid.io.save_inference_model中指定model_filename和params_filename为model和params参考链接

sample程序同样支持非融合模型的加载,更改/sample/src/image_classify.cpp下面代码,增加

config.model_dir = model_dir;

同时将45、46行注释掉,见下图:

重新编译。

3、修改config文件

  • 指定model路径
  • 修改数据预处理后的尺寸大小
  • 指定预测图片路径
  • 修改mean和scale值,图像数据归一化方式有:

    举例:R为一张图片中一个像素点的R通道的值

    ①(R / 255 – mean) / std

    ②(R – mean’) * scale(EdgeBoard处理方式)

       mean’= mean * 255
    
       scale = 1 / ( 255 * std )

4、上传预测图片

上传预测图片到config文件指定预测图片路径中,可使用ftp或者samba工具进行文件上传操作

5、运行模型

参考sample运行模型方式,同样运行自己的模型


第三方框架模型部署

如果当前模型使用不同框架模型,例如caffe/tensorflow/pytorch/ONNX模型,需要将模型转换成paddlepaddle框架才能在EdgeBoard中正确运行。

X2Paddle工具支持将其他深度学习框架训练得到的模型,转换至PaddlePaddle模型。

X2Paddle工具使用入口