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

图像分割服务器端SDK集成文档-Linux-C++

简介

本文档介绍EasyEdge/EasyDL的Linux CPP SDK的使用方法。

  • 网络类型支持:图像分类,物体检测,图像分割,目标追踪
  • 硬件支持:

    • CPU 基础版: - intel x86_64 * - AMD x86_64 - 龙芯 loongarch64 - 飞腾 aarch64
    • CPU 加速版 - Intel Xeon with Intel®AVX2 and AVX512 - Intel Core Processors with AVX2 - Intel Atom Processors with SSE - AMD Core Processors with AVX2
    • NVIDIA GPU: x86_64 PC
    • 寒武纪 Cambricon MLU270
    • 比特大陆计算卡SC5+
    • 百度昆仑XPU K200

      • x86_64 - 飞腾 aarch64 - 百度昆仑XPU R200
      • x86_64 - 飞腾 aarch64
    • 华为Atlas 300
    • 海光DCU: x86_64 PC
    • 寒武纪 MLU370 on x86_64
  • 操作系统支持:Linux

根据开发者的选择,实际下载的版本可能是以下版本之一:

  • EasyDL图像

    • x86 CPU 基础版
    • x86 CPU 加速版
    • Nvidia GPU 基础版
    • Nvidia GPU 加速版
    • x86 mlu270基础版
    • x86 SC5+基础版
    • Phytium MLU270基础版
    • Phytium XPU基础版
    • Phytium Atlas300I基础版
    • Hygon DCU基础版

性能数据参考算法性能及适配硬件

*intel 官方合作,拥有更好的适配与性能表现。

Release Notes

时间 版本 说明
2023.08.31 1.8.3 Atlas系列Soc支持语义分割模型,Atlas Cann升级到6.0.1,昆仑XPU后端推理引擎升级
2023.06.29 1.8.2 模型压缩能力升级
2023.05.17 1.8.1 支持物体检测自定义四边形模型精度无损压缩发布x86 CPU版SDK
2023.03.16 1.8.0 支持图像分类精度提升包本地部署
2022.12.29 1.7.2 模型性能优化;推理库性能优化
2022.10.27 1.7.1 新增语义分割模型http请求示例;升级海光DCU SDK,需配套rocm4.3版本使用;Linux GPU基础版下线适用于CUDA10.0及以下版本的SDK;Linux GPU加速版升级推理引擎版本
2022.09.15 1.7.0 Linux GPU加速版升级预测引擎;Linux GPU加速版适用于CUDA9.0、CUDA10.0的SDK为deprecated,未来移除;新增实例分割高性能模型离线部署;性能优化
2022.07.28 1.6.0 Linux CPU普通版、Linux GPU普通/加速版、Jetson新增目标追踪模型接入实时流的demo
2022.05.27 1.5.1 CPU、GPU普通版新增支持BML Cloud小目标检测模型
2022.05.18 1.5.0 GPU加速版max_batch_size参数含义变更;修复GPU加速版并发预测时部分图片结果预测错误及耗时增加问题;CPU普通版预测引擎升级;新增版本号头文件;新增飞腾Atlas300I支持,并且在EasdDL新增多种加速版本;示例代码移除frame_buffer,新增更安全高效的safe_queue; 新增Tensor In/Out接口和Demo
2022.04.25 1.4.1 EasyDL, BML升级支持paddle2模型
2022.03.25 1.4.0 新增支持海光服务器搭配海光DCU加速卡;
2021.12.22 1.3.5 GPU加速版支持自定义模型文件缓存路径;新增支持飞腾MLU270服务器、飞腾XPU服务器
2021.10.20 1.3.4 CPU加速版推理引擎优化升级,新增支持飞腾CPU、龙芯CPU服务器、比特大陆计算卡SC5+ BM1684、寒武纪MLU270;大幅提升EasyDL GPU加速版有损压缩加速模型的推理速度
2021.08.19 1.3.2 CPU、GPU普通版及无损加速版新增支持EasyDL小目标检测,CPU普通版、GPU普通版支持检测模型的batch预测
2021.06.29 1.3.1 CPU普通版、GPU普通版支持分类模型的batch预测,CPU加速版支持分类、检测模型的batch预测;GPU加速版支持CUDA11.1;视频流解析支持调整分辨率;预测引擎升级
2021.05.13 1.3.0 新增视频流接入支持;模型发布新增多种加速方案选择;目标追踪支持x86平台的CPU、GPU加速版;展示已发布模型性能评估报告
2021.03.09 1.2.1 GPU新增目标追踪支持, http server服务支持图片通过base64格式调用,EasyDL高性能检测模型和均衡检测模型CPU加速版新增量化压缩模型
2021.01.27 1.1.0 EasyDL经典版分类高性能模型升级;部分SDK不再需要单独安装OpenCV
2020.12.18 1.0.0 1.0版本发布!安全加固升级、性能优化、引擎升级、接口优化等多项更新
2020.11.26 0.5.8 EasyDL经典版分类模型CPU加速版里新增量化压缩模型
2020.10.29 0.5.7 新增CPU加速版支持:EasyDL经典版高精度、超高精度物体检测模型和EasyDL经典版图像分割模型
2020.09.17 0.5.6 性能优化,支持更多模型
2020.08.11 0.5.5 提升预测速度;支持百度昆仑芯片
2020.05.15 0.5.3 优化性能,支持专业版更多模型
2020.04.16 0.5.2 支持CPU加速版;CPU基础版引擎升级;GPU加速版支持多卡多线程
2020.03.12 0.5.0 x86引擎升级;更新本地http服务接口;GPU加速版提速,支持批量图片推理
2020.01.16 0.4.7 ARM引擎升级;增加推荐阈值支持
2019.12.26 0.4.6 支持海思NNIE
2019.11.02 0.4.5 移除curl依赖;支持自动编译OpenCV;支持EasyDL 专业版 Yolov3; 支持EasyDL经典版高精度物体检测模型升级
2019.10.25 0.4.4 ARM引擎升级,性能提升30%; 支持EasyDL专业版模型
2019.09.23 0.4.3 增加海思NNIE加速芯片支持
2019.08.30 0.4.2 ARM引擎升级;支持分类高性能与高精度模型
2019.07.25 0.4.1 引擎升级,性能提升
2019.07.25 0.4.0 支持Xeye, 细节完善
2019.06.11 0.3.3 paddle引擎升级;性能提升
2019.05.16 0.3.2 新增NVIDIA GPU支持;新增armv7l支持
2019.04.25 0.3.1 优化硬件支持
2019.03.29 0.3.0 ARM64 支持;效果提升
2019.02.20 0.2.1 paddle引擎支持;效果提升
2018.11.30 0.1.0 第一版!

2022-5-18: 【接口变更】 PREDICTOR_KEY_GTURBO_MAX_BATCH_SIZE含义变更。 变更前:预测输入图片数不大于该值均可。 变更后:预测输入图片数需等于该值。SDK内部对该接口变更做了兼容处理,在输入图片数小于该值时依然可正常运行,但预测性能会和等于该值时一致。推荐根据实际输入图片数量需求修改该值,尽可能保持最小。

2020-12-18: 【接口升级】 参数配置接口从1.0.0版本开始已升级为新接口,以前的方式被置为deprecated,并将在未来的版本中移除。请尽快考虑升级为新的接口方式,具体使用方式可以参考下文介绍以及demo工程示例,谢谢。 【关于SDK包与RES模型文件夹配套使用的说明】 我们强烈建议用户使用部署tar包中配套的SDK和RES。 更新模型时,如果SDK版本号有更新,请务必同时更新SDK,旧版本的SDK可能无法正确适配新发布出来部署包中的RES模型。

快速开始

SDK在以下环境中测试通过

  • x86_64, Ubuntu 16.04, gcc 5.4
  • x86_64, Ubuntu 18.04, gcc 7.4
  • Tesla P4, Ubuntu 16.04, cuda 9.0, cudnn 7.5
  • x86_64, Ubuntu 16.04, gcc 5.4, XTCL r1.0
  • aarch64, Kylin V10, gcc 7.3
  • loongarch64, Kylin V10, gcc 8.3
  • Bitmain SC5+ BM1684, Ubuntu 18.04, gcc 5.4
  • x86_64 MLU270,Ubuntu 18.04, gcc 7.5
  • phytium MLU270,Kylin V10,gcc 7.3.0
  • phytium XPU,Kylin V10,gcc 7.3.0
  • hygon DCU, CentOS 7.8 gcc 7.3.0
  • XPU K200, x86_64, Ubuntu 18.04
  • XPU K200 aarch64, Ubuntu 18.04
  • XPU R200, x86_64, Ubuntu 18.04
  • XPU R200 aarch64, Ubuntu 18.04
  • MLU370, x86_64, Centos7.6.1810

依赖包括

  • cmake 3+
  • gcc 5.4 (需包含 GLIBCXX_3.4.22) ,gcc / glibc版本请以实际SDK ldd的结果为准
  • opencv3.4.11 (可选)
  • cuda && cudnn (使用NVIDIA-GPU时必须,SDK内提供多个Cuda版本推理套件,根据需要安装依赖的Cuda和Cudnn版本)
  • XTCL 1.0.0.187 (使用昆仑服务器时必须)
  • Rocm4.3, Miopen 2.14(使用海光DCU服务器时必须)

1. 安装依赖

以下步骤均可选,请开发者根据实际运行环境选择安装。

(可选) 安装cuda&cudnn

在NVIDIA GPU上运行必须(包括GPU基础版,GPU加速版)

对于GPU基础版,若开发者需求不同的依赖版本,请在PaddlePaddle官网 下载对应版本的libpaddle_fluid.so或参考其文档进行编译,覆盖lib文件夹下的相关库文件。

(可选) 安装TensorRT

在NVIDIA GPU上运行GPU加速版必须

下载包中提供了对应 cuda9.0、cuda10.0、cuda10.2、cuda11.0+四个版本的 SDK,cuda9.0 和 cuda10.0 的 SDK 默认依赖的 TensorRT 版本为 TensorRT7.0.0.11,cuda10.2 及以上的 SDK 默认依赖的 TensorRT 版本为 TensorRT8.4,请在这里下载对应 cuda 版本的 TensorRT,并把其中的lib文件拷贝到系统lib目录,或其他目录并设置环境变量。

(可选) 安装XTCL

使用昆仑服务器及对应SDK时必须 请安装与1.0.0.187版本兼容的XTCL。必要时,请将运行库路径添加到环境变量。

(可选) 安装Rocm、Miopen

使用海光DCU服务器对应SDK时必须

海光DCU SDK依赖Rocm 4.3和Miopen 2.14版本,推荐使用easyedge镜像(registry.baidubce.com/easyedge/hygon_dcu_infer:1.0.2.rocm4.3),SDK镜像内运行,镜像拉取方式(wget https://aipe-easyedge-public.bj.bcebos.com/dcu_docker_images/hygon_dcu_rocm4.3.tar.gz && docker load -i hygon_dcu_rocm4.3.tar.gz),关于海光DCU使用更多细节可参考paddle文档

2. 使用序列号激活

请在官网获取序列号

SDK内bin目录下提供预编译二进制文件,可直接运行(二进制运行详细说明参考下一小节),用于图片推理和模型http服务,在二进制参数的serial_num(或者serial_key)处填入序列号可自动完成联网激活(请确保硬件首次激活时能够连接公网,如果确实不具备联网条件,需要使用纯离线模式激活,请下载使用百度智能边缘控制台纳管SDK)

# SDK内提供的一些二进制文件,填入序列号运行可自动完成激活,以下二进制具体使用说明参考下一小节
./edgekit_serving --cfg=./edgekit_serving.yml
./easyedge_image_inference {model_dir} {image_name or image_directory} {serial_num}
./easyedge_serving {res_dir} {serial_key} {host} {port}

如果是基于源码集成,设置序列号方法如下

global_controller()->set_licence_key("")

默认情况下(联网激活或者离线激活的场景),按照上述说明正确设置序列号即可,如果是实例数鉴权模式(请在百度智能云控制台再次确认自己的序列号是实例数鉴权模式,仅实例数鉴权需要进行下面的变量或者源码设置) 实例数鉴权环境变量设置方法

export EDGE_CONTROLLER_KEY_AUTH_MODE=2
export EDGE_CONTROLLER_KEY_INSTANCE_UPDATE_INTERVAL=30

实例数鉴权源码设置方法

global_controller()->set_config(easyedge::params::CONTROLLER_KEY_AUTH_MODE, 2)
global_controller()->set_config(easyedge::params::CONTROLLER_KEY_INSTANCE_UPDATE_INTERVAL, 300)

3. 基于预编译二进制测试图片推理和http服务

测试图片推理

模型资源文件默认已经打包在开发者下载的SDK包中。

请先将tar包整体拷贝到具体运行的设备中,再解压缩编译; 在Intel CPU上运行CPU加速版,如果thirdparty里包含openvino文件夹的,必须在编译或运行demo程序前执行以下命令: source ${cpp_kit位置路径}/thirdparty/openvino/bin/setupvars.sh 或者执行 source ${cpp_kit位置路径}/thirdparty/openvino/setupvars.sh(openvino-2022.1+) 如果SDK内不包含setupvars.sh脚本,请忽略该提示

运行预编译图片推理二进制,依次填入模型文件路径(RES文件夹路径)、推理图片、序列号(序列号尽首次激活需要使用,激活后可不用填序列号也能运行二进制)

#./easyedge_image_inference {model_dir} {image_name or image_directory} {serial_num}
LD_LIBRARY_PATH=../lib ./easyedge_image_inference ../../../RES /xxx/cat.jpeg "1111-1111-1111-1111"

demo运行效果:

 > ./easyedge_image_inference ../../../../RES 2.jpeg
2019-02-13 16:46:12,659 INFO [EasyEdge] [easyedge.cpp:34] 140606189016192 Baidu EasyEdge Linux Development Kit 0.2.1(20190213)
2019-02-13 16:46:14,083 INFO [EasyEdge] [paddlev2_edge_predictor.cpp:60] 140606189016192 Allocate graph success.
2019-02-13 16:46:14,326 DEBUG [EasyEdge] [paddlev2_edge_predictor.cpp:143] 140606189016192 Inference costs 168 ms
1, 1:txt_frame, p:0.994905 loc: 0.168161, 0.153654, 0.920856, 0.779621
Done

启动http服务

bin目录下提供编译好的启动http服务二进制文件,可直接运行

# 推荐使用 edgekit_serving 启动模型服务
LD_LIBRARY_PATH=../lib ./edgekit_serving --cfg=./edgekit_serving.yml

# 也可以使用 easyedge_serving 启动模型服务
# ./easyedge_serving {res_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}
# LD_LIBRARY_PATH=../lib ./easyedge_serving ../../../RES "1111-1111-1111-1111" 0.0.0.0  24401

后,日志中会显示

HTTP(or Webservice) is now serving at 0.0.0.0:24401

字样,此时,开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试,网页右侧会展示模型推理结果

对于目标追踪的模型,请选择一段视频,并耐心等待结果

图片

同时,可以调用HTTP接口来访问服务。

请求http服务

以图像预测场景为例(非语义分割模型场景,语义分割请求方式参考后面小节详细文档),提供一张图片,请求模型服务的示例参考如下demo

python示例代码如下

import requests

with open('./1.jpg', 'rb') as f:
    img = f.read()

## params 为GET参数 data 为POST Body
result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
                                                  data=img).json()

C# 使用示例代码如下

FileStream fs = new FileStream("./img.jpg", FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] img = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
string url = "http://127.0.0.1:8402?threshold=0.1";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
Stream stream = request.GetRequestStream();
stream.Write(img, 0, img.Length);
stream.Close();

WebResponse response = request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
Console.WriteLine(sr.ReadToEnd());
sr.Close();
response.Close();

C++ 使用示例代码如下,需要安装curl