所有文档

          EasyDL定制AI训练平台

          经典版图像分割服务器端SDK集成文档-Windows

          简介

          本文档介绍Windows GPU SDK的使用方法。

          • 网络类型支持:图像分类,物体检测,图像分割、声音分类
          • 硬件支持:

            • NVIDIA GPU (普通版,加速版)
          • 操作系统支持

            • 64位 Windows 7 及以上
          • 环境依赖(必须安装以下版本)

            • .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加速版依赖(必须安装以下版本)

            • TensorRT 7.x 必须和CUDA版本对应
          • 协议

            • HTTP

          Release Notes

          时间 版本 说明
          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

          https://www.microsoft.com/zh-CN/download/details.aspx?id=42642

          Visual C++ Redistributable Packages for Visual Studio 2013

          https://www.microsoft.com/zh-cn/download/details.aspx?id=40784

          Visual C++ Redistributable Packages for Visual Studio 2015

          https://www.microsoft.com/zh-cn/download/details.aspx?id=48145

          如果使用GPU版SDK,请安装CUDA + cuDNN

          https://developer.nvidia.com/cuda
          https://developer.nvidia.com/cudnn 

          如果使用GPU版加速版SDK,请安装TensorRT

          https://developer.nvidia.com/tensorrt
          
          根据cuda版本下载:
          cuda9.0: TensorRT-7.0.0.11.Windows10.x86_64.cuda-9.0.cudnn7.6
          cuda10.0: TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.0.cudnn7.6
          cuda10.2: 不支持,请降级为cuda10.0
          
          下载后把lib目录下的所有dll,拷贝到SDK的python37目录下

          注意事项

          1. 安装目录不能包含中文
          2. Windows Server 请自行开启,选择“我的电脑”——“属性”——“管理”——”添加角色和功能“——勾选”桌面体验“,点击安装,安装之后重启即可。

          2. 运行离线SDK

          解压下载好的SDK,SDK默认使用cuda9版本,如果需要cuda10请运行EasyEdge CUDA10.0.bat切换到cuda10版本,之后打开EasyEdge.exe,输入Serial Num 点击"启动服务",等待数秒即可启动成功,本地服务默认运行在

          http://127.0.0.1:24401/

          其他任何语言只需通过HTTP调用即可。

          Demo示例(以图像服务为例)

          服务运行成功,此时可直接在浏览器中输入http://127.0.0.1:24401,在h5中测试模型效果。

          使用说明

          图像服务调用说明

          Python 使用示例代码如下

          import requests
          
          with open('./1.jpg', 'rb') as f:
              img = f.read()
          
          ## params 为GET参数 data 为POST Body
          result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
                                                            data=img).json()

          C# 使用示例代码如下

          FileStream fs = new FileStream("./img.jpg", FileMode.Open);
          BinaryReader br = new BinaryReader(fs);
          byte[] img = br.ReadBytes((int)fs.Length);
          br.Close();
          fs.Close();
          string url = "http://127.0.0.1:8402?threshold=0.1";
          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
          request.Method = "POST";
          Stream stream = request.GetRequestStream();
          stream.Write(img, 0, img.Length);
          stream.Close();
          
          WebResponse response = request.GetResponse();
          StreamReader sr = new StreamReader(response.GetResponseStream());
          Console.WriteLine(sr.ReadToEnd());
          sr.Close();
          response.Close();

          C++ 使用示例代码如下,需要安装curl

          #include <sys/stat.h>
          #include <curl/curl.h>
          
          int main(int argc, char *argv[]) {
              const char *post_data_filename = "./img.jpg";
          
              FILE *fp = NULL;
              struct stat stbuf = { 0, };
          
              fp = fopen(post_data_filename, "rb");
          
              if (!fp) {
                  fprintf(stderr, "Error: failed to open file \"%s\"\n", post_data_filename);
                  return -1;
              }
          
              if (fstat(fileno(fp), &stbuf) || !S_ISREG(stbuf.st_mode)) {
                  fprintf(stderr, "Error: unknown file size \"%s\"\n", post_data_filename);
                  return -1;
              }
          
              CURL *curl;
              CURLcode res;
          
              curl_global_init(CURL_GLOBAL_ALL);
          
              curl = curl_easy_init();
              if (curl != NULL) {
                  curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:24401?threshold=0.1");
                  curl_easy_setopt(curl, CURLOPT_POST, 1L);
                  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,(curl_off_t)stbuf.st_size);
                  curl_easy_setopt(curl, CURLOPT_READDATA, (void *)fp);
          
                  res = curl_easy_perform(curl);
                  if (res != CURLE_OK) {
                      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
                  }
                  curl_easy_cleanup(curl);
              }
              curl_global_cleanup();
              fclose(fp);
          
              return 0;
          }

          请求参数

          字段 类型 取值 说明
          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 使用示例代码如下

          import requests
          
          with open('./1.mp3', 'rb') as f:
              audio = f.read()
          
          ## params 为GET参数 data 为POST Body
          result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1},
                                                            data=audio).json()

          C# 使用示例代码如下

          FileStream fs = new FileStream("./audio.mp3", FileMode.Open);
          BinaryReader br = new BinaryReader(fs);
          byte[] audio = br.ReadBytes((int)fs.Length);
          br.Close();
          fs.Close();
          string url = "http://127.0.0.1:8402?threshold=0.1";
          HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
          request.Method = "POST";
          Stream stream = request.GetRequestStream();
          stream.Write(audio, 0, audio.Length);
          stream.Close();
          
          WebResponse response = request.GetResponse();
          StreamReader sr = new StreamReader(response.GetResponseStream());
          Console.WriteLine(sr.ReadToEnd());
          sr.Close();
          response.Close();

          C++ 使用示例代码如下,需要安装curl

          #include <sys/stat.h>
          #include <curl/curl.h>
          
          int main(int argc, char *argv[]) {
              const char *post_data_filename = "./audio.mp3";
          
              FILE *fp = NULL;
              struct stat stbuf = { 0, };
          
              fp = fopen(post_data_filename, "rb");
          
              if (!fp) {
                  fprintf(stderr, "Error: failed to open file \"%s\"\n", post_data_filename);
                  return -1;
              }
          
              if (fstat(fileno(fp), &stbuf) || !S_ISREG(stbuf.st_mode)) {
                  fprintf(stderr, "Error: unknown file size \"%s\"\n", post_data_filename);
                  return -1;
              }
          
              CURL *curl;
              CURLcode res;
          
              curl_global_init(CURL_GLOBAL_ALL);
          
              curl = curl_easy_init();
              if (curl != NULL) {
                  curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:24401?threshold=0.1");
                  curl_easy_setopt(curl, CURLOPT_POST, 1L);
                  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,(curl_off_t)stbuf.st_size);
                  curl_easy_setopt(curl, CURLOPT_READDATA, (void *)fp);
          
                  res = curl_easy_perform(curl);
                  if (res != CURLE_OK) {
                      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
                  }
                  curl_easy_cleanup(curl);
              }
              curl_global_cleanup();
              fclose(fp);
          
              return 0;
          }

          请求参数

          字段 类型 取值 说明
          threshold float 0 ~ 1 置信度阈值

          HTTP POST Body直接发送声音二进制。

          返回参数

          字段 类型 取值 说明
          confidence float 0~1 分类或检测的置信度
          label string 分类或检测的类别
          index number 分类或检测的类别

          如何在自己代码中管理SDK服务

          创建一个子进程调用SDK

          python37\python.bat 您的序列号 127.0.0.1 24401

          使用多张显卡示例如下, 最后一个参数指定显卡设备id,只有一个显卡时,默认使用0。

          python37\python.bat 您的序列号 127.0.0.1 24401 1

          C# 使用示例代码如下:

          Process process = new Process();
          process.StartInfo.UseShellExecute = false;
          process.StartInfo.CreateNoWindow = true;
          string rootDir = "SDK根路径";
          string serialNum = "您的序列号";
          process.StartInfo.FileName = string.Format("{0}\\python37\\python.bat", rootDir);
          process.StartInfo.Arguments = string.Format("{1} 127.0.0.1 24401",
                                                      rootDir, serialNum);
          process.Start();

          调用参照上面Python调用示例即可。

          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加速版依赖,版本必须如下: * TensorRT 7.x 必须和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. 其他问题

          如果无法解决,可到论坛发帖: https://ai.baidu.com/forum/topic/list/199 描述使用遇到的问题,我们将及时回复您的问题。

          上一篇
          LinuxSDK集成文档-Python
          下一篇
          常见问题