jiangjiajun 5 yıl önce
ebeveyn
işleme
21c8666af0

+ 204 - 0
docs/datasets.md

@@ -0,0 +1,204 @@
+# 数据集格式说明
+
+---
+## 图像分类ImageNet
+
+图像分类ImageNet数据集包含对应多个标签的图像文件夹、标签文件及图像列表文件。
+参考数据文件结构如下:
+```
+./dataset/  # 数据集根目录
+|--labelA  # 标签为labelA的图像目录
+|  |--a1.jpg
+|  |--...
+|  └--...
+|
+|--...
+|
+|--labelZ  # 标签为labelZ的图像目录
+|  |--z1.jpg
+|  |--...
+|  └--...
+|
+|--train_list.txt  # 训练文件列表文件
+|
+|--val_list.txt  # 验证文件列表文件
+|
+└--labels.txt  # 标签列表文件
+
+```
+其中,相应的文件名可根据需要自行定义。
+
+`train_list.txt`和`val_list.txt`文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为图像文件对应的标签id(从0开始)。如下所示:
+```
+labelA/a1.jpg 0
+labelZ/z1.jpg 25
+...
+```
+
+`labels.txt`: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
+```
+labelA
+labelB
+...
+```
+[点击这里](https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz),下载蔬菜分类分类数据集
+在PaddleX中,使用`paddlex.cv.datasets.ImageNet`([API说明](./apis/datasets.html#imagenet))加载分类数据集
+
+## 目标检测VOC
+目标检测VOC数据集包含图像文件夹、标注信息文件夹、标签文件及图像列表文件。
+参考数据文件结构如下:
+```
+./dataset/  # 数据集根目录
+|--JPEGImages  # 图像目录
+|  |--xxx1.jpg
+|  |--...
+|  └--...
+|
+|--Annotations  # 标注信息目录
+|  |--xxx1.xml
+|  |--...
+|  └--...
+|
+|--train_list.txt  # 训练文件列表文件
+|
+|--val_list.txt  # 验证文件列表文件
+|
+└--labels.txt  # 标签列表文件
+
+```
+其中,相应的文件名可根据需要自行定义。
+
+`train_list.txt`和`val_list.txt`文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为标注文件相对于dataset的相对路径。如下所示:
+```
+JPEGImages/xxx1.jpg Annotations/xxx1.xml
+JPEGImages/xxx2.jpg Annotations/xxx2.xml
+...
+```
+
+`labels.txt`: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
+```
+labelA
+labelB
+...
+```
+[点击这里](https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz),下载昆虫检测数据集
+在PaddleX中,使用`paddlex.cv.datasets.VOCDetection`([API说明](./apis/datasets.html#vocdetection))加载目标检测VOC数据集
+
+## 目标检测和实例分割COCO
+目标检测和实例分割COCO数据集包含图像文件夹及图像标注信息文件。
+参考数据文件结构如下:
+```
+./dataset/  # 数据集根目录
+|--JPEGImages  # 图像目录
+|  |--xxx1.jpg
+|  |--...
+|  └--...
+|
+|--train.json  # 训练相关信息文件
+|
+└--val.json  # 验证相关信息文件
+
+```
+其中,相应的文件名可根据需要自行定义。
+
+`train.json`和`val.json`存储与标注信息、图像文件相关的信息。如下所示:
+
+```
+{
+  "annotations": [
+    {
+      "iscrowd": 0,
+      "category_id": 1,
+      "id": 1,
+      "area": 33672.0,
+      "image_id": 1,
+      "bbox": [232, 32, 138, 244],
+      "segmentation": [[32, 168, 365, 117, ...]]
+    },
+    ...
+  ],
+  "images": [
+    {
+      "file_name": "xxx1.jpg",
+      "height": 512,
+      "id": 267,
+      "width": 612
+    },
+    ...
+  ]
+  "categories": [
+    {
+      "name": "labelA",
+      "id": 1,
+      "supercategory": "component"
+    }
+  ]
+}
+```
+每个字段的含义如下所示:
+
+| 域名 | 字段名 | 含义 | 数据类型 | 备注 |
+|:-----|:--------|:------------|------|:-----|
+| annotations | id | 标注信息id | int | 从1开始 |
+| annotations | iscrowd      | 标注框是否为一组对象 | int | 只有0、1两种取值 |
+| annotations | category_id  | 标注框类别id | int |  |
+| annotations | area         | 标注框的面积 | float |  |
+| annotations | image_id     | 当前标注信息所在图像的id | int |  |
+| annotations | bbox         | 标注框坐标 | list | 长度为4,分别代表x,y,w,h |
+| annotations | segmentation | 标注区域坐标 | list | list中有至少1个list,每个list由每个小区域坐标点的横纵坐标(x,y)组成 |
+| images          | id                | 图像id | int | 从1开始 |
+| images   | file_name         | 图像文件名 | str |  |
+| images      | height            | 图像高度 | int |  |
+| images       | width             | 图像宽度 | int |  |
+| categories  | id            | 类别id | int | 从1开始 |
+| categories | name          | 类别标签名 | str |  |
+| categories | supercategory | 类别父类的标签名 | str |  |
+
+
+[点击这里](https://bj.bcebos.com/paddlex/datasets/garbage_ins_det.tar.gz),下载垃圾实例分割数据集
+在PaddleX中,使用`paddlex.cv.datasets.COCODetection`([API说明](./apis/datasets.html#cocodetection))加载COCO格式数据集
+
+## 语义分割数据
+语义分割数据集包含原图、标注图及相应的文件列表文件。
+参考数据文件结构如下:
+```
+./dataset/  # 数据集根目录
+|--images  # 原图目录
+|  |--xxx1.png
+|  |--...
+|  └--...
+|
+|--annotations  # 标注图目录
+|  |--xxx1.png
+|  |--...
+|  └--...
+|
+|--train_list.txt  # 训练文件列表文件
+|
+|--val_list.txt  # 验证文件列表文件
+|
+└--labels.txt  # 标签列表
+
+```
+其中,相应的文件名可根据需要自行定义。
+
+`train_list.txt`和`val_list.txt`文本以空格为分割符分为两列,第一列为图像文件相对于dataset的相对路径,第二列为标注图像文件相对于dataset的相对路径。如下所示:
+```
+images/xxx1.png annotations/xxx1.png
+images/xxx2.png annotations/xxx2.png
+...
+```
+
+`labels.txt`: 每一行为一个单独的类别,相应的行号即为类别对应的id(行号从0开始),如下所示:
+```
+labelA
+labelB
+...
+```
+
+标注图像为单通道图像,像素值即为对应的类别,像素标注类别需要从0开始递增,
+例如0,1,2,3表示有4种类别,标注类别最多为256类。其中可以指定特定的像素值用于表示该值的像素不参与训练和评估(默认为255)。
+
+[点击这里](https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz),下载视盘语义分割数据集
+在PaddleX中,使用`paddlex.cv.datasets.SegReader`([API说明](./apis/datasets.html#segreader))加载语义分割数据集
+

+ 24 - 15
docs/quick_start.md

@@ -17,16 +17,16 @@ tar xzvf vegetables_cls.tar.gz
 
 ## 3. 训练代码开发
 PaddleX的所有模型训练和预测均只涉及到5个API接口,分别是
-> - [transforms](apis/transforms/index) 图像数据处理
-> - [datasets](apis/datasets.md) 数据集加载
-> - [models](apis/models.md) 模型类型定义
-> - [train](apis/models.md) 开始训练
-> - [predict](apis/models.md) 模型预测 
+> - [transforms](apis/transforms/index.html) 图像数据处理
+> - [datasets](apis/datasets/classification.md) 数据集加载
+> - [models](apis/models/classification.md) 模型类型定义
+> - [train](apis/models/classification.html#train) 开始训练
+> - [predict](apis/models/classification.html#predict) 模型预测 
  
 在本示例,通过如下`train.py`代码进行训练, 训练环境为1张Tesla P40 GPU卡。  
 
 ### 3.1 定义`transforms`数据处理流程
-由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在`train_transforms`中加入了[RandomCrop](apis/transforms/cls_transforms.html#RandomCrop)和[RandomHorizontalFlip](apis/transforms/cls_transforms.html#RandomHorizontalFlip)两种数据增强方式
+由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在`train_transforms`中加入了[RandomCrop](apis/transforms/cls_transforms.html#RandomCrop)和[RandomHorizontalFlip](apis/transforms/cls_transforms.html#RandomHorizontalFlip)两种数据增强方式, 更多方法可以参考[数据增强文档](apis/transforms/augment.md)。
 ```
 from paddlex.cls import transforms
 train_transforms = transforms.Compose([
@@ -41,7 +41,8 @@ eval_transforms = transforms.Compose([
 ])
 ```
 
-> 定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集
+### 3.2 定义`dataset`加载数据集
+定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集, 更多数据集细节可以查阅[数据集格式说明](datasets.md)和[ImageNet接口文档](apis/datasets/classification.md)
 ```
 train_dataset = pdx.datasets.ImageNet(
     data_dir='vegetables_cls',
@@ -55,11 +56,17 @@ eval_dataset = pdx.datasets.ImageNet(
     label_list='vegetables_cls/labels.txt',
     transforms=eval_transforms)
 ```
-> 模型训练
 
+### 3.3 定义分类模型
+本文档中使用百度基于蒸馏方法得到的MobileNetV3预训练模型,模型结构与MobileNetV3一致,但精度更高。PaddleX内置了20多种分类模型,查阅[PaddleX模型库](appendix/model_zoo.md)了解更多分类模型。
 ```
 num_classes = len(train_dataset.labels)
-model = pdx.cls.MobileNetV2(num_classes=num_classes)
+model.pdx.cls.MobileNetV3_small_ssld(num_classes=num_classes)
+```
+
+### 3.4 定义训练参数
+定义好模型后,即可直接调用`train`接口,定义训练时的参数,分类模型内置了`piecewise_decay`学习率衰减策略,相关参数见[分类train接口文档](apis/models/classification.html#train)。
+```
 model.train(num_epochs=10,
             train_dataset=train_dataset,
             train_batch_size=32,
@@ -70,19 +77,21 @@ model.train(num_epochs=10,
             use_vdl=True)
 ```
 
-## 3. 模型训练
-> `train.py`与解压后的数据集目录`vegetables_cls`放在同一目录下,在此目录下运行`train.py`即可开始训练。如果您的电脑上有GPU,这将会在10分钟内训练完成,如果为CPU也大概会在30分钟内训练完毕。
+## 4. 模型开始训练
+`train.py`与解压后的数据集目录`vegetables_cls`放在同一目录下,在此目录下运行`train.py`即可开始训练。如果您的电脑上有GPU,这将会在10分钟内训练完成,如果为CPU也大概会在30分钟内训练完毕。
 ```
 python train.py
 ```
-## 4. 训练过程中查看训练指标
-> 模型在训练过程中,所有的迭代信息将以标注输出流的形式,输出到命令执行的终端上,用户也可通过visualdl以可视化的方式查看训练指标的变化,通过如下方式启动visualdl后,在浏览器打开https://0.0.0.0:8001即可。
+
+## 5. 训练过程中查看训练指标
+模型在训练过程中,所有的迭代信息将以标注输出流的形式,输出到命令执行的终端上,用户也可通过visualdl以可视化的方式查看训练指标的变化,通过如下方式启动visualdl后,在浏览器打开https://0.0.0.0:8001 (或 https://localhost:8001)即可。
 ```
 visualdl --logdir output/mobilenetv2/vdl_log --port 8000
 ```
 ![](./images/vdl1.jpg)
-## 5. 训练完成使用模型进行测试
-> 如使用训练过程中第8轮保存的模型进行测试
+
+## 6. 训练完成使用模型进行测试
+如下代码使用训练过程中第8轮保存的模型进行测试。
 ```
 import paddlex as pdx
 model = pdx.load_model('output/mobilenetv2/epoch_8')

+ 33 - 0
docs/tutorials/deploy/deploy.md

@@ -39,6 +39,39 @@ C++部署方案位于目录`deploy/cpp/`下,且独立于PaddleX其他模块。
 - Linux平台:[linux](deploy_cpp_linux.md)
 - window平台:[windows](deploy_cpp_win_vs2019.md)
 
+### OpenVINO部署demo
+
+OpenVINO部署demo位于目录`deploy/openvino/`下,且独立于PaddleX其他模块,该demo目前支持在 Linux 完成编译和部署运行。目前PaddleX到OpenVINO的部署流程如下:
+
+graph LR
+   PaddleX --> ONNX --> OpenVINO IR --> OpenVINO Inference Engine
+#### step1
+
+PaddleX输出ONNX模型方法如下:
+
+```
+paddlex --export_onnx --model_dir=./xiaoduxiong_epoch_12 --save_dir=./onnx_model
+```
+
+|目前支持的模型|
+|-----|
+|ResNet18|
+|ResNet34|
+|ResNet50|
+|ResNet101|
+|ResNet50_vd|
+|ResNet101_vd|
+|ResNet50_vd_ssld|
+|ResNet101_vd_ssld
+|DarkNet53|
+|MobileNetV1|
+|MobileNetV2|
+|DenseNet121|
+|DenseNet161|
+|DenseNet201|
+
+得到ONNX模型后,OpenVINO的部署参考:[OpenVINO部署](deploy_openvino.md)
+
 ### 预测性能对比
 
 #### 测试环境

+ 103 - 0
docs/tutorials/deploy/depoly_openvino.md

@@ -0,0 +1,103 @@
+# OpenVINO 分类demo编译
+
+## 说明
+本文档在 `Ubuntu`使用`GCC 4.8.5` 进行了验证,如果需要使用更多G++版本和平台的OpenVino编译,请参考: [OpenVINO](https://github.com/openvinotoolkit/openvino/blob/2020/build-instruction.md)。
+
+## 验证环境
+* Ubuntu* 16.04 (64-bit) with GCC* 4.8.5
+* CMake 3.12
+* Python 2.7 or higher
+
+请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。
+
+ `git clone https://github.com/PaddlePaddle/PaddleX.git`
+
+**说明**:其中`C++`预测代码在`/root/projects/PaddleX/deploy/openvino` 目录,该目录不依赖任何`PaddleX`下其他目录。
+
+### Step1: 软件依赖
+
+- openvino:
+[编译文档](https://github.com/openvinotoolkit/openvino/blob/2020/build-instruction.md#build-steps)
+
+- gflags:
+[编译文档](https://gflags.github.io/gflags/#download)
+
+- opencv:
+[编译文档](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)
+说明:/root/projects/PaddleX/deploy/openvino/scripts/bootstrap.sh提供了预编译版本下载,也可自行编译。
+
+- ngraph:
+说明:openvino编译的过程中会生成ngraph的lib文件,位于{openvino根目录}/bin/intel64/Release/lib/下。
+
+### Step2: 编译demo
+
+
+编译`cmake`的命令在`scripts/build.sh`中,请根据Step1中编译软件的实际情况修改主要参数,其主要内容说明如下:
+```
+# openvino预编译库的路径
+OPENVINO_DIR=/path/to/inference_engine/
+# gflags预编译库的路径
+GFLAGS_DIR=/path/to/gflags
+# ngraph lib的路径,编译openvino时通常会生成
+NGRAPH_LIB=/path/to/ngraph/lib/
+# opencv预编译库的路径, 如果使用自带预编译版本可不修改
+OPENCV_DIR=$(pwd)/deps/opencv3gcc4.8/
+# 下载自带预编译版本
+sh $(pwd)/scripts/bootstrap.sh
+rm -rf build
+mkdir -p build
+cd build
+cmake .. \
+    -DOPENCV_DIR=${OPENCV_DIR} \
+    -DGFLAGS_DIR=${GFLAGS_DIR} \
+    -DOPENVINO_DIR=${OPENVINO_DIR} \
+    -DNGRAPH_LIB=${NGRAPH_LIB} 
+make
+```
+
+修改脚本设置好主要参数后,执行`build`脚本:
+ ```shell
+ sh ./scripts/build.sh
+ ```
+
+### Step3: 模型转换
+
+将[]()生成的onnx文件转换为OpencVINO支持的格式,请参考:[Model Optimizer文档](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html)
+
+### Step4: 预测
+编译成功后,预测demo的可执行程序分别为`build/classifer`,其主要命令参数说明如下:
+
+|  参数   | 说明  |
+|  ----  | ----  |
+| --model_dir  | Model Optimizer生成的.xml文件路径,请保证Model Optimizer生成的三个文件在同一路径下|
+| --image  | 要预测的图片文件路径 |
+| --image_list  | 按行存储图片路径的.txt文件 |
+| --device  | 运行的平台, 默认值为"CPU" |
+
+
+## 样例
+
+可使用[小度熊识别模型](deploy.md#导出inference模型)中导出的`inference_model`和测试图片进行预测。
+
+`样例一`:
+
+测试图片 `/path/to/xiaoduxiong.jpeg`  
+
+```shell
+./build/classifier --model_dir=/path/to/inference_model --image=/path/to/xiaoduxiong.jpeg
+```
+
+
+`样例二`:
+
+预测多个图片`/path/to/image_list.txt`,image_list.txt内容的格式如下:
+```
+/path/to/images/xiaoduxiong1.jpeg
+/path/to/images/xiaoduxiong2.jpeg
+...
+/path/to/images/xiaoduxiongn.jpeg
+```
+```shell
+./build/classifier --model_dir=/path/to/models/inference_model --image_list=/root/projects/images_list.txt -
+```
+

+ 49 - 0
docs/tutorials/deploy/encryption.md

@@ -0,0 +1,49 @@
+# Paddle模型加密方案
+
+飞桨团队推出模型加密方案,使用业内主流的AES加密技术对最终模型进行加密。飞桨用户可以通过PaddleX导出模型后,使用该方案对模型进行加密,预测时使用解密SDK进行模型解密并完成推理,大大提升AI应用安全性和开发效率。
+
+## 1. 方案介绍
+
+### 1.1 工具组成
+
+[链接](http://wiki.baidu.com/pages/viewpage.action?pageId=1128566963)
+
+下载并解压后,目录包含内容为:
+```
+paddle_model_encrypt
+├── include # 头文件:paddle_model_decrypt.h(解密)和paddle_model_encrypt.h(加密)
+|
+├── lib # libpmodel-encrypt.so和libpmodel-decrypt.so动态库
+|
+└── tool # paddle_encrypt_tool
+```
+
+### 1.2 二进制工具
+
+#### 1.2.1 生成密钥
+
+产生随机密钥信息(用于AES加解密使用)(32字节key + 16字节iv, 注意这里产生的key是经过base64编码后的,这样可以扩充选取key的范围)
+
+```
+paddle_encrypt_tool    -g
+```
+#### 1.2.1 文件加密
+
+```
+ paddle_encrypt_tool    -e    -key    keydata     -infile    infile    -outfile    outfile
+```
+
+#### 1.3 SDK
+
+```
+// 加密API
+int paddle_encrypt_model(const char* keydata, const char* infile, const char* outfile);
+// 加载加密模型API:
+int paddle_security_load_model(
+        paddle::AnalysisConfig *config,
+        const char *key,
+        const char *model_file,
+        const char *param_file);
+```
+
+## 2. PaddleX C++加密部署