yzl19940819 4 anni fa
parent
commit
88bafcfc70

+ 11 - 13
README.md

@@ -13,7 +13,7 @@
 
 ## 近期动态
 2021.09.10 PaddleX发布2.0.0正式版本。
-- 全新发布Manufacture SDK,提供工业级多端多平台部署加速的预编译飞桨部署开发包(SDK),通过配置业务逻辑流程文件即可以低代码方式快速完成推理部署。[欢迎体验](./deploy/cpp/docs/manufacture_sdk)
+- 全新发布Manufacture SDK,支持多模型串联部署。[欢迎体验](./deploy/cpp/docs/manufacture_sdk)
 - PaddleX部署全面升级,支持飞桨视觉套件PaddleDetection、PaddleClas、PaddleSeg、PaddleX的端到端统一部署能力。[欢迎体验](./deploy/cpp/docs/deployment.md)
 - 发布产业实践案例:钢筋计数、缺陷检测、机械手抓取、工业表计读数。[欢迎体验](./examples)
 - 升级PaddleX GUI,支持30系列显卡、新增模型PP-YOLO V2、PP-YOLO Tiny 、BiSeNetV2。[欢迎体验](https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/install.md#2-padldex-gui%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F%E5%AE%89%E8%A3%85)
@@ -41,7 +41,7 @@ PaddleX提供了图像化开发界面、本地API、Restful-API三种开发模
 - 安防
     - [安全帽检测](./examples/helmet_detection)  
 - 工业视觉
-    -   [表计读数](./examples/meter_reader)  |  [钢筋计数](./examples/rebar_count)  |  [视觉辅助定位抓取](./examples/robot_grab)
+    - [表计读数](./examples/meter_reader)  |  [钢筋计数](./examples/rebar_count)  |  [视觉辅助定位抓取](./examples/robot_grab)
 
 
 
@@ -85,24 +85,22 @@ PaddleX提供了图像化开发界面、本地API、Restful-API三种开发模
 ### 4. 模型部署
 
 - [部署模型导出](./docs/apis/export_model.md)
-- [部署方式概览](./deploy)
+- [部署方式概览](./deploy/README.md)
   - 本地部署
-    - [OpenVINO](./deploy/cpp/docs/compile/openvino/README.md)(C++)
-    - [C++部署](./deploy/cpp)
-      - [Manufacture SDK](./deploy/cpp/docs/manufacture_sdk)
-      - [Deployment SDK](./deploy/cpp/docs/deployment.md)
-      - [C#工程化部署](./deploy/cpp/docs/CSharp_deploy)
+    - C++部署
+      - [C++源码编译](./deploy/cpp/README.md)
+      - [C#工程化示例](./deploy/cpp/docs/CSharp_deploy)
     - [Python部署](./docs/python_deploy.md)
   - 边缘侧部署
-    - [NVIDIA-JetsonQT部署](./deploy/cpp/docs/jetson-deploy)
+    - [NVIDIA-Jetson部署(C++)](./deploy/cpp/docs/compile/paddle/jetson.md)
+
   - 服务化部署
-    - [HubServing部署](./docs/hub_serving_deploy.md)
-  - Docker部署(C++)
+    - [HubServing部署(Python)](./docs/hub_serving_deploy.md)
+  - [基于ONNX部署(C++)](./deploy/cpp/docs/compile/README.md)
+    - [OpenVINO推理引擎](./deploy/cpp/docs/compile/openvino/README.md)
     - [Triton部署](./deploy/cpp/docs/compile/triton/docker.md)
-    - [TensorRT部署](./deploy/cpp/docs/compile/tensorrt/trt.md)
 
 - [模型加密](./deploy/cpp/docs/demo/decrypt_infer.md)
-- [ONNX格式转换](./deploy/cpp/docs/compile)
 
 ### 5. 附录
 

+ 10 - 15
deploy/README.md

@@ -2,21 +2,16 @@
 
 PaddleX提供了多种部署方式,用户可根据实际需要选择本地部署、边缘侧部署、服务化部署、Docker部署。部署方式目录如下:
 
-- [部署方式概览](./deploy)
   - 本地部署
-    - [OpenVINO](./deploy/cpp/docs/compile/openvino/README.md)(C++)
-    - [C++部署](./deploy/cpp)
-      - [Manufacture SDK](./deploy/cpp/docs/manufacture_sdk)
-      - [Deployment SDK](./deploy/cpp/docs/deployment.md)
-      - [C#工程化部署](./deploy/cpp/docs/C#_deploy)
-    - [Python部署](./docs/python_deploy.md)
+    - C++部署
+      - [C++源码编译](./../deploy/cpp/README.md)
+      - [C#工程化示例](./../deploy/cpp/docs/CSharp_deploy)
+    - [Python部署](./../docs/python_deploy.md)
   - 边缘侧部署
-    - [NVIDIA-JetsonQT部署](./deploy/cpp/docs/jetson-deploy)
-  - 服务化部署
-    - [HubServing部署](./docs/hub_serving_deploy.md)
-  - Docker部署(C++)
-    - [Triton部署](./deploy/cpp/docs/compile/triton/docker.md)
-    - [TensorRT部署](./deploy/cpp/docs/compile/tensorrt/trt.md)
+    - [NVIDIA-Jetson部署(C++)](./../deploy/cpp/docs/compile/paddle/jetson.md)
 
-- [模型加密](./deploy/cpp/docs/demo/decrypt_infer.md)
-- [ONNX格式转换](./deploy/cpp/docs/compile)
+  - 服务化部署
+    - [HubServing部署(Python)](./../docs/hub_serving_deploy.md)
+  - [基于ONNX部署(C++)](./../deploy/cpp/docs/compile/README.md)
+    - [OpenVINO推理引擎](./../deploy/cpp/docs/compile/openvino/README.md)
+    - [Triton部署](./../deploy/cpp/docs/compile/triton/docker.md)

+ 16 - 3
deploy/cpp/README.md

@@ -1,5 +1,18 @@
 # C++部署
 
-在C++部署部署方式中,我们提供了两类SDK,用户可根据SDK特点及实际需要制定部署方案:
-- [Manufacture SDK](./docs/manufacture_sdk) : 工业级多端多平台部署加速的预编译飞桨部署开发包,支持多模型串联
-- [Deployment SDK](./docs/deployment.md) : 支持飞桨视觉套件PaddleX、PaddleDetection、PaddleClas、PaddleSeg的统一部署能力
+
+基于飞桨原生推理库PaddleInference,PaddleX推出了统一部署编译方式**PaddleX-Deploy**。
+
+**PaddleX-Deploy**提供了强大的部署性能,可同时兼容飞桨视觉套件PaddleDetection、PaddleClas、PaddleSeg、PaddleX统一部署,支持Windows、Linux等多种系统。同时提供了工业级别的C#部署工程示例
+
+- [PaddleX Deployment部署方式说明](./docs/deployment.md)
+- [C#部署工程示例](./docs/CSharp_deploy)
+---
+为更进一步地提升部署效率,PaddleX部署发布[Manufacture SDK](./docs/manufacture_sdk),提供工业级多端多平台部署加速的预编译飞桨部署开发包(SDK)。
+
+- 通过配置业务逻辑流程文件即可以**低代码**方式快速完成推理部署。
+
+<div align="center">
+<img src="./docs/manufacture_sdk/images/pipeline_det.png"  width = "500" />              </div>
+
+- 通过配置文件,提供了**多模型串联**部署的方式,满足更多生产环境要求。相关使用参考[工业表计读数](./../../examples/meter_reader)

+ 1 - 1
deploy/cpp/docs/CSharp_deploy/README.md

@@ -107,7 +107,7 @@
 <img src="./images/18.png"  width = "800" />             </div>
 
 * 此外需保证在C#项目的bin\x64\Debug\net5.0-windows下包含以下dll,再进行预测推理
- 
+
   - opencv_world346.dll, 位于下载的opencv文件夹: opencv\build\x64\vc15\bin
   - model_infer.dll, 位于上边cmkae编译的目录下: PaddleX\deploy\cpp\out\paddle_deploy\Release
   - 其余dll, 位于以下目录: PaddleX\deploy\cpp\out\paddle_deploy

+ 28 - 28
deploy/cpp/docs/CSharp_deploy/model_infer.cpp

@@ -8,21 +8,21 @@ PaddleDeploy::Model* model;
 
 /*
 * Model initialization / registration API
-* 
+*
 * model_type: det,seg,clas,paddlex
-* 
+*
 * model_filename: Model file path
-* 
+*
 * params_filename: Parameter file path
-* 
+*
 * cfg_file: Configuration file path
-* 
+*
 * use_gpu: Whether to use GPU
-* 
+*
 * gpu_id: Specify GPU x
-* 
+*
 * paddlex_model_type: When Model_Type is paddlx, the type of actual Paddlex model returned - det, seg, clas
-* 
+*
 */
 extern "C" void InitModel(const char* model_type, const char* model_filename, const char* params_filename, const char* cfg_file, bool use_gpu, int gpu_id, char* paddlex_model_type)
 {
@@ -61,12 +61,12 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
 			strcpy(paddlex_model_type, "clas");
 		}
 	}
-} 
+}
 
 
 /*
 * Detection inference API
-* 
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -80,7 +80,7 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
 * nBoxesNum£º number of box
 *
 * LabelList: label list of result
-* 
+*
 * extern "C"
 */
 extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* output, int* nBoxesNum, char* LabelList)
@@ -129,8 +129,8 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 
 
 /*
-* Segmented inference 
-* 
+* Segmented inference
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -140,7 +140,7 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * nChannel: channel of img.
 *
 * output: result of pridict ,include label_map
-* 
+*
 * extern "C"
 */
 extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, unsigned char* output)
@@ -175,7 +175,7 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 
 /*
 * Recognition inference API
-* 
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -185,12 +185,12 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * nChannel: channel of img.
 *
 * score: result of pridict ,include score
-* 
+*
 * category: result of pridict ,include category_string
-* 
+*
 * category_id: result of pridict ,include category_id
-* 
-* extern "C" 
+*
+* extern "C"
 */
 extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* score, char* category, int* category_id)
 {
@@ -217,16 +217,16 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 	model->Predict(imgs, &results, 1);
 
 	*category_id = results[0].clas_result->category_id;
-	// Copy output category result to output -- string --> char* 
+	// Copy output category result to output -- string --> char*
 	memcpy(category, results[0].clas_result->category.c_str(), strlen(results[0].clas_result->category.c_str()));
 	// Copy output probability value
 	*score = results[0].clas_result->score;
-}	
+}
 
 
 /*
-* MaskRCNN Reasoning 
-* 
+* MaskRCNN Reasoning
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -240,9 +240,9 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * mask_output: result of pridict ,include label_map
 *
 * nBoxesNum: result of pridict ,include BoxesNum
-* 
+*
 * LabelList: result of pridict ,include LabelList
-* 
+*
 * extern "C"
 */
 extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* box_output, unsigned char* mask_output, int* nBoxesNum, char* LabelList)
@@ -285,7 +285,7 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
 		box_output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // Upper left and lower right vertices
 		box_output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
 		box_output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
-		
+
 		// Mask prediction results
 		for (int j = 0; j < results[0].det_result->boxes[i].mask.data.size(); j++)
 		{
@@ -302,8 +302,8 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
 
 /*
 * Model destruction API
-* 
-* extern "C" 
+*
+* extern "C"
 */
 extern "C" void DestructModel()
 {

+ 2 - 3
deploy/cpp/docs/compile/paddle/jetson.md

@@ -98,7 +98,7 @@ eg:
 <div>
   <img src="../../images/yaml_cmakelist.png">
   </div>
-  
+
 > 其它支持的加密操作以及TensorRT,可参考[Linux环境编译指南](./linux.md).
 
 ### Step 6. 编译
@@ -130,7 +130,7 @@ sh script/jetson_build.sh
 通过修改`PaddleX/deploy/cpp/demo/model_infer.cpp`以及`PaddleX/deploy/cpp/demo/CMakeLists.txt`, 再执行`jetson_build.sh`生成`libmodel_infer.so`动态链接库,用于QT应用调用,执行模型初始化、模型推理预测、模型注销等操作。[现已经在Jetson Xavier上利用原生编译的opencv实现了模型单张预测与文件夹连续预测,由于预编译opencv不支持解析视频格式,因此暂未对视频进行测试——仅在windows上完成了单张图片-文件夹连续预测-视频流预测的全流程验证。]
 
 > 该版本对于MaskRCNN模型的推理需要使用GPU进行推理——如果CPU下进行推理可能由于内存使用问题报错。
-> 
+>
 > 鉴于Qt跨平台属性,因此如果部署环境下opencv支持视频格式,则该Demo-Gui程序可启动完整的推理可视化功能。
 
 <div>
@@ -140,4 +140,3 @@ sh script/jetson_build.sh
 
 具体Demo信息可前往如下文档链接:
 - [基于QT的Jetson部署Demo](../../jetson-deploy/README.md)
-

+ 1 - 1
deploy/cpp/docs/jetson-deploy/CMakeLists.txt

@@ -83,7 +83,7 @@ if(WITH_GPU)
     message(FATAL_ERROR "please set CUDA_LIB with -DCUDA_LIB=/path/cuda/lib64")
   endif()
 
-  
+
   if(NOT WIN32)
     if (NOT DEFINED CUDNN_LIB)
       message(FATAL_ERROR "please set CUDNN_LIB with -DCUDNN_LIB=/path/cudnn/")

+ 2 - 2
deploy/cpp/docs/jetson-deploy/Deploy_infer/inferthread.cpp

@@ -942,7 +942,7 @@ void InferThread::Seg_Video()
 
         try {
             clock_t start_infer_time = clock();
-            
+
             qDebug() << "Doing Seg-Infer." << "\n";
             seg_ModelPredict((const uchar*)frame.data, frame.cols, frame.rows, 3, out_image);
             double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
@@ -953,7 +953,7 @@ void InferThread::Seg_Video()
             qDebug() << "Finished Seg-Infer, but it is raise a exception." << "\n";
 
             emit SetState_Btn_StopAndInfer(false, true);  // first is stop, second is infer
-            
+
             return;
         }
 

+ 20 - 22
deploy/cpp/docs/jetson-deploy/README.md

@@ -49,11 +49,11 @@
 
 > 查看Jetpack版本: `cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2`
 > (4.3可以使用4.4版本的预测库)
-> 
+>
 > 查看QT版本: `qmake -v`
-> 
+>
 > 查看CUDA版本: `cat /usr/local/cuda/version.txt`
-> 
+>
 > 查看Cudnn版本: `cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2`
 
 ## 1 环境准备<a id="## 1 环境准备"/>
@@ -65,7 +65,7 @@
 `sudo apt-get install qt5-default qtcreator -y`
 
 2. 下载PaddleX+PaddleInference预测库:
-> 可查看文档: 
+> 可查看文档:
 
 - [基于PaddleInference的推理-Jetson环境编译](../../deploy/cpp/docs/compile/paddle/jetson.md)
 
@@ -127,7 +127,7 @@
 <div>
   <img src="./images/cmakelist_set.png">
   </div>
-  
+
 ### 2.3 修改`yaml.cmake`参数<a id="### 2.3 修改`yaml.cmake`参数"/>
 
 由于Jetson环境下编译还需要yaml,所以这里需要手动下载yaml包,保证编译的正常运行。
@@ -141,7 +141,7 @@ eg:
 <div>
   <img src="./images/yaml_cmakelist.png">
   </div>
-  
+
 > 其它支持的加密操作以及TensorRT,可参考[Linux环境编译指南](./linux.md).
 
 -------
@@ -151,7 +151,7 @@ eg:
 该部分需要修改两个地方,以保证动态链接库的正常生成。
 
 > 接下来的操作,请在执行以下命令正常生成可执行程序后再往下继续配置,以确保修改前的工作是正确可执行的。
-> 
+>
 ```
 sh script/jetson_build.sh
 ```
@@ -222,27 +222,27 @@ sh script/jetson_build.sh
   </div><div>
   <img src="./images/qt_set_proname.png">
   </div>
-  
+
 > 如果存在多个编译环境供QT使用,请确保QT使用的编译环境与前边生成动态链接库的编译环境一致——或者至少保证生成的所有库都允许相互调用,即避免出现32位与64位不兼容等情况。
 
 2. 进入QT崭新的工程项目后,工程项目中会存在`*.pro`,`Headers`,`Sources`,`Forms`四个主要组件,其中后三个为项目分支(目录)<div>
   <img src="./images/project_list.png">
   </div>
-  
+
 3. 右键点击项目,选择`Add New`, 进入子界面选择`c++`,选中`Class`, 点击`choise`.<div>
   <img src="./images/qt_add_newfile.png">
   </div>
-  
+
 4. 在新出来的子界面中,输入`InferThread`作为**Class name**, 然后一直往下生成即可.<div>
   <img src="./images/qt_create_class.png">
   </div>
-  
+
 5. 将本项目`Deploy_infer`中的`inferthread.cpp`与`inferthread.h`中的内容分别复制过去即可.
 6. 然后,再将本项目`Deploy_infer`中的`mainwindow.cpp`与`mainwindow.h`中的内容也复制过去.
 7. 最后,将本项目的`mainwindow.ui`替换新建的QT-GUI项目的ui文件.
 
 > 此时,QT项目的移植就完成了——之所以新建项目,看起来比较复杂,是为了避免直接移植导致的QT版本不匹配,发生一些意料之外的问题。
-> 
+>
 > 此时QT项目中,会出现标红的错误,原因可能如下:
 - 1. 还未导入动态链接库
 - 2. 还未导入opencv的编译好的库
@@ -254,7 +254,7 @@ sh script/jetson_build.sh
 <div>
   <img src="./images/qt_project_inferlib.png">
   </div>
-  
+
 **然后打开`Qtcreator`, 打开项目选择本QT项目启动**,可观察到QT工程目录结构如图所示:
 <div>
   <img src="./images/project_list.png">
@@ -285,11 +285,11 @@ sh script/jetson_build.sh
 - `LIBS` : 表示`opencv`的动态链接库`so文件`所在路径,这里使用`正则匹配`,自动匹配路径下的所有`opencv.so`文件
 
 > 在本测试Jetson环境上,**预编译opencv由于没有同ffmpeg一同编译**,因此不支持视频流的处理与预测(无法打开视频文件,如mp4,avi等)
-> 
+>
 > 如有需要可在此时另外编译opencv,不覆盖原预编译的opencv版本,仅用于QT程序进行图像/视频的读取和简单处理。
-> 
+>
 > 此时编译的新opencv,在编译时要选择编译参数使其支持QT、GL以及ffmpeg.(ffmpeg可能需要自行编译)
-> 
+>
 > 该方案的编译指导,可参考网上的`linux下opencv与ffmpeg联合编译`资料。
 >
 > 因此,本QT的Demo在`Jetson Xavier`上,使用`原生opencv`,仅支持图片以及连续图片的预测,视频预测需要自行编译新的opencv,以支持视频读取——只要opencv编译成功,以上编译动态链接库的`opencv路径`仅需相应修改即可(**记得更改后重新编译生成**),同时修改QT导入的`opencv库路径`就可以正常使用该可视化Demo了。
@@ -359,9 +359,9 @@ sh script/jetson_build.sh
 <div>
   <img src="./images/gpu_infer.png">
   </div>
-  
+
 -----
-  
+
 ## 6 QT开发注解<a id="## 6 QT开发注解"/>
 
 > 一些方便大家修改Demo界面源码,以实现一些适配工作。
@@ -405,7 +405,7 @@ sh script/jetson_build.sh
 
 不要直接使用子线程对主线程控件进行控制,避免导致线程报错,线程问题不易debug——因此,多用信号与槽来实现交互。
 
-实现思路: 
+实现思路:
 1. 在子线程需要对主线程中控件进行控制时,发送一个信号
 2. 主线程在消息循环机制中持续运行时,接收信号,执行对应的槽,实现控件的控制
 
@@ -419,7 +419,7 @@ sh script/jetson_build.sh
 <div>
   <img src="./images/thread_signal.png">
   </div>
-  
+
 主线程槽声明如下:
 <div>
   <img src="./images/main_slot.png">
@@ -471,5 +471,3 @@ sh script/jetson_build.sh
   - 如cmake的configure中出现红字,说找不到ffmpeg相关包,属于网络问题,无法下载该相关dll,需要自行下载后进行相关处理,可参考: [ffmpeg下载失败处理方法](https://www.cxyzjd.com/article/pyt1234567890/106525475)
 - Jetson Xavier平台移植测试完成 -- 预编译opencv4.1.1,已支持QT和GL
 - Linux平台移植界面测试完成 -- opencv以及模型推理所需的动态链接库(可按照该项目的`CMakeList.txt`与`model_infer.cpp`替换原文件,然后按照[linux编译方法](../../deploy/cpp/docs/compile/paddle/linux.md)进行编译)去自行生成。
-
-

+ 28 - 28
deploy/cpp/docs/jetson-deploy/model_infer.cpp

@@ -8,21 +8,21 @@ PaddleDeploy::Model* model;
 
 /*
 * Model initialization / registration API
-* 
+*
 * model_type: det,seg,clas,paddlex
-* 
+*
 * model_filename: Model file path
-* 
+*
 * params_filename: Parameter file path
-* 
+*
 * cfg_file: Configuration file path
-* 
+*
 * use_gpu: Whether to use GPU
-* 
+*
 * gpu_id: Specify GPU x
-* 
+*
 * paddlex_model_type: When Model_Type is paddlx, the type of actual Paddlex model returned - det, seg, clas
-* 
+*
 */
 extern "C" void InitModel(const char* model_type, const char* model_filename, const char* params_filename, const char* cfg_file, bool use_gpu, int gpu_id, char* paddlex_model_type)
 {
@@ -61,12 +61,12 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
 			strcpy(paddlex_model_type, "clas");
 		}
 	}
-} 
+}
 
 
 /*
 * Detection inference API
-* 
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -80,7 +80,7 @@ extern "C" void InitModel(const char* model_type, const char* model_filename, co
 * nBoxesNum£º number of box
 *
 * LabelList: label list of result
-* 
+*
 * extern "C"
 */
 extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* output, int* nBoxesNum, char* LabelList)
@@ -129,8 +129,8 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 
 
 /*
-* Segmented inference 
-* 
+* Segmented inference
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -140,7 +140,7 @@ extern "C" void Det_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * nChannel: channel of img.
 *
 * output: result of pridict ,include label_map
-* 
+*
 * extern "C"
 */
 extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, unsigned char* output)
@@ -175,7 +175,7 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 
 /*
 * Recognition inference API
-* 
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -185,12 +185,12 @@ extern "C" void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * nChannel: channel of img.
 *
 * score: result of pridict ,include score
-* 
+*
 * category: result of pridict ,include category_string
-* 
+*
 * category_id: result of pridict ,include category_id
-* 
-* extern "C" 
+*
+* extern "C"
 */
 extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* score, char* category, int* category_id)
 {
@@ -217,16 +217,16 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 	model->Predict(imgs, &results, 1);
 
 	*category_id = results[0].clas_result->category_id;
-	// Copy output category result to output -- string --> char* 
+	// Copy output category result to output -- string --> char*
 	memcpy(category, results[0].clas_result->category.c_str(), strlen(results[0].clas_result->category.c_str()));
 	// Copy output probability value
 	*score = results[0].clas_result->score;
-}	
+}
 
 
 /*
-* MaskRCNN Reasoning 
-* 
+* MaskRCNN Reasoning
+*
 * img: input for predicting.
 *
 * nWidth: width of img.
@@ -240,9 +240,9 @@ extern "C" void Cls_ModelPredict(const unsigned char* img, int nWidth, int nHeig
 * mask_output: result of pridict ,include label_map
 *
 * nBoxesNum: result of pridict ,include BoxesNum
-* 
+*
 * LabelList: result of pridict ,include LabelList
-* 
+*
 * extern "C"
 */
 extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, float* box_output, unsigned char* mask_output, int* nBoxesNum, char* LabelList)
@@ -285,7 +285,7 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
 		box_output[i * 6 + 3] = results[0].det_result->boxes[i].coordinate[1]; // Upper left and lower right vertices
 		box_output[i * 6 + 4] = results[0].det_result->boxes[i].coordinate[2];
 		box_output[i * 6 + 5] = results[0].det_result->boxes[i].coordinate[3];
-		
+
 		// Mask prediction results
 		for (int j = 0; j < results[0].det_result->boxes[i].mask.data.size(); j++)
 		{
@@ -302,8 +302,8 @@ extern "C" void Mask_ModelPredict(const unsigned char* img, int nWidth, int nHei
 
 /*
 * Model destruction API
-* 
-* extern "C" 
+*
+* extern "C"
 */
 extern "C" void DestructModel()
 {

+ 0 - 2
examples/README.md

@@ -8,5 +8,3 @@
 * [缺陷检测](./defect_detection)
 
 * [工业表计检测](./meter_reader)
-
-* [Windows系统下使用C#语言部署](./C%23_deploy)