视觉任务服务器端WindowsSDK集成文档
简介
本文档介绍Windows GPU SDK的使用方法。
- 网络类型支持:图像分类,物体检测,图像分割、声音分类
-
硬件支持:
- NVIDIA GPU (普通版,加速版)
-
操作系统支持
- 64位 Windows 7 及以上
- 64位Windows Server 2012及以上
-
环境依赖(必须安装以下版本)
- .NET Framework 4.5
- Visual C++ Redistributable Packages for Visual Studio 2013
- Visual C++ Redistributable Packages for Visual Studio 2015
-
GPU非目标跟踪基础版(EasyEdge-win-x86-nvidia-gpu)依赖(必须安装以下版本)
- CUDA 9.0.x + cuDNN 7.6.x 或者 CUDA 10.0.x + cuDNN 7.6.x 或者 CUDA 11.0.x + cuDNN 8.0.x
-
GPU目标跟踪基础版(EasyEdge-win-x86-nvidia-gpu-torch)依赖(必须安装以下版本)
- CUDA 11.0.x + cuDNN 8.0.x
-
GPU加速版(EasyEdge-win-x86-nvidia-gpu-tensorrt)依赖(必须安装以下版本)
- CUDA 9.0.x + cuDNN 7.6.x 或者 CUDA 10.0.x + cuDNN 7.6.x
- TensorRT 7.x 必须和CUDA版本对应
-
GPU加速版(EasyEdge-win-x86-nvidia-gpu-paddletrt)依赖(必须安装以下版本)
- CUDA 11.0.x + cuDNN 8.0.x
- TensorRT 7.1.3.4 必须和CUDA版本对应
-
协议
- HTTP
- 更详细的环境说明可参考SDK内的README.md
Release Notes
时间 | 版本 | 说明 |
---|---|---|
2022-10-27 | 1.7.1 | GPU底层引擎升级,下线基础版CUDA10.0及以下版本支持 |
2022-09-15 | 1.7.0 | 优化模型算法;GPU CUDA9.0 CUDA10.0 标记为待废弃状态 |
2022-07-28 | 1.6.0 | 优化模型算法 |
2022-05-27 | 1.5.1 | 新增支持BML Cloud小目标检测模型 |
2022-05-18 | 1.5.0 | 修复各别机器下程序崩溃的问题 |
2022-04-25 | 1.4.1 | EasyDL, BML升级支持paddle2模型 |
2022-03-25 | 1.4.0 | 优化模型算法 |
2021-12-22 | 1.3.5 | GPU基础版推理引擎优化升级;GPU加速版支持自定义模型文件缓存路径;demo程序优化环境依赖检测 |
2021-10-20 | 1.3.4 | 修复已知问题 |
2021-08-19 | 1.3.2 | 新增支持EasyDL小目标检测,新增DEMO二进制文件 |
2021-06-29 | 1.3.1 | 预测引擎升级 |
2021-05-13 | 1.3.0 | 模型发布新增多种加速方案选择;目标追踪支持x86平台的GPU及加速版;展示已发布模型性能评估报告 |
2021-04-08 | 1.2.3 | 支持BML平台模型仓库本地上传模型 |
2021-03-09 | 1.2.2 | 修复已知问题 |
2021-01-27 | 1.2.1 | 新增模型支持;性能优化;问题修复 |
2020-12-18 | 1.2.0 | 推理引擎升级 |
2020-11-26 | 1.1.20 | 新增一些模型的加速版支持 |
2020-10-29 | 1.1.19 | 修复已知问题 |
2020-09-17 | 1.1.18 | 支持更多模型 |
2020.08.11 | 1.1.17 | 支持专业版更多模型 |
2020.06.23 | 1.1.16 | 支持专业版更多模型 |
2020.05.15 | 1.1.15 | 更新加速版tensorrt版本,支持高精度检测 |
2020.03.13 | 1.1.14 | 支持声音分类 |
2020.02.23 | 1.1.13 | 支持多阶段模型 |
2020.01.16 | 1.1.12 | 预测默认使用推荐阈值 |
2019.12.26 | 1.1.11 | 支持物体检测高精度算法的CPU加速版,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 | 第一版! |
快速开始
1. 安装依赖
安装.NET Framework4.5
1https://www.microsoft.com/zh-CN/download/details.aspx?id=42642
Visual C++ Redistributable Packages for Visual Studio 2013
1https://www.microsoft.com/zh-cn/download/details.aspx?id=40784
Visual C++ Redistributable Packages for Visual Studio 2015
1https://www.microsoft.com/zh-cn/download/details.aspx?id=48145
如果使用GPU版SDK,请安装CUDA + cuDNN
1https://developer.nvidia.com/cuda
2https://developer.nvidia.com/cudnn
如果使用GPU版加速版SDK(EasyEdge-win-x86-nvidia-gpu-tensorrt),请安装TensorRT
1https://developer.nvidia.com/tensorrt
2
3根据cuda版本下载:
4cuda9.0: TensorRT-7.0.0.11.Windows10.x86_64.cuda-9.0.cudnn7.6
5cuda10.0: TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.0.cudnn7.6
6cuda10.2: 不支持,请降级为cuda10.0
7
8下载后把lib目录下的所有dll,拷贝到SDK的dll目录下
如果使用GPU版加速版SDK(EasyEdge-win-x86-nvidia-gpu-paddletrt),请安装TensorRT
1https://developer.nvidia.com/tensorrt
2
3根据cuda版本下载:
4cuda11.0: TensorRT-7.1.3.4.Windows10.x86_64.cuda-11.0.cudnn8.0
5
6下载后把lib目录下的所有dll,拷贝到SDK的dll目录下
如果使用声音分类,请安装以下依赖
1· 安装six
2打开cmd,进入sdk包所在目录。执行EasyEdge-win-mXXXX-x86-nvidia-gpu\python37\python.exe -m pip install -U six -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
3
4· 安装librosa
5打开cmd,进入sdk包所在目录。执行EasyEdge-win-mXXXX-x86-nvidia-gpu\python37\python.exe -m pip install -U librosa -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
注意事项
- 安装目录不能包含中文
- Windows Server 请自行开启,选择“我的电脑”——“属性”——“管理”——”添加角色和功能“——勾选”桌面体验“,点击安装,安装之后重启即可。
2. 运行离线SDK
解压下载好的SDK,SDK默认使用cuda9版本,如果需要cuda10请运行EasyEdge CUDA10.0.bat切换到cuda10版本,之后打开EasyEdge.exe,输入Serial Num
点击"启动服务",等待数秒即可启动成功,本地服务默认运行在
1http://127.0.0.1:24401/
其他任何语言只需通过HTTP调用即可。
Demo示例(以图像服务为例)
服务运行成功,此时可直接在浏览器中输入http://127.0.0.1:24401
,在h5中测试模型效果。
使用说明
图像服务调用说明
Python 使用示例代码如下
1import requests
2
3with open('./1.jpg', 'rb') as f:
4 img = f.read()
5
6## params 为GET参数 data 为POST Body
7result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
8 data=img).json()
C# 使用示例代码如下
1FileStream fs = new FileStream("./img.jpg", FileMode.Open);
2BinaryReader br = new BinaryReader(fs);
3byte[] img = br.ReadBytes((int)fs.Length);
4br.Close();
5fs.Close();
6string url = "http://127.0.0.1:8402?threshold=0.1";
7HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
8request.Method = "POST";
9Stream stream = request.GetRequestStream();
10stream.Write(img, 0, img.Length);
11stream.Close();
12
13WebResponse response = request.GetResponse();
14StreamReader sr = new StreamReader(response.GetResponseStream());
15Console.WriteLine(sr.ReadToEnd());
16sr.Close();
17response.Close();
C++ 使用示例代码如下,需要安装curl
1#include <sys/stat.h>
2#include <curl/curl.h>
3
4#define S_ISREG(m) (((m) & 0170000) == (0100000))
5#define S_ISDIR(m) (((m) & 0170000) == (0040000))
6
7int main(int argc, char *argv[]) {
8 const char *post_data_filename = "./img.jpg";
9
10 FILE *fp = NULL;
11 struct stat stbuf = { 0, };
12
13 fp = fopen(post_data_filename, "rb");
14
15 if (!fp) {
16 fprintf(stderr, "Error: failed to open file \"%s\"\n", post_data_filename);
17 return -1;
18 }
19
20 if (fstat(fileno(fp), &stbuf) || !S_ISREG(stbuf.st_mode)) {
21 fprintf(stderr, "Error: unknown file size \"%s\"\n", post_data_filename);
22 return -1;
23 }
24
25 CURL *curl;
26 CURLcode res;
27
28 curl_global_init(CURL_GLOBAL_ALL);
29
30 curl = curl_easy_init();
31 if (curl != NULL) {
32 curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:24401?threshold=0.1");
33 curl_easy_setopt(curl, CURLOPT_POST, 1L);
34 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,(curl_off_t)stbuf.st_size);
35 curl_easy_setopt(curl, CURLOPT_READDATA, (void *)fp);
36
37 res = curl_easy_perform(curl);
38 if (res != CURLE_OK) {
39 fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
40 }
41 curl_easy_cleanup(curl);
42 }
43 curl_global_cleanup();
44 fclose(fp);
45
46 return 0;
47}
请求参数
字段 | 类型 | 取值 | 说明 |
---|---|---|---|
threshold | float | 0 ~ 1 | 置信度阈值 |
HTTP POST Body直接发送图片二进制。
返回参数
字段 | 类型 | 取值 | 说明 |
---|---|---|---|
confidence | float | 0~1 | 分类或检测的置信度 |
label | string | 分类或检测的类别 | |
index | number | 分类或检测的类别 | |
x1, y1 | float | 0~1 | 物体检测,矩形的左上角坐标 (相对长宽的比例值) |
x2, y2 | float | 0~1 | 物体检测,矩形的右下角坐标(相对长宽的比例值) |
关于矩形坐标
x1 * 图片宽度 = 检测框的左上角的横坐标
y1 * 图片高度 = 检测框的左上角的纵坐标
x2 * 图片宽度 = 检测框的右下角的横坐标
y2 * 图片高度 = 检测框的右下角的纵坐标
图像分割
返回结果格式参考API调用文档 代码参考 https://github.com/Baidu-AIP/EasyDL-Segmentation-Demo
声音服务调用说明
Python 使用示例代码如下
1import requests
2
3with open('./1.mp3', 'rb') as f:
4 audio = f.read()
5
6## params 为GET参数 data 为POST Body
7result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
8 data=audio).json()
C# 使用示例代码如下
1FileStream fs = new FileStream("./audio.mp3", FileMode.Open);
2BinaryReader br = new BinaryReader(fs);
3byte[] audio = br.ReadBytes((int)fs.Length);
4br.Close();
5fs.Close();
6string url = "http://127.0.0.1:8402?threshold=0.1";
7HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
8request.Method = "POST";
9Stream stream = request.GetRequestStream();
10stream.Write(audio, 0, audio.Length);
11stream.Close();
12
13WebResponse response = request.GetResponse();
14StreamReader sr = new StreamReader(response.GetResponseStream());
15Console.WriteLine(sr.ReadToEnd());
16sr.Close();
17response.Close();
C++ 使用示例代码如下,需要安装curl
1#include <sys/stat.h>
2#include <curl/curl.h>
3
4int main(int argc, char *argv[]) {
5 const char *post_data_filename = "./audio.mp3";
6
7 FILE *fp = NULL;
8 struct stat stbuf = { 0, };
9
10 fp = fopen(post_data_filename, "rb");
11
12 if (!fp) {
13 fprintf(stderr, "Error: failed to open file \"%s\"\n", post_data_filename);
14 return -1;
15 }
16
17 if (fstat(fileno(fp), &stbuf) || !S_ISREG(stbuf.st_mode)) {
18 fprintf(stderr, "Error: unknown file size \"%s\"\n", post_data_filename);
19 return -1;
20 }
21
22 CURL *curl;
23 CURLcode res;
24
25 curl_global_init(CURL_GLOBAL_ALL);
26
27 curl = curl_easy_init();
28 if (curl != NULL) {
29 curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:24401?threshold=0.1");
30 curl_easy_setopt(curl, CURLOPT_POST, 1L);
31 curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,(curl_off_t)stbuf.st_size);
32 curl_easy_setopt(curl, CURLOPT_READDATA, (void *)fp);
33
34 res = curl_easy_perform(curl);
35 if (res != CURLE_OK) {
36 fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
37 }
38 curl_easy_cleanup(curl);
39 }
40 curl_global_cleanup();
41 fclose(fp);
42
43 return 0;
44}
请求参数
字段 | 类型 | 取值 | 说明 |
---|---|---|---|
threshold | float | 0 ~ 1 | 置信度阈值 |
HTTP POST Body直接发送声音二进制。
返回参数
字段 | 类型 | 取值 | 说明 |
---|---|---|---|
confidence | float | 0~1 | 分类或检测的置信度 |
label | string | 分类或检测的类别 | |
index | number | 分类或检测的类别 |
集成指南
基于HTTP集成
通过EasyEdge.exe启动服务后,参照上面的调用说明,通过HTTP请求集成到自己的服务中
基于c++ dll集成
集成前提
解压开的SDK包中包含src、lib、dll、include四个目录才支持基于c++ dll集成
集成方法
参考src目录中的CMakeLists.txt进行集成
基于c# dll集成
集成前提
解压开的SDK包中包含src\demo_serving_csharp、dll两个目录才支持基于c# dll集成
集成方法
参考src\demo_serving_csharp目录中的CMakeLists.txt进行集成
FAQ
1. 服务启动失败,怎么处理?
请确保相关依赖都安装正确,版本必须如下: .NET Framework 4.5 Visual C++ Redistributable Packages for Visual Studio 2013 * Visual C++ Redistributable Packages for Visual Studio 2015
GPU依赖,版本必须如下: * CUDA 9.0.x + cuDNN 7.6.x 或者 CUDA 10.0.x + cuDNN 7.6.x
GPU加速版(EasyEdge-win-x86-nvidia-gpu-tensorrt)依赖,版本必须如下: CUDA 9.0.x + cuDNN 7.6.x 或者 CUDA 10.0.x + cuDNN 7.6.x TensorRT 7.x 必须和CUDA版本对应
GPU加速版(EasyEdge-win-x86-nvidia-gpu-paddletrt)依赖,版本必须如下: CUDA 11.0.x + cuDNN 8.0.x TensorRT 7.1.3.4 必须和CUDA版本对应
2. 服务调用时返回为空,怎么处理?
调用输入的图片必须是RGB格式,请确认是否有alpha通道。
3. 多个模型怎么同时使用?
SDK设置运行不同的端口,点击运行即可。
4. JAVA、C#等其他语言怎么调用SDK?
参考 https://ai.baidu.com/forum/topic/show/943765
5. 启动失败,缺失DLL?
打开EasyEdge.log,查看日志错误,根据提示处理 缺失DLL,请使用 https://www.dependencywalker.com/ 查看相应模块依赖DLL缺失哪些,请自行下载安装
6. 启动失败,报错NotDecrypted?
Windows下使用,当前用户名不能为中文,否则无法正确加载模型。
7. 启动失败,报错 SerialNum无效
日志显示failed to get/check device id(xxx)
或者Device fingerprint mismatch(xxx)
此类情况一般是设备指纹发生了变更,包括(但不局限于)以下可能的情况:
- mac 地址变化
- 磁盘变更
- bios重刷
以及系统相关信息。
遇到这类情况,请确保硬件无变更,如果想更换序列号,请先删除 C:\Users\${用户名}\.baidu\easyedge 目录
,再重新激活。
其他问题
如果无法解决,可到论坛发帖: https://ai.baidu.com/forum/topic/list/199 描述使用遇到的问题,我们将及时回复您的问题。