Jelajahi Sumber

fix exit unnormally when shapely cannot be imported, fix doc error for meter reader, add vdltrain in docs, add mkl_thread_num

FlyingQianMM 5 tahun lalu
induk
melakukan
b0129e93cb
32 mengubah file dengan 202 tambahan dan 249 penghapusan
  1. 2 2
      docs/deploy/nvidia-jetson.md
  2. 4 4
      docs/deploy/server/encryption.md
  3. 27 34
      docs/examples/meter_reader.md
  4. TEMPAT SAMPAH
      docs/images/vdl1.jpg
  5. TEMPAT SAMPAH
      docs/images/vdl2.jpg
  6. TEMPAT SAMPAH
      docs/images/vdl3.jpg
  7. TEMPAT SAMPAH
      docs/images/xiaoduxiong.jpeg
  8. 1 0
      docs/train/index.rst
  9. 26 0
      docs/train/visualdl.md
  10. 15 22
      examples/meter_reader/README.md
  11. 8 0
      paddlex/cv/datasets/coco.py
  12. 7 2
      paddlex/deploy.py
  13. 21 7
      tutorials/train/README.md
  14. 1 1
      tutorials/train/image_classification/README.md
  15. 3 8
      tutorials/train/image_classification/alexnet.py
  16. 3 8
      tutorials/train/image_classification/mobilenetv2.py
  17. 3 8
      tutorials/train/image_classification/mobilenetv3_small_ssld.py
  18. 3 8
      tutorials/train/image_classification/resnet50_vd_ssld.py
  19. 3 8
      tutorials/train/image_classification/shufflenetv2.py
  20. 6 9
      tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py
  21. 6 11
      tutorials/train/instance_segmentation/mask_rcnn_r18_fpn.py
  22. 6 11
      tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py
  23. 6 11
      tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py
  24. 6 9
      tutorials/train/object_detection/faster_rcnn_r18_fpn.py
  25. 6 9
      tutorials/train/object_detection/faster_rcnn_r50_fpn.py
  26. 6 12
      tutorials/train/object_detection/yolov3_darknet53.py
  27. 5 6
      tutorials/train/object_detection/yolov3_mobilenetv1.py
  28. 6 12
      tutorials/train/object_detection/yolov3_mobilenetv3.py
  29. 7 13
      tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py
  30. 5 13
      tutorials/train/semantic_segmentation/fast_scnn.py
  31. 5 11
      tutorials/train/semantic_segmentation/hrnet.py
  32. 5 10
      tutorials/train/semantic_segmentation/unet.py

+ 2 - 2
docs/deploy/nvidia-jetson.md

@@ -1,11 +1,11 @@
 # Nvidia Jetson开发板
 
 ## 说明
-本文档在 `Linux`平台使用`GCC 7.4`测试过,如果需要使用更高G++版本编译使用,则需要重新编译Paddle预测库,请参考: [Nvidia Jetson嵌入式硬件预测库源码编译](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12)。
+本文档在基于Nvidia Jetpack 4.4的`Linux`平台上使用`GCC 7.4`测试过,如需使用不同G++版本,则需要重新编译Paddle预测库,请参考: [NVIDIA Jetson嵌入式硬件预测库源码编译](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12)。
 
 ## 前置条件
 * G++ 7.4
-* CUDA 9.0 / CUDA 10.0, CUDNN 7+ (仅在使用GPU版本的预测库时需要)
+* CUDA 10.0 / CUDNN 8 (仅在使用GPU版本的预测库时需要)
 * CMake 3.0+
 
 请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。

+ 4 - 4
docs/deploy/server/encryption.md

@@ -51,7 +51,7 @@ paddlex-encryption
 |
 ├── lib # libpmodel-encrypt.so和libpmodel-decrypt.so动态库
 |
-└── tool # paddlex_encrypt_tool
+└── tool # paddle_encrypt_tool
 ```
 
 Windows加密工具包含内容为:
@@ -61,7 +61,7 @@ paddlex-encryption
 |
 ├── lib # pmodel-encrypt.dll和pmodel-decrypt.dll动态库 pmodel-encrypt.lib和pmodel-encrypt.lib静态库
 |
-└── tool # paddlex_encrypt_tool.exe 模型加密工具
+└── tool # paddle_encrypt_tool.exe 模型加密工具
 ```
 ### 1.3 加密PaddleX模型
 
@@ -71,13 +71,13 @@ paddlex-encryption
 Linux平台:
 ```
 # 假设模型在/root/projects下
-./paddlex-encryption/tool/paddlex_encrypt_tool -model_dir /root/projects/paddlex_inference_model -save_dir /root/projects/paddlex_encrypted_model
+./paddlex-encryption/tool/paddle_encrypt_tool -model_dir /root/projects/paddlex_inference_model -save_dir /root/projects/paddlex_encrypted_model
 ```
 
 Windows平台:
 ```
 # 假设模型在D:/projects下
-.\paddlex-encryption\tool\paddlex_encrypt_tool.exe -model_dir D:\projects\paddlex_inference_model -save_dir D:\projects\paddlex_encrypted_model
+.\paddlex-encryption\tool\paddle_encrypt_tool.exe -model_dir D:\projects\paddlex_inference_model -save_dir D:\projects\paddlex_encrypted_model
 ```
 
 `-model_dir`用于指定inference模型路径(参考[导出inference模型](../export_model.md)将模型导出为inference格式模型),可使用[导出小度熊识别模型](../export_model.md)中导出的`inference_model`。加密完成后,加密过的模型会保存至指定的`-save_dir`下,包含`__model__.encrypted`、`__params__.encrypted`和`model.yml`三个文件,同时生成密钥信息,命令输出如下图所示,密钥为`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`

+ 27 - 34
docs/examples/meter_reader.md

@@ -46,13 +46,13 @@
 
 #### 测试表计读数
 
-1. 下载PaddleX源码:
+step 1. 下载PaddleX源码:
 
 ```
 git clone https://github.com/PaddlePaddle/PaddleX
 ```
 
-2. 预测执行文件位于`PaddleX/examples/meter_reader/`,进入该目录:
+step 2. 预测执行文件位于`PaddleX/examples/meter_reader/`,进入该目录:
 
 ```
 cd PaddleX/examples/meter_reader/
@@ -76,7 +76,7 @@ cd PaddleX/examples/meter_reader/
 | use_erode | 是否使用图像腐蚀对分割预测图进行细分,默认为False |
 | erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 |
 
-3. 预测
+step 3. 预测
 
 若要使用GPU,则指定GPU卡号(以0号卡为例):
 
@@ -112,17 +112,17 @@ python3 reader_infer.py --detector_dir /path/to/det_inference_model --segmenter_
 
 #### c++部署
 
-1. 下载PaddleX源码:
+step 1. 下载PaddleX源码:
 
 ```
 git clone https://github.com/PaddlePaddle/PaddleX
 ```
 
-2. 将`PaddleX\examples\meter_reader\deploy\cpp`下的`meter_reader`文件夹和`CMakeList.txt`拷贝至`PaddleX\deploy\cpp`目录下,拷贝之前可以将`PaddleX\deploy\cpp`下原本的`CMakeList.txt`做好备份。
+step 2. 将`PaddleX\examples\meter_reader\deploy\cpp`下的`meter_reader`文件夹和`CMakeList.txt`拷贝至`PaddleX\deploy\cpp`目录下,拷贝之前可以将`PaddleX\deploy\cpp`下原本的`CMakeList.txt`做好备份。
 
-3. 按照[Windows平台部署](../deploy/server/cpp/windows.md)中的Step2至Step4完成C++预测代码的编译。
+step 3. 按照[Windows平台部署](../deploy/server/cpp/windows.md)中的Step2至Step4完成C++预测代码的编译。
 
-4. 编译成功后,可执行文件在`out\build\x64-Release`目录下,打开`cmd`,并切换到该目录:
+step 4. 编译成功后,可执行文件在`out\build\x64-Release`目录下,打开`cmd`,并切换到该目录:
 
    ```
    cd PaddleX\deploy\cpp\out\build\x64-Release
@@ -139,8 +139,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
    | use_gpu	| 是否使用 GPU 预测, 支持值为0或1(默认值为0)|
    | gpu_id	| GPU 设备ID, 默认值为0 |
    | save_dir	| 保存可视化结果的路径, 默认值为"output"|
-   | det_key	| 检测模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的检测模型 |
-   | seg_key	| 分割模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的分割模型 |
    | seg_batch_size | 分割的批量大小,默认为2 |
    | thread_num	| 分割预测的线程数,默认为cpu处理器个数 |
    | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) |
@@ -149,7 +147,7 @@ git clone https://github.com/PaddlePaddle/PaddleX
    | erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 |
    | score_threshold | 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5|
 
-5. 推理预测:
+step 5. 推理预测:
 
   用于部署推理的模型应为inference格式,本案例提供的预训练模型均为inference格式,如若是重新训练的模型,需参考[部署模型导出](../deploy/export_model.md)将模型导出为inference格式。
 
@@ -160,6 +158,13 @@ git clone https://github.com/PaddlePaddle/PaddleX
   ```
 
   * 使用未加密的模型对图像列表做预测
+  图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
+  ```
+  \path\to\images\1.jpg
+  \path\to\images\2.jpg
+  ...
+  \path\to\images\n.jpg
+  ```
 
   ```shell
   .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --image_list=\path\to\meter_test\image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
@@ -171,29 +176,21 @@ git clone https://github.com/PaddlePaddle/PaddleX
   .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
   ```
 
-  * 使用加密后的模型对单张图片做预测
-
-  如果未对模型进行加密,请参考[加密PaddleX模型](../deploy/server/encryption.html#paddlex)对模型进行加密。例如加密后的检测模型所在目录为`\path\to\encrypted_det_inference_model`,密钥为`yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0=`;加密后的分割模型所在目录为`\path\to\encrypted_seg_inference_model`,密钥为`DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=`
-
-  ```shell
-  .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\encrypted_det_inference_model --seg_model_dir=\path\to\encrypted_seg_inference_model --image=\path\to\test.jpg --use_gpu=1 --use_erode=1 --save_dir=output --det_key yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0= --seg_key DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
-  ```
-
 ### Linux系统的jetson嵌入式设备安全部署
 
 #### c++部署
 
-1. 下载PaddleX源码:
+step 1. 下载PaddleX源码:
 
 ```
 git clone https://github.com/PaddlePaddle/PaddleX
 ```
 
-2. 将`PaddleX/examples/meter_reader/deploy/cpp`下的`meter_reader`文件夹和`CMakeList.txt`拷贝至`PaddleX/deploy/cpp`目录下,拷贝之前可以将`PaddleX/deploy/cpp`下原本的`CMakeList.txt`做好备份。
+step 2. 将`PaddleX/examples/meter_reader/deploy/cpp`下的`meter_reader`文件夹和`CMakeList.txt`拷贝至`PaddleX/deploy/cpp`目录下,拷贝之前可以将`PaddleX/deploy/cpp`下原本的`CMakeList.txt`做好备份。
 
-3. 按照[Nvidia Jetson开发板部署](../deploy/nvidia-jetson.md)中的Step2至Step3完成C++预测代码的编译。
+step 3. 按照[Nvidia Jetson开发板部署](../deploy/nvidia-jetson.md)中的Step2至Step3完成C++预测代码的编译。
 
-4. 编译成功后,可执行程为`build/meter_reader/meter_reader`,其主要命令参数说明如下:
+step 4. 编译成功后,可执行程为`build/meter_reader/meter_reader`,其主要命令参数说明如下:
 
   | 参数    | 说明   |
   | ---- | ---- |
@@ -204,8 +201,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
   | use_gpu	| 是否使用 GPU 预测, 支持值为0或1(默认值为0)|
   | gpu_id	| GPU 设备ID, 默认值为0 |
   | save_dir	| 保存可视化结果的路径, 默认值为"output"|
-  | det_key	| 检测模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的检测模型 |
-  | seg_key	| 分割模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的分割模型 |
   | seg_batch_size | 分割的批量大小,默认为2 |
   | thread_num	| 分割预测的线程数,默认为cpu处理器个数 |
   | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) |
@@ -214,7 +209,7 @@ git clone https://github.com/PaddlePaddle/PaddleX
   | erode_kernel | 图像腐蚀操作时的卷积核大小,默认值为4 |
   | score_threshold | 检测模型输出结果中,预测得分低于该阈值的框将被滤除,默认值为0.5|
 
-5. 推理预测:
+step 5. 推理预测:
 
   用于部署推理的模型应为inference格式,本案例提供的预训练模型均为inference格式,如若是重新训练的模型,需参考[部署模型导出](../deploy/export_model.md)将模型导出为inference格式。
 
@@ -225,7 +220,13 @@ git clone https://github.com/PaddlePaddle/PaddleX
   ```
 
   * 使用未加密的模型对图像列表做预测
-
+  图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
+  ```
+  \path\to\images\1.jpg
+  \path\to\images\2.jpg
+  ...
+  \path\to\images\n.jpg
+  ```
   ```shell
   ./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --image_list=/path/to/image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
   ```
@@ -236,14 +237,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
   ./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
   ```
 
-  * 使用加密后的模型对单张图片做预测
-
-  如果未对模型进行加密,请参考[加密PaddleX模型](../deploy/server/encryption.html#paddlex)对模型进行加密。例如加密后的检测模型所在目录为`/path/to/encrypted_det_inference_model`,密钥为`yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0=`;加密后的分割模型所在目录为`/path/to/encrypted_seg_inference_model`,密钥为`DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=`
-
-  ```shell
-  ./build/meter_reader/meter_reader --det_model_dir=/path/to/encrypted_det_inference_model --seg_model_dir=/path/to/encrypted_seg_inference_model --image=/path/to/test.jpg --use_gpu=1 --use_erode=1 --save_dir=output --det_key yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0= --seg_key DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
-  ```
-
 
 ## 模型训练
 

TEMPAT SAMPAH
docs/images/vdl1.jpg


TEMPAT SAMPAH
docs/images/vdl2.jpg


TEMPAT SAMPAH
docs/images/vdl3.jpg


TEMPAT SAMPAH
docs/images/xiaoduxiong.jpeg


+ 1 - 0
docs/train/index.rst

@@ -13,3 +13,4 @@ PaddleX集成了PaddleClas、PaddleDetection和PaddleSeg三大CV工具套件中
    instance_segmentation.md
    semantic_segmentation.md
    prediction.md
+   visualdl.md

+ 26 - 0
docs/train/visualdl.md

@@ -0,0 +1,26 @@
+# VisualDL可视化训练指标
+在使用PaddleX训练模型过程中,各个训练指标和评估指标会直接输出到标准输出流,同时也可通过VisualDL对训练过程中的指标进行可视化,只需在调用`train`函数时,将`use_vdl`参数设为`True`即可,如下代码所示,
+```
+model = paddlex.cls.ResNet50(num_classes=1000)
+model.train(num_epochs=120, train_dataset=train_dataset,
+            train_batch_size=32, eval_dataset=eval_dataset,
+            log_interval_steps=10, save_interval_epochs=10,
+            save_dir='./output', use_vdl=True)
+```
+
+模型在训练过程中,会在`save_dir`下生成`vdl_log`目录,通过在命令行终端执行以下命令,启动VisualDL。
+```
+visualdl --logdir=output/vdl_log --port=8008
+```
+在浏览器打开`http://0.0.0.0:8008`便可直接查看随训练迭代动态变化的各个指标(0.0.0.0表示启动VisualDL所在服务器的IP,本机使用0.0.0.0即可)。
+
+在训练分类模型过程中,使用VisualDL进行可视化的示例图如下所示。
+
+> 训练过程中每个Step的`Loss`和相应`Top1准确率`变化趋势:
+![](../images/vdl1.jpg)
+
+> 训练过程中每个Step的`学习率lr`和相应`Top5准确率`变化趋势:
+![](../images/vdl2.jpg)
+
+> 训练过程中,每次保存模型时,模型在验证数据集上的`Top1准确率`和`Top5准确率`:
+![](../images/vdl3.jpg)

+ 15 - 22
examples/meter_reader/README.md

@@ -148,8 +148,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
    | use_gpu	| 是否使用 GPU 预测, 支持值为0或1(默认值为0)|
    | gpu_id	| GPU 设备ID, 默认值为0 |
    | save_dir	| 保存可视化结果的路径, 默认值为"output"|
-   | det_key	| 检测模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的检测模型 |
-   | seg_key	| 分割模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的分割模型 |
    | seg_batch_size | 分割的批量大小,默认为2 |
    | thread_num	| 分割预测的线程数,默认为cpu处理器个数 |
    | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) |
@@ -163,13 +161,20 @@ git clone https://github.com/PaddlePaddle/PaddleX
   用于部署推理的模型应为inference格式,本案例提供的预训练模型均为inference格式,如若是重新训练的模型,需参考[导出inference模型](https://paddlex.readthedocs.io/zh_CN/latest/tutorials/deploy/deploy_server/deploy_python.html#inference)将模型导出为inference格式。
 
   * 使用未加密的模型对单张图片做预测
-
   ```shell
   .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --image=\path\to\meter_test\20190822_168.jpg --use_gpu=1 --use_erode=1 --save_dir=output
   ```
 
   * 使用未加密的模型对图像列表做预测
 
+  图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
+  ```
+  \path\to\images\1.jpg
+  \path\to\images\2.jpg
+  ...
+  \path\to\images\n.jpg
+  ```
+
   ```shell
   .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --image_list=\path\to\meter_test\image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
   ```
@@ -180,14 +185,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
   .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\det_inference_model --seg_model_dir=\path\to\seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
   ```
 
-  * 使用加密后的模型对单张图片做预测
-
-  如果未对模型进行加密,请参考[加密PaddleX模型](../../docs/deploy/server/encryption.md#13-加密paddlex模型)对模型进行加密。例如加密后的检测模型所在目录为`\path\to\encrypted_det_inference_model`,密钥为`yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0=`;加密后的分割模型所在目录为`\path\to\encrypted_seg_inference_model`,密钥为`DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=`
-
-  ```shell
-  .\paddlex_inference\meter_reader.exe --det_model_dir=\path\to\encrypted_det_inference_model --seg_model_dir=\path\to\encrypted_seg_inference_model --image=\path\to\test.jpg --use_gpu=1 --use_erode=1 --save_dir=output --det_key yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0= --seg_key DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
-  ```
-
 ### Linux系统的jetson嵌入式设备安全部署
 
 #### c++部署
@@ -213,8 +210,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
   | use_gpu	| 是否使用 GPU 预测, 支持值为0或1(默认值为0)|
   | gpu_id	| GPU 设备ID, 默认值为0 |
   | save_dir	| 保存可视化结果的路径, 默认值为"output"|
-  | det_key	| 检测模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的检测模型 |
-  | seg_key	| 分割模型加密过程中产生的密钥信息,默认值为""表示加载的是未加密的分割模型 |
   | seg_batch_size | 分割的批量大小,默认为2 |
   | thread_num	| 分割预测的线程数,默认为cpu处理器个数 |
   | use_camera | 是否使用摄像头采集图片,支持值为0或1(默认值为0) |
@@ -234,6 +229,13 @@ git clone https://github.com/PaddlePaddle/PaddleX
   ```
 
   * 使用未加密的模型对图像列表做预测
+  图像列表image_list.txt内容的格式如下,因绝对路径不同,暂未提供该文件,用户可根据实际情况自行生成:
+  ```
+  \path\to\images\1.jpg
+  \path\to\images\2.jpg
+  ...
+  \path\to\images\n.jpg
+  ```
 
   ```shell
   ./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --image_list=/path/to/image_list.txt --use_gpu=1 --use_erode=1 --save_dir=output
@@ -245,15 +247,6 @@ git clone https://github.com/PaddlePaddle/PaddleX
   ./build/meter_reader/meter_reader --det_model_dir=/path/to/det_inference_model --seg_model_dir=/path/to/seg_inference_model --use_camera=1 --use_gpu=1 --use_erode=1 --save_dir=output
   ```
 
-  * 使用加密后的模型对单张图片做预测
-
-  如果未对模型进行加密,请参考[加密PaddleX模型](../../docs/deploy/server/encryption.md#13-加密paddlex模型)对模型进行加密。例如加密后的检测模型所在目录为`/path/to/encrypted_det_inference_model`,密钥为`yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0=`;加密后的分割模型所在目录为`/path/to/encrypted_seg_inference_model`,密钥为`DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=`
-
-  ```shell
-  ./build/meter_reader/meter_reader --det_model_dir=/path/to/encrypted_det_inference_model --seg_model_dir=/path/to/encrypted_seg_inference_model --image=/path/to/test.jpg --use_gpu=1 --use_erode=1 --save_dir=output --det_key yEBLDiBOdlj+5EsNNrABhfDuQGkdcreYcHcncqwdbx0= --seg_key DbVS64I9pFRo5XmQ8MNV2kSGsfEr4FKA6OH9OUhRrsY=
-  ```
-
-
 ## <h2 id="5">模型训练</h2>
 
 

+ 8 - 0
paddlex/cv/datasets/coco.py

@@ -15,6 +15,8 @@
 from __future__ import absolute_import
 import copy
 import os.path as osp
+import six
+import sys
 import random
 import numpy as np
 import paddlex.utils.logging as logging
@@ -48,6 +50,12 @@ class CocoDetection(VOCDetection):
                  shuffle=False):
         from pycocotools.coco import COCO
 
+        try:
+            import shapely.ops
+            from shapely.geometry import Polygon, MultiPolygon, GeometryCollection
+        except:
+            six.reraise(*sys.exc_info())
+
         super(VOCDetection, self).__init__(
             transforms=transforms,
             num_workers=num_workers,

+ 7 - 2
paddlex/deploy.py

@@ -28,6 +28,7 @@ class Predictor:
                  use_gpu=True,
                  gpu_id=0,
                  use_mkl=False,
+                 mkl_thread_num=4,
                  use_trt=False,
                  use_glog=False,
                  memory_optimize=True):
@@ -38,6 +39,7 @@ class Predictor:
                 use_gpu: 是否使用gpu,默认True
                 gpu_id: 使用gpu的id,默认0
                 use_mkl: 是否使用mkldnn计算库,CPU情况下使用,默认False
+                mkl_thread_num: mkldnn计算线程数,默认为4
                 use_trt: 是否使用TensorRT,默认False
                 use_glog: 是否启用glog日志, 默认False
                 memory_optimize: 是否启动内存优化,默认True
@@ -72,13 +74,15 @@ class Predictor:
             to_rgb = False
         self.transforms = build_transforms(self.model_type,
                                            self.info['Transforms'], to_rgb)
-        self.predictor = self.create_predictor(
-            use_gpu, gpu_id, use_mkl, use_trt, use_glog, memory_optimize)
+        self.predictor = self.create_predictor(use_gpu, gpu_id, use_mkl,
+                                               mkl_thread_num, use_trt,
+                                               use_glog, memory_optimize)
 
     def create_predictor(self,
                          use_gpu=True,
                          gpu_id=0,
                          use_mkl=False,
+                         mkl_thread_num=4,
                          use_trt=False,
                          use_glog=False,
                          memory_optimize=True):
@@ -93,6 +97,7 @@ class Predictor:
             config.disable_gpu()
         if use_mkl:
             config.enable_mkldnn()
+            config.set_cpu_math_library_num_threads(mkl_thread_num)
         if use_glog:
             config.enable_glog_info()
         else:

+ 21 - 7
tutorials/train/README.md

@@ -4,15 +4,29 @@
 
 |代码 | 模型任务 | 数据 |
 |------|--------|---------|
-|classification/mobilenetv2.py | 图像分类MobileNetV2 | 蔬菜分类 |
-|classification/resnet50.py | 图像分类ResNet50 | 蔬菜分类 |
-|detection/faster_rcnn_r50_fpn.py | 目标检测FasterRCNN | 昆虫检测 |
-|detection/mask_rcnn_f50_fpn.py | 实例分割MaskRCNN | 垃圾分拣 |
-|segmentation/deeplabv3p.py | 语义分割DeepLabV3| 视盘分割 |
-|segmentation/unet.py | 语义分割UNet | 视盘分割 |
+|image_classification/alexnet.py | 图像分类AlexyNet | 蔬菜分类 |
+|image_classification/mobilenetv2.py | 图像分类MobileNetV2 | 蔬菜分类 |
+|image_classification/mobilenetv3_small_ssld.py | 图像分类MobileNetV3_small_ssld | 蔬菜分类 |
+|image_classification/resnet50_vd_ssld.py | 图像分类ResNet50_vd_ssld | 蔬菜分类 |
+|image_classification/shufflenetv2.py | 图像分类ShuffleNetV2 | 蔬菜分类 |
+|object_detection/faster_rcnn_hrnet_fpn.py | 目标检测FasterRCNN | 昆虫检测 |
+|object_detection/faster_rcnn_r18_fpn.py | 目标检测FasterRCNN | 昆虫检测 |
+|object_detection/faster_rcnn_r50_fpn.py | 目标检测FasterRCNN | 昆虫检测 |
+|object_detection/yolov3_darknet53.py | 目标检测YOLOv3 | 昆虫检测 |
+|object_detection/yolov3_mobilenetv1.py | 目标检测YOLOv3 | 昆虫检测 |
+|object_detection/yolov3_mobilenetv3.py | 目标检测YOLOv3 | 昆虫检测 |
+|instance_segmentation/mask_rcnn_hrnet_fpn.py | 实例分割MaskRCNN | 小度熊分拣 |
+|instance_segmentation/mask_rcnn_r18_fpn.py | 实例分割MaskRCNN | 小度熊分拣 |
+|instance_segmentation/mask_rcnn_f50_fpn.py | 实例分割MaskRCNN | 小度熊分拣 |
+|semantic_segmentation/deeplabv3p_mobilenetv2.py | 语义分割DeepLabV3 | 视盘分割 |
+|semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py | 语义分割DeepLabV3 | 视盘分割 |
+|semantic_segmentation/deeplabv3p_xception65.py | 语义分割DeepLabV3 | 视盘分割 |
+|semantic_segmentation/fast_scnn.py | 语义分割FastSCNN | 视盘分割 |
+|semantic_segmentation/hrnet.py | 语义分割HRNet | 视盘分割 |
+|semantic_segmentation/unet.py | 语义分割UNet | 视盘分割 |
 
 ## 开始训练
 在安装PaddleX后,使用如下命令开始训练
 ```
-python classification/mobilenetv2.py
+python image_classification/mobilenetv2.py
 ```

+ 1 - 1
tutorials/train/image_classification/README.md

@@ -17,4 +17,4 @@ python mobilenetv3_small_ssld.py
 visualdl --logdir output/mobilenetv3_small_ssld/vdl_log --port 8001
 ```
 
-服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001 
+服务启动后,使用浏览器打开 https://0.0.0.0:8001 或 https://localhost:8001

+ 3 - 8
tutorials/train/image_classification/alexnet.py

@@ -13,14 +13,12 @@ pdx.utils.download_and_decompress(veg_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/cls_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomCrop(crop_size=224), 
-    transforms.RandomHorizontalFlip(),
+    transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 eval_transforms = transforms.Compose([
     transforms.ResizeByShort(short_size=256),
-    transforms.CenterCrop(crop_size=224), 
-    transforms.Normalize()
+    transforms.CenterCrop(crop_size=224), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.ImageNet(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mobilenetv2/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001或https://localhost:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 model = pdx.cls.AlexNet(num_classes=len(train_dataset.labels))
 # AlexNet需要指定确定的input_shape
 model.fixed_input_shape = [224, 224]

+ 3 - 8
tutorials/train/image_classification/mobilenetv2.py

@@ -13,14 +13,12 @@ pdx.utils.download_and_decompress(veg_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/cls_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomCrop(crop_size=224), 
-    transforms.RandomHorizontalFlip(),
+    transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 eval_transforms = transforms.Compose([
     transforms.ResizeByShort(short_size=256),
-    transforms.CenterCrop(crop_size=224), 
-    transforms.Normalize()
+    transforms.CenterCrop(crop_size=224), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.ImageNet(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mobilenetv2/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 model = pdx.cls.MobileNetV2(num_classes=len(train_dataset.labels))
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/classification.html#train

+ 3 - 8
tutorials/train/image_classification/mobilenetv3_small_ssld.py

@@ -13,14 +13,12 @@ pdx.utils.download_and_decompress(veg_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/cls_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomCrop(crop_size=224), 
-    transforms.RandomHorizontalFlip(),
+    transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 eval_transforms = transforms.Compose([
     transforms.ResizeByShort(short_size=256),
-    transforms.CenterCrop(crop_size=224), 
-    transforms.Normalize()
+    transforms.CenterCrop(crop_size=224), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.ImageNet(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mobilenetv2/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 model = pdx.cls.MobileNetV3_small_ssld(num_classes=len(train_dataset.labels))
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-imagenet

+ 3 - 8
tutorials/train/image_classification/resnet50_vd_ssld.py

@@ -13,14 +13,12 @@ pdx.utils.download_and_decompress(veg_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/cls_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomCrop(crop_size=224), 
-    transforms.RandomHorizontalFlip(),
+    transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 eval_transforms = transforms.Compose([
     transforms.ResizeByShort(short_size=256),
-    transforms.CenterCrop(crop_size=224), 
-    transforms.Normalize()
+    transforms.CenterCrop(crop_size=224), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.ImageNet(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mobilenetv2/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 model = pdx.cls.ResNet50_vd_ssld(num_classes=len(train_dataset.labels))
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/classification.html#train

+ 3 - 8
tutorials/train/image_classification/shufflenetv2.py

@@ -13,14 +13,12 @@ pdx.utils.download_and_decompress(veg_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/cls_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomCrop(crop_size=224), 
-    transforms.RandomHorizontalFlip(),
+    transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 eval_transforms = transforms.Compose([
     transforms.ResizeByShort(short_size=256),
-    transforms.CenterCrop(crop_size=224), 
-    transforms.Normalize()
+    transforms.CenterCrop(crop_size=224), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.ImageNet(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mobilenetv2/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 model = pdx.cls.ShuffleNetV2(num_classes=len(train_dataset.labels))
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/classification.html#train

+ 6 - 9
tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py

@@ -13,15 +13,15 @@ pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
     transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333),
     transforms.Padding(coarsest_stride=32),
 ])
 
@@ -38,10 +38,7 @@ eval_dataset = pdx.datasets.CocoDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mask_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 11
tutorials/train/instance_segmentation/mask_rcnn_r18_fpn.py

@@ -13,16 +13,14 @@ pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Normalize(), 
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.Normalize(), transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.CocoDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mask_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 11
tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py

@@ -13,16 +13,14 @@ pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Normalize(), 
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.Normalize(), transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 # 定义训练和验证所用的数据集
@@ -38,10 +36,7 @@ eval_dataset = pdx.datasets.CocoDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/mask_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 11
tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py

@@ -13,16 +13,14 @@ pdx.utils.download_and_decompress(insect_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Normalize(), 
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.Normalize(), transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 # 定义训练和验证所用的数据集
@@ -40,10 +38,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/faster_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 9
tutorials/train/object_detection/faster_rcnn_r18_fpn.py

@@ -13,15 +13,15 @@ pdx.utils.download_and_decompress(insect_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
     transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333),
     transforms.Padding(coarsest_stride=32),
 ])
 
@@ -40,10 +40,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/faster_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 9
tutorials/train/object_detection/faster_rcnn_r50_fpn.py

@@ -13,15 +13,15 @@ pdx.utils.download_and_decompress(insect_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333), 
-    transforms.Padding(coarsest_stride=32)
+    transforms.RandomHorizontalFlip(), transforms.Normalize(),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32)
 ])
 
 eval_transforms = transforms.Compose([
     transforms.Normalize(),
-    transforms.ResizeByShort(short_size=800, max_size=1333),
+    transforms.ResizeByShort(
+        short_size=800, max_size=1333),
     transforms.Padding(coarsest_stride=32),
 ])
 
@@ -40,10 +40,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/faster_rcnn_r50_fpn/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1
 num_classes = len(train_dataset.labels) + 1
 

+ 6 - 12
tutorials/train/object_detection/yolov3_darknet53.py

@@ -13,18 +13,15 @@ pdx.utils.download_and_decompress(insect_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.MixupImage(mixup_epoch=250), 
-    transforms.RandomDistort(),
-    transforms.RandomExpand(), 
-    transforms.RandomCrop(), 
-    transforms.Resize(target_size=608, interp='RANDOM'), 
-    transforms.RandomHorizontalFlip(),
+    transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(),
+    transforms.RandomExpand(), transforms.RandomCrop(), transforms.Resize(
+        target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Resize(target_size=608, interp='CUBIC'), 
-    transforms.Normalize()
+    transforms.Resize(
+        target_size=608, interp='CUBIC'), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -42,10 +39,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/yolov3_darknet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3

+ 5 - 6
tutorials/train/object_detection/yolov3_mobilenetv1.py

@@ -17,13 +17,15 @@ train_transforms = transforms.Compose([
     transforms.RandomDistort(),
     transforms.RandomExpand(),
     transforms.RandomCrop(),
-    transforms.Resize(target_size=608, interp='RANDOM'),
+    transforms.Resize(
+        target_size=608, interp='RANDOM'),
     transforms.RandomHorizontalFlip(),
     transforms.Normalize(),
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Resize(target_size=608, interp='CUBIC'),
+    transforms.Resize(
+        target_size=608, interp='CUBIC'),
     transforms.Normalize(),
 ])
 
@@ -42,10 +44,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/yolov3_darknet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3

+ 6 - 12
tutorials/train/object_detection/yolov3_mobilenetv3.py

@@ -13,18 +13,15 @@ pdx.utils.download_and_decompress(insect_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
 train_transforms = transforms.Compose([
-    transforms.MixupImage(mixup_epoch=250), 
-    transforms.RandomDistort(),
-    transforms.RandomExpand(), 
-    transforms.RandomCrop(), 
-    transforms.Resize(target_size=608, interp='RANDOM'), 
-    transforms.RandomHorizontalFlip(),
+    transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(),
+    transforms.RandomExpand(), transforms.RandomCrop(), transforms.Resize(
+        target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(),
     transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.Resize(target_size=608, interp='CUBIC'), 
-    transforms.Normalize()
+    transforms.Resize(
+        target_size=608, interp='CUBIC'), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -42,10 +39,7 @@ eval_dataset = pdx.datasets.VOCDetection(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/yolov3_darknet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3

+ 7 - 13
tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py

@@ -13,16 +13,13 @@ pdx.utils.download_and_decompress(optic_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.ResizeRangeScaling(),
-    transforms.RandomPaddingCrop(crop_size=512), 
-    transforms.Normalize()
+    transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(),
+    transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.ResizeByLong(long_size=512), 
-    transforms.Padding(target_size=512),
-    transforms.Normalize()
+    transforms.ResizeByLong(long_size=512),
+    transforms.Padding(target_size=512), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -40,15 +37,12 @@ eval_dataset = pdx.datasets.SegDataset(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/deeplab/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-deeplabv3p
-model = pdx.seg.DeepLabv3p(num_classes=num_classes, backbone='MobileNetV2_x1.0')
-
+model = pdx.seg.DeepLabv3p(
+    num_classes=num_classes, backbone='MobileNetV2_x1.0')
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#train
 # 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html

+ 5 - 13
tutorials/train/semantic_segmentation/fast_scnn.py

@@ -13,16 +13,13 @@ pdx.utils.download_and_decompress(optic_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.ResizeRangeScaling(),
-    transforms.RandomPaddingCrop(crop_size=512), 
-    transforms.Normalize()
+    transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(),
+    transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.ResizeByLong(long_size=512), 
-    transforms.Padding(target_size=512),
-    transforms.Normalize()
+    transforms.ResizeByLong(long_size=512),
+    transforms.Padding(target_size=512), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -40,13 +37,8 @@ eval_dataset = pdx.datasets.SegDataset(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/unet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
-
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
-
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-fastscnn
 model = pdx.seg.FastSCNN(num_classes=num_classes)
 

+ 5 - 11
tutorials/train/semantic_segmentation/hrnet.py

@@ -13,16 +13,13 @@ pdx.utils.download_and_decompress(optic_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.ResizeRangeScaling(),
-    transforms.RandomPaddingCrop(crop_size=512), 
-    transforms.Normalize()
+    transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(),
+    transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.ResizeByLong(long_size=512), 
-    transforms.Padding(target_size=512),
-    transforms.Normalize()
+    transforms.ResizeByLong(long_size=512),
+    transforms.Padding(target_size=512), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -40,10 +37,7 @@ eval_dataset = pdx.datasets.SegDataset(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/unet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-hrnet

+ 5 - 10
tutorials/train/semantic_segmentation/unet.py

@@ -13,15 +13,13 @@ pdx.utils.download_and_decompress(optic_dataset, path='./')
 # 定义训练和验证时的transforms
 # API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
 train_transforms = transforms.Compose([
-    transforms.RandomHorizontalFlip(), 
-    transforms.ResizeRangeScaling(),
-    transforms.RandomPaddingCrop(crop_size=512), 
-    transforms.Normalize()
+    transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(),
+    transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize()
 ])
 
 eval_transforms = transforms.Compose([
-    transforms.ResizeByLong(long_size=512), transforms.Padding(target_size=512),
-    transforms.Normalize()
+    transforms.ResizeByLong(long_size=512),
+    transforms.Padding(target_size=512), transforms.Normalize()
 ])
 
 # 定义训练和验证所用的数据集
@@ -39,10 +37,7 @@ eval_dataset = pdx.datasets.SegDataset(
     transforms=eval_transforms)
 
 # 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标
-# VisualDL启动方式: visualdl --logdir output/unet/vdl_log --port 8001
-# 浏览器打开 https://0.0.0.0:8001即可
-# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP
+# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
 num_classes = len(train_dataset.labels)
 
 # API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-deeplabv3p