图像分类服务器端SDK集成文档-Linux-Python
简介
本文档介绍 EasyDL 的 Linux Python SDK 的使用方法,适用于 EasyDL 和 BML。
EasyDL 通用版:
- 网络类型支持:图像分类,物体检测,图像分割,声音分类,表格预测
-
硬件支持:
- Linux x86_64 CPU (基础版,加速版)
- Linux x86_64 Nvidia GPU (基础版,加速版)
- 语言支持:Python 3.5, 3.6, 3.7, 3.8, 3.9
BML:
- 网络类型支持:图像分类,物体检测,声音分类,表格预测
-
硬件支持:
- Linux x86_64 CPU (基础版)
- Linux x86_64 Nvidia GPU (基础版)
- 语言支持:Python 3.5, 3.6, 3.7,3.8,3.9
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2023-03-16 | 1.3.7 | 迭代升级,新增支持文本类模型; 新增GPU 多卡多进程推理demo |
2022.10.27 | 1.3.5 | 新增华为Atlas300、飞腾Atlas300 Python SDK,支持图像分类、物体检测、人脸检测、实例分割 |
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 installBaiduAI_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 为准。
安装说明:华为 Atlas300
除了需要安装BaiduAI_EasyEdge_SDK包,还需安装
pip3 install -U EasyEdge_Devkit_Atlas300-{版本号}-cp36-cp36m-linux_x86_64.whl
安装说明:飞腾 Atlas300
除了需要安装BaiduAI_EasyEdge_SDK包,还需安装
pip3 install -U EasyEdge_Devkit_Phytium.Atlas-{版本号}-cp36-cp36m-linux_aarch64.whl
3. 使用序列号激活
获取序列号
修改demo.py
填写序列号
pred = edge.Program()
pred.set_auth_license_key("这里填写序列号")
4. GPU 加速版
使用 GPU 加速版,在安装完 whl 之后,必须:
- 从这里下载 TensorRT7.0.0.11 for cuda9.0,并把解压后的 lib 放到 C++ SDK 的 lib 目录或系统 lib 目录
- 运行时,必须在系统库路径中包含 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}
5.3 表格预测
输入对应模型文件夹(默认为RES
)和测试数据地址(csv文件地址),运行:
python3 demo.py {model_dir} {/xxx/xxx.csv}
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 | 分类的类别 |
表格预测
- 考虑到表格字段内容和长度的不固定性,我们建议您参考“校验服务”页面提供的详细信息。您可以访问该页面:https://ai.baidu.com/easydl/app/validate/ml/models/verify,并从中复制数据请求的 Body 部分作为参考模板。这将帮助您理解如何灵活处理各种不同的字段。
- 接口
def infer_csv(self, data):
"""
结构化数据推理
Args:
data: pd.DataFrame or list or dict
Returns:
"""
- 返回格式: list 接口直接反馈预测结果数组
升级模型
适用于经典版升级模型,执行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 目录
,再重新激活。
情况三:Atlas Python SDK日志提示ImportError: libavformat.so.58: cannot open shared object file: No such file or directory
或者其他类似so找不到
可以在LD_LIBRARY_PATH环境变量加上libs和thirdpartylibs路径,例如
export LD_LIBRARY_PATH=/xxx/libs:/xxx/thirdpartylibs:$LD_LIBRARY_PATH # tips: 这里/xxx需要替换为真实路径,/xxx路径查找方法如下
查找安装包内libs和thirdpartylibs路径的方法如下(以华为Atlas300 SDK为例,其他SDK查找方法类似):
pip3 show EasyEdge-Devkit-Atlas300 # 结果中会显示 Location 路径,也就是包的安装路径
# libs和thirdpartylibs两个路径在 Location 所指示的路径 easyedge_CANN 子文件夹下