图像分类EdgeBoard(FZ)专用SDK集成文档
简介
本文档介绍 EasyEdge/EasyDL在EdgeBoard®边缘计算盒/Lite计算卡上的专用软件的使用流程。
EdgeBoard系列硬件可直接应用于AI项目研发与部署,具有高性能、易携带、通用性强、开发简单等四大优点。
详细硬件参数请在AI市场浏览。
EdgeBoard产品使用手册:https://ai.baidu.com/ai-doc/HWCE/Yk3b86gvp
内核版本
SDK版本 | 对应内核 |
---|---|
0.5.2+ | 1.4 |
0.5.7+ | 1.5 |
SDK升级需配合EdgeBoard硬件内核升级,建议升级内核为SDK对应版本,否则可能出现结果错误或者其他异常。
内核下载地址:https://ai.baidu.com/ai-doc/HWCE/Yk3b95s8o
获取序列号
在EasyEdge/EasyDL生成SDK后,点击获取序列号进入控制台获取。EasyEdge控制台、EasyDL控制台。
如果是在AI市场购买的EdgeBoard-FZ软硬一体方案,也可以在AI市场订单详情获取序列号。
更换序列号、更换设备时,首次使用需要联网激活。激活成功之后,有效期内可离线使用。
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2020.10.29 | 0.5.7 | 预测引擎切换为PaddleLite |
2020.06.23 | 0.5.4 | 支持EasyDL新模型 |
2020.04.23 | 0.5.2 | 引擎升级,支持zu9/zu5/zu3 |
2019.12.27 | 0.4.5 | 引擎升级,支持zu5/zu3,支持EasyDL 高精度检测模型 |
2019.07.25 | 0.4.0 | EdgeBoard SDK Release! |
快速开始
开发者从EasyEdge/EasyDL下载的软件部署包中,包含了简单易用的SDK和Demo。只需简单的几个步骤,即可快速部署运行EdgeBoard计算盒。
部署包文件结构
baidu_easyedge_linux_cpp_aarch64_PADDLEMOBILE_FPGA_v0.4.0_gcc6.2_20190717/
├── demo
│ ├── CMakeLists.txt
│ ├── demo.cpp
│ └── easyedge_serving
├── include
│ ├── easyedge
│ │ └── easyedge.h
└── lib
├── libeasyedge.so -> libeasyedge.so.0.4.0
├── libeasyedge.so.0.4.0
├── libeasyedge_static.a
├── libpaddle-mobile.so
└── libverify.a
Demo使用流程
用户在AI市场购买计算盒之后,请参考以下步骤进行集成和试用。
1. 将计算盒连接电源
指示灯亮起,等待约1分钟。
- 参考EdgeBoard使用文档配置网口或串口连接。登录EdgeBoard计算盒。
- 加载驱动(开机加载一次即可)。
insmod /home/root/workspace/driver/{zu9|zu5|zu3}/fpgadrv.ko
根据购买的版本,选择合适的驱动。若未加载驱动,可能报错:
Failed to to fpga device: -1
- 设置系统时间(系统时间必须正确)
date --set "2019-5-18 20:48:00"
2. (可选)启动HTTP服务
部署包中附带了HTTP服务功能,开发者可以进入SDK根目录,运行easyedge_serving
程序启动HTTP服务。
# ./easyedge_serving {RES目录} {序列号} {绑定的host,默认0.0.0.0} {绑定的端口,默认24401}
cd ${SDK_ROOT}
export LD_LIBRARY_PATH=./lib
./demo/easyedge_serving ../../../RES "1111-1111-1111-1111"
日志显示
2019-07-18 13:27:05,941 INFO [EasyEdge] [http_server.cpp:136] 547974369280 Serving at 0.0.0.0:24401
则启动成功。此时可直接在浏览器中输入http://{EdgeBoard计算盒ip地址}:24401/
,在h5中测试模型效果。
同时,可以调用HTTP接口来访问盒子。具体参考下文接口说明。
EdgeBoard HTTP Server 目前使用的是单线程处理请求。
3. 使用序列号激活
修改demo/demo.cpp,将前面申请的序列号填入:
global_controller()->set_licence_key
4. 编译运行Demo
编译:
cd demo
mkdir build && cd build
cmake .. && make
运行
./easyedge_demo {RES资源文件夹路径} {测试图片路径}
便可看到识别结果。
使用说明
使用流程
首次使用需要联网激活。激活成功之后,有效期内可离线使用。
- 设置序列号
global_controller()->set_licence_key
- 配置
PaddleFluidConfig
- 新建
Predictor
:global_controller()->CreateEdgePredictor(config);
- 初始化
predictor->init()
- 传入图片开始识别
predictor->infer(img, ...);
目前EdgeBoard暂不支持并行多模型计算。
接口说明
预测图片
/**
* @brief 同步预测接口
* inference synchronous
* Supported by most chip and engine
* @param image: must be BGR , HWC format (opencv default)
* @param result
* @param threshold
* @return
*/
virtual int infer(
cv::Mat &image, std::vector<EdgeResultData> &result, float threshold = 0.1
) = 0;
识别结果说明
EdgeResultData
中可以获取对应的分类信息、位置信息。
struct EdgeResultData {
int index; // 分类结果的index
std::string label; // 分类结果的label
float prob; // 置信度
// object detection field
float x1, y1, x2, y2; // (x1, y1): 左上角, (x2, y2): 右下角; 均为0~1的长宽比例值。
};
关于矩形坐标
x1 * 图片宽度 = 检测框的左上角的横坐标
y1 * 图片高度 = 检测框的左上角的纵坐标
x2 * 图片宽度 = 检测框的右下角的横坐标
y2 * 图片高度 = 检测框的右下角的纵坐标
可以参考demo文件中使用opencv绘制矩形的逻辑。
HTTP 私有服务请求说明
http 请求参数
URL中的get参数:
参数 | 说明 | 默认值 |
---|---|---|
threshold | 阈值过滤, 0~1 | 0.1 |
HTTP POST Body即为图片的二进制内容(无需base64, 无需json)
Python请求示例
import requests
with open('./1.jpg', 'rb') as f:
img = f.read()
result = requests.post(
'http://127.0.0.1:24401/',
params={'threshold': 0.1},
data=img).json()
http 返回数据
字段 | 类型说明 | 其他 |
---|---|---|
error_code | Number | 0为成功,非0参考message获得具体错误信息 |
results | Array | 内容为具体的识别结果。其中字段的具体含义请参考预测图像-返回格式 一节 |
cost_ms | Number | 预测耗时ms,不含网络交互时间 |
返回示例
{
"cost_ms": 52,
"error_code": 0,
"results": [
{
"confidence": 0.94482421875,
"index": 1,
"label": "IronMan",
"x1": 0.059185408055782318,
"x2": 0.18795496225357056,
"y1": 0.14762254059314728,
"y2": 0.52510076761245728
},
{
"confidence": 0.94091796875,
"index": 1,
"label": "IronMan",
"x1": 0.79151463508605957,
"x2": 0.92310667037963867,
"y1": 0.045728668570518494,
"y2": 0.42920106649398804
}
]
}
错误说明
SDK所有主动报出的错误,均覆盖在EdgeStatus
枚举中。同时SDK会有详细的错误日志,开发者可以打开Debug日志查看额外说明:
EdgeLogConfig log_config;
log_config.enable_debug = true;
global_controller()->set_log_config(log_config);
FAQ
1. 如何处理一些 undefined reference?
如:undefined reference to `curl_easy_setopt@CURL_OPENSSL_3'
可以通过安装libcurl3 libcurl-openssl1.0-dev
来解决。
如果开发者想不想使用低版本的openssl(如Ubuntu 18.04), 可以link静态库easyedge_static.a
,自己指定需要的Library的版本。
示例:修改CMakeList.txt
find_package(CURL REQUIRED)
target_link_libraries(easyedge_demo ${OpenCV_LIBS} easyedge_static pthread ${CURL_LIBRARIES} paddle-mobile)
2. error while loading shared libraries: libeasyedge.so.0.4.0: cannot open shared object file: No such file or directory
类似错误包括libpaddle-mobile.so
找不到。
直接运行SDK自带的二进制可能会有这个问题,设置LD_LIBRARY_PATH为SDK部署包中的lib目录即可。 开发者自行使用CMake编译的二进制可以有效管理.so的依赖。
2. curl_easy_perform failed: Couldn't resolve host name
首次使用需要联网激活。 激活后,未联网状态可能会有类似日志,可以忽略。
3. 使用libcurl请求http服务时,速度明显变慢
这是因为libcurl请求continue导致server等待数据的问题,添加空的header即可
headers = curl_slist_append(headers, "Expect:");
4. 预测过程中报内存不足“Killed”
此问题仅出现在ZU5,因为FZ5A带vcu,给他预留的内存过大导致,如果用不到VCU可以把这部分改小。修改/run/media/mmcblk1p1/uEnv.txt:
ethaddr=00:0a:35:00:00:09
uenvcmd=fatload mmc 1 0x3000000 image.ub && bootm 0x3000000
bootargs=earlycon console=ttyPS0,115200 clk_ignore_unused cpuidle.off=1 root=/dev/mmcblk1p2 rw rootwait cma=128M
注意中间空行要保留。
5. 预测结果异常
如果购买的计算盒较早,驱动文件较旧,先更新驱动,否则可能导致结果异常。参考“内核版本”小节。
6. 编译过程报错file format not recognized
libeasyedge.so: file format not recognized; treating as linker script
下载的SDK zip包需要放到板子内部后,再解压、编译。
7. 提示 driver_version(1.4.0) not match paddle_lite_version(1.5.1)
需更新驱动,否则可能导致结果异常。参考“内核版本”小节。