Linux集成文档-Python
简介
本文档介绍Linux Python SDK 的使用方法。
- 网络类型支持:图像分类,物体检测
-
硬件支持:
- Linux x86_64 CPU
- Linux x86_64 Nvidia GPU
- 语言支持:Python 3.5, 3.6, 3.7
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2021.8.23 | 1.0.0 | 第一版! |
快速开始
1. 安装依赖
- 根据引擎的不同,SDK 依赖了不同的底层引擎。根据所需自行安装。
安装 paddlepaddle
- 使用
x86_64 CPU
预测时必须安装:
pip3 install -U paddlepaddle
若 CPU 为特殊型号,如赛扬处理器(一般用于深度定制的硬件中),请关注 CPU 是否支持 avx 指令集。如果不支持,请在paddle官网安装 noavx 版本
- 使用
NVIDIA GPU
预测时必须安装:
pip3 install -U paddlepaddle-gpu
如果环境非 cuda9 cudnn7,请参考paddle文档安装合适的 paddle 版本。 不被 paddle 支持的 cuda 和 cudnn 版本,EasyEdge 暂不支持
2. 安装 easyedge python wheel 包
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_x86_64.whl
具体名称以 SDK 包中的 whl 为准。
3. 测试 Demo
图片预测
输入对应的模型文件夹(默认为RES
)和测试图片路径,运行:
python3 demo.py {model_dir} {image_name.jpg}
测试效果:
4. 测试Demo HTTP 服务
输入对应的模型文件夹(默认为RES
)、序列号、设备ip和指定端口号,运行:
python3 demo_serving.py {model_dir} "" {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.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文件夹路径})
# 请参考同级目录下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.LOCAL,
engine=Engine.PADDLE_FLUID,
config_file='conf.json',
preprocess_file='preprocess_args.json',
model_file='model',
params_file='params',
graph_file='graph.ncsmodel',
label_file='label_list.txt',
device_id=0
):
"""
Args:
device: Device.CPU
engine: Engine.PADDLE_FLUID
model_dir: str
model dir
preprocess_file: str
model_file: str
params_file: str
graph_file: str
label_file: str
device_id: int
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
}
FAQ
1. 运行时报错 "非法指令" 或 " illegal instruction"
可能是 CPU 缺少 avx 指令集支持,请在paddle官网 下载 noavx 版本覆盖安装
2. NVIDIA GPU预测时,报错显存不:
如以下错误字样:
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 更多的显存。
3. 我想使用多线程预测,怎么做?
如果需要多线程预测,可以每个线程启动一个Progam实例,进行预测。 demo.py文件中有相关示例代码。
注意: 对于CPU预测,SDK内部是可以使用多线程,最大化硬件利用率。参考init的thread_num参数。