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

视觉任务服务器端LinuxSDK集成文档-Python

简介

本文档介绍 EasyDL 的 Linux Python SDK 的使用方法,适用于 EasyDL 和 BML。

EasyDL 通用版:

  • 网络类型支持:图像分类,物体检测,图像分割,声音分类,表格预测
  • 硬件支持:

    • Linux x86_64 CPU (基础版,加速版)
    • Linux x86_64 Nvidia GPU (基础版,加速版)
  • 语言支持:Python 3.5, 3.6, 3.7

BML:

  • 网络类型支持:图像分类,物体检测,声音分类
  • 硬件支持:

    • Linux x86_64 CPU (基础版)
    • Linux x86_64 Nvidia GPU (基础版)
  • 语言支持:Python 3.5, 3.6, 3.7

Release Notes

时间 版本 说明
2022.09.15 1.3.3 EasyDL CPU普通版新增支持表格预测
2022.05.27 1.3.1 CPU、GPU普通版新增支持BML Cloud小目标检测模型
2021.12.22 1.2.7 声音分类模型升级
2021.10.20 1.2.6 CPU基础版、CPU加速版、GPU基础版推理引擎优化升级
2021.08.19 1.2.5 CPU基础版、CPU无损加速版、GPU基础版新增支持EasyDL小目标检测
2021.06.29 1.2.4 CPU、GPU新增EasyDL目标跟踪支持;新增http server服务启动demo
2021.03.09 1.2.2 EasyDL CPU加速版新增支持分类、高性能检测和均衡检测的量化压缩模型
2021.01.27 1.2.1 EasyDL经典版分类高性能模型升级;支持更多模型
2020.12.18 1.2.0 推理引擎升级;接口升级;性能优化
2020.09.17 1.1.19 支持更多模型
2020.08.11 1.1.18 性能优化
2020.06.23 1.1.17 支持更多EasyDL专业版模型
2020.04.16 1.1.15 技术优化;升级 OpenVINO 版本
2020.03.12 1.1.14 新增声音识别python sdk
2020.02.12 1.1.13 新增口罩模型支持
2020.01.16 1.1.12 预测函数默认使用推荐阈值
2019.12.26 1.1.11 EasyDL 专业版支持 SDK 加速版
2019.12.04 1.1.10 支持图像分割
2019.10.21 1.1.9 支持 EasyDL 专业版
2019.08.29 1.1.8 CPU 加速版支持
2019.07.19 1.1.7 提供模型更新工具
2019.05.16 1.1.3 NVIDIA GPU 支持
2019.03.15 1.1.0 架构与功能完善
2019.02.28 1.0.6 引擎功能完善
2019.02.13 1.0.5 paddlepaddle 支持
2018.11.30 1.0.0 第一版!

2020-12-18: 【接口升级】 序列号的配置接口从1.2.0版本开始已升级为新接口,以前的方式被置为deprecated,并将在未来的版本中移除。请尽快考虑升级为新的接口方式,具体使用方式可以参考下文介绍以及demo工程示例,谢谢。

快速开始

1. 安装依赖

  • 根据引擎的不同,SDK 依赖了不同的底层引擎。根据所需自行安装。
  • 使用声音分类SDK需要安装额外依赖 * pip 安装 resampy pydub six librosa 音频默认格式支持wav文件预测,如果需要预测mp3等其他音频格式的数据需要系统额外安装ffmpeg(windows系统的ffmpeg已基在sdk中无需额外安装,linux系统需要手动安装)
  • 使用表格预测SDK需要安装额外依赖 pip安装brotlipy==0.7.0 certifi==2020.6.20 joblib==1.0.1 kaggle==1.5.12 Pillow py4j pycosat python-dateutil python-slugify ruamel_yaml text-unidecode threadpoolctl flask pandas==1.0.5 scikit-learn==0.23.2 lightgbm==2.2.3 catboost==0.24.1 xgboost==1.2.0 numpy==1.19.5 scipy==1.5.2 psutil==5.7.2 pypmml==0.9.7 torch==1.8.0 jieba==0.42.1 pyod==0.8.5 pyarrow==6.0.0 scikit-optimize==0.9.0 pyspark==3.3.0 另外ml算法安装(目前只支持python3.7) pip install BaiduAI_TabularInfer-0.0.0-cp37-cp37m-linux_x86_64.whl

安装 paddlepaddle

  • 使用x86_64 CPU 基础版预测时必须安装(目标跟踪除外)
python -m pip install paddlepaddle==2.2.2 -i https://mirror.baidu.com/pypi/simple 

若 CPU 为特殊型号,如赛扬处理器(一般用于深度定制的硬件中),请关注 CPU 是否支持 avx 指令集。如果不支持,请在paddle官网安装 noavx 版本

  • 使用NVIDIA GPU 基础版预测时必须安装(目标跟踪除外)
python -m pip install paddlepaddle-gpu==2.2.2.post101 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html #CUDA10.1的PaddlePaddle
python -m pip install paddlepaddle-gpu==2.2.2 -i https://mirror.baidu.com/pypi/simple #CUDA10.2的PaddlePaddle
python -m pip install paddlepaddle-gpu==2.2.2.post110 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html #CUDA11.0的PaddlePaddle
python -m pip install paddlepaddle-gpu==2.2.2.post111 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html #CUDA11.1的PaddlePaddle
python -m pip install paddlepaddle-gpu==2.2.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html #CUDA11.2的PaddlePaddle

不同cuda版本的环境,请参考paddle文档安装合适的 paddle 版本。 不被 paddle 支持的 cuda 和 cudnn 版本,EasyEdge 暂不支持

安装 OpenVINO

使用x86_64 CPU 加速版 SDK 预测时必须安装。

1)请参考 OpenVINO toolkit 文档安装 2021.4版本, 安装时可忽略Configure the Model Optimizer及后续部分

2)运行之前,务必设置环境变量

source /opt/intel/openvino_2021/bin/setupvars.sh

安装 cuda、cudnn

  • 使用Nvidia GPU 加速版预测时必须安装。 依赖的版本为 cuda9.0、cudnn7。版本号必须正确。

安装 pytorch(torch >= 1.7.0)

  • 目标跟踪模型的预测必须安装pytorch版本1.7.0及以上(包含:Nvidia GPU 基础版x86_64 CPU 基础版)。
  • 目标跟踪模型Nvidia GPU 基础版还需安装依赖cuda、cudnn。

关于不同版本的pytorch和CUDA版本的对应关系:pytorch官网 目标跟踪模型还有一些列举在requirements.txt里的依赖(包括torch >= 1.7.0),均可使用pip下载安装。

pip3 install -r requirements.txt

2. 安装 easyedge python wheel 包

pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_x86_64.whl

具体名称以 SDK 包中的 whl 为准。

3. 使用序列号激活

获取序列号

修改demo.py 填写序列号

pred = edge.Program()
pred.set_auth_license_key("这里填写序列号")

4. GPU 加速版

使用 GPU 加速版,在安装完 whl 之后,必须:

  1. 这里下载 TensorRT7.0.0.11 for cuda9.0,并把解压后的 lib 放到 C++ SDK 的 lib 目录或系统 lib 目录
  2. 运行时,必须在系统库路径中包含 C++ SDK 下的lib目录。如设置LD_LIBRARY_PATH
cd ${SDK_ROOT}

# 1. 安装 python wheel 包
tar -xzvf python/*.tar.gz
pip install -U {对应 Python 版本的 wheel 包}

# 2. 设置 LD_LIBRARY_PATH
tar -xzvf cpp/*.tar.gz 
export EDGE_ROOT=$(readlink -f $(ls -h | grep "baidu_easyedge_linux_cpp"))
export LD_LIBRARY_PATH=$EDGE_ROOT/lib

# 3. 运行 demo
python3 demo.py {RES文件夹路径}  {测试图片路径}

如果是使用 C++ SDK 自带的编译安装的 OpenCV,LD_LIBRARY_PATH 还需要包括 C++ SDK的 build 目录下的 thirdparty/lib 目录

如果没有正确设置 LD_LIBRARY_PATH,运行时可能报错:

ImportError: libeasyedge.so.0.4.3: cannot open shared object file: No such file or directory
ImportError: libopencv_core.so.3.4: cannot open shared object file: No such file or directory

5. 测试 Demo

5.1 图片预测

输入对应的模型文件夹(默认为RES)和测试图片路径,运行:

python3 demo.py {model_dir} {image_name.jpg}

测试效果:

5.2 视频预测(适用于目标跟踪)

输入对应的模型文件夹(默认为RES)和测试视频文件路径 / 摄像头id / 网络视频流地址,运行:

# video_type: 输入源类型 type:int
#             1 本地视频文件
#             2 摄像头的index
#             3 网络视频流
# video_src: 输入源地址,如视频文件路径、摄像头index、网络流地址 type: string
python3 demo.py {model_dir} {video_type} {video_src}

6. 测试Demo HTTP 服务

输入对应的模型文件夹(默认为RES)、序列号、设备ip和指定端口号,运行:

python3 demo_serving.py {model_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}

后,会显示:

Running on http://0.0.0.0:24401/

字样,此时,开发者可以打开浏览器,http://{设备ip}:24401,选择图片或者视频来进行测试。也可以参考`demo_serving.py`里 http_client_test()函数请求http服务进行推理。 图片

使用说明

使用流程

demo.py

import BaiduAI.EasyEdge as edge

pred = edge.Program()
pred.set_auth_license_key("这里填写序列号")
pred.init(model_dir={RES文件夹路径}, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID)
pred.infer_image({numpy.ndarray的图片})
pred.close()

demo_serving.py

import BaiduAI.EasyEdge as edge
from BaiduAI.EasyEdge.serving import Serving

server = Serving(model_dir={RES文件夹路径}, license=serial_key)
# 请参考同级目录下demo.py里:
# pred.init(model_dir=xx, device=xx, engine=xx, device_id=xx)
# 对以下参数device\device_id和engine进行修改
server.run(host=host, port=port, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID)

初始化

  • 接口
    def init(self,
          model_dir,
          device=Device.CPU,
          engine=Engine.PADDLE_FLUID,
          config_file='conf.json',
          preprocess_file='preprocess_args.json',
          model_file='model',
          params_file='params',
          label_file='label_list.txt',
          infer_cfg_file='infer_cfg.json',
          device_id=0,
          thread_num=1
          ):
       """
       Args:
           model_dir: str
           device: BaiduAI.EasyEdge.Device,比如:Device.CPU
           engine: BaiduAI.EasyEdge.Engine, 比如: Engine.PADDLE_FLUID
           config_file: str
           preprocess_file: str
           model_file: str
           params_file: str
           label_file: str 标签文件
           infer_cfg_file: 包含预处理、后处理信息的文件
			device_id: int 设备ID
           thread_num: int CPU的线程数

       Raises:
           RuntimeError, IOError
       Returns:
           bool: True if success
       """

使用 NVIDIA GPU 预测时,必须满足:

  • 机器已安装 cuda, cudnn
  • 已正确安装对应 cuda 版本的 paddle 版本
  • 通过设置环境变量FLAGS_fraction_of_gpu_memory_to_use设置合理的初始内存使用比例

使用 CPU 预测时,可以通过在 init 中设置 thread_num 使用多线程预测。如:

pred.init(model_dir=_model_dir, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID, thread_num=1)

预测图像

  • 接口
    def infer_image(self, img,
                   threshold=0.3,
                   channel_order='HWC',
                   color_format='BGR',
                   data_type='numpy'):
       """

       Args:
           img: np.ndarray or bytes
           threshold: float
               only return result with confidence larger than threshold
           channel_order: string
               channel order HWC or CHW
           color_format: string
               color format order RGB or BGR
           data_type: string
               image data type
           
       Returns:
           list

       """
  • 返回格式: [dict1, dict2, ...]
字段 类型 取值 说明
confidence float 0~1 分类或检测的置信度
label string 分类或检测的类别
index number 分类或检测的类别
x1, y1 float 0~1 物体检测,矩形的左上角坐标 (相对长宽的比例值)
x2, y2 float 0~1 物体检测,矩形的右下角坐标(相对长宽的比例值)
mask string/numpy.ndarray 图像分割的mask

关于矩形坐标

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

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

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

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

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

结果示例

  • i) 图像分类
{
    "index": 736,
    "label": "table",
    "confidence": 0.9
}
  • ii) 物体检测
{
    "y2": 0.91211,
    "label": "cat",
    "confidence": 1.0,
    "x2": 0.91504,
    "index": 8,
    "y1": 0.12671,
    "x1": 0.21289
}
  • iii) 图像分割
{
	"name": "cat",
    "score": 1.0,
    "location": {
    	"left": ..., 
    	"top": ..., 
    	"width": ...,
    	"height": ...,
    },
    "mask": ...
}

mask字段中,data_type为numpy时,返回图像掩码的二维数组

{
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}
其中1代表为目标区域,0代表非目标区域

data_type为string时,mask的游程编码,解析方式可参考 demo

预测视频(目前仅限目标跟踪模型调用)

  • 接口
def infer_frame(self, frame, threshold=None):
   """
   视频推理(抽帧之后)
   :param frame:
   :param threshold:
   :return:
   """
  • 返回格式dict
字段 类型 说明
pos dict1 当前帧每一个类别的追踪目标的像素坐标(tlwh)
id dict2 当前帧每一个类别的追踪目标的id
score dict3 当前帧每一个类别的追踪目标的识别置信度
label dict4 class_idx(int)与label(string)的对应关系
class_num int 追踪类别数

预测声音

  • 使用声音分类SDK需要安装额外依赖 pip 安装 resampy pydub 音频默认格式支持wav文件预测,如果需要预测mp3等其他音频格式的数据需要系统额外安装ffmpeg(windows系统的ffmpeg已集成在sdk中无需额外安装,linux系统需要手动安装)
  • 接口
    def infer_sound(self, sound_binary,
                   threshold=0.3):
       """

       Args:
           sound_binary: sound_binary
           threshold: confidence
           
       Returns:
           list

       """
  • 返回格式: [dict1, dict2, ...]
字段 类型 取值 说明
confidence float 0~1 分类的置信度
label string 分类的类别
index number 分类的类别

升级模型

适用于经典版升级模型,执行bash update_model.sh,根据提示,输入模型路径、激活码、模型ID、模型版本,等待模型更新完毕即可。

FAQ

Q: EasyDL 离线 SDK 与云服务效果不一致,如何处理?

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

Q: 运行时报错 "非法指令" 或 " illegal instruction"

A: 可能是 CPU 缺少 avx 指令集支持,请在paddle官网 下载 noavx 版本覆盖安装

Q: NVIDIA GPU预测时,报错显存不足:

A: 如以下错误字样:

paddle.fluid.core.EnforceNotMet: Enforce failed. Expected allocating <= available, but received allocating:20998686233 > available:19587333888.
Insufficient GPU memory to allocation. at [/paddle/paddle/fluid/platform/gpu_info.cc:170]

请在运行 Python 前设置环境变量,通过export FLAGS_fraction_of_gpu_memory_to_use=0.3来限制SDK初始使用的显存量,0.3表示初始使用30%的显存。如果设置的初始显存较小,SDK 会自动尝试 allocate 更多的显存。

Q: 我想使用多线程预测,怎么做?

如果需要多线程预测,可以每个线程启动一个Progam实例,进行预测。 demo.py文件中有相关示例代码。

注意: 对于CPU预测,SDK内部是可以使用多线程,最大化硬件利用率。参考init的thread_num参数。

Q: 运行SDK报错 Authorization failed

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

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

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

export HTTP_PROXY="http://192.168.1.100:8888"
./easyedge_demo ...
情况二:日志显示failed to get/check device id(xxx)或者Device fingerprint mismatch(xxx)

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

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

以及系统相关信息。

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

上一篇
视觉任务服务器端SDK简介
下一篇
视觉任务服务器端LinuxSDK集成文档-C++