视觉任务LinuxSDK集成文档-C++

全功能AI开发平台 BML

  • 版本发布记录
  • 快速开始
    • 用BML实现表格预测
    • 用BML实现序列标注
    • 用BML实现文本实体抽取
    • 用BML实现图片分类
    • 用BML实现实例分割
    • 用BML评价短文本相似度
    • 用BML实现开源大模型的预训练(Post-pretrain)
    • 用BML实现文本分类
    • 用BML实现物体检测
  • 模型仓库
    • 从训练任务导入模型
    • 查看模型
    • 创建模型
    • 模型仓库简介
    • 从本地导入模型
    • 校验模型
    • 服务代码文件示例
      • Sklearn服务代码文件示例
      • XGBoost服务代码文件示例
  • 平台管理
    • 权限管理
    • 在BML平台使用并行文件系统PFS和对象存储BOS
    • 在BML平台使用容器镜像服务CCR
    • 在BML使用外部镜像
    • 项目空间管理
    • 镜像管理
      • 镜像使用
      • 镜像管理简介
      • 常见问题
      • 自定义镜像
    • 资源管理
      • 资源池管理简介
      • 资源池使用简介
  • 预测部署
    • 批量预测(用户资源池)API
    • 文字识别模型部署
      • 文字识别任务API参考文档
      • 文字识别任务公有云部署
    • 通用模型部署
      • 标准接口规范参考
      • Paddle框架API调用文档
      • sklearn框架API调用文档
      • 公有云部署
      • XGBoost框架API调用文档
      • tensorflow框架API调用文档
      • Pytorch框架API调用文档
      • 通用类模型API参考
      • 错误码
    • 语音技术模型部署
      • 声音分类API调用文档
    • 视觉模型部署
      • 智能边缘控制台-多节点版
      • 端云协同服务部署
      • 智能边缘控制台-单节点版
      • 视觉任务模型部署整体说明
      • 软硬一体方案部署
        • 视觉任务Jetson专用SDK集成文档
        • 如何获取视觉任务软硬一体产品
        • 视觉任务EdgeBoard(VMX)专用SDK集成文档
        • 视觉任务EdgeBoard(FZ)专用SDK集成文档
        • 视觉任务专用辨影SDK集成开发文档
      • 私有服务器部署
        • 视觉模型如何部署在私有服务器
        • 私有API
          • 如何发布私有API
          • 图像分类-单图单标签私有API集成文档
          • 图像分类-单图多标签私有API集成文档
          • 物体检测私有API集成文档
        • 服务器端SDK
          • 视觉任务服务器端LinuxSDK集成文档-Python
          • 视觉任务服务器端LinuxSDK集成文档-C++
          • 如何发布服务器端SDK
          • 视觉任务服务器端WindowsSDK集成文档
          • 视觉任务服务器端SDK简介
      • 设备端SDK部署
        • 视觉任务WindowsSDK集成文档
        • 视觉任务iOSSDK集成文档
        • 视觉任务LinuxSDK集成文档-Python
        • 视觉任务LinuxSDK集成文档-C++
        • 视觉任务设备端SDK使用说明
        • 如何发布视觉任务设备端SDK
        • 视觉任务AndroidSDK集成文档
      • 公有云部署
        • 文字识别API参考文档
        • 视觉任务公有云部署
        • 物体检测API参考文档
        • 图像分类-单图单标签API参考文档
        • 实例分割API参考文档
        • 图像分类-单图多标签API参考文档
    • 表格预测模型部署
      • 整体说明
      • 公有云部署
    • 公有云部署管理
      • 配置AB测试版本
      • 批量预测服务
      • 公有云部署
      • 公有云部署简介
      • 配置休眠策略
    • NLP模型部署
      • 自然语言处理任务模型部署整体说明
      • 私有服务器部署
        • 如何部署在私有服务器
        • 私有服务API说明
          • 私有部署说明-短文本相似度
          • 私有化部署接口说明-文本分类
          • 私有部署文档-序列标注
          • 文本实体抽取API调用文档
      • 公有云部署
        • 短文本匹配API调用文档
        • 文本实体抽取私有API调用说明
        • 如何发布自然语言处理任务API
        • 文本分类-多标签API调用文档
        • 文本分类API调用文档
        • 序列标注API调用文档
  • 数据服务
    • 数据服务简介
    • 智能数据API
    • 公有云服务调用数据反馈
    • 智能标注
      • 文本智能标注介绍及原理说明
      • 图像智能标注介绍说明
    • 管理视觉数据
      • 实例分割数据导入与标注
        • 数据标注说明
        • 导入未标注数据
        • 导入已标注数据
      • 物体检测数据导入与标注
        • 物体检测数据标注说明
        • 物体检测导入未标注数据
        • 物体检测导入已标注数据
      • 图像分类数据导入与标注
        • 图像分类导入未标注数据
        • 图像分类导入已标注数据
        • 图像分类数据标注说明
    • 管理文本数据
      • 文本分类数据导入与标注
        • 文本分类数据标注说明
        • 文本分类数据导入与标注
        • 数据去重策略
      • 序列标注数据导入与标注
        • 序列标注标注说明
        • 序列标注数据导入
        • 数据去重策略
      • 文本实体抽取数据标注
        • 文本实体抽取数据标注
        • 文本实体抽取数据导入
        • 数据去重策略
      • 短文本匹配数据导入与标注
        • 短文本匹配数据导入与标注
        • 数据去重策略说明
        • 短文本匹配数据标注
  • 产品简介
    • BML平台升级公告
    • 平台重点升级介绍
    • 产品优势
    • 产品功能
    • 什么是BML
    • 文心大模型
  • 产品定价
    • 服务器部署价格说明
    • 专项适配硬件部署价格说明
    • 公有云部署计费说明
    • 批量预测计费说明
    • 模型训练计费说明
    • 通用小型设备部署价格说明
  • 模型训练
    • Notebook建模
      • 创建并启动Notebook
      • Notebook导入数据集
      • 保存Notebook中的模型
      • Notebook使用参考
      • 常见问题
      • 数据模型可视化功能说明
      • Notebook简介
      • 发布模型
      • 配置模型
      • 使用Notebook开发模型
      • 如何使用Notebook SSH 功能
      • Notebook从训练到部署快速入门
        • Codelab Notebook自定义环境部署最佳实践
        • 基于Notebook的图像分类模板使用指南
        • 基于 Notebook 的 NLP 通用模板使用指南
        • Notebook 模板使用指南概述
        • 基于 Notebook 的通用模板使用指南
        • 基于 Notebook 的物体检测模板使用指南
    • 自定义作业建模
      • 自定义作业简介
      • 训练作业API
      • 训练作业
        • 使用训练作业训练模型
        • 创建训练作业
        • 发布模型
        • 训练作业代码示例
          • TensorFlow 1.13.2
          • AIAK- Training Pytorch版
          • TensorFlow 2.3.0
          • Blackhole 1.0.0
          • Pytorch 1.7.1
          • Sklearn 0.23.2
          • XGBoost 1.3.1
          • PaddlePaddle 2.0.0rc
      • 自动搜索作业
        • 创建自动搜索作业
        • yaml文件编写规范
        • 自动搜索作业简介
        • 自动搜索作业代码编写规范
        • 自动搜索作业代码示例
          • XGBoost 1.3.1代码规范
          • TensorFlow 1.13.2代码规范
          • Sklearn 0.23.2代码规范
          • Pytorch 1.7.1代码规范
          • Tensorflow2.3.0代码规范
          • PaddlePaddle 2.1.1代码规范
    • 可视化建模
      • 快速入门
      • 概述
      • 组件菜单
        • 001-基本操作
        • 003-查看模型特征溯源
        • 007-组件状态
        • 008-组件资源配置
        • 006-组件列选择
        • 002-查看模型可解释性
        • 004-查看特征重要性
      • 组件说明
        • 015-图算法
        • 004-特征工程组件
        • 003-数据处理组件
        • 012-预测组件
        • 008-聚类算法
        • 009-Python算法组件
        • 002-数据集组件
        • 014-自然语言处理组件
        • 010-NLP算法
        • 016-统计分析组件
        • 006-回归算法
        • 007-异常检测算法
        • 013-模型评估组件
        • 005-分类算法
        • 018-时间序列组件
      • 画布操作说明
        • 005-AutoML(自动调参)
        • 002-开始训练
        • 001-概述
    • 预置模型调参建模
      • 预置模型调参简介
      • 神经网络训练搜索
      • 开发视觉模型
        • 视觉任务简介
        • 查看训练结果
        • 创建视觉任务
        • 配置视觉任务
        • 开发参考
          • 视觉预训练模型
          • 超参数配置参考
          • 评估报告参考
          • 自动超参搜索配置参考
          • 数据增强算子参考
          • 训练时长设置参考
          • 网络选型参考
      • 开发表格预测模型
        • 创建表格预测任务
        • 配置专家模式表格数据预测任务
        • 查看训练结果
        • 配置AUTOML模式表格数据预测任务
        • 表格预测任务简介
      • 开发文字识别模型
        • 文字识别任务简介
        • 文字识别任务操作流程
      • 开发自然语言处理模型
        • 查看训练结果
        • 自然语言处理任务简介
        • 配置NLP任务
        • 创建NLP任务
        • 代码模板升级及迁移说明
所有文档
menu
没有找到结果,请重新输入

全功能AI开发平台 BML

  • 版本发布记录
  • 快速开始
    • 用BML实现表格预测
    • 用BML实现序列标注
    • 用BML实现文本实体抽取
    • 用BML实现图片分类
    • 用BML实现实例分割
    • 用BML评价短文本相似度
    • 用BML实现开源大模型的预训练(Post-pretrain)
    • 用BML实现文本分类
    • 用BML实现物体检测
  • 模型仓库
    • 从训练任务导入模型
    • 查看模型
    • 创建模型
    • 模型仓库简介
    • 从本地导入模型
    • 校验模型
    • 服务代码文件示例
      • Sklearn服务代码文件示例
      • XGBoost服务代码文件示例
  • 平台管理
    • 权限管理
    • 在BML平台使用并行文件系统PFS和对象存储BOS
    • 在BML平台使用容器镜像服务CCR
    • 在BML使用外部镜像
    • 项目空间管理
    • 镜像管理
      • 镜像使用
      • 镜像管理简介
      • 常见问题
      • 自定义镜像
    • 资源管理
      • 资源池管理简介
      • 资源池使用简介
  • 预测部署
    • 批量预测(用户资源池)API
    • 文字识别模型部署
      • 文字识别任务API参考文档
      • 文字识别任务公有云部署
    • 通用模型部署
      • 标准接口规范参考
      • Paddle框架API调用文档
      • sklearn框架API调用文档
      • 公有云部署
      • XGBoost框架API调用文档
      • tensorflow框架API调用文档
      • Pytorch框架API调用文档
      • 通用类模型API参考
      • 错误码
    • 语音技术模型部署
      • 声音分类API调用文档
    • 视觉模型部署
      • 智能边缘控制台-多节点版
      • 端云协同服务部署
      • 智能边缘控制台-单节点版
      • 视觉任务模型部署整体说明
      • 软硬一体方案部署
        • 视觉任务Jetson专用SDK集成文档
        • 如何获取视觉任务软硬一体产品
        • 视觉任务EdgeBoard(VMX)专用SDK集成文档
        • 视觉任务EdgeBoard(FZ)专用SDK集成文档
        • 视觉任务专用辨影SDK集成开发文档
      • 私有服务器部署
        • 视觉模型如何部署在私有服务器
        • 私有API
          • 如何发布私有API
          • 图像分类-单图单标签私有API集成文档
          • 图像分类-单图多标签私有API集成文档
          • 物体检测私有API集成文档
        • 服务器端SDK
          • 视觉任务服务器端LinuxSDK集成文档-Python
          • 视觉任务服务器端LinuxSDK集成文档-C++
          • 如何发布服务器端SDK
          • 视觉任务服务器端WindowsSDK集成文档
          • 视觉任务服务器端SDK简介
      • 设备端SDK部署
        • 视觉任务WindowsSDK集成文档
        • 视觉任务iOSSDK集成文档
        • 视觉任务LinuxSDK集成文档-Python
        • 视觉任务LinuxSDK集成文档-C++
        • 视觉任务设备端SDK使用说明
        • 如何发布视觉任务设备端SDK
        • 视觉任务AndroidSDK集成文档
      • 公有云部署
        • 文字识别API参考文档
        • 视觉任务公有云部署
        • 物体检测API参考文档
        • 图像分类-单图单标签API参考文档
        • 实例分割API参考文档
        • 图像分类-单图多标签API参考文档
    • 表格预测模型部署
      • 整体说明
      • 公有云部署
    • 公有云部署管理
      • 配置AB测试版本
      • 批量预测服务
      • 公有云部署
      • 公有云部署简介
      • 配置休眠策略
    • NLP模型部署
      • 自然语言处理任务模型部署整体说明
      • 私有服务器部署
        • 如何部署在私有服务器
        • 私有服务API说明
          • 私有部署说明-短文本相似度
          • 私有化部署接口说明-文本分类
          • 私有部署文档-序列标注
          • 文本实体抽取API调用文档
      • 公有云部署
        • 短文本匹配API调用文档
        • 文本实体抽取私有API调用说明
        • 如何发布自然语言处理任务API
        • 文本分类-多标签API调用文档
        • 文本分类API调用文档
        • 序列标注API调用文档
  • 数据服务
    • 数据服务简介
    • 智能数据API
    • 公有云服务调用数据反馈
    • 智能标注
      • 文本智能标注介绍及原理说明
      • 图像智能标注介绍说明
    • 管理视觉数据
      • 实例分割数据导入与标注
        • 数据标注说明
        • 导入未标注数据
        • 导入已标注数据
      • 物体检测数据导入与标注
        • 物体检测数据标注说明
        • 物体检测导入未标注数据
        • 物体检测导入已标注数据
      • 图像分类数据导入与标注
        • 图像分类导入未标注数据
        • 图像分类导入已标注数据
        • 图像分类数据标注说明
    • 管理文本数据
      • 文本分类数据导入与标注
        • 文本分类数据标注说明
        • 文本分类数据导入与标注
        • 数据去重策略
      • 序列标注数据导入与标注
        • 序列标注标注说明
        • 序列标注数据导入
        • 数据去重策略
      • 文本实体抽取数据标注
        • 文本实体抽取数据标注
        • 文本实体抽取数据导入
        • 数据去重策略
      • 短文本匹配数据导入与标注
        • 短文本匹配数据导入与标注
        • 数据去重策略说明
        • 短文本匹配数据标注
  • 产品简介
    • BML平台升级公告
    • 平台重点升级介绍
    • 产品优势
    • 产品功能
    • 什么是BML
    • 文心大模型
  • 产品定价
    • 服务器部署价格说明
    • 专项适配硬件部署价格说明
    • 公有云部署计费说明
    • 批量预测计费说明
    • 模型训练计费说明
    • 通用小型设备部署价格说明
  • 模型训练
    • Notebook建模
      • 创建并启动Notebook
      • Notebook导入数据集
      • 保存Notebook中的模型
      • Notebook使用参考
      • 常见问题
      • 数据模型可视化功能说明
      • Notebook简介
      • 发布模型
      • 配置模型
      • 使用Notebook开发模型
      • 如何使用Notebook SSH 功能
      • Notebook从训练到部署快速入门
        • Codelab Notebook自定义环境部署最佳实践
        • 基于Notebook的图像分类模板使用指南
        • 基于 Notebook 的 NLP 通用模板使用指南
        • Notebook 模板使用指南概述
        • 基于 Notebook 的通用模板使用指南
        • 基于 Notebook 的物体检测模板使用指南
    • 自定义作业建模
      • 自定义作业简介
      • 训练作业API
      • 训练作业
        • 使用训练作业训练模型
        • 创建训练作业
        • 发布模型
        • 训练作业代码示例
          • TensorFlow 1.13.2
          • AIAK- Training Pytorch版
          • TensorFlow 2.3.0
          • Blackhole 1.0.0
          • Pytorch 1.7.1
          • Sklearn 0.23.2
          • XGBoost 1.3.1
          • PaddlePaddle 2.0.0rc
      • 自动搜索作业
        • 创建自动搜索作业
        • yaml文件编写规范
        • 自动搜索作业简介
        • 自动搜索作业代码编写规范
        • 自动搜索作业代码示例
          • XGBoost 1.3.1代码规范
          • TensorFlow 1.13.2代码规范
          • Sklearn 0.23.2代码规范
          • Pytorch 1.7.1代码规范
          • Tensorflow2.3.0代码规范
          • PaddlePaddle 2.1.1代码规范
    • 可视化建模
      • 快速入门
      • 概述
      • 组件菜单
        • 001-基本操作
        • 003-查看模型特征溯源
        • 007-组件状态
        • 008-组件资源配置
        • 006-组件列选择
        • 002-查看模型可解释性
        • 004-查看特征重要性
      • 组件说明
        • 015-图算法
        • 004-特征工程组件
        • 003-数据处理组件
        • 012-预测组件
        • 008-聚类算法
        • 009-Python算法组件
        • 002-数据集组件
        • 014-自然语言处理组件
        • 010-NLP算法
        • 016-统计分析组件
        • 006-回归算法
        • 007-异常检测算法
        • 013-模型评估组件
        • 005-分类算法
        • 018-时间序列组件
      • 画布操作说明
        • 005-AutoML(自动调参)
        • 002-开始训练
        • 001-概述
    • 预置模型调参建模
      • 预置模型调参简介
      • 神经网络训练搜索
      • 开发视觉模型
        • 视觉任务简介
        • 查看训练结果
        • 创建视觉任务
        • 配置视觉任务
        • 开发参考
          • 视觉预训练模型
          • 超参数配置参考
          • 评估报告参考
          • 自动超参搜索配置参考
          • 数据增强算子参考
          • 训练时长设置参考
          • 网络选型参考
      • 开发表格预测模型
        • 创建表格预测任务
        • 配置专家模式表格数据预测任务
        • 查看训练结果
        • 配置AUTOML模式表格数据预测任务
        • 表格预测任务简介
      • 开发文字识别模型
        • 文字识别任务简介
        • 文字识别任务操作流程
      • 开发自然语言处理模型
        • 查看训练结果
        • 自然语言处理任务简介
        • 配置NLP任务
        • 创建NLP任务
        • 代码模板升级及迁移说明
  • 文档中心
  • arrow
  • 全功能AI开发平台BML
  • arrow
  • 预测部署
  • arrow
  • 视觉模型部署
  • arrow
  • 设备端SDK部署
  • arrow
  • 视觉任务LinuxSDK集成文档-C++
本页目录
  • 简介
  • Release Notes
  • 快速开始
  • 安装依赖
  • 依赖说明:树莓派
  • 依赖说明:比特大陆SE计算盒
  • 依赖说明:海思开发板
  • 依赖说明:RK3399Pro
  • 依赖说明:RV1109/RV1126
  • 依赖说明:RK3568
  • 依赖说明:晶晨A311D
  • 使用序列号激活
  • 测试Demo
  • 测试Demo HTTP 服务
  • 使用说明
  • 使用流程
  • SDK参数配置
  • 初始化
  • 预测图像
  • 预测视频
  • 设置序列号
  • 日志配置
  • http服务
  • 1. 开启http服务
  • 2. 请求http服务
  • http 请求方式一:不使用图片base64格式
  • http 请求方法二:使用图片base64格式
  • http 返回数据
  • 其他配置
  • 1. 日志名称、HTTP 网页标题设置
  • FAQ
  • 1. 如何处理一些 undefined reference / error while loading shared libraries?
  • 2. EasyDL SDK与云服务效果不一致,如何处理?
  • 3. 如何将我的模型运行为一个http服务?
  • 4. 运行NNIE引擎报permission denied
  • 5. 运行SDK报错 Authorization failed
  • 情况一:日志显示 Http perform failed: null respond
  • 情况二:日志显示failed to get/check device id(xxx)或者Device fingerprint mismatch(xxx)
  • 6. 使用libcurl请求http服务时,速度明显变慢
  • 7. 运行NNIE引擎报错 std::bad_alloc
  • 8. 运行二进制时,提示 libverify.so cannot open shared object file
  • 9. 编译时报错:file format not recognized

视觉任务LinuxSDK集成文档-C++

更新时间:2025-08-21

简介

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

  • 网络类型支持: - 图像分类 - 物体检测 - 图像分割
  • 硬件支持:

    • CPU: aarch64 armv7hf
    • GPU: ARM Mali G系列
    • ASIC: Hisilicon NNIE1.1 on aarch64(Hi3559AV100/Hi3559CV100等)
    • ASIC: Hisilicon NNIE1.2 on armv7l(Hi3519AV100/Hi3559V200等)
    • Intel Movidius MyRIAD2 / MyRIAD X on x86_64
    • Intel Movidius MyRIAD2 / MyRIAD X on armv7l
    • Intel Movidius MyRIAD2 / MyRIAD X on aarch64
    • Intel iGPU on x86_64
    • 比特大陆 Bitmain SE50 (BM1684)
    • 瑞芯微 RK3399Pro / RV1109 / RV1126 / RK3568
    • 华为 Atlas200
    • 晶晨 A311D
    • 寒武纪 MLU220 on aarch64
  • 操作系统支持:

    • Linux (Ubuntu, Centos, Debian等)
    • 海思HiLinux
    • 树莓派Raspbian/Debian
    • 瑞芯微Firefly

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

Release Notes

时间 版本 说明
2022.10.27 1.7.1 新增语义分割模型http请求示例
2022.09.15 1.7.0 新增瑞芯微 RK3568 支持, RK3399Pro、RV1126升级到RKNN1.7.1
2022.07.28 1.6.0 引擎升级;新增英特尔 iGPU 支持
2022.04.25 1.4.1 EasyDL, BML升级支持paddle2模型
2022.03.25 1.4.0 EasyDL新增上线支持晶晨A311D NPU预测引擎;Arm CPU、Arm GPU引擎升级;atlas 200在EasyDL模型增加多个量化加速版本;
2021.12.22 1.3.5 RK3399Pro, RV1109/RV1126 SDK扩展模型压缩加速能力,更新端上推理库版本;边缘控制台IEC功能升级,适配更多通用小型设备,NNIE 在EasyDL增加量化加速版本;Atlas200升级到Cann5.0.3
2021.06.29 1.3.1 视频流解析支持调整分辨率;预测引擎升级;设备端sdk新增支持瑞芯微RV1109、RV1126
2021.05.13 1.3.0 新增视频流接入支持;EasyDL模型发布新增多种加速方案选择;目标追踪支持x86平台的CPU、GPU加速版;展示已发布模型性能评估报告
2021.03.09 1.2.0 http server服务支持图片通过base64格式调用
2021.01.27 1.1.0 EasyDL经典版分类高性能模型升级;部分SDK不再需要单独安装OpenCV;新增RKNPU预测引擎支持;新增高通骁龙GPU预测引擎支持
2020.12.18 1.0.0 1.0版本发布!安全加固升级、性能优化、引擎升级、接口优化等多项更新
2020.10.29 0.5.7 优化多线程预测细节
2020.09.17 0.5.6 支持linux aarch64架构的硬件接入intel神经计算棒预测;支持比特大陆计算盒SE50 BM1684
2020.08.11 0.5.5 支持linux armv7hf架构硬件(如树莓派)接入intel神经计算棒预测
2020.06.23 0.5.4 arm引擎升级
2020.05.15 0.5.3 支持EasyDL 专业版新增模型 ;支持树莓派(armv7hf, aarch64)
2020.04.16 0.5.2 Jetson系列SDK支持多线程infer
2020.02.23 0.5.0 新增支持人脸口罩模型;Jetson SDK支持批量图片推理; ARM支持图像分割
2020.01.16 0.4.7 上线海思NNIE1.2,支持EasyEdge以及EasyDL;ARM引擎升级;增加推荐阈值支持
2019.12.26 0.4.6 海思NNIE支持EasyDL专业版
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.06.11 0.3.3 paddle引擎升级;性能提升
2019.05.16 0.3.2 新增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 第一版!

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

快速开始

SDK在以下环境中测试通过

  • aarch64(arm64), Ubuntu 16.04, gcc 5.3 (RK3399)
  • Hi3559AV100, aarch64, Ubuntu 16.04, gcc 5.3
  • Hi3519AV100, armv7l , HiLinux 4.9.37, (Hi3519AV100R001C02SPC020)
  • armv7hf, Raspbian, (Raspberry 3b)
  • aarch64, Raspbian, (Raspberry 4b)
  • armv7hf, Raspbian, (Raspberry 3b+)
  • armv7hf, Ubuntu 16.04, (RK3288)
  • Bitmain se50 BM1684, Debian 9
  • Rockchip rk3399pro, Ubuntu 18.04
  • Rockchip rv1126, Debain 10
  • Rockchip rk3568, Ubuntu 20.04
  • Atlas200(华为官网指定的Ubuntu 18.04版本)
  • Amlogic A311D, Ubuntu 20.04
  • MLU220, aarch64, Ubuntu 18.04

安装依赖

依赖包括

  • cmake 3+
  • gcc 5.4 以上(需包含 GLIBCXX_3.4.22) ,gcc / glibc版本请以实际SDK ldd的结果为准
  • opencv3.4.5 (可选)

依赖说明:树莓派

树莓派Raspberry默认为armv7hf系统,使用SDK包中名称中包含armv7hf_ARM_的tar包。如果是aarch64系统,使用SDK包中名称中包含aarch64_ARM_的tar包。

在安装前可通过以下命令查看是32位还是64位 :

Plain Text
1getconf LONG_BIT
232

依赖说明:比特大陆SE计算盒

需要安装BMNNSDK2.2,并在CMakeList.txt中指定SDK安装地址:

Plain Text
1# 这里修改并填入所使用的bmnnsdk路径
2set(EDGE_BMSDK_ROOT "{这里填写sdk路径}")

依赖说明:海思开发板

海思开发板需要根据海思SDK文档配置开运行环境和编译环境,SDK和opencv都需要在该编译环境中编译。 NNIE1.2用arm-himix200-linux交叉编译好的opencv,下载链接:https://pan.baidu.com/s/13QW0ReeWx4ZwgYg4lretyw 密码:yq0s。下载后修改SDK CMakesList.txt

依赖说明:RK3399Pro

所有用例基于 Npu driver版本1.7.1的RK3399pro开发板测试通过,SDK采用预编译模式,请务必确保板上驱动版本为1.7.1 查看RK3399Pro板上driver版本方法:dpkg -l | grep 3399pro

依赖说明:RV1109/RV1126

所有用例基于Rknn_server版本1.7.1的RV1126开发板测试通过,SDK采用预编译模式,请务必确保板上驱动版本为1.7.1 查看RV1109/RV1126板上Rknn_server版本方法:strings /usr/bin/rknn_server | grep build

依赖说明:RK3568

所有用例基于Rknn_server版本1.2.0的RK3568开发板测试通过, 查看RK3568板上Rknn_server版本方法:strings /usr/bin/rknn_server | grep build

依赖说明:晶晨A311D

所有用例基于晶晨A311D开发板测试通过,需要驱动版本为 6.4.4.3(下载驱动请联系开发版厂商) 查看晶晨A311D开发板驱动版本方法:dmesg | grep Galcore

使用序列号激活

在控制台获取的序列号请通过global_controller()->set_licence_key("")方法设置。

具体请参考SDK自带的Demo.cpp文件的使用方法。

测试Demo

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

Demo工程直接编译即可运行。

请先将tar包整体拷贝到具体运行的设备中,再解压缩编译; 对于硬件使用为: -Intel Movidius MyRIAD2 / MyRIAD X / IGPU on Linux x86_64 / armv7hf / aarch64,在编译或运行demo程序前执行以下命令: source ${cpp_kit位置路径}/thirdparty/openvino/bin/setupvars.sh 或者执行 source ${cpp_kit位置路径}/thirdparty/openvino/setupvars.sh (openvino-2022.1+) 部分SDK中已经包含预先编译的二进制, bin/easyedge_demo, bin/easyedge_serving,配置LD_LIBRARY_PATH后,可直接运行: LD_LIBRARY_PATH=../lib ./bin/easyedge_serving

请在官网获取序列号,填写在demo.cpp中

编译运行:

Bash
1cd src
2mkdir build && cd build
3cmake .. && make
4./easyedge_image_inference {模型RES文件夹}  {测试图片路径}
5# 如果是NNIE引擎,使用sudo运行
6sudo ./easyedge_image_inference {模型RES文件夹}  {测试图片路径}

如果希望SDK自动编译安装所需要的OpenCV库,修改cmake的optionEDGE_BUILD_OPENCV为ON即可。 SDK会自动从网络下载opencv源码,并编译需要的module、链接。注意,此功能必须需联网。

Bash
1cmake -DEDGE_BUILD_OPENCV=ON .. && make -j16

若需自定义library search path或者gcc路径,修改CMakeList.txt即可。

对于硬件使用为Intel Movidius MyRIAD2 / MyRIAD X 的,如果宿主机找不到神经计算棒Intel® Neural Compute Stick,需要执行以下命令添加USB Rules:

Plain Text
1cp ${cpp_kit位置路径}/thirdparty/openvino/deployment_tools/inference_engine/external/97-myriad-usbboot.rules /etc/udev/rules.d/
2sudo udevadm control --reload-rules
3sudo udevadm trigger
4sudo ldconfig

demo运行效果:

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

测试Demo HTTP 服务

编译demo完成之后,会同时生成一个http服务 运行

Bash
1# ./easyedge_serving {res_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}
2 ./easyedge_serving ../../../RES "1111-1111-1111-1111" 0.0.0.0  24401

后,日志中会显示

Plain Text
1HTTP is now serving at 0.0.0.0:24401

字样,此时,开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试。

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

使用说明

使用该方式,将运行库嵌入到开发者的程序当中。

使用流程

请优先参考Demo的使用流程。遇到错误,请优先参考文件中的注释解释,以及日志说明。

C++
1    // step 1: 配置运行参数
2    EdgePredictorConfig config;
3    config.model_dir = {模型文件目录};
4
5    // step 2: 创建并初始化Predictor;这这里选择合适的引擎
6    auto predictor = global_controller()->CreateEdgePredictor(config);
7
8    // step 3-1: 预测图像
9    auto img = cv::imread({图片路径});
10    std::vector<EdgeResultData> results;
11    predictor->infer(img, results);
12
13	// step 3-2: 预测视频
14	std::vector<EdgeResultData> results;
15	FrameTensor frame_tensor;
16	VideoConfig video_config;
17	video_config.source_type = static_cast<SourceType>(video_type);  // source_type 定义参考头文件 easyedge_video.h
18	video_config.source_value = video_src;
19	/*
20	... more video_configs, 根据需要配置video_config的各选项
21	*/
22	auto video_decoding = CreateVideoDecoding(video_config);
23	while (video_decoding->next(frame_tensor) == EDGE_OK) {
24	    results.clear();
25	    if (frame_tensor.is_needed) {
26	        predictor->infer(frame_tensor.frame, results);
27	        render(frame_tensor.frame, results, predictor->model_info().kind);
28	    }
29	    //video_decoding->display(frame_tensor); // 显示当前frame,需在video_config中开启配置
30	    //video_decoding->save(frame_tensor); // 存储当前frame到视频,需在video_config中开启配置
31	 }

对于口罩检测模型,将 EdgePredictorConfig config修改为PaddleMultiStageConfig config即可。

口罩检测模型请注意输入图片中人脸大小建议保持在 88到9696像素之间,可根据场景远近程度缩放图片后再传入SDK。

SDK参数配置

SDK的参数通过EdgePredictorConfig::set_config和global_controller()->set_config配置。set_config的所有key在easyedge_xxxx_config.h中。其中

  • PREDICTOR前缀的key是不同模型相关的配置,通过EdgePredictorConfig::set_config设置
  • CONTROLLER前缀的key是整个SDK的全局配置,通过global_controller()->set_config设置

以序列号为例,KEY的说明如下:

Plain Text
1/**
2 * @brief 序列号设置;序列号不设置留空时,SDK将会自动尝试使用本地已经激活成功的有效期内的序列号
3 * 值类型:string
4 * 默认值:空
5 */
6static constexpr auto PREDICTOR_KEY_SERIAL_NUM = "PREDICTOR_KEY_SERIAL_NUM";

使用方法如下:

Plain Text
1EdgePredictorConfig config;
2config.model_dir = ...;
3config.set_config(params::PREDICTOR_KEY_SERIAL_NUM, "1DB7-1111-1111-D27D");

具体支持的运行参数可以参考开发工具包中的头文件的详细说明。

初始化

  • 接口
C++
1auto predictor = global_controller()->CreateEdgePredictor(config);
2predictor->init();

若返回非0,请查看输出日志排查错误原因。

预测图像

  • 接口
C++
1 /**
2  * @brief
3  * 通用接口
4  * @param image: must be BGR , HWC format (opencv default)
5  * @param result
6  * @return
7  */
8 virtual int infer(
9         cv::Mat& image, std::vector<EdgeResultData>& result
10 ) = 0;

图片的格式务必为opencv默认的BGR, HWC格式。

  • 返回格式

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

C++
1struct EdgeResultData {
2    int index;  // 分类结果的index
3    std::string label;  // 分类结果的label
4    float prob;  // 置信度
5
6    // 物体检测活图像分割时才有
7    float x1, y1, x2, y2;  // (x1, y1): 左上角, (x2, y2): 右下角; 均为0~1的长宽比例值。
8
9    // 图像分割时才有
10    cv::Mat mask;  // 0, 1 的mask
11    std::string mask_rle;  // Run Length Encoding,游程编码的mask
12};

关于矩形坐标

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

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

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

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

关于图像分割mask

Plain Text
1cv::Mat mask为图像掩码的二维数组
2{
3  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
4  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
5  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
6  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
7  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
8  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
9}
10其中1代表为目标区域,0代表非目标区域

关于图像分割mask_rle

该字段返回了mask的游程编码,解析方式可参考 http demo

以上字段可以参考demo文件中使用opencv绘制的逻辑进行解析

预测视频

SDK 提供了支持摄像头读取、视频文件和网络视频流的解析工具类VideoDecoding,此类提供了获取视频帧数据的便利函数。通过VideoConfig结构体可以控制视频/摄像头的解析策略、抽帧策略、分辨率调整、结果视频存储等功能。对于抽取到的视频帧可以直接作为SDK infer 接口的参数进行预测。

  • 接口

classVideoDecoding:

Plain Text
1    /**
2     * @brief 获取输入源的下一帧
3     * @param frame_tensor
4     * @return
5     */
6    virtual int next(FrameTensor &frame_tensor) = 0;
7
8    /**
9     * @brief 显示当前frame_tensor中的视频帧
10     * @param frame_tensor
11     * @return
12     */
13    virtual int display(const FrameTensor &frame_tensor) = 0;
14
15    /**
16     * @brief 将当前frame_tensor中的视频帧写为本地视频文件
17     * @param frame_tensor
18     * @return
19     */
20    virtual int save(FrameTensor &frame_tensor) = 0;
21
22    /**
23     * @brief 获取视频的fps属性
24     * @return
25     */
26    virtual int get_fps() = 0;
27     /**
28      * @brief 获取视频的width属性
29      * @return
30      */
31    virtual int get_width() = 0;
32
33    /**
34     * @brief 获取视频的height属性
35     * @return
36     */
37    virtual int get_height() = 0;

struct VideoConfig

Plain Text
1/**
2 * @brief 视频源、抽帧策略、存储策略的设置选项
3 */
4struct VideoConfig {
5    SourceType source_type;            // 输入源类型
6    std::string source_value;          // 输入源地址,如视频文件路径、摄像头index、网络流地址
7    int skip_frames{0};                // 设置跳帧,每隔skip_frames帧抽取一帧,并把该抽取帧的is_needed置为true
8    int retrieve_all{false};           // 是否抽取所有frame以便于作为显示和存储,对于不满足skip_frames策略的frame,把所抽取帧的is_needed置为false
9    int input_fps{0};                  // 在采取抽帧之前设置视频的fps
10    Resolution resolution{Resolution::kAuto}; // 采样分辨率,只对camera有效
11
12    bool enable_display{false};
13    std::string window_name{"EasyEdge"};
14    bool display_all{false};           // 是否显示所有frame,若为false,仅显示根据skip_frames抽取的frame
15
16    bool enable_save{false};
17    std::string save_path;             // frame存储为视频文件的路径
18    bool save_all{false};              // 是否存储所有frame,若为false,仅存储根据skip_frames抽取的frame
19
20    std::map<std::string, std::string> conf;
21};

source_type:输入源类型,支持视频文件、摄像头、网络视频流三种,值分别为1、2、3。 source_value: 若source_type为视频文件,该值为指向视频文件的完整路径;若source_type为摄像头,该值为摄像头的index,如对于/dev/video0的摄像头,则index为0;若source_type为网络视频流,则为该视频流的完整地址。 skip_frames:设置跳帧,每隔skip_frames帧抽取一帧,并把该抽取帧的is_needed置为true,标记为is_needed的帧是用来做预测的帧。反之,直接跳过该帧,不经过预测。 retrieve_all:若置该项为true,则无论是否设置跳帧,所有的帧都会被抽取返回,以作为显示或存储用。 input_fps:用于抽帧前设置fps。 resolution:设置摄像头采样的分辨率,其值请参考easyedge_video.h中的定义,注意该分辨率调整仅对输入源为摄像头时有效。 conf:高级选项。部分配置会通过该map来设置。

注意: 1.如果使用VideoConfig的display功能,需要自行编译带有GTK选项的opencv,默认打包的opencv不包含此项。 2.使用摄像头抽帧时,如果通过resolution设置了分辨率调整,但是不起作用,请添加如下选项:

Plain Text
1video_config.conf["backend"] = "2";

3.部分设备上的CSI摄像头尚未兼容,如遇到问题,可以通过工单、QQ交流群或微信交流群反馈。

具体接口调用流程,可以参考SDK中的demo_video_inference。

设置序列号

请在网页控制台中申请序列号,并在init初始化前设置。 LinuxSDK 首次使用需联网授权。

C++
1EdgePredictorConfig config;
2config.set_config(easyedge::params::PREDICTOR_KEY_SERIAL_NUM, "this-is-serial-num");

日志配置

设置 EdgeLogConfig 的相关参数。具体含义参考文件中的注释说明。

C++
1EdgeLogConfig log_config;
2log_config.enable_debug = true;
3global_controller()->set_log_config(log_config);

http服务

1. 开启http服务

http服务的启动参考demo_serving.cpp文件。

C++
1 /**
2     * @brief 开启一个简单的demo http服务。
3     * 该方法会block直到收到sigint/sigterm。
4     * http服务里,图片的解码运行在cpu之上,可能会降低推理速度。
5     * @tparam ConfigT
6     * @param config
7     * @param host
8     * @param port
9     * @param service_id service_id  user parameter, uri '/get/service_id' will respond this value with 'text/plain'
10     * @param instance_num 实例数量,根据内存/显存/时延要求调整
11     * @return
12     */
13    template<typename ConfigT>
14    int start_http_server(
15            const ConfigT &config,
16            const std::string &host,
17            int port,
18            const std::string &service_id,
19            int instance_num = 1);

2. 请求http服务

开发者可以打开浏览器,http://{设备ip}:24401,选择图片来进行测试。

http 请求方式一:不使用图片base64格式

URL中的get参数:

参数 说明 默认值
threshold 阈值过滤, 0~1 如不提供,则会使用模型的推荐阈值

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

Python请求示例 (针对非语义分割模型)

Python
1import requests
2
3with open('./1.jpg', 'rb') as f:
4    img = f.read()
5    result = requests.post(
6	    'http://127.0.0.1:24401/',
7	    params={'threshold': 0.1},
8	    data=img).json()

Python请求示例 (针对语义分割模型)

Python
1import requests
2
3with open('./1.jpg', 'rb') as f:
4    img_data = f.read()
5    res = requests.post('http://127.0.0.1:24401/',
6        data=img_data)
7    with open("gray_result.png", "wb") as fb:
8        fb.write(res.content) # 语义分割模型是像素点级别输出,可将api返回结果保存为灰度图,每个像素值代表该像素分类结果

Java请求示例

http 请求方法二:使用图片base64格式

HTTP方法:POST Header如下:

参数 值
Content-Type application/json

Body请求填写:

  • 分类网络: body 中请求示例
Plain Text
1{
2	"image": "<base64数据>"
3	"top_num": 5
4}

body中参数详情

参数 是否必选 类型 可选值范围 说明
image 是 string - 图像数据,base64编码,要求base64图片编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 注意去掉头部
top_num 否 number - 返回分类数量,不填该参数,则默认返回全部分类结果
  • 检测和分割网络: Body请求示例:
Plain Text
1{
2	"image": "<base64数据>"
3}

body中参数详情:

参数 是否必选 类型 可选值范围 说明
image 是 string - 图像数据,base64编码,要求base64图片编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 注意去掉头部
threshold 否 number - 默认为推荐阈值,也可自行根据需要进行设置

Python请求示例 (针对非语义分割模型)

Python
1import base64
2import requests
3
4
5def main():
6    with open("1.jpg 【图片路径】", 'rb') as f:
7        result = requests.post("http://{服务ip地址}:24401/", json={
8            "image": base64.b64encode(f.read()).decode("utf8")
9        })
10        # print(result.request.body)
11        # print(result.request.headers)
12        print(result.content)
13
14
15if __name__ == '__main__':
16    main()

Python 请求示例 (针对语义分割模型)

Python
1import base64
2import requests
3def main():
4    with open("1.jpg 【图片路径】", 'rb') as f:
5        res = requests.post("http://{服务ip地址}:24401/", json={"image": base64.b64encode(f.read()).decode("utf8")})
6        with open("gray_result.png", "wb") as fb:
7            fb.write(res.content) # 语义分割模型是像素点级别输出,可将api返回结果保存为灰度图,每个像素值代表该像素分类结果
8if __name__ == '__main__':
9    main()

http 返回数据

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

返回示例

JSON
1{
2    "cost_ms": 52,
3    "error_code": 0,
4    "results": [
5        {
6            "confidence": 0.94482421875,
7            "index": 1,
8            "label": "IronMan",
9            "x1": 0.059185408055782318,
10            "x2": 0.18795496225357056,
11            "y1": 0.14762254059314728,
12            "y2": 0.52510076761245728,
13            "mask": "...",  // 图像分割模型字段
14            "trackId": 0,  // 目标追踪模型字段
15        },
16        
17      ]
18}

其他配置

1. 日志名称、HTTP 网页标题设置

通过global_controller的set_config方法设置:

C++
1global_controller()->set_config(easyedge::params::KEY_LOG_BRAND, "MY_BRAND");

效果如下: 图片

FAQ

1. 如何处理一些 undefined reference / error while loading shared libraries?

如:./easyedge_demo: error while loading shared libraries: libeasyedge.so.1: cannot open shared object file: No such file or directory 这是因为二进制运行时ld无法找到依赖的库。如果是正确cmake && make 的程序,会自动处理好链接,一般不会出现此类问题。

遇到该问题时,请找到具体的库的位置,设置LD_LIBRARY_PATH。

示例一:libverify.so.1: cannot open shared object file: No such file or directory 链接找不到libveirfy.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../lib 解决(实际冒号后面添加的路径以libverify.so文件所在的路径为准)

示例二:libopencv_videoio.so.4.5: cannot open shared object file: No such file or directory 链接找不到libopencv_videoio.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../thirdparty/opencv/lib 解决(实际冒号后面添加的路径以libopencv_videoio.so所在路径为准)

2. EasyDL SDK与云服务效果不一致,如何处理?

后续我们会消除这部分差异,如果开发者发现差异较大,可联系我们协助处理。

3. 如何将我的模型运行为一个http服务?

目前cpp sdk暂未集成http运行方式; 0.4.7版本之后,可以通过start_http_server方法开启http服务。

4. 运行NNIE引擎报permission denied

日志显示:

Plain Text
1open sys: Permission denied
2open err
3: Permission denied
4open err
5: Permission denied

请使用sudo在root下运行。

5. 运行SDK报错 Authorization failed

情况一:日志显示 Http perform failed: null respond

在新的硬件上首次运行,必须联网激活。

SDK 能够接受HTTP_PROXY 的环境变量通过代理处理自己的网络请求。如

Bash
1export HTTP_PROXY="http://192.168.1.100:8888"
2./easyedge_demo ...

情况二:日志显示failed to get/check device id(xxx)或者Device fingerprint mismatch(xxx)

此类情况一般是设备指纹发生了变更,包括(但不局限于)以下可能的情况:

  • MAC地址变化
  • 磁盘变更
  • BIOS重刷

以及系统相关信息。

遇到这类情况,请确保硬件无变更,如果想更换序列号,请先删除 ~/.baidu/easyedge 目录,再重新激活。

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

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

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

7. 运行NNIE引擎报错 std::bad_alloc

检查开发板可用内存,一些比较大的网络占用内存较多,推荐内存500M以上

8. 运行二进制时,提示 libverify.so cannot open shared object file

可能cmake没有正确设置rpath, 可以设置LD_LIBRARY_PATH为sdk的lib文件夹后,再运行:

Bash
1LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./easyedge_demo

9. 编译时报错:file format not recognized

可能是因为在复制SDK时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译

上一篇
视觉任务LinuxSDK集成文档-Python
下一篇
视觉任务设备端SDK使用说明