物体检测LinuxSDK集成文档-Python
简介
本文档介绍 EasyDL 的 Linux Python SDK 的使用方法,适用于 EasyDL 通用版和BML。
- 网络类型支持:图像分类,物体检测
-
硬件支持:
- Intel Movidius MyRIAD2 / MyRIAD X / IGPU
- 瑞芯微 RK3399Pro
- 语言支持: Intel Movidius MyRIAD2 / MyRIAD X / IGPU: Python 3.5, 3.6, 3.7 瑞芯微 RK3399Pro: Python 3.6
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2022.10.27 | 1.3.5 | 新增Armv7 CPU、Armv8 CPU、Jetson、华为昇腾Atlas开发板对应Python SDK,支持图像分类、物体检测、人脸检测、实例分割;新增 Intel IGPU 支持 |
2022.05.18 | 1.3.0 | 新增RK3399Pro NPU对应Python SDK,支持图像分类、物体检测 |
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.01.16 | 1.1.12 | 预测函数默认使用推荐阈值 |
2019.12.26 | 1.1.11 | EasyDL 专业版支持加速棒 |
2019.10.21 | 1.1.9 | 支持 EasyDL 专业版 |
2019.07.19 | 1.1.7 | 提供模型更新工具 |
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 依赖了不同的底层引擎。根据所需自行安装。
依赖说明:Intel Movidius 加速棒
使用Intel Movidius
加速棒 SDK、Intel IGPU
预测时,必须安装 OpenVINO 预测引擎,两种方式:
- 使用 OpenVINO™ toolkit 安装,请参考 OpenVINO toolkit 文档安装 2020.3.1LTS(必须)版本, 安装时可忽略
Configure the Model Optimizer
及后续部分。 -
使用源码编译安装,请参考 Openvino Inference Engine文档编译安装 2020.3.1(必须)版本。
安装完毕,运行之前,请按照OpenVinono的文档 设置环境变量
source /opt/intel/openvino/bin/setupvars.sh
依赖说明:RK3399Pro
所有用例基于 Npu driver版本1.7.3的RK3399pro开发板测试通过 查看RK3399Pro板上driver版本方法:运行sdk内提供demo项目,日志里会提供API和Driver版本信息
升级399Pro driver版本参考瑞芯微github:https://github.com/airockchip/RK3399Pro_npu
2. 安装 easyedge python wheel 包
安装说明:Intel Movidius 加速棒 / Intel IGPU
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_x86_64.whl
具体名称以 SDK 包中的 whl 为准。
安装说明:RK3399Pro
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_aarch64.whl
pip3 install -U EasyEdge_Devkit_RK3399Pro-{版本号}-cp36-cp36m-linux_aarch64.whl
具体名称以 SDK 包中的 whl 为准,特别注意这里要同时安装两个whl包
安装说明:ArmV7 CPU
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_armv7l.whl
pip3 install -U EasyEdge_Devkit_ARM-{版本号}-cp36-cp36m-linux_armv7l.whl
安装说明:ArmV8 CPU (Aarch64 CPU)
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_aarch64.whl
pip3 install -U EasyEdge_Devkit_ARM-{版本号}-cp36-cp36m-linux_aarch64.whl
安装说明:Jetson SDK
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_aarch64.whl
pip3 install -U EasyEdge_Devkit_JetPack{版本号}-{版本号}-cp36-cp36m-linux_aarch64.whl
安装说明:华为昇腾Atlas开发板
pip3 install -U BaiduAI_EasyEdge_SDK-{版本号}-cp36-cp36m-linux_aarch64.whl
EasyEdge_Devkit_Atlas200-{版本号}-cp36-cp36m-linux_aarch64.whl
3. 使用序列号激活
获取序列号
修改demo.py
填写序列号
pred = edge.Program()
pred.set_auth_license_key("这里填写序列号")
默认情况下(联网激活或者离线激活的场景),按照上述说明正确设置序列号即可,如果是实例数鉴权模式(请在百度智能云控制台再次确认自己的序列号是实例数鉴权模式,仅实例数鉴权需要进行下面的设置),需要调用函数指定实例数鉴权模式,并且实例数鉴权模式下,支持指定license证书更新时间,单位是秒,要求设置为大于20的整数,否则会采用默认的license更新时间,参考
pred.set_instance_auth_mode()
pred.set_instance_update_interval(200)
4. 测试 Demo
输入对应的模型文件夹(默认为RES
)和测试图片路径,运行:
python3 demo.py {model_dir} {image_name.jpg}
测试效果:
使用说明
使用流程
import BaiduAI.EasyEdge as edge
pred = edge.Program()
pred.set_auth_license_key("这里填写序列号")
pred.init(model_dir={RES文件夹路径}, device=edge.Device.MOVIDIUS, engine=edge.Engine.OPENVINO)
pred.infer_image({numpy.ndarray的图片})
pred.close()
初始化
- 接口
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
"""
预测图像
- 接口
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
升级模型
适用于经典版升级模型,执行bash update_model.sh
,根据提示,输入模型路径、激活码、模型ID、模型版本,等待模型更新完毕即可。
FAQ
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 目录
,再重新激活。
情况三:ArmV7、ArmV8 CPU、Jetson、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路径的方法如下(以Atlas SDK为例,其他SDK查找方法类似):
pip3 show EasyEdge-Devkit-Atlas200 # 结果中会显示 Location 路径,也就是包的安装路径
# libs和thirdpartylibs两个路径在 Location 所指示的路径 easyedge_CANN 子文件夹下