diff --git a/docs/Makefile b/docs/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..d4bb2cbb9eddb1bb1b4f366623044af8e4830919 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..df45f14400cac1d6816e9a55ad92dc59ba141650 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,11 @@ +# PaddleX文档 + +PaddleX的使用文档均在本目录结构下。文档采用Read the Docs方式组织,您可以直接访问[在线文档](https://paddlex.readthedocs.io/zh_CN/latest/index.html)进行查阅。 + +## 编译文档 +在本目录下按如下步骤进行文档编译 + +- 安装依赖: `pip install -r requirements.txt` +- 编译: `make html` + +编译完成后,编译文件在`_build`目录下,直接打开`_build/html/index.html`即可查阅。 diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000000000000000000000000000000000000..76d4bb0c6da716dc75d363d226dadf9173342f3a --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,8 @@ +{% extends "!layout.html" %} + {% block footer %} {{ super() }} + + + +{% endblock %} diff --git a/docs/apis/datasets.md b/docs/apis/datasets.md new file mode 100644 index 0000000000000000000000000000000000000000..ae3595be7ece185ce1992d0e5a0c75e2977ef362 --- /dev/null +++ b/docs/apis/datasets.md @@ -0,0 +1,142 @@ +# 数据集读取 + +## paddlex.datasets.ImageNet +> **用于图像分类模型** +``` +paddlex.datasets.ImageNet(data_dir, file_list, label_list, transforms=None, num_workers=‘auto’, buffer_size=100, parallel_method='thread', shuffle=False) +``` +读取ImageNet格式的分类数据集,并对样本进行相应的处理。ImageNet数据集格式的介绍可查看文档:[数据集格式说明](../data/format/index.html) + +示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/classification/mobilenetv2.py#L25) + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和类别id的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.cls.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.cls.transforms](./transforms/cls_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.PascalVOC +> **用于目标检测模型** +``` +paddlex.datasets.PascalVOC(data_dir, file_list, label_list, transforms=None, num_workers=‘auto’, buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取PascalVOC格式的检测数据集,并对样本进行相应的处理。PascalVOC数据集格式的介绍可查看文档:[数据集格式说明](../data/format/index.html) + +> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/detection/yolov3_darknet53.py#L29) + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.det.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.det.transforms](./transforms/det_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.MSCOCO +> **用于实例分割/目标检测模型** +``` +paddlex.datasets.MSCOCO(data_dir, ann_file, transforms=None, num_workers='auto', buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取MSCOCO格式的检测数据集,并对样本进行相应的处理,该格式的数据集同样可以应用到实例分割模型的训练中。MSCOCO数据集格式的介绍可查看文档:[数据集格式说明](../data/format/index.html) + +> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/detection/mask_rcnn_r50_fpn.py#L27) + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **ann_file** (str): 数据集的标注文件,为一个独立的json格式文件。 +> > * **transforms** (paddlex.det.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.det.transforms](./transforms/det_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.SegDataset +> **用于语义分割模型** +``` +paddlex.datasets.SegDataset(data_dir, file_list, label_list, transforms=None, num_workers='auto', buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取语义分割任务数据集,并对样本进行相应的处理。语义分割任务数据集格式的介绍可查看文档:[数据集格式说明](../data/format/index.html) + +> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/segmentation/unet.py#L27) + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.seg.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.seg.transforms](./transforms/seg_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.EasyDataCls +> **用于图像分类模型** +``` +paddlex.datasets.EasyDataCls(data_dir, file_list, label_list, transforms=None, num_workers='auto', buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取EasyData平台标注图像分类数据集,并对样本进行相应的处理。 + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.seg.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.cls.transforms](./transforms/cls_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.EasyDataDet +> 用于**目标检测/实例分割模型** +``` +paddlex.datasets.EasyDataDet(data_dir, file_list, label_list, transforms=None, num_workers=‘auto’, buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取EasyData目标检测/实例分割格式数据集,并对样本进行相应的处理,该格式的数据集同样可以应用到实例分割模型的训练中。 + + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.det.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.det.transforms](./transforms/det_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 + +## paddlex.datasets.EasyDataSeg +> **用于语义分割模型** +``` +paddlex.datasets.EasyDataSeg(data_dir, file_list, label_list, transforms=None, num_workers='auto', buffer_size=100, parallel_method='thread', shuffle=False) +``` + +> 读取EasyData语义分割任务数据集,并对样本进行相应的处理。 + + +> **参数** + +> > * **data_dir** (str): 数据集所在的目录路径。 +> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。 +> > * **label_list** (str): 描述数据集包含的类别信息文件路径。 +> > * **transforms** (paddlex.seg.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.seg.transforms](./transforms/seg_transforms.md)。 +> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。 +> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。 +> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。 +> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。 diff --git a/docs/apis/images/insect_bbox_pr_curve(iou-0.5).png b/docs/apis/images/insect_bbox_pr_curve(iou-0.5).png new file mode 100755 index 0000000000000000000000000000000000000000..87c41aeab79779eb5355ea5d2e9be41087eb9006 Binary files /dev/null and b/docs/apis/images/insect_bbox_pr_curve(iou-0.5).png differ diff --git a/docs/apis/index.rst b/docs/apis/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..142637e8c33d121289e9c329f9b547fcb21404a6 --- /dev/null +++ b/docs/apis/index.rst @@ -0,0 +1,13 @@ +API接口说明 +============================ + +.. toctree:: + :maxdepth: 2 + + transforms/index.rst + datasets.md + models/index.rst + slim.md + load_model.md + visualize.md + interpret.md diff --git a/docs/apis/interpret.md b/docs/apis/interpret.md new file mode 100644 index 0000000000000000000000000000000000000000..24ab99a1a17b2ebee2dc4388843e5d81176038ac --- /dev/null +++ b/docs/apis/interpret.md @@ -0,0 +1,58 @@ +# 模型可解释性 + +目前PaddleX支持对于图像分类的结果以可视化的方式进行解释,支持LIME和NormLIME两种可解释性算法。 + +## paddlex.interpret.lime +> **LIME可解释性结果可视化** +``` +paddlex.interpret.lime(img_file, + model, + num_samples=3000, + batch_size=50, + save_dir='./') +``` +使用LIME算法将模型预测结果的可解释性可视化。 +LIME表示与模型无关的局部可解释性,可以解释任何模型。LIME的思想是以输入样本为中心,在其附近的空间中进行随机采样,每个采样通过原模型得到新的输出,这样得到一系列的输入和对应的输出,LIME用一个简单的、可解释的模型(比如线性回归模型)来拟合这个映射关系,得到每个输入维度的权重,以此来解释模型。 + +**注意:** 可解释性结果可视化目前只支持分类模型。 + +### 参数 +>* **img_file** (str): 预测图像路径。 +>* **model** (paddlex.cv.models): paddlex中的模型。 +>* **num_samples** (int): LIME用于学习线性模型的采样数,默认为3000。 +>* **batch_size** (int): 预测数据batch大小,默认为50。 +>* **save_dir** (str): 可解释性可视化结果(保存为png格式文件)和中间文件存储路径。 + + +### 使用示例 +> 对预测可解释性结果可视化的过程可参见[代码](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/interpret/lime.py)。 + + +## paddlex.interpret.normlime +> **NormLIME可解释性结果可视化** +``` +paddlex.interpret.normlime(img_file, + model, + dataset=None, + num_samples=3000, + batch_size=50, + save_dir='./', + normlime_weights_file=None) +``` +使用NormLIME算法将模型预测结果的可解释性可视化。 +NormLIME是利用一定数量的样本来出一个全局的解释。由于NormLIME计算量较大,此处采用一种简化的方式:使用一定数量的测试样本(目前默认使用所有测试样本),对每个样本进行特征提取,映射到同一个特征空间;然后以此特征做为输入,以模型输出做为输出,使用线性回归对其进行拟合,得到一个全局的输入和输出的关系。之后,对一测试样本进行解释时,使用NormLIME全局的解释,来对LIME的结果进行滤波,使最终的可视化结果更加稳定。 + +**注意:** 可解释性结果可视化目前只支持分类模型。 + +### 参数 +>* **img_file** (str): 预测图像路径。 +>* **model** (paddlex.cv.models): paddlex中的模型。 +>* **dataset** (paddlex.datasets): 数据集读取器,默认为None。 +>* **num_samples** (int): LIME用于学习线性模型的采样数,默认为3000。 +>* **batch_size** (int): 预测数据batch大小,默认为50。 +>* **save_dir** (str): 可解释性可视化结果(保存为png格式文件)和中间文件存储路径。 +>* **normlime_weights_file** (str): NormLIME初始化文件名,若不存在,则计算一次,保存于该路径;若存在,则直接载入。 + +**注意:** dataset`读取的是一个数据集,该数据集不宜过大,否则计算时间会较长,但应包含所有类别的数据。NormLIME可解释性结果可视化目前只支持分类模型。 +### 使用示例 +> 对预测可解释性结果可视化的过程可参见[代码](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/interpret/normlime.py)。 diff --git a/docs/apis/load_model.md b/docs/apis/load_model.md new file mode 100755 index 0000000000000000000000000000000000000000..e325279a3f3db5c9e832d18fec78dcf4fac6e167 --- /dev/null +++ b/docs/apis/load_model.md @@ -0,0 +1,41 @@ +# 模型加载 + +PaddleX提供了统一的模型加载接口,支持加载PaddleX保存的模型,并在验证集上进行评估或对测试图片进行预测 + +## paddlex.load_model +> **加载PaddleX保存的模型** + +``` +paddlex.load_model(model_dir) +``` + +### 参数 + +* **model_dir**: 训练过程中保存的模型路径 + +### 返回值 +* **paddlex.cv.models**, 模型类。 + +### 示例 +> 1. [点击下载](https://bj.bcebos.com/paddlex/models/xiaoduxiong_epoch_12.tar.gz)PaddleX在小度熊分拣数据上训练的MaskRCNN模型 +> 2. [点击下载](https://bj.bcebos.com/paddlex/datasets/xiaoduxiong_ins_det.tar.gz)小度熊分拣数据集 + +``` +import paddlex as pdx + +model_dir = './xiaoduxiong_epoch_12' +data_dir = './xiaoduxiong_ins_det/JPEGImages' +ann_file = './xiaoduxiong_ins_det/val.json' + +# 加载垃圾分拣模型 +model = pdx.load_model(model_dir) + +# 预测 +pred_result = model.predict('./xiaoduxiong_ins_det/JPEGImages/WechatIMG114.jpeg') + +# 在验证集上进行评估 +eval_reader = pdx.cv.datasets.CocoDetection(data_dir=data_dir, + ann_file=ann_file, + transforms=model.eval_transforms) +eval_result = model.evaluate(eval_reader, batch_size=1) +``` diff --git a/docs/apis/models/classification.md b/docs/apis/models/classification.md new file mode 100755 index 0000000000000000000000000000000000000000..135b50ed6dc73ef4f9becae9132a800424835c69 --- /dev/null +++ b/docs/apis/models/classification.md @@ -0,0 +1,108 @@ +# Image Classification + +## paddlex.cls.ResNet50 + +```python +paddlex.cls.ResNet50(num_classes=1000) +``` + +> 构建ResNet50分类器,并实现其训练、评估和预测。 + +**参数** + +> - **num_classes** (int): 类别数。默认为1000。 + +### train + +```python +train(self, num_epochs, train_dataset, train_batch_size=64, eval_dataset=None, save_interval_epochs=1, log_interval_steps=2, save_dir='output', pretrain_weights='IMAGENET', optimizer=None, learning_rate=0.025, warmup_steps=0, warmup_start_lr=0.0, lr_decay_epochs=[30, 60, 90], lr_decay_gamma=0.1, use_vdl=False, sensitivities_file=None, eval_metric_loss=0.05, early_stop=False, early_stop_patience=5, resume_checkpoint=None) +``` +> +> **参数** +> +> > - **num_epochs** (int): 训练迭代轮数。 +> > - **train_dataset** (paddlex.datasets): 训练数据读取器。 +> > - **train_batch_size** (int): 训练数据batch大小。同时作为验证数据batch大小。默认值为64。 +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **save_interval_epochs** (int): 模型保存间隔(单位:迭代轮数)。默认为1。 +> > - **log_interval_steps** (int): 训练日志输出间隔(单位:迭代步数)。默认为2。 +> > - **save_dir** (str): 模型保存路径。 +> > - **pretrain_weights** (str): 若指定为路径时,则加载路径下预训练模型;若为字符串'IMAGENET',则自动下载在ImageNet图片数据上预训练的模型权重;若为None,则不使用预训练模型。默认为'IMAGENET'。 +> > - **optimizer** (paddle.fluid.optimizer): 优化器。当该参数为None时,使用默认优化器:fluid.layers.piecewise_decay衰减策略,fluid.optimizer.Momentum优化方法。 +> > - **learning_rate** (float): 默认优化器的初始学习率。默认为0.025。 +> > - **warmup_steps** (int): 默认优化器的warmup步数,学习率将在设定的步数内,从warmup_start_lr线性增长至设定的learning_rate,默认为0。 +> > - **warmup_start_lr**(float): 默认优化器的warmup起始学习率,默认为0.0。 +> > - **lr_decay_epochs** (list): 默认优化器的学习率衰减轮数。默认为[30, 60, 90]。 +> > - **lr_decay_gamma** (float): 默认优化器的学习率衰减率。默认为0.1。 +> > - **use_vdl** (bool): 是否使用VisualDL进行可视化。默认值为False。 +> > - **sensitivities_file** (str): 若指定为路径时,则加载路径下敏感度信息进行裁剪;若为字符串'DEFAULT',则自动下载在ImageNet图片数据上获得的敏感度信息进行裁剪;若为None,则不进行裁剪。默认为None。 +> > - **eval_metric_loss** (float): 可容忍的精度损失。默认为0.05。 +> > - **early_stop** (bool): 是否使用提前终止训练策略。默认值为False。 +> > - **early_stop_patience** (int): 当使用提前终止训练策略时,如果验证集精度在`early_stop_patience`个epoch内连续下降或持平,则终止训练。默认值为5。 +> > - **resume_checkpoint** (str): 恢复训练时指定上次训练保存的模型路径。若为None,则不会恢复训练。默认值为None。 + +### evaluate + +```python +evaluate(self, eval_dataset, batch_size=1, epoch_id=None, return_details=False) +``` +> +> **参数** +> +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **batch_size** (int): 验证数据批大小。默认为1。 +> > - **epoch_id** (int): 当前评估模型所在的训练轮数。 +> > - **return_details** (bool): 是否返回详细信息,默认False。 +> +> **返回值** +> +> > - **dict**: 当return_details为False时,返回dict, 包含关键字:'acc1'、'acc5',分别表示最大值的accuracy、前5个最大值的accuracy。 +> > - **tuple** (metrics, eval_details): 当`return_details`为True时,增加返回dict,包含关键字:'true_labels'、'pred_scores',分别代表真实类别id、每个类别的预测得分。 + +### predict + +```python +predict(self, img_file, transforms=None, topk=5) +``` + +> 分类模型预测接口。需要注意的是,只有在训练过程中定义了eval_dataset,模型在保存时才会将预测时的图像处理流程保存在`ResNet50.test_transforms`和`ResNet50.eval_transforms`中。如未在训练时定义eval_dataset,那在调用预测`predict`接口时,用户需要再重新定义test_transforms传入给`predict`接口。 + +> **参数** +> +> > - **img_file** (str|np.ndarray): 预测图像路径或numpy数组(HWC排列,BGR格式)。 +> > - **transforms** (paddlex.cls.transforms): 数据预处理操作。 +> > - **topk** (int): 预测时前k个最大值。 + +> **返回值** +> +> > - **list**: 其中元素均为字典。字典的关键字为'category_id'、'category'、'score', +> > 分别对应预测类别id、预测类别标签、预测得分。 + +## 其它分类模型 + +PaddleX提供了共计22种分类模型,所有分类模型均提供同`ResNet50`相同的训练`train`,评估`evaluate`和预测`predict`接口,各模型效果可参考[模型库](https://paddlex.readthedocs.io/zh_CN/latest/appendix/model_zoo.html)。 + +| 模型 | 接口 | +| :---------------- | :---------------------- | +| ResNet18 | paddlex.cls.ResNet18(num_classes=1000) | +| ResNet34 | paddlex.cls.ResNet34(num_classes=1000) | +| ResNet50 | paddlex.cls.ResNet50(num_classes=1000) | +| ResNet50_vd | paddlex.cls.ResNet50_vd(num_classes=1000) | +| ResNet50_vd_ssld | paddlex.cls.ResNet50_vd_ssld(num_classes=1000) | +| ResNet101 | paddlex.cls.ResNet101(num_classes=1000) | +| ResNet101_vd | paddlex.cls.ResNet101_vd(num_classes=1000) | +| ResNet101_vd_ssld | paddlex.cls.ResNet101_vd_ssld(num_classes=1000) | +| DarkNet53 | paddlex.cls.DarkNet53(num_classes=1000) | +| MoibileNetV1 | paddlex.cls.MobileNetV1(num_classes=1000) | +| MobileNetV2 | paddlex.cls.MobileNetV2(num_classes=1000) | +| MobileNetV3_small | paddlex.cls.MobileNetV3_small(num_classes=1000) | +| MobileNetV3_small_ssld | paddlex.cls.MobileNetV3_small_ssld(num_classes=1000) | +| MobileNetV3_large | paddlex.cls.MobileNetV3_large(num_classes=1000) | +| MobileNetV3_large_ssld | paddlex.cls.MobileNetV3_large_ssld(num_classes=1000) | +| Xception65 | paddlex.cls.Xception65(num_classes=1000) | +| Xception71 | paddlex.cls.Xception71(num_classes=1000) | +| ShuffleNetV2 | paddlex.cls.ShuffleNetV2(num_classes=1000) | +| DenseNet121 | paddlex.cls.DenseNet121(num_classes=1000) | +| DenseNet161 | paddlex.cls.DenseNet161(num_classes=1000) | +| DenseNet201 | paddlex.cls.DenseNet201(num_classes=1000) | +| HRNet_W18 | paddlex.cls.HRNet_W18(num_classes=1000) | diff --git a/docs/apis/models/detection.md b/docs/apis/models/detection.md new file mode 100755 index 0000000000000000000000000000000000000000..ab3f413e18b7fad427f2e3ec0db32927a800b29b --- /dev/null +++ b/docs/apis/models/detection.md @@ -0,0 +1,180 @@ +# Object Detection + +## paddlex.det.YOLOv3 + +```python +paddlex.det.YOLOv3(num_classes=80, backbone='MobileNetV1', anchors=None, anchor_masks=None, ignore_threshold=0.7, nms_score_threshold=0.01, nms_topk=1000, nms_keep_topk=100, nms_iou_threshold=0.45, label_smooth=False, train_random_shapes=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608]) +``` + +> 构建YOLOv3检测器。**注意在YOLOv3,num_classes不需要包含背景类,如目标包括human、dog两种,则num_classes设为2即可,这里与FasterRCNN/MaskRCNN有差别** + +> **参数** +> +> > - **num_classes** (int): 类别数。默认为80。 +> > - **backbone** (str): YOLOv3的backbone网络,取值范围为['DarkNet53', 'ResNet34', 'MobileNetV1', 'MobileNetV3_large']。默认为'MobileNetV1'。 +> > - **anchors** (list|tuple): anchor框的宽度和高度,为None时表示使用默认值 +> > [[10, 13], [16, 30], [33, 23], [30, 61], [62, 45], +> [59, 119], [116, 90], [156, 198], [373, 326]]。 +> > - **anchor_masks** (list|tuple): 在计算YOLOv3损失时,使用anchor的mask索引,为None时表示使用默认值 +> > [[6, 7, 8], [3, 4, 5], [0, 1, 2]]。 +> > - **ignore_threshold** (float): 在计算YOLOv3损失时,IoU大于`ignore_threshold`的预测框的置信度被忽略。默认为0.7。 +> > - **nms_score_threshold** (float): 检测框的置信度得分阈值,置信度得分低于阈值的框应该被忽略。默认为0.01。 +> > - **nms_topk** (int): 进行NMS时,根据置信度保留的最大检测框数。默认为1000。 +> > - **nms_keep_topk** (int): 进行NMS后,每个图像要保留的总检测框数。默认为100。 +> > - **nms_iou_threshold** (float): 进行NMS时,用于剔除检测框IOU的阈值。默认为0.45。 +> > - **label_smooth** (bool): 是否使用label smooth。默认值为False。 +> > - **train_random_shapes** (list|tuple): 训练时从列表中随机选择图像大小。默认值为[320, 352, 384, 416, 448, 480, 512, 544, 576, 608]。 + +### train + +```python +train(self, num_epochs, train_dataset, train_batch_size=8, eval_dataset=None, save_interval_epochs=20, log_interval_steps=2, save_dir='output', pretrain_weights='IMAGENET', optimizer=None, learning_rate=1.0/8000, warmup_steps=1000, warmup_start_lr=0.0, lr_decay_epochs=[213, 240], lr_decay_gamma=0.1, metric=None, use_vdl=False, sensitivities_file=None, eval_metric_loss=0.05, early_stop=False, early_stop_patience=5, resume_checkpoint=None) +``` + +> YOLOv3模型的训练接口,函数内置了`piecewise`学习率衰减策略和`momentum`优化器。 + +> **参数** +> +> > - **num_epochs** (int): 训练迭代轮数。 +> > - **train_dataset** (paddlex.datasets): 训练数据读取器。 +> > - **train_batch_size** (int): 训练数据batch大小。目前检测仅支持单卡评估,训练数据batch大小与显卡数量之商为验证数据batch大小。默认值为8。 +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **save_interval_epochs** (int): 模型保存间隔(单位:迭代轮数)。默认为20。 +> > - **log_interval_steps** (int): 训练日志输出间隔(单位:迭代次数)。默认为2。 +> > - **save_dir** (str): 模型保存路径。默认值为'output'。 +> > - **pretrain_weights** (str): 若指定为路径时,则加载路径下预训练模型;若为字符串'IMAGENET',则自动下载在ImageNet图片数据上预训练的模型权重;若为字符串'COCO',则自动下载在COCO数据集上预训练的模型权重;若为None,则不使用预训练模型。默认为None。 +> > - **optimizer** (paddle.fluid.optimizer): 优化器。当该参数为None时,使用默认优化器:fluid.layers.piecewise_decay衰减策略,fluid.optimizer.Momentum优化方法。 +> > - **learning_rate** (float): 默认优化器的学习率。默认为1.0/8000。 +> > - **warmup_steps** (int): 默认优化器进行warmup过程的步数。默认为1000。 +> > - **warmup_start_lr** (int): 默认优化器warmup的起始学习率。默认为0.0。 +> > - **lr_decay_epochs** (list): 默认优化器的学习率衰减轮数。默认为[213, 240]。 +> > - **lr_decay_gamma** (float): 默认优化器的学习率衰减率。默认为0.1。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认值为None。 +> > - **use_vdl** (bool): 是否使用VisualDL进行可视化。默认值为False。 +> > - **sensitivities_file** (str): 若指定为路径时,则加载路径下敏感度信息进行裁剪;若为字符串'DEFAULT',则自动下载在PascalVOC数据上获得的敏感度信息进行裁剪;若为None,则不进行裁剪。默认为None。 +> > - **eval_metric_loss** (float): 可容忍的精度损失。默认为0.05。 +> > - **early_stop** (bool): 是否使用提前终止训练策略。默认值为False。 +> > - **early_stop_patience** (int): 当使用提前终止训练策略时,如果验证集精度在`early_stop_patience`个epoch内连续下降或持平,则终止训练。默认值为5。 +> > - **resume_checkpoint** (str): 恢复训练时指定上次训练保存的模型路径。若为None,则不会恢复训练。默认值为None。 + +### evaluate + +```python +evaluate(self, eval_dataset, batch_size=1, epoch_id=None, metric=None, return_details=False) +``` + +> YOLOv3模型的评估接口,模型评估后会返回在验证集上的指标`box_map`(metric指定为'VOC'时)或`box_mmap`(metric指定为`COCO`时)。 + +> **参数** +> +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **batch_size** (int): 验证数据批大小。默认为1。 +> > - **epoch_id** (int): 当前评估模型所在的训练轮数。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认为None,根据用户传入的Dataset自动选择,如为VOCDetection,则`metric`为'VOC';如为COCODetection,则`metric`为'COCO'默认为None, 如为EasyData类型数据集,同时也会使用'VOC'。 +> > - **return_details** (bool): 是否返回详细信息。默认值为False。 +> > +> **返回值** +> +> > - **tuple** (metrics, eval_details) | **dict** (metrics): 当`return_details`为True时,返回(metrics, eval_details),当`return_details`为False时,返回metrics。metrics为dict,包含关键字:'bbox_mmap'或者’bbox_map‘,分别表示平均准确率平均值在各个阈值下的结果取平均值的结果(mmAP)、平均准确率平均值(mAP)。eval_details为dict,包含关键字:'bbox',对应元素预测结果列表,每个预测结果由图像id、预测框类别id、预测框坐标、预测框得分;’gt‘:真实标注框相关信息。 + +### predict + +```python +predict(self, img_file, transforms=None) +``` + +> YOLOv3模型预测接口。需要注意的是,只有在训练过程中定义了eval_dataset,模型在保存时才会将预测时的图像处理流程保存在`YOLOv3.test_transforms`和`YOLOv3.eval_transforms`中。如未在训练时定义eval_dataset,那在调用预测`predict`接口时,用户需要再重新定义`test_transforms`传入给`predict`接口 + +> **参数** +> +> > - **img_file** (str|np.ndarray): 预测图像路径或numpy数组(HWC排列,BGR格式)。 +> > - **transforms** (paddlex.det.transforms): 数据预处理操作。 +> +> **返回值** +> +> > - **list**: 预测结果列表,列表中每个元素均为一个dict,key包括'bbox', 'category', 'category_id', 'score',分别表示每个预测目标的框坐标信息、类别、类别id、置信度,其中框坐标信息为[xmin, ymin, w, h],即左上角x, y坐标和框的宽和高。 + + +## paddlex.det.FasterRCNN + +```python +paddlex.det.FasterRCNN(num_classes=81, backbone='ResNet50', with_fpn=True, aspect_ratios=[0.5, 1.0, 2.0], anchor_sizes=[32, 64, 128, 256, 512]) + +``` + +> 构建FasterRCNN检测器。 **注意在FasterRCNN中,num_classes需要设置为类别数+背景类,如目标包括human、dog两种,则num_classes需设为3,多的一种为背景background类别** + +> **参数** + +> > - **num_classes** (int): 包含了背景类的类别数。默认为81。 +> > - **backbone** (str): FasterRCNN的backbone网络,取值范围为['ResNet18', 'ResNet50', 'ResNet50_vd', 'ResNet101', 'ResNet101_vd', 'HRNet_W18']。默认为'ResNet50'。 +> > - **with_fpn** (bool): 是否使用FPN结构。默认为True。 +> > - **aspect_ratios** (list): 生成anchor高宽比的可选值。默认为[0.5, 1.0, 2.0]。 +> > - **anchor_sizes** (list): 生成anchor大小的可选值。默认为[32, 64, 128, 256, 512]。 + +### train + +```python +train(self, num_epochs, train_dataset, train_batch_size=2, eval_dataset=None, save_interval_epochs=1, log_interval_steps=2,save_dir='output', pretrain_weights='IMAGENET', optimizer=None, learning_rate=0.0025, warmup_steps=500, warmup_start_lr=1.0/1200, lr_decay_epochs=[8, 11], lr_decay_gamma=0.1, metric=None, use_vdl=False, early_stop=False, early_stop_patience=5, resume_checkpoint=None) +``` + +> FasterRCNN模型的训练接口,函数内置了`piecewise`学习率衰减策略和`momentum`优化器。 + +> **参数** +> +> > - **num_epochs** (int): 训练迭代轮数。 +> > - **train_dataset** (paddlex.datasets): 训练数据读取器。 +> > - **train_batch_size** (int): 训练数据batch大小。目前检测仅支持单卡评估,训练数据batch大小与显卡数量之商为验证数据batch大小。默认为2。 +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **save_interval_epochs** (int): 模型保存间隔(单位:迭代轮数)。默认为1。 +> > - **log_interval_steps** (int): 训练日志输出间隔(单位:迭代次数)。默认为2。 +> > - **save_dir** (str): 模型保存路径。默认值为'output'。 +> > - **pretrain_weights** (str): 若指定为路径时,则加载路径下预训练模型;若为字符串'IMAGENET',则自动下载在ImageNet图片数据上预训练的模型权重;若为字符串'COCO',则自动下载在COCO数据集上预训练的模型权重(注意:暂未提供ResNet18的COCO预训练模型);为None,则不使用预训练模型。默认为None。 +> > - **optimizer** (paddle.fluid.optimizer): 优化器。当该参数为None时,使用默认优化器:fluid.layers.piecewise_decay衰减策略,fluid.optimizer.Momentum优化方法。 +> > - **learning_rate** (float): 默认优化器的初始学习率。默认为0.0025。 +> > - **warmup_steps** (int): 默认优化器进行warmup过程的步数。默认为500。 +> > - **warmup_start_lr** (int): 默认优化器warmup的起始学习率。默认为1.0/1200。 +> > - **lr_decay_epochs** (list): 默认优化器的学习率衰减轮数。默认为[8, 11]。 +> > - **lr_decay_gamma** (float): 默认优化器的学习率衰减率。默认为0.1。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认值为None。 +> > - **use_vdl** (bool): 是否使用VisualDL进行可视化。默认值为False。 +> > - **early_stop** (float): 是否使用提前终止训练策略。默认值为False。 +> > - **early_stop_patience** (int): 当使用提前终止训练策略时,如果验证集精度在`early_stop_patience`个epoch内连续下降或持平,则终止训练。默认值为5。 +> > - **resume_checkpoint** (str): 恢复训练时指定上次训练保存的模型路径。若为None,则不会恢复训练。默认值为None。 + +### evaluate + +```python +evaluate(self, eval_dataset, batch_size=1, epoch_id=None, metric=None, return_details=False) +``` + +> FasterRCNN模型的评估接口,模型评估后会返回在验证集上的指标box_map(metric指定为’VOC’时)或box_mmap(metric指定为COCO时)。 + +> **参数** +> +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **batch_size** (int): 验证数据批大小。默认为1。当前只支持设置为1。 +> > - **epoch_id** (int): 当前评估模型所在的训练轮数。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认为None,根据用户传入的Dataset自动选择,如为VOCDetection,则`metric`为'VOC'; 如为COCODetection,则`metric`为'COCO'。 +> > - **return_details** (bool): 是否返回详细信息。默认值为False。 +> > +> **返回值** +> +> > - **tuple** (metrics, eval_details) | **dict** (metrics): 当`return_details`为True时,返回(metrics, eval_details),当`return_details`为False时,返回metrics。metrics为dict,包含关键字:'bbox_mmap'或者’bbox_map‘,分别表示平均准确率平均值在各个IoU阈值下的结果取平均值的结果(mmAP)、平均准确率平均值(mAP)。eval_details为dict,包含关键字:'bbox',对应元素预测结果列表,每个预测结果由图像id、预测框类别id、预测框坐标、预测框得分;’gt‘:真实标注框相关信息。 + +### predict + +```python +predict(self, img_file, transforms=None) +``` + +> FasterRCNN模型预测接口。需要注意的是,只有在训练过程中定义了eval_dataset,模型在保存时才会将预测时的图像处理流程保存在`FasterRCNN.test_transforms`和`FasterRCNN.eval_transforms`中。如未在训练时定义eval_dataset,那在调用预测`predict`接口时,用户需要再重新定义test_transforms传入给`predict`接口。 + +> **参数** +> +> > - **img_file** (str|np.ndarray): 预测图像路径或numpy数组(HWC排列,BGR格式)。 +> > - **transforms** (paddlex.det.transforms): 数据预处理操作。 +> +> **返回值** +> +> > - **list**: 预测结果列表,列表中每个元素均为一个dict,key包括'bbox', 'category', 'category_id', 'score',分别表示每个预测目标的框坐标信息、类别、类别id、置信度,其中框坐标信息为[xmin, ymin, w, h],即左上角x, y坐标和框的宽和高。 diff --git a/docs/apis/models/index.rst b/docs/apis/models/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..2cf02d9f011c95ab0f0325dab33b7e9025f4f533 --- /dev/null +++ b/docs/apis/models/index.rst @@ -0,0 +1,12 @@ +视觉模型集 +============================ + +PaddleX目前支持 `四种视觉任务解决方案 <../../cv_solutions.html>`_ ,包括图像分类、目标检测、实例分割和语义分割。对于每种视觉任务,PaddleX又提供了1种或多种模型,用户可根据需求及应用场景选取。 + +.. toctree:: + :maxdepth: 3 + + classification.md + detection.md + instance_segmentation.md + semantic_segmentation.md diff --git a/docs/apis/models/instance_segmentation.md b/docs/apis/models/instance_segmentation.md new file mode 100755 index 0000000000000000000000000000000000000000..916b8510855c1796b7e4fc45843702eb1a0553b7 --- /dev/null +++ b/docs/apis/models/instance_segmentation.md @@ -0,0 +1,85 @@ +# Instance Segmentation + +## MaskRCNN + +```python +paddlex.det.MaskRCNN(num_classes=81, backbone='ResNet50', with_fpn=True, aspect_ratios=[0.5, 1.0, 2.0], anchor_sizes=[32, 64, 128, 256, 512]) + +``` + +> 构建MaskRCNN检测器。**注意在MaskRCNN中,num_classes需要设置为类别数+背景类,如目标包括human、dog两种,则num_classes需设为3,多的一种为背景background类别** + +> **参数** + +> > - **num_classes** (int): 包含了背景类的类别数。默认为81。 +> > - **backbone** (str): MaskRCNN的backbone网络,取值范围为['ResNet18', 'ResNet50', 'ResNet50_vd', 'ResNet101', 'ResNet101_vd', 'HRNet_W18']。默认为'ResNet50'。 +> > - **with_fpn** (bool): 是否使用FPN结构。默认为True。 +> > - **aspect_ratios** (list): 生成anchor高宽比的可选值。默认为[0.5, 1.0, 2.0]。 +> > - **anchor_sizes** (list): 生成anchor大小的可选值。默认为[32, 64, 128, 256, 512]。 + +#### train + +```python +train(self, num_epochs, train_dataset, train_batch_size=1, eval_dataset=None, save_interval_epochs=1, log_interval_steps=20, save_dir='output', pretrain_weights='IMAGENET', optimizer=None, learning_rate=1.0/800, warmup_steps=500, warmup_start_lr=1.0 / 2400, lr_decay_epochs=[8, 11], lr_decay_gamma=0.1, metric=None, use_vdl=False, early_stop=False, early_stop_patience=5, resume_checkpoint=None) +``` + +> MaskRCNN模型的训练接口,函数内置了`piecewise`学习率衰减策略和`momentum`优化器。 + +> **参数** +> +> > - **num_epochs** (int): 训练迭代轮数。 +> > - **train_dataset** (paddlex.datasets): 训练数据读取器。 +> > - **train_batch_size** (int): 训练数据batch大小。目前检测仅支持单卡评估,训练数据batch大小与显卡数量之商为验证数据batch大小。默认为1。 +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **save_interval_epochs** (int): 模型保存间隔(单位:迭代轮数)。默认为1。 +> > - **log_interval_steps** (int): 训练日志输出间隔(单位:迭代次数)。默认为2。 +> > - **save_dir** (str): 模型保存路径。默认值为'output'。 +> > - **pretrain_weights** (str): 若指定为路径时,则加载路径下预训练模型;若为字符串'IMAGENET',则自动下载在ImageNet图片数据上预训练的模型权重;若为字符串'COCO',则自动下载在COCO数据集上预训练的模型权重(注意:暂未提供ResNet18和HRNet_W18的COCO预训练模型);若为None,则不使用预训练模型。默认为None。 +> > - **optimizer** (paddle.fluid.optimizer): 优化器。当该参数为None时,使用默认优化器:fluid.layers.piecewise_decay衰减策略,fluid.optimizer.Momentum优化方法。 +> > - **learning_rate** (float): 默认优化器的初始学习率。默认为0.00125。 +> > - **warmup_steps** (int): 默认优化器进行warmup过程的步数。默认为500。 +> > - **warmup_start_lr** (int): 默认优化器warmup的起始学习率。默认为1.0/2400。 +> > - **lr_decay_epochs** (list): 默认优化器的学习率衰减轮数。默认为[8, 11]。 +> > - **lr_decay_gamma** (float): 默认优化器的学习率衰减率。默认为0.1。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认值为None。 +> > - **use_vdl** (bool): 是否使用VisualDL进行可视化。默认值为False。 +> > - **early_stop** (float): 是否使用提前终止训练策略。默认值为False。 +> > - **early_stop_patience** (int): 当使用提前终止训练策略时,如果验证集精度在`early_stop_patience`个epoch内连续下降或持平,则终止训练。默认值为5。 +> > - **resume_checkpoint** (str): 恢复训练时指定上次训练保存的模型路径。若为None,则不会恢复训练。默认值为None。 + +#### evaluate + +```python +evaluate(self, eval_dataset, batch_size=1, epoch_id=None, metric=None, return_details=False) +``` + +> MaskRCNN模型的评估接口,模型评估后会返回在验证集上的指标box_mmap(metric指定为COCO时)和相应的seg_mmap。 + +> **参数** +> +> > - **eval_dataset** (paddlex.datasets): 验证数据读取器。 +> > - **batch_size** (int): 验证数据批大小。默认为1。当前只支持设置为1。 +> > - **epoch_id** (int): 当前评估模型所在的训练轮数。 +> > - **metric** (bool): 训练过程中评估的方式,取值范围为['COCO', 'VOC']。默认为None,根据用户传入的Dataset自动选择,如为VOCDetection,则`metric`为'VOC'; 如为COCODetection,则`metric`为'COCO'。 +> > - **return_details** (bool): 是否返回详细信息。默认值为False。 +> > +> **返回值** +> +> > - **tuple** (metrics, eval_details) | **dict** (metrics): 当`return_details`为True时,返回(metrics, eval_details),当return_details为False时,返回metrics。metrics为dict,包含关键字:'bbox_mmap'和'segm_mmap'或者’bbox_map‘和'segm_map',分别表示预测框和分割区域平均准确率平均值在各个IoU阈值下的结果取平均值的结果(mmAP)、平均准确率平均值(mAP)。eval_details为dict,包含关键字:'bbox',对应元素预测框结果列表,每个预测结果由图像id、预测框类别id、预测框坐标、预测框得分;'mask',对应元素预测区域结果列表,每个预测结果由图像id、预测区域类别id、预测区域坐标、预测区域得分;’gt‘:真实标注框和标注区域相关信息。 + +#### predict + +```python +predict(self, img_file, transforms=None) +``` + +> MaskRCNN模型预测接口。需要注意的是,只有在训练过程中定义了eval_dataset,模型在保存时才会将预测时的图像处理流程保存在FasterRCNN.test_transforms和FasterRCNN.eval_transforms中。如未在训练时定义eval_dataset,那在调用预测predict接口时,用户需要再重新定义test_transforms传入给predict接口。 + +> **参数** +> +> > - **img_file** (str|np.ndarray): 预测图像路径或numpy数组(HWC排列,BGR格式)。 +> > - **transforms** (paddlex.det.transforms): 数据预处理操作。 +> +> **返回值** +> +> > - **list**: 预测结果列表,列表中每个元素均为一个dict,key'bbox', 'mask', 'category', 'category_id', 'score',分别表示每个预测目标的框坐标信息、Mask信息,类别、类别id、置信度。其中框坐标信息为[xmin, ymin, w, h],即左上角x, y坐标和框的宽和高。Mask信息为原图大小的二值图,1表示像素点属于预测类别,0表示像素点是背景。 diff --git a/docs/apis/models/semantic_segmentation.md b/docs/apis/models/semantic_segmentation.md new file mode 100755 index 0000000000000000000000000000000000000000..f6d940abde6020dea74c134d7f3dc29d4aa8201a --- /dev/null +++ b/docs/apis/models/semantic_segmentation.md @@ -0,0 +1,154 @@ +# Semantic Segmentation + +## paddlex.seg.DeepLabv3p + +```python +paddlex.seg.DeepLabv3p(num_classes=2, backbone='MobileNetV2_x1.0', output_stride=16, aspp_with_sep_conv=True, decoder_use_sep_conv=True, encoder_with_aspp=True, enable_decoder=True, use_bce_loss=False, use_dice_loss=False, class_weight=None, ignore_index=255) + +``` + +> 构建DeepLabv3p分割器。 + +> **参数** + +> > - **num_classes** (int): 类别数。 +> > - **backbone** (str): DeepLabv3+的backbone网络,实现特征图的计算,取值范围为['Xception65', 'Xception41', 'MobileNetV2_x0.25', 'MobileNetV2_x0.5', 'MobileNetV2_x1.0', 'MobileNetV2_x1.5', 'MobileNetV2_x2.0'],默认值为'MobileNetV2_x1.0'。 +> > - **output_stride** (int): backbone 输出特征图相对于输入的下采样倍数,一般取值为8或16。默认16。 +> > - **aspp_with_sep_conv** (bool): decoder模块是否采用separable convolutions。默认True。 +> > - **decoder_use_sep_conv** (bool): decoder模块是否采用separable convolutions。默认True。 +> > - **encoder_with_aspp** (bool): 是否在encoder阶段采用aspp模块。默认True。 +> > - **enable_decoder** (bool): 是否使用decoder模块。默认True。 +> > - **use_bce_loss** (bool): 是否使用bce loss作为网络的损失函数,只能用于两类分割。可与dice loss同时使用。默认False。 +> > - **use_dice_loss** (bool): 是否使用dice loss作为网络的损失函数,只能用于两类分割,可与bce loss同时使用,当`use_bce_loss`和`use_dice_loss`都为False时,使用交叉熵损失函数。默认False。 +> > - **class_weight** (list/str): 交叉熵损失函数各类损失的权重。当`class_weight`为list的时候,长度应为`num_classes`。当`class_weight`为str时, weight.lower()应为'dynamic',这时会根据每一轮各类像素的比重自行计算相应的权重,每一类的权重为:每类的比例 * num_classes。class_weight取默认值None是,各类的权重1,即平时使用的交叉熵损失函数。 +> > - **ignore_index** (int): label上忽略的值,label为`ignore_index`的像素不参与损失函数的计算。默认255。 + +### train + +```python +train(self, num_epochs, train_dataset, train_batch_size=2, eval_dataset=None, eval_batch_size=1, save_interval_epochs=1, log_interval_steps=2, save_dir='output', pretrain_weights='IMAGENET', optimizer=None, learning_rate=0.01, lr_decay_power=0.9, use_vdl=False, sensitivities_file=None, eval_metric_loss=0.05, early_stop=False, early_stop_patience=5, resume_checkpoint=None): +``` + +> DeepLabv3p模型的训练接口,函数内置了`polynomial`学习率衰减策略和`momentum`优化器。 + +> **参数** +> > +> > - **num_epochs** (int): 训练迭代轮数。 +> > - **train_dataset** (paddlex.datasets): 训练数据读取器。 +> > - **train_batch_size** (int): 训练数据batch大小。同时作为验证数据batch大小。默认2。 +> > - **eval_dataset** (paddlex.datasets): 评估数据读取器。 +> > - **save_interval_epochs** (int): 模型保存间隔(单位:迭代轮数)。默认为1。 +> > - **log_interval_steps** (int): 训练日志输出间隔(单位:迭代次数)。默认为2。 +> > - **save_dir** (str): 模型保存路径。默认'output' +> > - **pretrain_weights** (str): 若指定为路径时,则加载路径下预训练模型;若为字符串'IMAGENET',则自动下载在ImageNet图片数据上预训练的模型权重;若为字符串'COCO',则自动下载在COCO数据集上预训练的模型权重(注意:暂未提供Xception41、MobileNetV2_x0.25、MobileNetV2_x0.5、MobileNetV2_x1.5、MobileNetV2_x2.0的COCO预训练模型);若为字符串'CITYSCAPES',则自动下载在CITYSCAPES数据集上预训练的模型权重(注意:暂未提供Xception41、MobileNetV2_x0.25、MobileNetV2_x0.5、MobileNetV2_x1.5、MobileNetV2_x2.0的CITYSCAPES预训练模型);若为None,则不使用预训练模型。默认'IMAGENET'。 +> > - **optimizer** (paddle.fluid.optimizer): 优化器。当该参数为None时,使用默认的优化器:使用fluid.optimizer.Momentum优化方法,polynomial的学习率衰减策略。 +> > - **learning_rate** (float): 默认优化器的初始学习率。默认0.01。 +> > - **lr_decay_power** (float): 默认优化器学习率衰减指数。默认0.9。 +> > - **use_vdl** (bool): 是否使用VisualDL进行可视化。默认False。 +> > - **sensitivities_file** (str): 若指定为路径时,则加载路径下敏感度信息进行裁剪;若为字符串'DEFAULT',则自动下载在Cityscapes图片数据上获得的敏感度信息进行裁剪;若为None,则不进行裁剪。默认为None。 +> > - **eval_metric_loss** (float): 可容忍的精度损失。默认为0.05。 +> > - **early_stop** (bool): 是否使用提前终止训练策略。默认值为False。 +> > - **early_stop_patience** (int): 当使用提前终止训练策略时,如果验证集精度在`early_stop_patience`个epoch内连续下降或持平,则终止训练。默认值为5。 +> > - **resume_checkpoint** (str): 恢复训练时指定上次训练保存的模型路径。若为None,则不会恢复训练。默认值为None。 + +### evaluate + +```python +evaluate(self, eval_dataset, batch_size=1, epoch_id=None, return_details=False): +``` + +> DeepLabv3p模型评估接口。 + +> **参数** +> > +> > - **eval_dataset** (paddlex.datasets): 评估数据读取器。 +> > - **batch_size** (int): 评估时的batch大小。默认1。 +> > - **epoch_id** (int): 当前评估模型所在的训练轮数。 +> > - **return_details** (bool): 是否返回详细信息。默认False。 + +> **返回值** +> > +> > - **dict**: 当`return_details`为False时,返回dict。包含关键字:'miou'、'category_iou'、'macc'、 +> > 'category_acc'和'kappa',分别表示平均iou、各类别iou、平均准确率、各类别准确率和kappa系数。 +> > - **tuple** (metrics, eval_details):当`return_details`为True时,增加返回dict (eval_details), +> > 包含关键字:'confusion_matrix',表示评估的混淆矩阵。 + +### predict + +``` +predict(self, im_file, transforms=None): +``` + +> DeepLabv3p模型预测接口。需要注意的是,只有在训练过程中定义了eval_dataset,模型在保存时才会将预测时的图像处理流程保存在`DeepLabv3p.test_transforms`和`DeepLabv3p.eval_transforms`中。如未在训练时定义eval_dataset,那在调用预测`predict`接口时,用户需要再重新定义test_transforms传入给`predict`接口。 + +> **参数** +> > +> > - **img_file** (str|np.ndarray): 预测图像路径或numpy数组(HWC排列,BGR格式)。 +> > - **transforms** (paddlex.seg.transforms): 数据预处理操作。 + +> **返回值** +> > +> > - **dict**: 包含关键字'label_map'和'score_map', 'label_map'存储预测结果灰度图,像素值表示对应的类别,'score_map'存储各类别的概率,shape=(h, w, num_classes)。 + +## paddlex.seg.UNet + +```python +paddlex.seg.UNet(num_classes=2, upsample_mode='bilinear', use_bce_loss=False, use_dice_loss=False, class_weight=None, ignore_index=255) +``` + +> 构建UNet分割器。 + +> **参数** + +> > - **num_classes** (int): 类别数。 +> > - **upsample_mode** (str): UNet decode时采用的上采样方式,取值为'bilinear'时利用双线行差值进行上菜样,当输入其他选项时则利用反卷积进行上菜样,默认为'bilinear'。 +> > - **use_bce_loss** (bool): 是否使用bce loss作为网络的损失函数,只能用于两类分割。可与dice loss同时使用。默认False。 +> > - **use_dice_loss** (bool): 是否使用dice loss作为网络的损失函数,只能用于两类分割,可与bce loss同时使用。当use_bce_loss和use_dice_loss都为False时,使用交叉熵损失函数。默认False。 +> > - **class_weight** (list/str): 交叉熵损失函数各类损失的权重。当`class_weight`为list的时候,长度应为`num_classes`。当`class_weight`为str时, weight.lower()应为'dynamic',这时会根据每一轮各类像素的比重自行计算相应的权重,每一类的权重为:每类的比例 * num_classes。class_weight取默认值None是,各类的权重1,即平时使用的交叉熵损失函数。 +> > - **ignore_index** (int): label上忽略的值,label为`ignore_index`的像素不参与损失函数的计算。默认255。 + +> - train 训练接口说明同 [DeepLabv3p模型train接口](#train) +> - evaluate 评估接口说明同 [DeepLabv3p模型evaluate接口](#evaluate) +> - predict 预测接口说明同 [DeepLabv3p模型predict接口](#predict) + +## paddlex.seg.HRNet + +```python +paddlex.seg.HRNet(num_classes=2, width=18, use_bce_loss=False, use_dice_loss=False, class_weight=None, ignore_index=255) +``` + +> 构建HRNet分割器。 + +> **参数** + +> > - **num_classes** (int): 类别数。 +> > - **width** (int|str): 高分辨率分支中特征层的通道数量。默认值为18。可选择取值为[18, 30, 32, 40, 44, 48, 60, 64, '18_small_v1']。'18_small_v1'是18的轻量级版本。 +> > - **use_bce_loss** (bool): 是否使用bce loss作为网络的损失函数,只能用于两类分割。可与dice loss同时使用。默认False。 +> > - **use_dice_loss** (bool): 是否使用dice loss作为网络的损失函数,只能用于两类分割,可与bce loss同时使用。当use_bce_loss和use_dice_loss都为False时,使用交叉熵损失函数。默认False。 +> > - **class_weight** (list|str): 交叉熵损失函数各类损失的权重。当`class_weight`为list的时候,长度应为`num_classes`。当`class_weight`为str时, weight.lower()应为'dynamic',这时会根据每一轮各类像素的比重自行计算相应的权重,每一类的权重为:每类的比例 * num_classes。class_weight取默认值None是,各类的权重1,即平时使用的交叉熵损失函数。 +> > - **ignore_index** (int): label上忽略的值,label为`ignore_index`的像素不参与损失函数的计算。默认255。 + +> - train 训练接口说明同 [DeepLabv3p模型train接口](#train) +> - evaluate 评估接口说明同 [DeepLabv3p模型evaluate接口](#evaluate) +> - predict 预测接口说明同 [DeepLabv3p模型predict接口](#predict) + +## paddlex.seg.FastSCNN + +```python +paddlex.seg.FastSCNN(num_classes=2, use_bce_loss=False, use_dice_loss=False, class_weight=None, ignore_index=255, multi_loss_weight=[1.0]) +``` + +> 构建FastSCNN分割器。 + +> **参数** + +> > - **num_classes** (int): 类别数。 +> > - **use_bce_loss** (bool): 是否使用bce loss作为网络的损失函数,只能用于两类分割。可与dice loss同时使用。默认False。 +> > - **use_dice_loss** (bool): 是否使用dice loss作为网络的损失函数,只能用于两类分割,可与bce loss同时使用。当use_bce_loss和use_dice_loss都为False时,使用交叉熵损失函数。默认False。 +> > - **class_weight** (list/str): 交叉熵损失函数各类损失的权重。当`class_weight`为list的时候,长度应为`num_classes`。当`class_weight`为str时, weight.lower()应为'dynamic',这时会根据每一轮各类像素的比重自行计算相应的权重,每一类的权重为:每类的比例 * num_classes。class_weight取默认值None是,各类的权重1,即平时使用的交叉熵损失函数。 +> > - **ignore_index** (int): label上忽略的值,label为`ignore_index`的像素不参与损失函数的计算。默认255。 +> > - **multi_loss_weight** (list): 多分支上的loss权重。默认计算一个分支上的loss,即默认值为[1.0]。也支持计算两个分支或三个分支上的loss,权重按[fusion_branch_weight, higher_branch_weight, lower_branch_weight]排列,fusion_branch_weight为空间细节分支和全局上下文分支融合后的分支上的loss权重,higher_branch_weight为空间细节分支上的loss权重,lower_branch_weight为全局上下文分支上的loss权重,若higher_branch_weight和lower_branch_weight未设置则不会计算这两个分支上的loss。 + +> - train 训练接口说明同 [DeepLabv3p模型train接口](#train) +> - evaluate 评估接口说明同 [DeepLabv3p模型evaluate接口](#evaluate) +> - predict 预测接口说明同 [DeepLabv3p模型predict接口](#predict) diff --git a/docs/apis/slim.md b/docs/apis/slim.md new file mode 100755 index 0000000000000000000000000000000000000000..38420a7a8c7a5b2d57f430a7eb32dd326f0a4b83 --- /dev/null +++ b/docs/apis/slim.md @@ -0,0 +1,50 @@ +# 模型压缩 + +## paddlex.slim.cal_params_sensitivities +> **计算参数敏感度** +``` +paddlex.slim.cal_params_sensitivities(model, save_file, eval_dataset, batch_size=8) +``` +计算模型中可裁剪参数在验证集上的敏感度,并将敏感度信息保存至文件`save_file` +1. 获取模型中可裁剪卷积Kernel的名称。 +2. 计算每个可裁剪卷积Kernel不同裁剪率下的敏感度。 +【注意】卷积的敏感度是指在不同裁剪率下评估数据集预测精度的损失,通过得到的敏感度,可以决定最终模型需要裁剪的参数列表和各裁剪参数对应的裁剪率。 +[查看使用示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/compress/classification/cal_sensitivities_file.py#L33) [查看裁剪教程](../tutorials/compress/classification.md) + +### 参数 + +* **model** (paddlex.cls.models/paddlex.det.models/paddlex.seg.models): paddlex加载的模型。 +* **save_file** (str): 计算的得到的sensetives文件存储路径。 +* **eval_dataset** (paddlex.datasets): 评估数据集的读取器。 +* **batch_size** (int): 评估时的batch_size大小。 + + +## paddlex.slim.export_quant_model +> **导出量化模型** +``` +paddlex.slim.export_quant_model(model, test_dataset, batch_size=2, batch_num=10, save_dir='./quant_model', cache_dir='./temp') +``` +导出量化模型,该接口实现了Post Quantization量化方式,需要传入测试数据集,并设定`batch_size`和`batch_num`,模型会以`batch_size`的大小计算`batch_num`批样本数据,并以这些样本数据的计算结果为统计信息进行模型量化。 + +### 参数 + +* **model**(paddlex.cls.models/paddlex.det.models/paddlex.seg.models): paddlex加载的模型。 +* **test_dataset**(paddlex.dataset): 测试数据集 +* **batch_size**(int): 进行前向计算时的批数据大小 +* **batch_num**(int): 进行向前计算时批数据数量 +* **save_dir**(str): 量化后模型的保存目录 +* **cache_dir**(str): 量化过程中的统计数据临时存储目录 + + +### 使用示例 +点击下载如下示例中的[模型](https://bj.bcebos.com/paddlex/models/vegetables_mobilenetv2.tar.gz),[数据集](https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz) +``` +import paddlex as pdx +model = pdx.load_model('vegetables_mobilenet') +test_dataset = pdx.datasets.ImageNet( + data_dir='vegetables_cls', + file_list='vegetables_cls/train_list.txt', + label_list='vegetables_cls/labels.txt', + transforms=model.eval_transforms) +pdx.slim.export_quant_model(model, test_dataset, save_dir='./quant_mobilenet') +``` diff --git a/docs/apis/transforms/augment.md b/docs/apis/transforms/augment.md new file mode 100644 index 0000000000000000000000000000000000000000..f8c66b45d2d853fde57c520b079f9974e5fa4d76 --- /dev/null +++ b/docs/apis/transforms/augment.md @@ -0,0 +1,66 @@ +# 数据增强与imgaug支持 + +数据增强操作可用于在模型训练时,增加训练样本的多样性,从而提升模型的泛化能力。 + +## PaddleX内置增强操作 + +PaddleX对于图像分类、目标检测、实例分割和语义分割内置了部分常见的数据增强操作,如下表所示, + +| 任务类型 | 增强方法 | +| :------- | :------------| +| 图像分类 | [RandomCrop](cls_transforms.html#randomcrop)、[RandomHorizontalFlip](cls_transforms.html#randomhorizontalflip)、[RandomVerticalFlip](cls_transforms.html#randomverticalflip)、
[RandomRotate](cls_transforms.html#randomratate)、 [RandomDistort](cls_transforms.html#randomdistort) | +|目标检测
实例分割| [RandomHorizontalFlip](det_transforms.html#randomhorizontalflip)、[RandomDistort](det_transforms.html#randomdistort)、[RandomCrop](det_transforms.html#randomcrop)、
[MixupImage](det_transforms.html#mixupimage)(仅支持YOLOv3模型)、[RandomExpand](det_transforms.html#randomexpand) | +|语义分割 | [RandomHorizontalFlip](seg_transforms.html#randomhorizontalflip)、[RandomVerticalFlip](seg_transforms.html#randomverticalflip)、[RandomRangeScaling](seg_transforms.html#randomrangescaling)、
[RandomStepScaling](seg_transforms.html#randomstepscaling)、[RandomPaddingCrop](seg_transforms.html#randompaddingcrop)、 [RandomBlur](seg_transforms.html#randomblur)、
[RandomRotate](seg_transforms.html#randomrotate)、[RandomScaleAspect](seg_transforms.html#randomscaleaspect)、[RandomDistort](seg_transforms.html#randomdistort) | + +## imgaug增强库的支持 + +PaddleX目前已适配imgaug图像增强库,用户可以直接在PaddleX构造`transforms`时,调用imgaug的方法, 如下示例 +``` +import paddlex as pdx +from paddlex.cls import transforms +import imgaug.augmenters as iaa +train_transforms = transforms.Compose([ + # 随机在[0.0 3.0]中选值对图像进行模糊 + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)), + transforms.RandomCrop(crop_size=224), + transforms.Normalize() +]) +``` +除了上述用法,`Compose`接口中也支持imgaug的`Someof`、`Sometimes`、`Sequential`、`Oneof`等操作,开发者可以通过这些方法随意组合出增强流程。由于imgaug对于标注信息(目标检测框和实例分割mask)与PaddleX模型训练逻辑有部分差异,**目前在检测和分割中,只支持pixel-level的增强方法,(即在增强时,不对图像的大小和方向做改变) 其它方法仍在适配中**,详情可见下表, + +| 增强方法 | 图像分类 | 目标检测
实例分割 | 语义分割 | 备注 | +| :------ | :------- | :-------------------- | :------- | :--- | +| [imgaug.augmenters.arithmetic](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_arithmetic.html) |√ |√ |√ | Cutout, DropoutJpegCompression等| +| [imgaug.augmenters.artistic](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_artistic.html) |√ |√ |√ | 图像卡通化| +| [imgaug.augmenters.blur](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_blur.html) |√ |√ |√ | GaussianBlur, AverageBlur等| +| [imgaug.augmenters.collections](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_collections.html) |√ | | |提供了RandAugment方法 | +| [imgaug.augmenters.color](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_color.html) |√ |√ |√ | Brightness, Hue等色调的增强方法| +| [imgaug.augmenters.contrast](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_contrast.html) |√ |√ |√ | 多种对比度增强方式| +| [imgaug.augmenters.convolutional](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_convolutional.html) |√ |√ |√ | 应用卷积kernel到图像 | +| [imgaug.augmenters.edges](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_edges.html) |√ |√ |√ | 图像边缘化等方法| +| [imgaug.augmenters.flip](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_flip.html) |√ | | | Fliplr和Flipud翻转方法| +| [imgaug.augmenters.geometric](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_geometric.html) |√ | | | Affine、Rotate等增强方法| +| [imgaug.augmenters.imgcorruptlike](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_imgcorruptlike.html) |√ |√ |√ | GaussianNoise等图像噪声增强方法| +| [imgaug.augmenters.pillike](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_pillike.html) |√ | | | | +| [imgaug.augmenters.pooling](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_pooling.html) |√ | | |应用pooling操作到图像 | +| [imgaug.augmenters.segmentation](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_segmentation.html) |√ | | | 应用分割方法到图像| +| [imgaug.augmenters.size](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_size.html) |√ | | | Reisze、Crop、Pad等操作| +| [imgaug.augmenters.weather](https://imgaug.readthedocs.io/en/latest/source/api_augmenters_weather.html) |√ |√ |√ | 多种模拟天气等增强方法| + +需要注意的是,imgaug的基础方法中,如`imgaug.augmenters.blur`仅为图像处理操作,并无概率设置,而在CV模型训练中,增强操作往往是以一定概率应用在样本上,因此我们可以通过imgaug的`Someof`、`Sometimes`、`Sequential`、`Oneof`等操作来组合实现,如下代码所示, +> - `Someof` 执行定义增强方法列表中的部分方法 +> - `Sometimes` 以一定概率执行定义的增强方法列表 +> - `Sequential` 按顺序执行定义的增强方法列表 +``` +image imgaug.augmenters as iaa +from paddlex.cls import transforms +# 以0.6的概率对图像样本进行模糊 +img_augmenters = iaa.Sometimes(0.6, [ + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)) +]) +train_transforms = transforms.Compose([ + img_augmenters, + transforms.RandomCrop(crop_size=224), + transforms.Normalize() +]) +``` diff --git a/docs/apis/transforms/cls_transforms.md b/docs/apis/transforms/cls_transforms.md new file mode 100755 index 0000000000000000000000000000000000000000..b77bcfa483c9f40aedf90911330163d71c9aff85 --- /dev/null +++ b/docs/apis/transforms/cls_transforms.md @@ -0,0 +1,185 @@ +# paddlex.cls.transforms + +对图像分类任务的数据进行操作。可以利用[Compose](#compose)类将图像预处理/增强操作进行组合。 + +## Compose +```python +paddlex.cls.transforms.Compose(transforms) +``` + +根据数据预处理/增强算子对输入数据进行操作。 [使用示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/classification/mobilenetv2.py#L13) + +> **参数** +> * **transforms** (list): 数据预处理/数据增强列表。 + +## Normalize +```python +paddlex.cls.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) +``` + +对图像进行标准化。 +1. 对图像进行归一化到区间[0.0, 1.0]。 +2. 对图像进行减均值除以标准差操作。 + +### 参数 +* **mean** (list): 图像数据集的均值。默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像数据集的标准差。默认为[0.229, 0.224, 0.225]。 + +## ResizeByShort +```python +paddlex.cls.transforms.ResizeByShort(short_size=256, max_size=-1) +``` + +根据图像的短边调整图像大小(resize)。 +1. 获取图像的长边和短边长度。 +2. 根据短边与short_size的比例,计算长边的目标长度,此时高、宽的resize比例为short_size/原图短边长度。 +3. 如果max_size>0,调整resize比例: + 如果长边的目标长度>max_size,则高、宽的resize比例为max_size/原图长边长度。 +4. 根据调整大小的比例对图像进行resize。 + +### 参数 +* **short_size** (int): 调整大小后的图像目标短边长度。默认为256。 +* **max_size** (int): 长边目标长度的最大限制。默认为-1。 + +## CenterCrop +```python +paddlex.cls.transforms.CenterCrop(crop_size=224) +``` + +以图像中心点扩散裁剪长宽为`crop_size`的正方形 +1. 计算剪裁的起始点。 +2. 剪裁图像。 + +### 参数 +* **crop_size** (int): 裁剪的目标边长。默认为224。 + +## RandomCrop +```python +paddlex.cls.transforms.RandomCrop(crop_size=224, lower_scale=0.08, lower_ratio=3. / 4, upper_ratio=4. / 3) +``` + +对图像进行随机剪裁,模型训练时的数据增强操作。 +1. 根据lower_scale、lower_ratio、upper_ratio计算随机剪裁的高、宽。 +2. 根据随机剪裁的高、宽随机选取剪裁的起始点。 +3. 剪裁图像。 +4. 调整剪裁后的图像的大小到crop_size*crop_size。 + +### 参数 +* **crop_size** (int): 随机裁剪后重新调整的目标边长。默认为224。 +* **lower_scale** (float): 裁剪面积相对原面积比例的最小限制。默认为0.08。 +* **lower_ratio** (float): 宽变换比例的最小限制。默认为3. / 4。 +* **upper_ratio** (float): 宽变换比例的最小限制。默认为4. / 3。 + +## RandomHorizontalFlip +```python +paddlex.cls.transforms.RandomHorizontalFlip(prob=0.5) +``` + +以一定的概率对图像进行随机水平翻转,模型训练时的数据增强操作。 + +### 参数 +* **prob** (float): 随机水平翻转的概率。默认为0.5。 + +## RandomVerticalFlip +```python +paddlex.cls.transforms.RandomVerticalFlip(prob=0.5) +``` + +以一定的概率对图像进行随机垂直翻转,模型训练时的数据增强操作。 + +### 参数 +* **prob** (float): 随机垂直翻转的概率。默认为0.5。 + +## RandomRotate +```python +paddlex.cls.transforms.RandomRotate(rotate_range=30, prob=0.5) +``` + +以一定的概率对图像在[-rotate_range, rotaterange]角度范围内进行旋转,模型训练时的数据增强操作。 + +### 参数 +* **rotate_range** (int): 旋转度数的范围。默认为30。 +* **prob** (float): 随机旋转的概率。默认为0.5。 + +## RandomDistort +```python +paddlex.cls.transforms.RandomDistort(brightness_range=0.9, brightness_prob=0.5, contrast_range=0.9, contrast_prob=0.5, saturation_range=0.9, saturation_prob=0.5, hue_range=18, hue_prob=0.5) +``` + +以一定的概率对图像进行随机像素内容变换,模型训练时的数据增强操作。 +1. 对变换的操作顺序进行随机化操作。 +2. 按照1中的顺序以一定的概率对图像在范围[-range, range]内进行随机像素内容变换。 + +【注意】该数据增强必须在数据增强Normalize之前使用。 + +### 参数 +* **brightness_range** (float): 明亮度因子的范围。默认为0.9。 +* **brightness_prob** (float): 随机调整明亮度的概率。默认为0.5。 +* **contrast_range** (float): 对比度因子的范围。默认为0.9。 +* **contrast_prob** (float): 随机调整对比度的概率。默认为0.5。 +* **saturation_range** (float): 饱和度因子的范围。默认为0.9。 +* **saturation_prob** (float): 随机调整饱和度的概率。默认为0.5。 +* **hue_range** (int): 色调因子的范围。默认为18。 +* **hue_prob** (float): 随机调整色调的概率。默认为0.5。 + +## ComposedClsTransforms +```python +paddlex.cls.transforms.ComposedClsTransforms(mode, crop_size=[224, 224], mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], random_horizontal_flip=True) +``` +分类模型中已经组合好的数据处理流程,开发者可以直接使用ComposedClsTransforms,简化手动组合transforms的过程, 该类中已经包含了[RandomCrop](#RandomCrop)和[RandomHorizontalFlip](#RandomHorizontalFlip)两种数据增强方式,你仍可以通过[add_augmenters函数接口](#add_augmenters)添加新的数据增强方式。 +ComposedClsTransforms共包括以下几个步骤: +> 训练阶段: +> > 1. 随机从图像中crop一块子图,并resize成crop_size大小 +> > 2. 将1的输出按0.5的概率随机进行水平翻转, 若random_horizontal_flip为False,则跳过此步骤 +> > 3. 将图像进行归一化 +> 验证/预测阶段: +> > 1. 将图像按比例Resize,使得最小边长度为crop_size[0] * 1.14 +> > 2. 从图像中心crop出一个大小为crop_size的图像 +> > 3. 将图像进行归一化 + +### 参数 +* **mode** (str): Transforms所处的阶段,包括`train', 'eval'或'test' +* **crop_size** (int|list): 输入到模型里的图像大小,默认为[224, 224](与原图大小无关,根据上述几个步骤,会将原图处理成该图大小输入给模型训练) +* **mean** (list): 图像均值, 默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像方差,默认为[0.229, 0.224, 0.225]。 +* **random_horizontal_flip**(bool): 数据增强,是否以0,5的概率使用随机水平翻转增强,仅在model为'train'时生效,默认为True。底层实现采用[paddlex.cls.transforms.RandomHorizontalFlip](#randomhorizontalflip) + +### 添加数据增强方式 +```python +ComposedClsTransforms.add_augmenters(augmenters) +``` +> **参数** +> * **augmenters**(list): 数据增强方式列表 + +#### 使用示例 +``` +import paddlex as pdx +from paddlex.cls import transforms +train_transforms = transforms.ComposedClsTransforms(mode='train', crop_size=[320, 320]) +eval_transforms = transforms.ComposedClsTransforms(mode='eval', crop_size=[320, 320]) + +# 添加数据增强 +import imgaug.augmenters as iaa +train_transforms.add_augmenters([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)) +]) +``` +上面代码等价于 +``` +import paddlex as pdx +from paddlex.cls import transforms +train_transforms = transforms.Composed([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)), + # 上面两个为通过add_augmenters额外添加的数据增强方式 + transforms.RandomCrop(crop_size=320), + transforms.RandomHorizontalFlip(prob=0.5), + transforms.Normalize() +]) +eval_transforms = transforms.Composed([ + transforms.ResizeByShort(short_size=int(320*1.14)), + transforms.CenterCrop(crop_size=320), + transforms.Normalize() +]) +``` diff --git a/docs/apis/transforms/det_transforms.md b/docs/apis/transforms/det_transforms.md new file mode 100755 index 0000000000000000000000000000000000000000..3d623a15eab25ec15f57f088863c3e2a9795f567 --- /dev/null +++ b/docs/apis/transforms/det_transforms.md @@ -0,0 +1,304 @@ +# paddlex.det.transforms + +对目标检测/实例分割任务的数据进行操作。可以利用[Compose](#compose)类将图像预处理/增强操作进行组合。 + +## Compose +```python +paddlex.det.transforms.Compose(transforms) +``` + +根据数据预处理/增强算子对输入数据进行操作。[使用示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/detection/yolov3_mobilenetv1.py#L13) + +### 参数 +* **transforms** (list): 数据预处理/数据增强列表。 + +## Normalize +```python +paddlex.det.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) +``` + +对图像进行标准化。 +1. 归一化图像到到区间[0.0, 1.0]。 +2. 对图像进行减均值除以标准差操作。 + +### 参数 +* **mean** (list): 图像数据集的均值。默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像数据集的标准差。默认为[0.229, 0.224, 0.225]。 + +## ResizeByShort +```python +paddlex.det.transforms.ResizeByShort(short_size=800, max_size=1333) +``` + +根据图像的短边调整图像大小(resize)。 +1. 获取图像的长边和短边长度。 +2. 根据短边与short_size的比例,计算长边的目标长度,此时高、宽的resize比例为short_size/原图短边长度。 +3. 如果max_size>0,调整resize比例: + 如果长边的目标长度>max_size,则高、宽的resize比例为max_size/原图长边长度。 +4. 根据调整大小的比例对图像进行resize。 + +### 参数 +* **short_size** (int): 短边目标长度。默认为800。 +* **max_size** (int): 长边目标长度的最大限制。默认为1333。 + +## Padding +```python +paddlex.det.transforms.Padding(coarsest_stride=1) +``` + +将图像的长和宽padding至coarsest_stride的倍数。如输入图像为[300, 640], `coarest_stride`为32,则由于300不为32的倍数,因此在图像最右和最下使用0值进行padding,最终输出图像为[320, 640] +1. 如果coarsest_stride为1则直接返回。 +2. 计算宽和高与最邻近的coarest_stride倍数差值 +3. 根据计算得到的差值,在图像最右和最下进行padding + +### 参数 +* **coarsest_stride** (int): 填充后的图像长、宽为该参数的倍数,默认为1。 + +## Resize +```python +paddlex.det.transforms.Resize(target_size=608, interp='LINEAR') +``` + +调整图像大小(resize)。 +* 当目标大小(target_size)类型为int时,根据插值方式,将图像resize为[target_size, target_size]。 +* 当目标大小(target_size)类型为list或tuple时,根据插值方式,将图像resize为target_size。 +【注意】当插值方式为“RANDOM”时,则随机选取一种插值方式进行resize,作为模型训练时的数据增强操作。 + +### 参数 +* **target_size** (int/list/tuple): 短边目标长度。默认为608。 +* **interp** (str): resize的插值方式,与opencv的插值方式对应,取值范围为['NEAREST', 'LINEAR', 'CUBIC', 'AREA', 'LANCZOS4', 'RANDOM']。默认为"LINEAR"。 + +## RandomHorizontalFlip +```python +paddlex.det.transforms.RandomHorizontalFlip(prob=0.5) +``` + +以一定的概率对图像进行随机水平翻转,模型训练时的数据增强操作。 + +### 参数 +* **prob** (float): 随机水平翻转的概率。默认为0.5。 + +## RandomDistort +```python +paddlex.det.transforms.RandomDistort(brightness_range=0.5, brightness_prob=0.5, contrast_range=0.5, contrast_prob=0.5, saturation_range=0.5, saturation_prob=0.5, hue_range=18, hue_prob=0.5) +``` + +以一定的概率对图像进行随机像素内容变换,模型训练时的数据增强操作。 +1. 对变换的操作顺序进行随机化操作。 +2. 按照1中的顺序以一定的概率对图像在范围[-range, range]内进行随机像素内容变换。 + +【注意】该数据增强必须在数据增强Normalize之前使用。 + +### 参数 +* **brightness_range** (float): 明亮度因子的范围。默认为0.5。 +* **brightness_prob** (float): 随机调整明亮度的概率。默认为0.5。 +* **contrast_range** (float): 对比度因子的范围。默认为0.5。 +* **contrast_prob** (float): 随机调整对比度的概率。默认为0.5。 +* **saturation_range** (float): 饱和度因子的范围。默认为0.5。 +* **saturation_prob** (float): 随机调整饱和度的概率。默认为0.5。 +* **hue_range** (int): 色调因子的范围。默认为18。 +* **hue_prob** (float): 随机调整色调的概率。默认为0.5。 + +## MixupImage +```python +paddlex.det.transforms.MixupImage(alpha=1.5, beta=1.5, mixup_epoch=-1) +``` + +对图像进行mixup操作,模型训练时的数据增强操作,目前仅YOLOv3模型支持该transform。 +当label_info中不存在mixup字段时,直接返回,否则进行下述操作: +1. 从随机beta分布中抽取出随机因子factor。 +2. 根据不同情况进行处理: + * 当factor>=1.0时,去除label_info中的mixup字段,直接返回。 + * 当factor<=0.0时,直接返回label_info中的mixup字段,并在label_info中去除该字段。 + * 其余情况,执行下述操作: + (1)原图像乘以factor,mixup图像乘以(1-factor),叠加2个结果。 + (2)拼接原图像标注框和mixup图像标注框。 + (3)拼接原图像标注框类别和mixup图像标注框类别。 + (4)原图像标注框混合得分乘以factor,mixup图像标注框混合得分乘以(1-factor),叠加2个结果。 +3. 更新im_info中的augment_shape信息。 + +### 参数 +* **alpha** (float): 随机beta分布的下限。默认为1.5。 +* **beta** (float): 随机beta分布的上限。默认为1.5。 +* **mixup_epoch** (int): 在前mixup_epoch轮使用mixup增强操作;当该参数为-1时,该策略不会生效。默认为-1。 + +## RandomExpand类 +```python +paddlex.det.transforms.RandomExpand(ratio=4., prob=0.5, fill_value=[123.675, 116.28, 103.53]) +``` + +随机扩张图像,模型训练时的数据增强操作。 +1. 随机选取扩张比例(扩张比例大于1时才进行扩张)。 +2. 计算扩张后图像大小。 +3. 初始化像素值为输入填充值的图像,并将原图像随机粘贴于该图像上。 +4. 根据原图像粘贴位置换算出扩张后真实标注框的位置坐标。 +5. 根据原图像粘贴位置换算出扩张后真实分割区域的位置坐标。 + +### 参数 +* **ratio** (float): 图像扩张的最大比例。默认为4.0。 +* **prob** (float): 随机扩张的概率。默认为0.5。 +* **fill_value** (list): 扩张图像的初始填充值(0-255)。默认为[123.675, 116.28, 103.53]。 + +【注意】该数据增强必须在数据增强Resize、ResizeByShort之前使用。 + +## RandomCrop +```python +paddlex.det.transforms.RandomCrop(aspect_ratio=[.5, 2.], thresholds=[.0, .1, .3, .5, .7, .9], scaling=[.3, 1.], num_attempts=50, allow_no_crop=True, cover_all_box=False) +``` + +随机裁剪图像,模型训练时的数据增强操作。 +1. 若allow_no_crop为True,则在thresholds加入’no_crop’。 +2. 随机打乱thresholds。 +3. 遍历thresholds中各元素: + (1) 如果当前thresh为’no_crop’,则返回原始图像和标注信息。 + (2) 随机取出aspect_ratio和scaling中的值并由此计算出候选裁剪区域的高、宽、起始点。 + (3) 计算真实标注框与候选裁剪区域IoU,若全部真实标注框的IoU都小于thresh,则继续第3步。 + (4) 如果cover_all_box为True且存在真实标注框的IoU小于thresh,则继续第3步。 + (5) 筛选出位于候选裁剪区域内的真实标注框,若有效框的个数为0,则继续第3步,否则进行第4步。 +4. 换算有效真值标注框相对候选裁剪区域的位置坐标。 +5. 换算有效分割区域相对候选裁剪区域的位置坐标。 + +【注意】该数据增强必须在数据增强Resize、ResizeByShort之前使用。 + +### 参数 +* **aspect_ratio** (list): 裁剪后短边缩放比例的取值范围,以[min, max]形式表示。默认值为[.5, 2.]。 +* **thresholds** (list): 判断裁剪候选区域是否有效所需的IoU阈值取值列表。默认值为[.0, .1, .3, .5, .7, .9]。 +* **scaling** (list): 裁剪面积相对原面积的取值范围,以[min, max]形式表示。默认值为[.3, 1.]。 +* **num_attempts** (int): 在放弃寻找有效裁剪区域前尝试的次数。默认值为50。 +* **allow_no_crop** (bool): 是否允许未进行裁剪。默认值为True。 +* **cover_all_box** (bool): 是否要求所有的真实标注框都必须在裁剪区域内。默认值为False。 + +## ComposedRCNNTransforms +```python +paddlex.det.transforms.ComposedRCNNTransforms(mode, min_max_size=[224, 224], mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], random_horizontal_flip=True) +``` +目标检测FasterRCNN和实例分割MaskRCNN模型中已经组合好的数据处理流程,开发者可以直接使用ComposedRCNNTransforms,简化手动组合transforms的过程, 该类中已经包含了[RandomHorizontalFlip](#RandomHorizontalFlip)数据增强方式,你仍可以通过[add_augmenters函数接口](#add_augmenters)添加新的数据增强方式。 +ComposedRCNNTransforms共包括以下几个步骤: +> 训练阶段: +> > 1. 随机以0.5的概率将图像水平翻转, 若random_horizontal_flip为False,则跳过此步骤 +> > 2. 将图像进行归一化 +> > 3. 图像采用[ResizeByShort](#ResizeByShort)方式,根据min_max_size参数,进行缩入 +> > 4. 使用[Padding](#Padding)将图像的长和宽分别Padding成32的倍数 +> 验证/预测阶段: +> > 1. 将图像进行归一化 +> > 2. 图像采用[ResizeByShort](#ResizeByShort)方式,根据min_max_size参数,进行缩入 +> > 3. 使用[Padding](#Padding)将图像的长和宽分别Padding成32的倍数 + +### 参数 +* **mode** (str): Transforms所处的阶段,包括`train', 'eval'或'test' +* **min_max_size** (list): 输入模型中图像的最短边长度和最长边长度,参考[ResizeByShort](#ResizeByShort)(与原图大小无关,根据上述几个步骤,会将原图处理成相应大小输入给模型训练),默认[800, 1333] +* **mean** (list): 图像均值, 默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像方差,默认为[0.229, 0.224, 0.225]。 +* **random_horizontal_flip**(bool): 数据增强,是否以0.5的概率使用随机水平翻转增强,仅在mode为'train'时生效,默认为True。底层实现采用[paddlex.det.transforms.RandomHorizontalFlip](#randomhorizontalflip) + +### 添加数据增强方式 +```python +ComposedRCNNTransforms.add_augmenters(augmenters) +``` +> **参数** +> * **augmenters**(list): 数据增强方式列表 + +#### 使用示例 +``` +import paddlex as pdx +from paddlex.det import transforms +train_transforms = transforms.ComposedRCNNTransforms(mode='train', min_max_size=[800, 1333]) +eval_transforms = transforms.ComposedRCNNTransforms(mode='eval', min_max_size=[800, 1333]) + +# 添加数据增强 +import imgaug.augmenters as iaa +train_transforms.add_augmenters([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)) +]) +``` +上面代码等价于 +``` +import paddlex as pdx +from paddlex.det import transforms +train_transforms = transforms.Composed([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)), + # 上面两个为通过add_augmenters额外添加的数据增强方式 + transforms.RandomHorizontalFlip(prob=0.5), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) +eval_transforms = transforms.Composed([ + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) +``` + + +## ComposedYOLOv3Transforms +```python +paddlex.det.transforms.ComposedYOLOv3Transforms(mode, shape=[608, 608], mixup_epoch=250, mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], random_distort=True, random_expand=True, random_crop=True, random_horizontal_flip=True) +``` +目标检测YOLOv3模型中已经组合好的数据处理流程,开发者可以直接使用ComposedYOLOv3Transforms,简化手动组合transforms的过程, 该类中已经包含了[MixupImage](#MixupImage)、[RandomDistort](#RandomDistort)、[RandomExpand](#RandomExpand)、[RandomCrop](#RandomCrop)、[RandomHorizontalFlip](#RandomHorizontalFlip)5种数据增强方式,你仍可以通过[add_augmenters函数接口](#add_augmenters)添加新的数据增强方式。 +ComposedYOLOv3Transforms共包括以下几个步骤: +> 训练阶段: +> > 1. 在前mixup_epoch轮迭代中,使用MixupImage策略,若mixup_epoch为-1,则跳过此步骤 +> > 2. 对图像进行随机扰动,包括亮度,对比度,饱和度和色调,若random_distort为False,则跳过此步骤 +> > 3. 随机扩充图像,若random_expand为False, 则跳过此步骤 +> > 4. 随机裁剪图像,若random_crop为False, 则跳过此步骤 +> > 5. 将4步骤的输出图像Resize成shape参数的大小 +> > 6. 随机0.5的概率水平翻转图像,若random_horizontal_flip为False,则跳过此步骤 +> > 7. 图像归一化 +> 验证/预测阶段: +> > 1. 将图像Resize成shape参数大小 +> > 2. 图像归一化 + +### 参数 +* **mode** (str): Transforms所处的阶段,包括`train', 'eval'或'test' +* **shape** (list): 输入模型中图像的大小(与原图大小无关,根据上述几个步骤,会将原图处理成相应大小输入给模型训练), 默认[608, 608] +* **mixup_epoch**(int): 模型训练过程中,在前mixup_epoch轮迭代中,使用mixup策略,如果为-1,则不使用mixup策略, 默认250。底层实现采用[paddlex.det.transforms.MixupImage](#mixupimage) +* **mean** (list): 图像均值, 默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像方差,默认为[0.229, 0.224, 0.225]。 +* **random_distort**(bool): 数据增强,是否在训练过程中随机扰动图像,仅在mode为'train'时生效,默认为True。底层实现采用[paddlex.det.transforms.RandomDistort](#randomdistort) +* **random_expand**(bool): 数据增强,是否在训练过程随机扩张图像,仅在mode为'train'时生效,默认为True。底层实现采用[paddlex.det.transforms.RandomExpand](#randomexpand) +* **random_crop**(bool): 数据增强,是否在训练过程中随机裁剪图像,仅在mode为'train'时生效,默认为True。底层实现采用[paddlex.det.transforms.RandomCrop](#randomcrop) +* **random_horizontal_flip**(bool): 数据增强,是否在训练过程中随机水平翻转图像,仅在mode为'train'时生效,默认为True。底层实现采用[paddlex.det.transforms.RandomHorizontalFlip](#randomhorizontalflip) + +### 添加数据增强方式 +```python +ComposedYOLOv3Transforms.add_augmenters(augmenters) +``` +> **参数** +> * **augmenters**(list): 数据增强方式列表 + +#### 使用示例 +``` +import paddlex as pdx +from paddlex.det import transforms +train_transforms = transforms.ComposedYOLOv3Transforms(mode='train', shape=[480, 480]) +eval_transforms = transforms.ComposedYOLOv3Transforms(mode='eval', shape=[480, 480]) + +# 添加数据增强 +import imgaug.augmenters as iaa +train_transforms.add_augmenters([ + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)) +]) +``` +上面代码等价于 +``` +import paddlex as pdx +from paddlex.det import transforms +train_transforms = transforms.Composed([ + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)), + # 上面为通过add_augmenters额外添加的数据增强方式 + transforms.MixupImage(mixup_epoch=250), + transforms.RandomDistort(), + transforms.RandomExpand(), + transforms.RandomCrop(), + transforms.Resize(target_size=480, interp='RANDOM'), + transforms.RandomHorizontalFlip(prob=0.5), + transforms.Normalize() +]) +eval_transforms = transforms.Composed([ + transforms.Resize(target_size=480, interp='CUBIC'), + transforms.Normalize() +]) +``` diff --git a/docs/apis/transforms/index.rst b/docs/apis/transforms/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..2264fb610a03aee0631986912eaa7ce2e82e7478 --- /dev/null +++ b/docs/apis/transforms/index.rst @@ -0,0 +1,12 @@ +数据处理与增强 +============================ + +transforms为PaddleX的模型训练提供了数据的预处理和数据增强接口。 + +.. toctree:: + :maxdepth: 1 + + cls_transforms.md + det_transforms.md + seg_transforms.md + augment.md diff --git a/docs/apis/transforms/seg_transforms.md b/docs/apis/transforms/seg_transforms.md new file mode 100755 index 0000000000000000000000000000000000000000..b7f15e978f617bf9129fa504fc6cf682ea0cb0a7 --- /dev/null +++ b/docs/apis/transforms/seg_transforms.md @@ -0,0 +1,230 @@ +# paddlex.seg.transforms + +对用于分割任务的数据进行操作。可以利用[Compose](#compose)类将图像预处理/增强操作进行组合。 + + +## Compose +```python +paddlex.seg.transforms.Compose(transforms) +``` +根据数据预处理/数据增强列表对输入数据进行操作。[使用示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/segmentation/unet.py#L13) +### 参数 +* **transforms** (list): 数据预处理/数据增强列表。 + + +## RandomHorizontalFlip +```python +paddlex.seg.transforms.RandomHorizontalFlip(prob=0.5) +``` +以一定的概率对图像进行水平翻转,模型训练时的数据增强操作。 +### 参数 +* **prob** (float): 随机水平翻转的概率。默认值为0.5。 + + +## RandomVerticalFlip +```python +paddlex.seg.transforms.RandomVerticalFlip(prob=0.1) +``` +以一定的概率对图像进行垂直翻转,模型训练时的数据增强操作。 +### 参数 +* **prob** (float): 随机垂直翻转的概率。默认值为0.1。 + + +## Resize +```python +paddlex.seg.transforms.Resize(target_size, interp='LINEAR') +``` +调整图像大小(resize)。 + +- 当目标大小(target_size)类型为int时,根据插值方式, + 将图像resize为[target_size, target_size]。 +- 当目标大小(target_size)类型为list或tuple时,根据插值方式, + 将图像resize为target_size, target_size的输入应为[w, h]或(w, h)。 +### 参数 +* **target_size** (int|list|tuple): 目标大小 +* **interp** (str): resize的插值方式,与opencv的插值方式对应, +可选的值为['NEAREST', 'LINEAR', 'CUBIC', 'AREA', 'LANCZOS4'],默认为"LINEAR"。 + + +## ResizeByLong +```python +paddlex.seg.transforms.ResizeByLong(long_size) +``` +对图像长边resize到固定值,短边按比例进行缩放。 +### 参数 +* **long_size** (int): resize后图像的长边大小。 + + +## ResizeRangeScaling +```python +paddlex.seg.transforms.ResizeRangeScaling(min_value=400, max_value=600) +``` +对图像长边随机resize到指定范围内,短边按比例进行缩放,模型训练时的数据增强操作。 +### 参数 +* **min_value** (int): 图像长边resize后的最小值。默认值400。 +* **max_value** (int): 图像长边resize后的最大值。默认值600。 + + +## ResizeStepScaling +```python +paddlex.seg.transforms.ResizeStepScaling(min_scale_factor=0.75, max_scale_factor=1.25, scale_step_size=0.25) +``` +对图像按照某一个比例resize,这个比例以scale_step_size为步长,在[min_scale_factor, max_scale_factor]随机变动,模型训练时的数据增强操作。 +### 参数 +* **min_scale_factor**(float), resize最小尺度。默认值0.75。 +* **max_scale_factor** (float), resize最大尺度。默认值1.25。 +* **scale_step_size** (float), resize尺度范围间隔。默认值0.25。 + + +## Normalize +```python +paddlex.seg.transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) +``` +对图像进行标准化。 + +1.图像像素归一化到区间 [0.0, 1.0]。 +2.对图像进行减均值除以标准差操作。 +### 参数 +* **mean** (list): 图像数据集的均值。默认值[0.5, 0.5, 0.5]。 +* **std** (list): 图像数据集的标准差。默认值[0.5, 0.5, 0.5]。 + + +## Padding +```python +paddlex.seg.transforms.Padding(target_size, im_padding_value=[127.5, 127.5, 127.5], label_padding_value=255) +``` +对图像或标注图像进行padding,padding方向为右和下。根据提供的值对图像或标注图像进行padding操作。 +### 参数 +* **target_size** (int|list|tuple): padding后图像的大小。 +* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。 +* **label_padding_value** (int): 标注图像padding的值。默认值为255(仅在训练时需要设定该参数)。 + + +## RandomPaddingCrop +```python +paddlex.seg.transforms.RandomPaddingCrop(crop_size=512, im_padding_value=[127.5, 127.5, 127.5], label_padding_value=255) +``` +对图像和标注图进行随机裁剪,当所需要的裁剪尺寸大于原图时,则进行padding操作,模型训练时的数据增强操作。 +### 参数 +* **crop_size**(int|list|tuple): 裁剪图像大小。默认为512。 +* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。 +* **label_padding_value** (int): 标注图像padding的值。默认值为255。 + + +## RandomBlur +```python +paddlex.seg.transforms.RandomBlur(prob=0.1) +``` +以一定的概率对图像进行高斯模糊,模型训练时的数据增强操作。 +### 参数 +* **prob** (float): 图像模糊概率。默认为0.1。 + + +## RandomRotate +```python +paddlex.seg.transforms.RandomRotate(rotate_range=15, im_padding_value=[127.5, 127.5, 127.5], label_padding_value=255) +``` +对图像进行随机旋转, 模型训练时的数据增强操作。 + +在旋转区间[-rotate_range, rotate_range]内,对图像进行随机旋转,当存在标注图像时,同步进行, +并对旋转后的图像和标注图像进行相应的padding。 +### 参数 +* **rotate_range** (float): 最大旋转角度。默认为15度。 +* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。 +* **label_padding_value** (int): 标注图像padding的值。默认为255。 + + +## RandomScaleAspect +```python +paddlex.seg.transforms.RandomScaleAspect(min_scale=0.5, aspect_ratio=0.33) +``` +裁剪并resize回原始尺寸的图像和标注图像,模型训练时的数据增强操作。 + +按照一定的面积比和宽高比对图像进行裁剪,并reszie回原始图像的图像,当存在标注图时,同步进行。 +### 参数 +* **min_scale** (float):裁取图像占原始图像的面积比,取值[0,1],为0时则返回原图。默认为0.5。 +* **aspect_ratio** (float): 裁取图像的宽高比范围,非负值,为0时返回原图。默认为0.33。 + + +## RandomDistort +```python +paddlex.seg.transforms.RandomDistort(brightness_range=0.5, brightness_prob=0.5, contrast_range=0.5, contrast_prob=0.5, saturation_range=0.5, saturation_prob=0.5, hue_range=18, hue_prob=0.5) +``` +以一定的概率对图像进行随机像素内容变换,模型训练时的数据增强操作。 + +1.对变换的操作顺序进行随机化操作。 +2.按照1中的顺序以一定的概率对图像在范围[-range, range]内进行随机像素内容变换。 + +【注意】该数据增强必须在数据增强Normalize之前使用。 + +### 参数 +* **brightness_range** (float): 明亮度因子的范围。默认为0.5。 +* **brightness_prob** (float): 随机调整明亮度的概率。默认为0.5。 +* **contrast_range** (float): 对比度因子的范围。默认为0.5。 +* **contrast_prob** (float): 随机调整对比度的概率。默认为0.5。 +* **saturation_range** (float): 饱和度因子的范围。默认为0.5。 +* **saturation_prob** (float): 随机调整饱和度的概率。默认为0.5。 +* **hue_range** (int): 色调因子的范围。默认为18。 +* **hue_prob** (float): 随机调整色调的概率。默认为0.5。 + +## ComposedSegTransforms +```python +paddlex.det.transforms.ComposedSegTransforms(mode, min_max_size=[400, 600], train_crop_shape=[769, 769], mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], random_horizontal_flip=True) +``` +语义分割DeepLab和UNet模型中已经组合好的数据处理流程,开发者可以直接使用ComposedSegTransforms,简化手动组合transforms的过程, 该类中已经包含了[RandomHorizontalFlip](#RandomHorizontalFlip)、[ResizeStepScaling](#ResizeStepScaling)、[RandomPaddingCrop](#RandomPaddingCrop)3种数据增强方式,你仍可以通过[add_augmenters函数接口](#add_augmenters)添加新的数据增强方式。 +ComposedSegTransforms共包括以下几个步骤: + > 训练阶段: +> > 1. 随机对图像以0.5的概率水平翻转,若random_horizontal_flip为False,则跳过此步骤 +> > 2. 按不同的比例随机Resize原图, 处理方式参考[paddlex.seg.transforms.ResizeRangeScaling](#resizerangescaling)。若min_max_size为None,则跳过此步骤 +> > 3. 从原图中随机crop出大小为train_crop_size大小的子图,如若crop出来的图小于train_crop_size,则会将图padding到对应大小 +> > 4. 图像归一化 + > 预测阶段: +> > 1. 将图像的最长边resize至(min_max_size[0] + min_max_size[1])//2, 短边按比例resize。若min_max_size为None,则跳过此步骤 +> > 1. 图像归一化 + +### 参数 +* **mode** (str): Transforms所处的阶段,包括`train', 'eval'或'test' +* **min_max_size**(list): 用于对图像进行resize,具体作用参见上述步骤。 +* **train_crop_size** (list): 训练过程中随机裁剪原图用于训练,具体作用参见上述步骤。此参数仅在mode为`train`时生效。 +* **mean** (list): 图像均值, 默认为[0.485, 0.456, 0.406]。 +* **std** (list): 图像方差,默认为[0.229, 0.224, 0.225]。 +* **random_horizontal_flip**(bool): 数据增强,是否随机水平翻转图像,此参数仅在mode为`train`时生效。 + +### 添加数据增强方式 +```python +ComposedSegTransforms.add_augmenters(augmenters) +``` +> **参数** +> * **augmenters**(list): 数据增强方式列表 + +#### 使用示例 +``` +import paddlex as pdx +from paddlex.seg import transforms +train_transforms = transforms.ComposedSegTransforms(mode='train', train_crop_size=[512, 512]) +eval_transforms = transforms.ComposedSegTransforms(mode='eval') + +# 添加数据增强 +import imgaug.augmenters as iaa +train_transforms.add_augmenters([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)) +]) +``` +上面代码等价于 +``` +import paddlex as pdx +from paddlex.det import transforms +train_transforms = transforms.Composed([ + transforms.RandomDistort(), + iaa.blur.GaussianBlur(sigma=(0.0, 3.0)), + # 上面2行为通过add_augmenters额外添加的数据增强方式 + transforms.RandomHorizontalFlip(prob=0.5), + transforms.ResizeStepScaling(), + transforms.PaddingCrop(crop_size=[512, 512]), + transforms.Normalize() +]) +eval_transforms = transforms.Composed([ + transforms.Normalize() +]) +``` diff --git a/docs/apis/visualize.md b/docs/apis/visualize.md new file mode 100755 index 0000000000000000000000000000000000000000..f04e86acc8ec1cb82355bac508952438a714d8b0 --- /dev/null +++ b/docs/apis/visualize.md @@ -0,0 +1,139 @@ +# 预测结果可视化 + +PaddleX提供了一系列模型预测和结果分析的可视化函数。 + +## paddlex.det.visualize +> **目标检测/实例分割预测结果可视化** +``` +paddlex.det.visualize(image, result, threshold=0.5, save_dir='./') +``` +将目标检测/实例分割模型预测得到的Box框和Mask在原图上进行可视化。 + +### 参数 +> * **image** (str|np.ndarray): 原图文件路径或numpy数组(HWC排列,BGR格式)。 +> * **result** (str): 模型预测结果。 +> * **threshold**(float): score阈值,将Box置信度低于该阈值的框过滤不进行可视化。默认0.5 +> * **save_dir**(str): 可视化结果保存路径。若为None,则表示不保存,该函数将可视化的结果以np.ndarray的形式返回;若设为目录路径,则将可视化结果保存至该目录下。默认值为'./'。 + +### 使用示例 +> 点击下载如下示例中的[模型](https://bj.bcebos.com/paddlex/models/xiaoduxiong_epoch_12.tar.gz) +``` +import paddlex as pdx +model = pdx.load_model('xiaoduxiong_epoch_12') +result = model.predict('./xiaoduxiong_epoch_12/xiaoduxiong.jpeg') +pdx.det.visualize('./xiaoduxiong_epoch_12/xiaoduxiong.jpeg', result, save_dir='./') +# 预测结果保存在./visualize_xiaoduxiong.jpeg +``` +## paddlex.seg.visualize +> **语义分割模型预测结果可视化** +``` +paddlex.seg.visualize(image, result, weight=0.6, save_dir='./') +``` +将语义分割模型预测得到的Mask在原图上进行可视化。 + +### 参数 +> * **image** (str|np.ndarray): 原图文件路径或numpy数组(HWC排列,BGR格式)。 +> * **result** (str): 模型预测结果。 +> * **weight**(float): mask可视化结果与原图权重因子,weight表示原图的权重。默认0.6。 +> * **save_dir**(str): 可视化结果保存路径。若为None,则表示不保存,该函数将可视化的结果以np.ndarray的形式返回;若设为目录路径,则将可视化结果保存至该目录下。默认值为'./'。 + +### 使用示例 +> 点击下载如下示例中的[模型](https://bj.bcebos.com/paddlex/models/cityscape_deeplab.tar.gz)和[测试图片](https://bj.bcebos.com/paddlex/datasets/city.png) +``` +import paddlex as pdx +model = pdx.load_model('cityscape_deeplab') +result = model.predict('city.png') +pdx.det.visualize('city.png', result, save_dir='./') +# 预测结果保存在./visualize_city.png +``` + +## paddlex.det.draw_pr_curve +> **目标检测/实例分割准确率-召回率可视化** +``` +paddlex.det.draw_pr_curve(eval_details_file=None, gt=None, pred_bbox=None, pred_mask=None, iou_thresh=0.5, save_dir='./') +``` +将目标检测/实例分割模型评估结果中各个类别的准确率和召回率的对应关系进行可视化,同时可视化召回率和置信度阈值的对应关系。 +> 注:PaddleX在训练过程中保存的模型目录中,均包含`eval_result.json`文件,可将此文件路径传给`eval_details_file`参数,设定`iou_threshold`即可得到对应模型在验证集上的PR曲线图。 + +### 参数 +> * **eval_details_file** (str): 模型评估结果的保存路径,包含真值信息和预测结果。默认值为None。 +> * **gt** (list): 数据集的真值信息。默认值为None。 +> * **pred_bbox** (list): 模型在数据集上的预测框。默认值为None。 +> * **pred_mask** (list): 模型在数据集上的预测mask。默认值为None。 +> * **iou_thresh** (float): 判断预测框或预测mask为真阳时的IoU阈值。默认值为0.5。 +> * **save_dir** (str): 可视化结果保存路径。默认值为'./'。 + +**注意:**`eval_details_file`的优先级更高,只要`eval_details_file`不为None,就会从`eval_details_file`提取真值信息和预测结果做分析。当`eval_details_file`为None时,则用`gt`、`pred_mask`、`pred_mask`做分析。 + +### 使用示例 +点击下载如下示例中的[模型](https://bj.bcebos.com/paddlex/models/insect_epoch_270.zip)和[数据集](https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz) + +> 方式一:分析训练过程中保存的模型文件夹中的评估结果文件`eval_details.json`,例如[模型](https://bj.bcebos.com/paddlex/models/insect_epoch_270.zip)中的`eval_details.json`。 +``` +import paddlex as pdx +eval_details_file = 'insect_epoch_270/eval_details.json' +pdx.det.draw_pr_curve(eval_details_file, save_dir='./insect') +``` +> 方式二:分析模型评估函数返回的评估结果。 + +``` +import os +# 选择使用0号卡 +os.environ['CUDA_VISIBLE_DEVICES'] = '0' + +from paddlex.det import transforms +import paddlex as pdx + +model = pdx.load_model('insect_epoch_270') +eval_dataset = pdx.datasets.VOCDetection( + data_dir='insect_det', + file_list='insect_det/val_list.txt', + label_list='insect_det/labels.txt', + transforms=model.eval_transforms) +metrics, evaluate_details = model.evaluate(eval_dataset, batch_size=8, return_details=True) +gt = evaluate_details['gt'] +bbox = evaluate_details['bbox'] +pdx.det.draw_pr_curve(gt=gt, pred_bbox=bbox, save_dir='./insect') +``` + +预测框的各个类别的准确率和召回率的对应关系、召回率和置信度阈值的对应关系可视化如下: +![](./images/insect_bbox_pr_curve(iou-0.5).png) + + +## paddlex.slim.visualzie +> **模型裁剪比例可视化分析** +``` +paddlex.slim.visualize(model, sensitivities_file) +``` +利用此接口,可以分析在不同的`eval_metric_loss`参数下,模型被裁剪的比例情况。可视化结果纵轴为eval_metric_loss参数值,横轴为对应的模型被裁剪的比例。 + +### 参数 +>* **model** (paddlex.cv.models): 使用PaddleX加载的模型。 +>* **sensitivities_file** (str): 模型各参数在验证集上计算得到的参数敏感度信息文件。 + +### 使用示例 +> 点击下载示例中的[模型](https://bj.bcebos.com/paddlex/models/vegetables_mobilenet.tar.gz)和[sensitivities_file](https://bj.bcebos.com/paddlex/slim_prune/mobilenetv2.sensitivities) +``` +import paddlex as pdx +model = pdx.load_model('vegetables_mobilenet') +pdx.slim.visualize(model, 'mobilenetv2.sensitivities', save_dir='./') +# 可视化结果保存在./sensitivities.png +``` + +## paddlex.transforms.visualize +> **数据预处理/增强过程可视化** +``` +paddlex.transforms.visualize(dataset, + img_count=3, + save_dir='vdl_output') +``` +对数据预处理/增强中间结果进行可视化。 +可使用VisualDL查看中间结果: +1. VisualDL启动方式: visualdl --logdir vdl_output --port 8001 +2. 浏览器打开 https://0.0.0.0:8001即可, + 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP + +### 参数 +>* **dataset** (paddlex.datasets): 数据集读取器。 +>* **img_count** (int): 需要进行数据预处理/增强的图像数目。默认为3。 +>* **save_dir** (str): 日志保存的路径。默认为'vdl_output'。 diff --git a/docs/appendix/anaconda_install.md b/docs/appendix/anaconda_install.md new file mode 100755 index 0000000000000000000000000000000000000000..0484ea720bd944351efe1de63bce06d87d6429db --- /dev/null +++ b/docs/appendix/anaconda_install.md @@ -0,0 +1,60 @@ +# Anaconda安装使用 +Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。使用Anaconda可以通过创建多个独立的Python环境,避免用户的Python环境安装太多不同版本依赖导致冲突。 + +## Windows安装Anaconda +### 第一步 下载 +- 在Anaconda官网[(https://www.anaconda.com/products/individual)](https://www.anaconda.com/products/individual)选择下载Windows Python3.7 64-Bit版本 +- 确保已经安装`Visual C++ Build Tools`(可以在开始菜单中找到),如未安装,请[点击下载](https://go.microsoft.com/fwlink/?LinkId=691126)安装。 + +### 第二步 安装 +运行下载的安装包(以.exe为后辍),根据引导完成安装, 用户可自行修改安装目录(如下图) +![](images/anaconda_windows.png) + +### 第三步 使用 +- 点击Windows系统左下角的Windows图标,打开:所有程序->Anaconda3/2(64-bit)->Anaconda Prompt +- 在命令行中执行下述命令 +```cmd +# 创建名为my_paddlex的环境,指定Python版本为3.7 +conda create -n my_paddlex python=3.7 +# 进入my_paddlex环境 +conda activate my_paddlex +# 安装git +conda install git +# 安装pycocotools +pip install cython +pip install git+https://gitee.com/jiangjiajun/philferriere-cocoapi.git#subdirectory=PythonAPI +# 安装paddlepaddle-gpu +pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple +# 安装paddlex +pip install paddlex -i https://mirror.baidu.com/pypi/simple +``` +按如上方式配置后,即可在环境中使用PaddleX了,命令行输入`python`回车后,`import paddlex`试试吧,之后再次使用都可以通过打开'所有程序->Anaconda3/2(64-bit)->Anaconda Prompt',再执行`conda activate my_paddlex`进入环境后,即可再次使用paddlex + +## Linux/Mac安装 + +### 第一步 下载 +在Anaconda官网[(https://www.anaconda.com/products/individual)](https://www.anaconda.com/products/individual)选择下载对应系统 Python3.7版本下载(Mac下载Command Line Installer版本即可) + +### 第二步 安装 +打开终端,在终端安装Anaconda +``` +# ~/Downloads/Anaconda3-2019.07-Linux-x86_64.sh即下载的文件 +bash ~/Downloads/Anaconda3-2019.07-Linux-x86_64.sh +``` +安装过程中一直回车即可,如提示设置安装路径,可根据需求修改,一般默认即可。 + +### 第三步 使用 +``` +# 创建名为my_paddlex的环境,指定Python版本为3.7 +conda create -n my_paddlex python=3.7 +# 进入paddlex环境 +conda activate my_paddlex +# 安装pycocotools +pip install cython +pip install pycocotools +# 安装paddlepaddle-gpu +pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple +# 安装paddlex +pip install paddlex -i https://mirror.baidu.com/pypi/simple +``` +按如上方式配置后,即可在环境中使用PaddleX了,终端输入`python`回车后,`import paddlex`试试吧,之后再次使用只需再打开终端,再执行`conda activate my_paddlex`进入环境后,即可使用paddlex diff --git a/docs/appendix/gpu_configure.md b/docs/appendix/gpu_configure.md new file mode 100755 index 0000000000000000000000000000000000000000..cf72fe2ecf54082d15dfc1bdc13e137c8daa5da9 --- /dev/null +++ b/docs/appendix/gpu_configure.md @@ -0,0 +1,70 @@ +# 多卡GPU/CPU训练 + +## GPU卡数配置 +PaddleX在训练过程中会优先选择**当前所有可用的GPU卡进行训练**,在评估时**分类和分割任务仍使用多张卡**而**检测任务只使用1张卡**进行计算,在预测时各任务**则只会使用1张卡进行计算**。 + +用户如想配置PaddleX在运行时使用的卡的数量,可在命令行终端(Shell)或Python代码中按如下方式配置: + +命令行终端: +``` +# 使用1号GPU卡 +export CUDA_VISIBLE_DEVICES='1' +# 使用0, 1, 3号GPU卡 +export CUDA_VISIBLE_DEVICES='0,1,3' +# 不使用GPU,仅使用CPU +export CUDA_VISIBLE_DEVICES='' +``` + +python代码: +``` +# 注意:须要在第一次import paddlex或paddle前执行如下语句 +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,3' +import paddlex as pdx +``` + +## 使用多个GPU卡训练 + +目前PaddlePaddle支持在Linux下使用多卡训练,Windows只支持单卡,在命令行终端输入`nvidia-smi`可以查看自己机器的GPU卡信息,如若提示命令未找到,则用户需要自行安装CUDA驱动。 + +PaddleX在多卡GPU下训练时,无需额外的配置,用户按照上文的方式,通过`CUDA_VISIBLE_DEVICES`环境变量配置所需要使用的卡的数量即可。 + +需要注意的是,在训练代码中,可根据卡的数量,调高`batch_size`和`learning_rate`等参数,GPU卡数量越多,则可以支持更高的`batch_size`(注意batch_size需能被卡的数量整除), 同时更高的`batch_size`也意味着学习率`learning_rate`也要对应上调。同理,在训练过程中,如若因显存或内存不够导致训练失败,用户也需自行调低`batch_size`,并且按比例调低学习率。 + +## CPU配置 +PaddleX在训练过程中可以选择使用CPU进行训练、评估和预测。通过以下方式进行配置: + +命令行终端: +``` +export CUDA_VISIBLE_DEVICES="" +``` + +python代码: +``` +# 注意:须要在第一次import paddlex或paddle前执行如下语句 +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '' +import paddlex as pdx +``` +此时使用的CPU个数为1。 + +## 使用多个CPU训练 +通过设置环境变量`CPU_NUM`可以改变CPU个数,如果未设置,则CPU数目默认设为1,即`CPU_NUM`=1。 在物理核心数量范围内,该参数的配置可以加速模型。 + +PaddleX在训练过程中会选择`CPU_NUM`个CPU进行训练,在评估时分类和分割任务仍使用`CPU_NUM`个CPU,而检测任务只使用1个CPU进行计算,在预测时各任务则只会使用1个CPU进行计算。 +通过以下方式可设置CPU的个数: + +命令行终端: +``` +export CUDA_VISIBLE_DEVICES="" +export CPU_NUM=2 +``` + +python代码: +``` +# 注意:须要在第一次import paddlex或paddle前执行如下语句 +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '' +os.environ['CPU_NUM'] = '2' +import paddlex as pdx +``` diff --git a/docs/appendix/how_to_offline_run.md b/docs/appendix/how_to_offline_run.md new file mode 100755 index 0000000000000000000000000000000000000000..73e22060c8b661f76fea95798300e9b1aac0d27e --- /dev/null +++ b/docs/appendix/how_to_offline_run.md @@ -0,0 +1,39 @@ +# 无联网模型训练 + +PaddleX在模型训练时,存在以下两种情况需要进行联网下载 +> 1.训练模型时,用户没有配置自定义的预训练模型权重`pretrain_weights`,此时PaddleX会自动联网下载在标准数据集上的预训练模型; +> 2.模型裁剪训练时,用户没有配置自定义的参数敏感度信息文件`sensitivities_file`,并将`sensitivities_file`配置成了'DEFAULT'字符串,此时PaddleX会自动联网下载模型在标准数据集上计算得到的参数敏感度信息文件。 + + +## 如何在没联网的情况下进行模型训练 +> 在训练模型时,不管是正常训练还是裁剪训练,用户可以提前准备好预训练权重或参数敏感度信息文档,只需自定义`pretrain_weights`或`sensitivities_file`, 将其设为本地的路径即可。 + + +## 预训练模型下载地址 +> 以下模型均为分类模型权重(UNet除外),用户在训练模型时,需要**根据分类模型的种类或backbone的种类**,选择对应的模型权重进行下载(目标检测在使用ResNet50作为Backbone时,使用下面表格中的ResNet50_cos作为预训练模型) + +| 模型(点击下载) | 数据集 | +| :------------|:------| +| [ResNet18](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_pretrained.tar) | ImageNet | +| [ResNet34](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_pretrained.tar) | ImageNet | +| [ResNet50](http://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_pretrained.tar) | ImageNet | +| [ResNet101](http://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar) | ImageNet | +| [ResNet50_vd](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar) | ImageNet | +| [ResNet101_vd](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_vd_pretrained.tar) | ImageNet | +| [MobileNetV1](http://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV1_pretrained.tar) | ImageNet | +| [MobileNetV2_x1.0](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_pretrained.tar) | ImageNet | +| [MobileNetV2_x0.5](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_x0_5_pretrained.tar) | ImageNet | +| [MobileNetV2_x2.0](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_x2_0_pretrained.tar) | ImageNet | +| [MobileNetV2_x0.25](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_x0_25_pretrained.tar) | ImageNet | +| [MobileNetV2_x1.5](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_x1_5_pretrained.tar) | ImageNet | +| [MobileNetV3_small](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_small_x1_0_pretrained.tar) | ImageNet | +| [MobileNetV3_large](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x1_0_pretrained.tar) | ImageNet | +| [DarkNet53](https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_ImageNet1k_pretrained.tar) | ImageNet | +| [DenseNet121](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet121_pretrained.tar) | ImageNet | +| [DenseNet161](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet161_pretrained.tar) | ImageNet | +| [DenseNet201](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet201_pretrained.tar) | ImageNet | +| [ResNet50_cos](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_cos_pretrained.tar) | ImageNet | +| [Xception41](https://paddle-imagenet-models-name.bj.bcebos.com/Xception41_deeplab_pretrained.tar) | ImageNet | +| [Xception65](https://paddle-imagenet-models-name.bj.bcebos.com/Xception65_deeplab_pretrained.tar) | ImageNet | +| [ShuffleNetV2](https://paddle-imagenet-models-name.bj.bcebos.com/ShuffleNetV2_pretrained.tar) | ImageNet | +| [UNet](https://paddleseg.bj.bcebos.com/models/unet_coco_v3.tgz) | MSCOCO | diff --git a/docs/appendix/images/anaconda_windows.png b/docs/appendix/images/anaconda_windows.png new file mode 100755 index 0000000000000000000000000000000000000000..fe1c62ff6134f1d3cba928d91940f404ae9ac11d Binary files /dev/null and b/docs/appendix/images/anaconda_windows.png differ diff --git a/docs/appendix/images/cls_eval.png b/docs/appendix/images/cls_eval.png new file mode 100755 index 0000000000000000000000000000000000000000..625166920f32e5fe4ef8c4f3ddcc7d35259ba021 Binary files /dev/null and b/docs/appendix/images/cls_eval.png differ diff --git a/docs/appendix/images/cls_train.png b/docs/appendix/images/cls_train.png new file mode 100755 index 0000000000000000000000000000000000000000..b6ccd88dc7365b1f98e985bf34c42d76a2ede958 Binary files /dev/null and b/docs/appendix/images/cls_train.png differ diff --git a/docs/appendix/images/faster_eval.png b/docs/appendix/images/faster_eval.png new file mode 100755 index 0000000000000000000000000000000000000000..31f59266e24fd51c9462d2b1f2e1cfa8e4af4fcf Binary files /dev/null and b/docs/appendix/images/faster_eval.png differ diff --git a/docs/appendix/images/faster_train.png b/docs/appendix/images/faster_train.png new file mode 100755 index 0000000000000000000000000000000000000000..611c56dabb445bff9681eb48aac3ed407d791eb0 Binary files /dev/null and b/docs/appendix/images/faster_train.png differ diff --git a/docs/appendix/images/lime.png b/docs/appendix/images/lime.png new file mode 100644 index 0000000000000000000000000000000000000000..801be69b57c80ad92dcc0ca69bf1a0a4de074b0f Binary files /dev/null and b/docs/appendix/images/lime.png differ diff --git a/docs/appendix/images/mask_eval.png b/docs/appendix/images/mask_eval.png new file mode 100644 index 0000000000000000000000000000000000000000..39e1ffb497920a9345c5f9a41251ec0a6b6621d5 Binary files /dev/null and b/docs/appendix/images/mask_eval.png differ diff --git a/docs/appendix/images/mask_train.png b/docs/appendix/images/mask_train.png new file mode 100755 index 0000000000000000000000000000000000000000..f43bf8cf9bd5e43c157dfd59ee1f382e2fd41fa0 Binary files /dev/null and b/docs/appendix/images/mask_train.png differ diff --git a/docs/appendix/images/normlime.png b/docs/appendix/images/normlime.png new file mode 100644 index 0000000000000000000000000000000000000000..321716126b6770c4915fc0f902d39fe97a5885a9 Binary files /dev/null and b/docs/appendix/images/normlime.png differ diff --git a/docs/appendix/images/seg_eval.png b/docs/appendix/images/seg_eval.png new file mode 100755 index 0000000000000000000000000000000000000000..978b1ce3ecea799eb5fa81fe60f68ed2f4526838 Binary files /dev/null and b/docs/appendix/images/seg_eval.png differ diff --git a/docs/appendix/images/seg_train.png b/docs/appendix/images/seg_train.png new file mode 100755 index 0000000000000000000000000000000000000000..9490a9022b07d6da62a333362238fb8b86d64aa4 Binary files /dev/null and b/docs/appendix/images/seg_train.png differ diff --git a/docs/appendix/images/voc_eval.png b/docs/appendix/images/voc_eval.png new file mode 100755 index 0000000000000000000000000000000000000000..f99ded08a637986d0256e85009eb9568912b2811 Binary files /dev/null and b/docs/appendix/images/voc_eval.png differ diff --git a/docs/appendix/images/yolo_train.png b/docs/appendix/images/yolo_train.png new file mode 100755 index 0000000000000000000000000000000000000000..4ab97aca5be9c8b9f0d03cc5f1c4dd8d265d69a7 Binary files /dev/null and b/docs/appendix/images/yolo_train.png differ diff --git a/docs/appendix/index.rst b/docs/appendix/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..56fb69f04fa4e72ebded3d4d39787e5446ae6d56 --- /dev/null +++ b/docs/appendix/index.rst @@ -0,0 +1,14 @@ +附录 +======================================= + + +.. toctree:: + :maxdepth: 1 + :caption: 目录: + + model_zoo.md + slim_model_zoo.md + metrics.md + interpret.md + parameters.md + diff --git a/docs/appendix/interpret.md b/docs/appendix/interpret.md new file mode 100644 index 0000000000000000000000000000000000000000..00fa12cb2c08f3756e5a03bb75c9cfd08e5c8329 --- /dev/null +++ b/docs/appendix/interpret.md @@ -0,0 +1,42 @@ +# PaddleX可解释性 + +目前深度学习模型普遍存在一个问题,因为使用模型预测还是一个黑盒,几乎无法去感知它的内部工作状态,预测结果的可信度一直遭到质疑。为此,PadlleX提供了2种对图像分类预测结果进行可解释性研究的算法:LIME和NormLIME。 + +## LIME +LIME全称Local interpretable model-agnostic explanations,表示一种与模型无关的局部可解释性。其实现步骤主要如下: +1. 获取图像的超像素。 +2. 以输入样本为中心,在其附近的空间中进行随机采样,每个采样即对对象中的超像素进行随机遮掩(每个采样的权重和该采样与原样本的距离成反比)。 +3. 每个采样通过预测模型得到新的输出,这样得到一系列的输入`X`和对应的输出`Y`。 +4. 将`X`转换为超像素特征`F`,用一个简单的、可解释的模型`Model`(这里使用岭回归)来拟合`F`和`Y`的映射关系。 +5. `Model`将得到`F`每个输入维度的权重(每个维度代表一个超像素),以此来解释模型。 + +LIME的使用方式可参见[代码示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/interpret/lime.py)和[api介绍](../apis/visualize.html#lime)。在使用时,参数中的`num_samples`设置尤为重要,其表示上述步骤2中的随机采样的个数,若设置过小会影响可解释性结果的稳定性,若设置过大则将在上述步骤3耗费较长时间;参数`batch_size`则表示在计算上述步骤3时,预测的batch size,若设置过小将在上述步骤3耗费较长时间,而上限则根据机器配置决定。 + +最终LIME可解释性算法的可视化结果如下所示: +![](images/lime.png) +图中绿色区域代表起正向作用的超像素,红色区域代表起反向作用的超像素,"First n superpixels"代表前n个权重比较大的超像素(由上述步骤5计算所得结果)。 + + +## NormLIME +NormLIME是在LIME上的改进,LIME的解释是局部性的,是针对当前样本给的特定解释,而NormLIME是利用一定数量的样本对当前样本的一个全局性的解释,有一定的降噪效果。其实现步骤如下所示: +1. 下载Kmeans模型参数和ResNet50_vc网络前三层参数。(ResNet50_vc的参数是在ImageNet上训练所得网络的参数;使用ImageNet图像作为数据集,每张图像从ResNet50_vc的第三层输出提取对应超象素位置上的平均特征和质心上的特征,训练将得到此处的Kmeans模型) +2. 使用测试集中的数据计算normlime的权重信息(如无测试集,可用验证集代替): + 对每张图像的处理: + (1) 获取图像的超像素。 + (2) 使用ResNet50_vc获取第三层特征,针对每个超像素位置,组合质心特征和均值特征`F`。 + (3) 把`F`作为Kmeans模型的输入,计算每个超像素位置的聚类中心。 + (4) 使用训练好的分类模型,预测该张图像的`label`。 + 对所有图像的处理: + (1) 以每张图像的聚类中心信息组成的向量(若某聚类中心出现在盖章途中设置为1,反之为0)为输入, + 预测的`label`为输出,构建逻辑回归函数`regression_func`。 + (2) 由`regression_func`可获得每个聚类中心不同类别下的权重,并对权重进行归一化。 +3. 使用Kmeans模型获取需要可视化图像的每个超像素的聚类中心。 +4. 对需要可视化的图像的超像素进行随机遮掩构成新的图像。 +5. 对每张构造的图像使用预测模型预测label。 +6. 根据normlime的权重信息,每个超像素可获不同的权重,选取最高的权重为最终的权重,以此来解释模型。 + +NormLIME的使用方式可参见[代码示例](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/interpret/normlime.py)和[api介绍](../apis/visualize.html#normlime)。在使用时,参数中的`num_samples`设置尤为重要,其表示上述步骤2中的随机采样的个数,若设置过小会影响可解释性结果的稳定性,若设置过大则将在上述步骤3耗费较长时间;参数`batch_size`则表示在计算上述步骤3时,预测的batch size,若设置过小将在上述步骤3耗费较长时间,而上限则根据机器配置决定;而`dataset`则是由测试集或验证集构造的数据。 + +最终NormLIME可解释性算法的可视化结果如下所示: +![](images/normlime.png) +图中绿色区域代表起正向作用的超像素,红色区域代表起反向作用的超像素,"First n superpixels"代表前n个权重比较大的超像素(由上述步骤5计算所得结果)。图中最后一行代表把LIME和NormLIME对应超像素权重相乘的结果。 diff --git a/docs/appendix/metrics.md b/docs/appendix/metrics.md new file mode 100755 index 0000000000000000000000000000000000000000..174e57a69ee573c60bf3568b1b6bc2c4292451a8 --- /dev/null +++ b/docs/appendix/metrics.md @@ -0,0 +1,145 @@ +# PaddleX指标及日志 + +PaddleX在模型训练、评估过程中,都会有相应的日志和指标反馈,本文档用于说明这些日志和指标的含义。 + +## 训练通用统计信息 + +PaddleX所有模型在训练过程中,输出的日志信息都包含了6个通用的统计信息,用于辅助用户进行模型训练,例如**分割模型**的训练日志,如下图所示。 + +![](images/seg_train.png) + +各字段含义如下: + +| 字段 | 字段值示例 | 含义 | +| -------------- | -------------------- | ------------------------------------------------------------ | +| Epoch | Epoch=4/20 | [迭代轮数]所有训练数据会被训练20轮,当前处于第4轮 | +| Step | Step=62/66 | [迭代步数]所有训练数据被训练一轮所需要的迭代步数为66,当前处于第62步 | +| loss | loss=0.007226 | [损失函数值]参与当前迭代步数的训练样本的平均损失函数值loss,loss值越低,表明模型在训练集上拟合的效果越好(如上日志中第1行表示第4个epoch的第62个Batch的loss值为0.007226) | +| lr | lr=0.008215 | [学习率]当前模型迭代过程中的学习率 | +| time_each_step | time_each_step=0.41s | [每步迭代时间]训练过程计算得到的每步迭代平均用时 | +| eta | eta=0:9:44 | [剩余时间]模型训练完成所需剩余时间预估为0小时9分钟44秒 | +| | | | + +不同模型的日志中除了上述通用字段外,还有其它字段,这些字段含义可见文档后面对各任务模型的描述。 + +## 评估通用统计信息 + +PaddleX所有模型在训练过程中会根据用户设定的`save_interval_epochs`参数,每间隔一定轮数进行评估和保存。例如**分类模型**的评估日志,如下图所示。 + +![](images/cls_eval.png) + +上图中第1行表明验证数据集中样本数为240,需要迭代8步才能评估完所有验证数据;第5行用于表明第2轮的模型已经完成保存操作;第6行则表明当前保存的模型中,第2轮的模型在验证集上指标最优(分类任务看`acc1`,此时`acc1`值为0.258333),最优模型会保存在`best_model`目录中。 + +## 分类特有统计信息 + +### 训练日志字段 + +分类任务的训练日志除了通用统计信息外,还包括`acc1`和`acc5`两个特有字段。 + +> 注: acck准确率是针对一张图片进行计算的:把模型在各个类别上的预测得分按从高往低进行排序,取出前k个预测类别,若这k个预测类别包含了真值类,则认为该图片分类正确。 + +![](images/cls_train.png) + + +上图中第1行中的`acc1`表示参与当前迭代步数的训练样本的平均top1准确率,值越高代表模型越优;`acc5`表示参与当前迭代步数的训练样本的平均top5(若类别数n少于5,则为topn)准确率,值越高代表模型越优。第4行中的`loss`表示整个训练集的平均损失函数值,`acc1`表示整个训练集的平均top1准确率,`acc5`表示整个训练集的平均top5准确率。 + + +### 评估日志字段 + +![](images/cls_eval.png) + +上图中第3行中的`acc1`表示整个验证集的平均top1准确率,`acc5`表示整个验证集的平均top5准确率。 + + +## 检测特有统计信息 + +### 训练日志字段 + +#### YOLOv3 + +YOLOv3的训练日志只包括训练通用统计信息(见上文训练通用统计信息)。 + +![](images/yolo_train.png) + +上图中第5行`loss`表示整个训练集的平均损失函数loss值。 + +#### FasterRCNN + +FasterRCNN的训练日志除了通用统计信息外,还包括`loss_cls`、`loss_bbox`、`loss_rpn_cls`和`loss_rpn_bbox`,这些字段的含义如下: + +| 字段 | 含义 | +| -------------- | --------------------------------------------- | +| loss_cls | RCNN子网络中分类损失函数值 | +| loss_bbox | RCNN子网络中检测框回归损失函数值 | +| loss_rpn_cls | RPN子网络中分类损失函数值 | +| loss_rpn_bbox | RPN子网络中检测框回归损失函数值 | +| loss | 所有子网络损失函数值之和 | + +![](images/faster_train.png) + +上图中第1行`loss`, `loss_cls`、`loss_bbox`、`loss_rpn_clss`、`loss_rpn_bbox`都是参与当前迭代步数的训练样本的损失值,而第7行是针整个训练集的损失函数值。 + +#### MaskRCNN + +MaskRCNN的训练日志除了通用统计信息外,还包括`loss_cls`、`loss_bbox`、`loss_mask`、`loss_rpn_cls`和`loss_rpn_bbox`,这些字段的含义如下: + + +| 字段 | 含义 | +| -------------- | --------------------------------------------- | +| loss_cls | RCNN子网络中分类损失函数值 | +| loss_bbox | RCNN子网络中检测框回归损失函数值 | +| loss_mask | RCNN子网络中Mask回归损失函数值 | +| loss_rpn_cls | RPN子网络中分类损失函数值 | +| loss_rpn_bbox | RPN子网络中检测框回归损失函数值 | +| loss | 所有子网络损失函数值之和 | + +![](images/mask_train.png) + +上图中第1行`loss`, `loss_cls`、`loss_bbox`、`loss_mask`、`loss_rpn_clss`、`loss_rpn_bbox`都是参与当前迭代步数的训练样本的损失值,而第7行是针整个训练集的损失函数值。 + +### 评估日志字段 + +检测可以使用两种评估标准:VOC评估标准和COCO评估标准。 + +#### VOC评估标准 + +![](images/voc_eval.png) + +> 注:`map`为平均准确率的平均值,即IoU(Intersection Over Union)取0.5时各个类别的准确率-召回率曲线下面积的平均值。 + +上图中第3行`bbox_map`表示检测任务中整个验证集的平均准确率平均值。 + +#### COCO评估标准 + +> 注:COCO评估指标可参见[COCO官网解释](http://cocodataset.org/#detection-eval)。PaddleX主要反馈`mmAP`,即AP at IoU=.50:.05:.95这项指标,为在各个IoU阈值下平均准确率平均值(mAP)的平均值。 + +COCO格式的数据集不仅可以用于训练目标检测模型,也可以用于训练实例分割模型。在目标检测中,PaddleX主要反馈针对检测框的`bbox_mmAP`指标;在实例分割中,还包括针对Mask的`seg_mmAP`指标。如下所示,第一张日志截图为目标检测的评估结果,第二张日志截图为实例分割的评估结果。 + +![](images/faster_eval.png) + +上图中红框标注的`bbox_mmap`表示整个验证集的检测框平均准确率平均值。 + +![](images/mask_eval.png) +上图中红框标注的`bbox_mmap`和`seg_mmap`分别表示整个验证集的检测框平均准确率平均值、Mask平均准确率平均值。 + +## 分割特有统计信息 + +### 训练日志字段 + +语义分割的训练日志只包括训练通用统计信息(见上文训练通用统计信息)。 + +![](images/seg_train.png) + +### 评估日志字段 + +语义分割的评估日志包括了`miou`、`category_iou`、`macc`、`category_acc`、`kappa`,这些字段的含义如下: + +| 字段 | 含义 | +| -------------- | --------------------------------------------- | +| miou | 各类IoU(Intersection Over Union)的平均值 | +| category_iou | 各类别的IoU | +| macc | 平均准确率,即预测正确的像素数/总像素数 | +| category_acc | 各类别的准确率,即各类别预测正确的像素数/预测为该类别的总像素数 | +| kappa | kappa系数,用于一致性检验 | + +![](images/seg_eval.png) diff --git a/docs/appendix/model_zoo.md b/docs/appendix/model_zoo.md new file mode 100644 index 0000000000000000000000000000000000000000..f866b39173ead1c162e9e3ee722ae2ea2cb2afb3 --- /dev/null +++ b/docs/appendix/model_zoo.md @@ -0,0 +1,61 @@ +# PaddleX模型库 + +## 图像分类模型 +> 表中模型相关指标均为在ImageNet数据集上使用PaddlePaddle Python预测接口测试得到(测试GPU型号为Nvidia Tesla P40),预测速度为每张图片预测用时(不包括预处理和后处理),表中符号`-`表示相关指标暂未测试。 + + +| 模型 | 模型大小 | 预测速度(毫秒) | Top1准确率(%) | Top5准确率(%) | +| :----| :------- | :----------- | :--------- | :--------- | +| [ResNet18](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_pretrained.tar)| 46.2MB | 3.72882 | 71.0 | 89.9 | +| [ResNet34](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet34_pretrained.tar)| 87.9MB | 5.50876 | 74.6 | 92.1 | +| [ResNet50](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_pretrained.tar)| 103.4MB | 7.76659 | 76.5 | 93.0 | +| [ResNet101](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_pretrained.tar) |180.4MB | 13.80876 | 77.6 | 93.6 | +| [ResNet50_vd](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_pretrained.tar) |103.5MB | 8.20476 | 79.1 | 94.4 | +| [ResNet101_vd](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_vd_pretrained.tar)| 180.5MB | 14.24643 | 80.2 | 95.0 | +| [ResNet50_vd_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar) |103.5MB | 7.79264 | 82.4 | 96.1 | +| [ResNet101_vd_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/ResNet101_vd_ssld_pretrained.tar)| 180.5MB | 13.34580 | 83.7 | 96.7 | +| [DarkNet53](https://paddle-imagenet-models-name.bj.bcebos.com/DarkNet53_ImageNet1k_pretrained.tar)|167.4MB | 8.82047 | 78.0 | 94.1 | +| [MobileNetV1](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV1_pretrained.tar) | 17.4MB | 3.42838 | 71.0 | 89.7 | +| [MobileNetV2](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV2_pretrained.tar) | 15.0MB | 5.92667 | 72.2 | 90.7 | +| [MobileNetV3_large](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x1_0_pretrained.tar)| 22.8MB | 8.31428 | 75.3 | 93.2 | +| [MobileNetV3_small](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_small_x1_0_pretrained.tar) | 12.5MB | 7.30689 | 68.2 | 88.1 | +| [MobileNetV3_large_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x1_0_ssld_pretrained.tar)| 22.8MB | 8.06651 | 79.0 | 94.5 | +| [MobileNetV3_small_ssld](https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_small_x1_0_ssld_pretrained.tar) | 12.5MB | 7.08837 | 71.3 | 90.1 | +| [Xception41](https://paddle-imagenet-models-name.bj.bcebos.com/Xception41_deeplab_pretrained.tar) | 109.2MB | 8.15611 | 79.6 | 94.4 | +| [Xception65](https://paddle-imagenet-models-name.bj.bcebos.com/Xception65_deeplab_pretrained.tar) | 161.6MB | 13.87017 | 80.3 | 94.5 | +| [DenseNet121](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet121_pretrained.tar) | 33.1MB | 17.09874 | 75.7 | 92.6 | +| [DenseNet161](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet161_pretrained.tar)| 118.0MB | 22.79690 | 78.6 | 94.1 | +| [DenseNet201](https://paddle-imagenet-models-name.bj.bcebos.com/DenseNet201_pretrained.tar)| 84.1MB | 25.26089 | 77.6 | 93.7 | +| [ShuffleNetV2](https://paddle-imagenet-models-name.bj.bcebos.com/ShuffleNetV2_pretrained.tar) | 10.2MB | 15.40138 | 68.8 | 88.5 | +| [HRNet_W18](https://paddle-imagenet-models-name.bj.bcebos.com/HRNet_W18_C_pretrained.tar) | 21.29MB |45.25514 | 76.9 | 93.4 | + +## 目标检测模型 + +> 表中模型相关指标均为在MSCOCO数据集上使用PaddlePaddle Python预测接口测试得到(测试GPU型号为Nvidia Tesla V100测试得到),表中符号`-`表示相关指标暂未测试。 + +| 模型 | 模型大小 | 预测时间(毫秒) | BoxAP(%) | +|:-------|:-----------|:-------------|:----------| +|[FasterRCNN-ResNet50](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_1x.tar)|136.0MB| 197.715 | 35.2 | +|[FasterRCNN-ResNet50_vd](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_vd_1x.tar)| 136.1MB | 475.700 | 36.4 | +|[FasterRCNN-ResNet101](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r101_1x.tar)| 212.5MB | 582.911 | 38.3 | +|[FasterRCNN-ResNet50-FPN](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_fpn_1x.tar)| 167.7MB | 83.189 | 37.2 | +|[FasterRCNN-ResNet50_vd-FPN](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r50_vd_fpn_2x.tar)|167.8MB | 128.277 | 38.9 | +|[FasterRCNN-ResNet101-FPN](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r101_fpn_1x.tar)| 244.2MB | 119.788 | 38.7 | +|[FasterRCNN-ResNet101_vd-FPN](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_r101_vd_fpn_2x.tar) |244.3MB | 156.097 | 40.5 | +|[FasterRCNN-HRNet_W18-FPN](https://paddlemodels.bj.bcebos.com/object_detection/faster_rcnn_hrnetv2p_w18_1x.tar) |115.5MB | 81.592 | 36 | +|[YOLOv3-DarkNet53](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_darknet.tar)|249.2MB | 42.672 | 38.9 | +|[YOLOv3-MobileNetV1](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v1.tar) |99.2MB | 15.442 | 29.3 | +|[YOLOv3-MobileNetV3_large](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_mobilenet_v3.pdparams)|100.7MB | 143.322 | 31.6 | +| [YOLOv3-ResNet34](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r34.tar)|170.3MB | 23.185 | 36.2 | + +## 实例分割模型 + +> 表中模型相关指标均为在MSCOCO数据集上测试得到。 + +| 模型 | 模型大小 | 预测时间(毫秒) | mIoU(%) | +|:-------|:-----------|:-------------|:----------| +|DeepLabv3+-MobileNetV2_x1.0|-| - | - | +|DeepLabv3+-Xception41|-| - | - | +|DeepLabv3+-Xception65|-| - | - | +|UNet|-| - | - | +|HRNet_w18|-| - | - | diff --git a/docs/appendix/parameters.md b/docs/appendix/parameters.md new file mode 100644 index 0000000000000000000000000000000000000000..d0f913600aa3a402be95ae9b998b3dfc2dd45901 --- /dev/null +++ b/docs/appendix/parameters.md @@ -0,0 +1,73 @@ +# 训练参数调整 + +PaddleX所有训练接口中,内置的参数均为根据单GPU卡相应batch_size下的较优参数,用户在自己的数据上训练模型,涉及到参数调整时,如无太多参数调优经验,则可参考如下方式 + +## 1.Epoch数的调整 +Epoch数是模型训练过程,迭代的轮数,用户可以设置较大的数值,根据模型迭代过程在验证集上的指标表现,来判断模型是否收敛,进而提前终止训练。此外也可以使用`train`接口中的`early_stop`策略,模型在训练过程会自动判断模型是否收敛自动中止。 + +## 2.batch_size和learning_rate + +> - Batch Size指模型在训练过程中,一次性处理的样本数量 +> - 如若使用多卡训练, batch_size会均分到各张卡上(因此需要让batch size整除卡数) +> - Batch Size跟机器的显存/内存高度相关,`batch_size`越高,所消耗的显存/内存就越高 +> - PaddleX在各个`train`接口中均配置了默认的batch size(默认针对单GPU卡),如若训练时提示GPU显存不足,则相应调低BatchSize,如若GPU显存高或使用多张GPU卡时,可相应调高BatchSize。 +> - **如若用户调整batch size,则也注意需要对应调整其它参数,特别是train接口中默认的learning_rate值**。如在YOLOv3模型中,默认`train_batch_size`为8,`learning_rate`为0.000125,当用户将模型在2卡机器上训练时,可以将`train_batch_size`调整为16, 那么同时`learning_rate`也可以对应调整为0.000125 * 2 = 0.00025 + +## 3.warmup_steps和warmup_start_lr + +在训练模型时,一般都会使用预训练模型,例如检测模型在训练时使用backbone在ImageNet数据集上的预训练权重。但由于在自行训练时,自己的数据与ImageNet数据集存在较大的差异,可能会一开始由于梯度过大使得训练出现问题,因此可以在刚开始训练时,让学习率以一个较小的值,慢慢增长到设定的学习率。因此`warmup_steps`和`warmup_start_lr`就是这个作用,模型开始训练时,学习率会从`warmup_start_lr`开始,在`warmup_steps`个batch数据迭代后线性增长到设定的学习率。 + +> 例如YOLOv3的train接口,默认`train_batch_size`为8,`learning_rate`为0.000125, `warmup_steps`为1000, `warmup_start_lr`为0.0;在此参数配置下表示,模型在启动训练后,在前1000个step(每个step表示一个batch的数据,也就是8个样本)内,学习率会从0.0开始线性增长到设定的0.000125。 + +## 4.lr_decay_epochs和lr_decay_gamma + +`lr_decay_epochs`用于让学习率在模型训练后期逐步衰减,它一般是一个list,如[6, 8, 10],表示学习率在第6个epoch时衰减一次,第8个epoch时再衰减一次,第10个epoch时再衰减一次。每次学习率衰减为之前的学习率*lr_decay_gamma。 + +> 例如YOLOv3的train接口,默认`num_epochs`为270,`learning_rate`为0.000125, `lr_decay_epochs`为[213, 240],`lr_decay_gamma`为0.1;在此参数配置下表示,模型在启动训练后,在前213个epoch中,训练时使用的学习率为0.000125,在第213至240个epoch之间,训练使用的学习率为0.000125x0.1=0.0000125,在240个epoch之后,使用的学习率为0.000125x0.1x0.1=0.00000125 + +## 5.参数设定时的约束 +根据上述几个参数,可以了解到学习率的变化分为WarmUp热身阶段和Decay衰减阶段, +> - Wamup热身阶段:随着训练迭代,学习率从较低的值逐渐线性增长至设定的值,以step为单位 +> - Decay衰减阶段:随着训练迭代,学习率逐步衰减,如每次衰减为之前的0.1, 以epoch为单位 +> step与epoch的关系:1个epoch由多个step组成,例如训练样本有800张图像,`train_batch_size`为8, 那么每个epoch都要完整用这800张图片训一次模型,而每个epoch总共包含800//8即100个step + +在PaddleX中,约束warmup必须在Decay之前结束,因此各参数设置需要满足下面条件 +``` +warmup_steps <= lr_decay_epochs[0] * num_steps_each_epoch +``` +其中`num_steps_each_epoch`计算方式如下, +``` +num_steps_each_eposh = num_samples_in_train_dataset // train_batch_size +``` + +因此,如若你在启动训练时,被提示`warmup_steps should be less than...`时,即表示需要根据上述公式调整你的参数啦,可以调整`lr_decay_epochs`或者是`warmup_steps`。 + +## 6.如何使用多GPU卡进行训练 +在`import paddlex`前配置环境变量,代码如下 +``` +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 使用第1张GPU卡进行训练 +# 注意paddle或paddlex都需要在设置环境变量后再import +import paddlex as pdx +``` + +``` +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '' # 不使用GPU,使用CPU进行训练 +import paddlex as pdx +``` + +``` +import os +os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,3' # 使用第1、2、4张GPU卡进行训练 +import paddlex as pdx +``` + + +## 相关模型接口 + +- 图像分类模型 [train接口](../apis/models/classification.html#train) +- FasterRCNN [train接口](../apis/models/detection.html#id1) +- YOLOv3 [train接口](../apis/models/detection.html#train) +- MaskRCNN [train接口](../apis/models/instance_segmentation.html#train) +- DeepLabv3p [train接口](../apis/models/semantic_segmentation.html#train) diff --git a/docs/appendix/slim_model_zoo.md b/docs/appendix/slim_model_zoo.md new file mode 100644 index 0000000000000000000000000000000000000000..a594d53dd7a777288571ccae6fad5ec21415de36 --- /dev/null +++ b/docs/appendix/slim_model_zoo.md @@ -0,0 +1,121 @@ +# PaddleX压缩模型库 + +## 图像分类 + +数据集:ImageNet-1000 + +### 量化 + +| 模型 | 压缩策略 | Top-1准确率 | 存储体积 | TensorRT时延(V100, ms) | +|:--:|:---:|:--:|:--:|:--:| +|MobileNetV1| 无 |70.99%| 17MB | -| +|MobileNetV1| 量化 |70.18% (-0.81%)| 4.4MB | - | +| MobileNetV2 | 无 |72.15%| 15MB | - | +| MobileNetV2 | 量化 | 71.15% (-1%)| 4.0MB | - | +|ResNet50| 无 |76.50%| 99MB | 2.71 | +|ResNet50| 量化 |76.33% (-0.17%)| 25.1MB | 1.19 | + +分类模型Lite时延(ms) + +| 设备 | 模型类型 | 压缩策略 | armv7 Thread 1 | armv7 Thread 2 | armv7 Thread 4 | armv8 Thread 1 | armv8 Thread 2 | armv8 Thread 4 | +| ------- | ----------- | ------------- | -------------- | -------------- | -------------- | -------------- | -------------- | -------------- | +| 高通835 | MobileNetV1 | 无 | 96.1942 | 53.2058 | 32.4468 | 88.4955 | 47.95 | 27.5189 | +| 高通835 | MobileNetV1 | 量化 | 60.5615 | 32.4016 | 16.6596 | 56.5266 | 29.7178 | 15.1459 | +| 高通835 | MobileNetV2 | 无 | 65.715 | 38.1346 | 25.155 | 61.3593 | 36.2038 | 22.849 | +| 高通835 | MobileNetV2 | 量化 | 48.3495 | 30.3069 | 22.1506 | 45.8715 | 27.4105 | 18.2223 | +| 高通835 | ResNet50 | 无 | 526.811 | 319.6486 | 205.8345 | 506.1138 | 335.1584 | 214.8936 | +| 高通835 | ResNet50 | 量化 | 476.0507 | 256.5963 | 139.7266 | 461.9176 | 248.3795 | 149.353 | +| 高通855 | MobileNetV1 | 无 | 33.5086 | 19.5773 | 11.7534 | 31.3474 | 18.5382 | 10.0811 | +| 高通855 | MobileNetV1 | 量化 | 37.0498 | 21.7081 | 11.0779 | 14.0947 | 8.1926 | 4.2934 | +| 高通855 | MobileNetV2 | 无 | 25.0396 | 15.2862 | 9.6609 | 22.909 | 14.1797 | 8.8325 | +| 高通855 | MobileNetV2 | 量化 | 28.1631 | 18.3917 | 11.8333 | 16.9399 | 11.1772 | 7.4176 | +| 高通855 | ResNet50 | 无 | 185.3705 | 113.0825 | 87.0741 | 177.7367 | 110.0433 | 74.4114 | +| 高通855 | ResNet50 | 量化 | 328.2683 | 201.9937 | 106.744 | 242.6397 | 150.0338 | 79.8659 | +| 麒麟970 | MobileNetV1 | 无 | 101.2455 | 56.4053 | 35.6484 | 94.8985 | 51.7251 | 31.9511 | +| 麒麟970 | MobileNetV1 | 量化 | 62.4412 | 32.2585 | 16.6215 | 57.825 | 29.2573 | 15.1206 | +| 麒麟970 | MobileNetV2 | 无 | 70.4176 | 42.0795 | 25.1939 | 68.9597 | 39.2145 | 22.6617 | +| 麒麟970 | MobileNetV2 | 量化 | 53.0961 | 31.7987 | 21.8334 | 49.383 | 28.2358 | 18.3642 | +| 麒麟970 | ResNet50 | 无 | 586.8943 | 344.0858 | 228.2293 | 573.3344 | 351.4332 | 225.8006 | +| 麒麟970 | ResNet50 | 量化 | 489.6188 | 258.3279 | 142.6063 | 480.0064 | 249.5339 | 138.5284 | + +### 剪裁 + +PaddleLite推理耗时说明: + +环境:Qualcomm SnapDragon 845 + armv8 + +速度指标:Thread1/Thread2/Thread4耗时 + + +| 模型 | 压缩策略 | Top-1 | 存储体积 |PaddleLite推理耗时|TensorRT推理速度(FPS)| +|:--:|:---:|:--:|:--:|:--:|:--:| +| MobileNetV1 | 无 | 70.99% | 17MB | 66.052\35.8014\19.5762|-| +| MobileNetV1 | 剪裁 -30% | 70.4% (-0.59%) | 12MB | 46.5958\25.3098\13.6982|-| +| MobileNetV1 | 剪裁 -50% | 69.8% (-1.19%) | 9MB | 37.9892\20.7882\11.3144|-| + +## 目标检测 + +### 量化 + +数据集: COCO2017 + +| 模型 | 压缩策略 | 数据集 | Image/GPU | 输入608 Box AP | 存储体积 | TensorRT时延(V100, ms) | +| :----------------------------: | :---------: | :----: | :-------: | :------------: | :------------: | :----------: | +| MobileNet-V1-YOLOv3 | 无 | COCO | 8 | 29.3 | 95MB | - | +| MobileNet-V1-YOLOv3 | 量化 | COCO | 8 | 27.9 (-1.4)| 25MB | - | +| R34-YOLOv3 | 无 | COCO | 8 | 36.2 | 162MB | - | +| R34-YOLOv3 | 量化 | COCO | 8 | 35.7 (-0.5) | 42.7MB | - | + +### 剪裁 + +数据集:Pasacl VOC & COCO2017 + +PaddleLite推理耗时说明: + +环境:Qualcomm SnapDragon 845 + armv8 + +速度指标:Thread1/Thread2/Thread4耗时 + +| 模型 | 压缩策略 | 数据集 | Image/GPU | 输入608 Box mmAP | 存储体积 | PaddleLite推理耗时(ms)(608*608) | TensorRT推理速度(FPS)(608*608) | +| :----------------------------: | :---------------: | :--------: | :-------: | :------------: | :----------: | :--------------: | :--------------: | +| MobileNet-V1-YOLOv3 | 无 | Pascal VOC | 8 | 76.2 | 94MB | 1238\796.943\520.101|60.04| +| MobileNet-V1-YOLOv3 | 剪裁 -52.88% | Pascal VOC | 8 | 77.6 (+1.4) | 31MB | 602.497\353.759\222.427 |99.36| +| MobileNet-V1-YOLOv3 | 无 | COCO | 8 | 29.3 | 95MB |-|-| +| MobileNet-V1-YOLOv3 | 剪裁 -51.77% | COCO | 8 | 26.0 (-3.3) | 32MB |-|73.93| + +## 语义分割 + +数据集:Cityscapes + + +### 量化 + +| 模型 | 压缩策略 | mIoU | 存储体积 | +| :--------------------: | :---------: | :-----------: | :------------: | +| DeepLabv3-MobileNetv2 | 无 | 69.81 | 7.4MB | +| DeepLabv3-MobileNetv2 | 量化 | 67.59 (-2.22) | 2.1MB | + +图像分割模型Lite时延(ms), 输入尺寸769 x 769 + +| 设备 | 模型类型 | 压缩策略 | armv7 Thread 1 | armv7 Thread 2 | armv7 Thread 4 | armv8 Thread 1 | armv8 Thread 2 | armv8 Thread 4 | +| ------- | ---------------------- | ------------- | -------------- | -------------- | -------------- | -------------- | -------------- | -------------- | +| 高通835 | Deeplabv3-MobileNetV2 | 无 | 1282.8126 | 793.2064 | 653.6538 | 1193.9908 | 737.1827 | 593.4522 | +| 高通835 | Deeplabv3-MobileNetV2 | 量化 | 981.44 | 658.4969 | 538.6166 | 885.3273 | 586.1284 | 484.0018 | +| 高通855 | Deeplabv3-MobileNetV2 | 无 | 639.4425 | 390.1851 | 322.7014 | 477.7667 | 339.7411 | 262.2847 | +| 高通855 | Deeplabv3-MobileNetV2 | 量化 | 705.7589 | 474.4076 | 427.2951 | 394.8352 | 297.4035 | 264.6724 | +| 麒麟970 | Deeplabv3-MobileNetV2 | 无 | 1771.1301 | 1746.0569 | 1222.4805 | 1448.9739 | 1192.4491 | 760.606 | +| 麒麟970 | Deeplabv3-MobileNetV2 | 量化 | 1320.386 | 918.5328 | 672.2481 | 1020.753 | 820.094 | 591.4114 | + +### 剪裁 + +PaddleLite推理耗时说明: + +环境:Qualcomm SnapDragon 845 + armv8 + +速度指标:Thread1/Thread2/Thread4耗时 + + +| 模型 | 压缩方法 | mIoU | 存储体积 | PaddleLite推理耗时 | TensorRT推理速度(FPS) | +| :-------: | :---------------: | :-----------: | :------: | :------------: | :----: | +| FastSCNN | 无 | 69.64 | 11MB | 1226.36\682.96\415.664 |39.53| +| FastSCNN | 剪裁 -47.60% | 66.68 (-2.96) | 5.7MB | 866.693\494.467\291.748 |51.48| diff --git a/docs/change_log.md b/docs/change_log.md new file mode 100644 index 0000000000000000000000000000000000000000..bf1da23bcbd9facb293afa20a020a879ca90647d --- /dev/null +++ b/docs/change_log.md @@ -0,0 +1,34 @@ +# 更新日志 + + +**v1.1.0** 2020.07.12 + +- 模型更新 +> - 新增语义分割模型HRNet、FastSCNN +> - 目标检测FasterRCNN、实例分割MaskRCNN新增backbone HRNet +> - 目标检测/实例分割模型新增COCO数据集预训练模型 +> - 集成X2Paddle,PaddleX所有分类模型和语义分割模型支持导出为ONNX协议 +- 模型部署更新 +> - 模型加密增加支持Windows平台 +> - 新增Jetson、PaddleLite模型部署预测方案 +> - C++部署代码新增batch批预测,并采用OpenMP对预处理进行并行加速 +- 新增2个PaddleX产业案例 +> - [人像分割案例]() +> - [工业表计读数案例]() +- 新增数据格式转换功能,LabelMe、精灵标注助手和EasyData平台标注的数据转为PaddleX支持加载的数据格式 +- PaddleX文档更新,优化文档结构 + + +**v1.0.0** 2020.05.20 + +- 增加模型C++部署和Python部署代码 +- 增加模型加密部署方案 +- 增加分类模型的OpenVINO部署方案 +- 增加模型可解释性的接口 + + +**v0.1.8** 2020.05.17 + +- 修复部分代码Bug +- 新增EasyData平台数据标注格式支持 +- 支持imgaug数据增强库的pixel-level算子 diff --git a/docs/conf.py b/docs/conf.py new file mode 100755 index 0000000000000000000000000000000000000000..1f62b6bf6340a2ddd61d4744dcd75590d4ec805c --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,79 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import recommonmark + +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Project information ----------------------------------------------------- + +project = 'PaddleX' +copyright = '2020, paddlepaddle' +author = 'paddlepaddle' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.coverage', + 'sphinx.ext.viewcode', + 'sphinx.ext.mathjax', + 'sphinx.ext.githubpages', + 'sphinx.ext.napoleon', + 'recommonmark', + 'sphinx_markdown_tables', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# md file can also be parased +source_suffix = ['.rst', '.md'] + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'zh_CN' + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. + +# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' + +if not on_rtd: # only import and set the theme if we're building docs locally + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# otherwise, readthedocs.org uses their theme by default, so no need to specify it + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". + +html_static_path = ['_static'] + +html_logo = 'paddlex.png' diff --git a/docs/data/annotation.md b/docs/data/annotation.md new file mode 100755 index 0000000000000000000000000000000000000000..646066545cd276cae5c1bf0b12af07edb56d8d49 --- /dev/null +++ b/docs/data/annotation.md @@ -0,0 +1,36 @@ +# 数据标注工具 + +PaddleX支持图像分类、目标检测、实例分割和语义分割四大视觉领域常见的任务,对于每类视觉任务,都支持了特定的数据格式。PaddleX目前支持了图像分类的ImageNet格式,目标检测的PascalVOC格式,实例分割的MSCOCO格式(MSCOCO也可以用于目标检测)以及语义分割数据格式。 + +## 常见标注工具 + +> 图像分类无需标注工具,用户只需以txt文件记录每张图片的类别标签即可。 +> 对于目标检测、实例分割和语义分割,PaddleX已经与主流的标注工具进行了适配,用户可根据自己的需求,选择以下标注工具进行数据标注。 + +| 标注工具 | 图像分类 | 目标检测 | 实例分割 | 语义分割 | 安装 | +| :--------- | :------- | :------ | :------ | :------- | :----------------------------------------------- | +| Labelme | - | √ | √ | √ | pip install labelme (本地数据标注) | +| 精灵标注 | √ | √* | √ | √ | [官网下载](http://www.jinglingbiaozhu.com/) (本地数据标注) | +| EasyData | √ | √ | √ | √ | [Web页面标注](https://ai.baidu.com/easydata/) (需上传数据进行标注) | + +数据标注完成后,参照如下流程,将标注数据转为可用PaddleX模型训练的数据组织格式。 + +> *注*:精灵标注的目标检测数据可以在工具内部导出为PascalVOC格式,因此paddlex未提供精灵标注数据到PascalVOC格式的转换 + + +## 标注数据格式转换 + +目前所有标注工具,生成的标注文件,均为与原图同名的json格式文件,如`1.jpg`在标注完成后,则会在标注文件保存的目录生成`1.json`文件。转换时参照以下步骤 +> 1. 将所有的原图文件放在同一个目录下,如`pics`目录 +> 2. 将所有的标注json文件放在同一个目录下,如`annotations`目录 +> 3. 使用如下命令进行转换 + +> *注*:精灵标注的目标检测数据可以在工具内部导出为PascalVOC格式,因此paddlex未提供精灵标注数据到PascalVOC格式的转换 + +``` +paddlex --data_conversion --source labelme --to PascalVOC --pics ./pics --annotations ./annotations --save_dir ./converted_dataset_dir +``` +> `--source`表示数据标注来源,支持`labelme`、`jingling`和`easydata`(分别表示数据来源于LabelMe,精灵标注助手和EasyData) +> `--to`表示数据需要转换成为的格式,支持`ImageNet`(图像分类)、`PascalVOC`(目标检测),`MSCOCO`(实例分割,也可用于目标检测)和`SEG`(语义分割) +> `--pics`指定原图所在的目录路径 +> `--annotations`指定标注文件所在的目录路径 diff --git a/docs/data/format/classification.md b/docs/data/format/classification.md new file mode 100644 index 0000000000000000000000000000000000000000..70ed5ac34e07ee97321b9eb51168f964ed82f274 --- /dev/null +++ b/docs/data/format/classification.md @@ -0,0 +1,75 @@ +# 图像分类ImageNet + +## 数据文件夹结构 + +在PaddleX中,图像分类支持ImageNet数据集格式。数据集目录`data_dir`下包含多个文件夹,每个文件夹中的图像均属于同一个类别,文件夹的命名即为类别名(注意路径中不要包括中文,空格)。 +如下为示例结构 +``` +MyDataset/ # 图像分类数据集根目录 +|--dog/ # 当前文件夹所有图片属于dog类别 +| |--d1.jpg +| |--d2.jpg +| |--... +| |--... +| +|--... +| +|--snake/ # 当前文件夹所有图片属于snake类别 +| |--s1.jpg +| |--s2.jpg +| |--... +| |--... +``` + +## 划分训练集验证集 + +**为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载图像分类示例数据集](https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz) +> 注:也可使用PaddleX自带工具,对数据集进行随机划分,**在数据集按照上面格式组织后**,使用如下命令即可快速完成数据集随机划分,其中split指标训练集的比例,剩余的比例用于验证集。 +> ``` +> paddlex --split_dataset --from ImageNet --split 0.8 --save_dir ./splited_dataset_dir +> ``` + +**labels.txt** + +labels.txt用于列出所有类别,类别对应行号表示模型训练过程中类别的id(行号从0开始计数),例如labels.txt为以下内容 +``` +dog +cat +snake +``` +即表示该分类数据集中共有3个类别,分别为`dog`,`cat`和`snake`,在模型训练中`dog`对应的类别id为0, `cat`对应1,以此类推 + +**train_list.txt** + +train_list.txt列出用于训练时的图片集合,与其对应的类别id,示例如下 +``` +dog/d1.jpg 0 +dog/d2.jpg 0 +cat/c1.jpg 1 +... ... +snake/s1.jpg 2 +``` +其中第一列为相对对`MyDataset`的相对路径,第二列为图片对应类别的类别id + +**val_list.txt** + +val_list列出用于验证时的图片集成,与其对应的类别id,格式与train_list.txt一致 + +## PaddleX数据集加载 +示例代码如下, +``` +import paddlex as pdx +from paddlex.cls import transforms +train_transforms = transforms.ComposedClsTransforms(mode='train', crop_size=[224, 224]) +eval_transforms = transforms.ComposedClsTransforms(mode='eval', crop_size=[224, 224]) +train_dataset = pdx.datasets.ImageNet( + data_dir='./MyDataset', + file_list='./MyDataset/train_list.txt', + label_list='./MyDataset/labels.txt', + transforms=train_transforms) +eval_dataset = pdx.datasets.ImageNet( + data_dir='./MyDataset', + file_list='./MyDataset/eval_list.txt', + label_list='./MyDataset/labels.txt', + transforms=eval_transforms) +``` diff --git a/docs/data/format/detection.md b/docs/data/format/detection.md new file mode 100644 index 0000000000000000000000000000000000000000..19d2ed339bb1424df57b519abf100ae398f35f96 --- /dev/null +++ b/docs/data/format/detection.md @@ -0,0 +1,73 @@ +# 目标检测PascalVOC + +## 数据集文件夹结构 + +在PaddleX中,目标检测支持PascalVOC数据集格式。建议用户将数据集按照如下方式进行组织,原图均放在同一目录,如`JPEGImages`,标注的同名xml文件均放在同一目录,如`Annotations`,示例如下 +``` +MyDataset/ # 目标检测数据集根目录 +|--JPEGImages/ # 原图文件所在目录 +| |--1.jpg +| |--2.jpg +| |--... +| |--... +| +|--Annotations/ # 标注文件所在目录 +| |--1.xml +| |--2.xml +| |--... +| |--... +``` + +## 划分训练集验证集 + +**为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载目标检测示例数据集](https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz) +> 注:也可使用PaddleX自带工具,对数据集进行随机划分,**在数据集按照上面格式组织后**,使用如下命令即可快速完成数据集随机划分,其中split指标训练集的比例,剩余的比例用于验证集。 +> ``` +> paddlex --split_dataset --from PascalVOC --pics ./JPEGImages --annotations ./Annotations --split 0.8 --save_dir ./splited_dataset_dir +> ``` + +**labels.txt** + +labels.txt用于列出所有类别,类别对应行号表示模型训练过程中类别的id(行号从0开始计数),例如labels.txt为以下内容 +``` +dog +cat +snake +``` +表示该检测数据集中共有3个目标类别,分别为`dog`,`cat`和`snake`,在模型训练中`dog`对应的类别id为0, `cat`对应1,以此类推 + +**train_list.txt** + +train_list.txt列出用于训练时的图片集合,与其对应的标注文件,示例如下 +``` +JPEGImages/1.jpg Annotations/1.xml +JPEGImages/2.jpg Annotations/2.xml +... ... +``` +其中第一列为原图相对`MyDataset`的相对路径,第二列为标注文件相对`MyDataset`的相对路径 + +**val_list.txt** + +val_list列出用于验证时的图片集成,与其对应的标注文件,格式与val_list.txt一致 + +## PaddleX数据集加载 +示例代码如下, +``` +import paddlex as pdx +from paddlex.det import transforms + +train_transforms = transforms.ComposedYOLOv3Transforms(mode='train', shape=[608, 608]) +eval_transforms = transforms.ComposedYOLOv3Transforms(mode='eval', shape=[608, 608]) + +train_dataset = pdx.datasets.VOCDetection( + data_dir='./MyDataset', + file_list='./MyDataset/train_list.txt', + label_list='./MyDataset/labels.txt', + transforms=train_transforms) +eval_dataset = pdx.datasets.VOCDetection( + data_dir='./MyDataset', + file_list='./MyDataset/val_list.txt', + label_list='MyDataset/labels.txt', + transforms=eval_transforms) + +``` diff --git a/docs/data/format/index.rst b/docs/data/format/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..98157ad2b3450eb10be43dc4e91fa159dbfdd4a4 --- /dev/null +++ b/docs/data/format/index.rst @@ -0,0 +1,12 @@ +数据格式说明 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + classification.md + detection.md + instance_segmentation.md + segmentation.md diff --git a/docs/data/format/instance_segmentation.md b/docs/data/format/instance_segmentation.md new file mode 100644 index 0000000000000000000000000000000000000000..d28852485aee17fbebe57d5a0cc32754a6740713 --- /dev/null +++ b/docs/data/format/instance_segmentation.md @@ -0,0 +1,44 @@ +# 实例分割MSCOCO + +## 数据集文件夹结构 + +在PaddleX中,实例分割支持MSCOCO数据集格式(MSCOCO格式同样也可以用于目标检测)。建议用户将数据集按照如下方式进行组织,原图均放在同一目录,如JPEGImages,标注文件(如annotations.json)放在与JPEGImages所在目录同级目录下,示例结构如下 +``` +MyDataset/ # 实例分割数据集根目录 +|--JPEGImages/ # 原图文件所在目录 +| |--1.jpg +| |--2.jpg +| |--... +| |--... +| +|--annotations.json # 标注文件所在目录 +``` + +## 划分训练集验证集 + +在PaddleX中,为了区分训练集和验证集,在`MyDataset`同级目录,使用不同的json表示数据的划分,例如`train.json`和`val.json`。[点击下载实例分割示例数据集](https://bj.bcebos.com/paddlex/datasets/garbage_ins_det.tar.gz)。 +> 注:也可使用PaddleX自带工具,对数据集进行随机划分,在数据按照上述示例组织结构后,使用如下命令,即可快速完成数据集随机划分,其中split指定训练集的比例,剩余比例用于验证集。 +> ``` +> paddlex --split_dataset --from MSCOCO --pics ./JPEGImages --annotations ./annotations.json --split 0.8 --save_dir ./splited_dataset_dir +> ``` + +MSCOCO数据的标注文件采用json格式,用户可使用Labelme, 精灵标注助手或EasyData等标注工具进行标注,参见[数据标注工具](../annotations.md) + +## PaddleX加载数据集 +示例代码如下, +``` +import paddlex as pdx +from paddlex.det import transforms + +train_transforms = transforms.ComposedRCNNTransforms(mode='train', min_max_size=[800, 1333]) +eval_transforms = transforms.ComposedRCNNTransforms(mode='eval', min_max_size=[800, 1333]) + +train_dataset = pdx.dataset.CocoDetection( + data_dir='./MyDataset/JPEGImages', + ann_file='./MyDataset/train.json', + transforms=train_transforms) +eval_dataset = pdx.dataset.CocoDetection( + data_dir='./MyDataset/JPEGImages', + ann_file='./MyDataset/val.json', + transforms=eval_transforms) +``` diff --git a/docs/data/format/segmentation.md b/docs/data/format/segmentation.md new file mode 100644 index 0000000000000000000000000000000000000000..f91a9ea28368e8e0d14462a002ed0482d3843d25 --- /dev/null +++ b/docs/data/format/segmentation.md @@ -0,0 +1,75 @@ +# 语义分割Seg + +## 数据集文件夹结构 + +在PaddleX中,**标注文件为png文件**。建议用户将数据集按照如下方式进行组织,原图均放在同一目录,如`JPEGImages`,标注的同名png文件均放在同一目录,如`Annotations`,示例如下 +``` +MyDataset/ # 语义分割数据集根目录 +|--JPEGImages/ # 原图文件所在目录 +| |--1.jpg +| |--2.jpg +| |--... +| |--... +| +|--Annotations/ # 标注文件所在目录 +| |--1.png +| |--2.png +| |--... +| |--... +``` +语义分割的标注图像,如1.png,为单通道图像,像素标注类别需要从0开始递增(一般0表示background背景), 例如0, 1, 2, 3表示4种类别,标注类别最多255个类别(其中像素值255不参与训练和评估)。 + +## 划分训练集验证集 + +**为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载语义分割示例数据集](https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz) +> 注:也可使用PaddleX自带工具,对数据集进行随机划分,**在数据集按照上面格式组织后**,使用如下命令即可快速完成数据集随机划分,其中split指标训练集的比例,剩余的比例用于验证集。 +> ``` +> paddlex --split_dataset --from Seg --pics ./JPEGImages --annotations ./Annotations --split 0.8 --save_dir ./splited_dataset_dir +> ``` + +**labels.txt** + +labels.txt用于列出所有类别,类别对应行号表示模型训练过程中类别的id(行号从0开始计数),例如labels.txt为以下内容 +``` +backgrond +human +car +``` +表示该检测数据集中共有3个分割类别,分别为`background`,`human`和`car`,在模型训练中`background`对应的类别id为0, `human`对应1,以此类推,如不知具体类别标签,可直接在labels.txt逐行写0,1,2...序列即可。 + +**train_list.txt** + +train_list.txt列出用于训练时的图片集合,与其对应的标注文件,示例如下 +``` +JPEGImages/1.jpg Annotations/1.png +JPEGImages/2.jpg Annotations/2.png +... ... +``` +其中第一列为原图相对`MyDataset`的相对路径,第二列为标注文件相对`MyDataset`的相对路径 + +**val_list.txt** + +val_list列出用于验证时的图片集成,与其对应的标注文件,格式与val_list.txt一致 + +## PaddleX数据集加载 + +示例代码如下, +``` +import paddlex as pdx +from paddlex.seg import transforms + +train_transforms = transforms.ComposedSegTransforms(mode='train', train_crop_size=[512, 512]) +eval_transforms = transforms.ComposedSegTransforms(mode='eval', train_crop_size=[512, 512]) + +train_dataset = pdx.datasets.SegDataset( + data_dir='./MyDataset', + file_list='./MyDataset/train_list.txt', + label_list='./MyDataset/labels.txt', + transforms=train_transforms) +eval_dataset = pdx.datasets.SegDataset( + data_dir='./MyDataset', + file_list='./MyDataset/val_list.txt', + label_list='MyDataset/labels.txt', + transforms=eval_transforms) + +``` diff --git a/docs/data/index.rst b/docs/data/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..419ed81f528fe786dca3e6a0d777c1412859dfb7 --- /dev/null +++ b/docs/data/index.rst @@ -0,0 +1,10 @@ +数据准备 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + annotation.md + format/index diff --git a/docs/deploy/export_model.md b/docs/deploy/export_model.md new file mode 100644 index 0000000000000000000000000000000000000000..8a51c30fa32cfa375e9e76c212b2bd6a16d3f1be --- /dev/null +++ b/docs/deploy/export_model.md @@ -0,0 +1,17 @@ +# 部署模型导出 + +在服务端部署的模型需要首先将模型导出为inference格式模型,导出的模型将包括`__model__`、`__params__`和`model.yml`三个文名,分别为模型的网络结构,模型权重和模型的配置文件(包括数据预处理参数等等)。在安装完PaddleX后,在命令行终端使用如下命令导出模型到当前目录`inferece_model`下。 +> 可直接下载小度熊分拣模型测试本文档的流程[xiaoduxiong_epoch_12.tar.gz](https://bj.bcebos.com/paddlex/models/xiaoduxiong_epoch_12.tar.gz) + +``` +paddlex --export_inference --model_dir=./xiaoduxiong_epoch_12 --save_dir=./inference_model +``` + +使用TensorRT预测时,需指定模型的图像输入shape:[w,h]。 +**注**: +- 分类模型请保持于训练时输入的shape一致。 +- 指定[w,h]时,w和h中间逗号隔开,不允许存在空格等其他字符 + +``` +paddlex --export_inference --model_dir=./xiaoduxiong_epoch_12 --save_dir=./inference_model --fixed_input_shape=[640,960] +``` diff --git a/docs/deploy/images/encrypt.png b/docs/deploy/images/encrypt.png new file mode 100644 index 0000000000000000000000000000000000000000..31f46781daabfaea3c6374a8fda5cc4476eceb43 Binary files /dev/null and b/docs/deploy/images/encrypt.png differ diff --git a/docs/deploy/images/encryption_process.png b/docs/deploy/images/encryption_process.png new file mode 100644 index 0000000000000000000000000000000000000000..25d3fac458e5cbdd2e211a62147698ac081b9f32 Binary files /dev/null and b/docs/deploy/images/encryption_process.png differ diff --git a/docs/deploy/images/vs2019_step1.png b/docs/deploy/images/vs2019_step1.png new file mode 100755 index 0000000000000000000000000000000000000000..58fdf2fd624f3c2d26f7c78814c4a67cc323e495 Binary files /dev/null and b/docs/deploy/images/vs2019_step1.png differ diff --git a/docs/deploy/images/vs2019_step2.png b/docs/deploy/images/vs2019_step2.png new file mode 100755 index 0000000000000000000000000000000000000000..f1b5fd0a1c83c3008e2953a84164932140b104bf Binary files /dev/null and b/docs/deploy/images/vs2019_step2.png differ diff --git a/docs/deploy/images/vs2019_step3.png b/docs/deploy/images/vs2019_step3.png new file mode 100755 index 0000000000000000000000000000000000000000..943e861aaa1496cdb6693fb973cce13600122985 Binary files /dev/null and b/docs/deploy/images/vs2019_step3.png differ diff --git a/docs/deploy/images/vs2019_step4.png b/docs/deploy/images/vs2019_step4.png new file mode 100644 index 0000000000000000000000000000000000000000..9df86c9824f5fde45bc6df440ddc813742ce460f Binary files /dev/null and b/docs/deploy/images/vs2019_step4.png differ diff --git a/docs/deploy/images/vs2019_step5.png b/docs/deploy/images/vs2019_step5.png new file mode 100644 index 0000000000000000000000000000000000000000..e5349cf08b209561b5cd11e3f5b68e4aa6c6e295 Binary files /dev/null and b/docs/deploy/images/vs2019_step5.png differ diff --git a/docs/deploy/images/vs2019_step6.png b/docs/deploy/images/vs2019_step6.png new file mode 100755 index 0000000000000000000000000000000000000000..0986e823812e2316c4fd0f2e6cb260a1204fda40 Binary files /dev/null and b/docs/deploy/images/vs2019_step6.png differ diff --git a/docs/deploy/images/vs2019_step7.png b/docs/deploy/images/vs2019_step7.png new file mode 100755 index 0000000000000000000000000000000000000000..86a8039cbd2a9f8fb499ed72d386b5c02b30c86c Binary files /dev/null and b/docs/deploy/images/vs2019_step7.png differ diff --git a/docs/deploy/images/vs2019_step_encryption.png b/docs/deploy/images/vs2019_step_encryption.png new file mode 100644 index 0000000000000000000000000000000000000000..27a606799363b8b0f383ebd06f86a9a20e133ce9 Binary files /dev/null and b/docs/deploy/images/vs2019_step_encryption.png differ diff --git a/docs/deploy/index.rst b/docs/deploy/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..23337c7d279ce624a22c048c6ffc716c72d89090 --- /dev/null +++ b/docs/deploy/index.rst @@ -0,0 +1,13 @@ +模型部署 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + export_model.md + server/index + nvidia-jetson.md + openvino/index + paddlelite/index diff --git a/docs/deploy/nvidia-jetson.md b/docs/deploy/nvidia-jetson.md new file mode 100644 index 0000000000000000000000000000000000000000..709799b089b9e8e8cd2dd44ead08bb743b84c347 --- /dev/null +++ b/docs/deploy/nvidia-jetson.md @@ -0,0 +1,145 @@ +# Nvidia-Jetson开发板 + +## 说明 +本文档在 `Linux`平台使用`GCC 4.8.5` 和 `GCC 4.9.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++ 4.8.2 ~ 4.9.4 +* CUDA 9.0 / CUDA 10.0, CUDNN 7+ (仅在使用GPU版本的预测库时需要) +* CMake 3.0+ + +请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。 + +### Step1: 下载代码 + + `git clone https://github.com/PaddlePaddle/PaddleX.git` + +**说明**:其中`C++`预测代码在`/root/projects/PaddleX/deploy/cpp` 目录,该目录不依赖任何`PaddleX`下其他目录。 + + +### Step2: 下载PaddlePaddle C++ 预测库 paddle_inference + +目前PaddlePaddle为Nvidia-Jetson 提供了一个基于1.6.2版本的C++ 预测库。 + +| 版本说明 | 预测库(1.6.2版本) | +| ---- | ---- | +| nv-jetson-cuda10-cudnn7.5-trt5 | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.7.1-nv-jetson-cuda10-cudnn7.5-trt5/fluid_inference.tar.gz) | + +下载并解压后`/root/projects/fluid_inference`目录包含内容为: +``` +fluid_inference +├── paddle # paddle核心库和头文件 +| +├── third_party # 第三方依赖库和头文件 +| +└── version.txt # 版本和编译信息 +``` + +### Step3: 编译 + +编译`cmake`的命令在`scripts/jetson_build.sh`中,请根据实际情况修改主要参数,其主要内容说明如下: +``` +# 是否使用GPU(即是否使用 CUDA) +WITH_GPU=OFF +# 使用MKL or openblas +WITH_MKL=OFF +# 是否集成 TensorRT(仅WITH_GPU=ON 有效) +WITH_TENSORRT=OFF +# TensorRT 的路径,如果需要集成TensorRT,需修改为您实际安装的TensorRT路径 +TENSORRT_DIR=/root/projects/TensorRT/ +# Paddle 预测库路径, 请修改为您实际安装的预测库路径 +PADDLE_DIR=/root/projects/fluid_inference +# Paddle 的预测库是否使用静态库来编译 +# 使用TensorRT时,Paddle的预测库通常为动态库 +WITH_STATIC_LIB=OFF +# CUDA 的 lib 路径 +CUDA_LIB=/usr/local/cuda/lib64 +# CUDNN 的 lib 路径 +CUDNN_LIB=/usr/local/cuda/lib64 + +# 是否加载加密后的模型 +WITH_ENCRYPTION=OFF + +# OPENCV 路径, 如果使用自带预编译版本可不修改 +sh $(pwd)/scripts/jetson_bootstrap.sh # 下载预编译版本的opencv +OPENCV_DIR=$(pwd)/deps/opencv3/ + +# 以下无需改动 +rm -rf build +mkdir -p build +cd build +cmake .. \ + -DWITH_GPU=${WITH_GPU} \ + -DWITH_MKL=${WITH_MKL} \ + -DWITH_TENSORRT=${WITH_TENSORRT} \ + -DWITH_ENCRYPTION=${WITH_ENCRYPTION} \ + -DTENSORRT_DIR=${TENSORRT_DIR} \ + -DPADDLE_DIR=${PADDLE_DIR} \ + -DWITH_STATIC_LIB=${WITH_STATIC_LIB} \ + -DCUDA_LIB=${CUDA_LIB} \ + -DCUDNN_LIB=${CUDNN_LIB} \ + -DENCRYPTION_DIR=${ENCRYPTION_DIR} \ + -DOPENCV_DIR=${OPENCV_DIR} +make +``` +**注意:** linux环境下编译会自动下载OPENCV和YAML,如果编译环境无法访问外网,可手动下载: + +- [opencv3_aarch.tgz](https://bj.bcebos.com/paddlex/deploy/tools/opencv3_aarch.tgz) +- [yaml-cpp.zip](https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip) + +opencv3_aarch.tgz文件下载后解压,然后在script/build.sh中指定`OPENCE_DIR`为解压后的路径。 + +yaml-cpp.zip文件下载后无需解压,在cmake/yaml.cmake中将`URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip` 中的网址,改为下载文件的路径。 + +修改脚本设置好主要参数后,执行`build`脚本: + ```shell + sh ./scripts/jetson_build.sh + ``` + +### Step4: 预测及可视化 + +**在加载模型前,请检查你的模型目录中文件应该包括`model.yml`、`__model__`和`__params__`三个文件。如若不满足这个条件,请参考[模型导出为Inference文档](export_model.md)将模型导出为部署格式。** + +编译成功后,预测demo的可执行程序分别为`build/demo/detector`,`build/demo/classifier`,`build/demo/segmenter`,用户可根据自己的模型类型选择,其主要命令参数说明如下: + +| 参数 | 说明 | +| ---- | ---- | +| model_dir | 导出的预测模型所在路径 | +| image | 要预测的图片文件路径 | +| image_list | 按行存储图片路径的.txt文件 | +| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | +| use_trt | 是否使用 TensorRT 预测, 支持值为0或1(默认值为0) | +| gpu_id | GPU 设备ID, 默认值为0 | +| save_dir | 保存可视化结果的路径, 默认值为"output",**classfier无该参数** | +| key | 加密过程中产生的密钥信息,默认值为""表示加载的是未加密的模型 | +| batch_size | 预测的批量大小,默认为1 | +| thread_num | 预测的线程数,默认为cpu处理器个数 | +| use_ir_optim | 是否使用图优化策略,支持值为0或1(默认值为1,图像分割默认值为0)| + +## 样例 + +可使用[小度熊识别模型](export_model.md)中导出的`inference_model`和测试图片进行预测,导出到/root/projects,模型路径为/root/projects/inference_model。 + +`样例一`: + +不使用`GPU`测试图片 `/root/projects/images/xiaoduxiong.jpeg` + +```shell +./build/demo/detector --model_dir=/root/projects/inference_model --image=/root/projects/images/xiaoduxiong.jpeg --save_dir=output +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + + +`样例二`: + +使用`GPU`预测多个图片`/root/projects/image_list.txt`,image_list.txt内容的格式如下: +``` +/root/projects/images/xiaoduxiong1.jpeg +/root/projects/images/xiaoduxiong2.jpeg +... +/root/projects/images/xiaoduxiongn.jpeg +``` +```shell +./build/demo/detector --model_dir=/root/projects/inference_model --image_list=/root/projects/images_list.txt --use_gpu=1 --save_dir=output --batch_size=2 --thread_num=2 +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 diff --git a/docs/deploy/openvino/index.rst b/docs/deploy/openvino/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..3f3ee83919b3c7e7e7c2d03cbd3d451803042a14 --- /dev/null +++ b/docs/deploy/openvino/index.rst @@ -0,0 +1,11 @@ +OpenVINO部署 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + windows.md + linux.md + intel_movidius.md diff --git a/docs/deploy/openvino/intel_movidius.md b/docs/deploy/openvino/intel_movidius.md new file mode 100644 index 0000000000000000000000000000000000000000..ec514562b7738abe86654e08af044b22ec450f6c --- /dev/null +++ b/docs/deploy/openvino/intel_movidius.md @@ -0,0 +1 @@ +# Intel计算棒 diff --git a/docs/deploy/openvino/linux.md b/docs/deploy/openvino/linux.md new file mode 100644 index 0000000000000000000000000000000000000000..4825da6366435f098145e42ca7b88fc6d4f84255 --- /dev/null +++ b/docs/deploy/openvino/linux.md @@ -0,0 +1 @@ +# Linux平台 diff --git a/docs/deploy/openvino/windows.md b/docs/deploy/openvino/windows.md new file mode 100644 index 0000000000000000000000000000000000000000..30cdf17ded910bfda9286e5f700525c9b1bb777b --- /dev/null +++ b/docs/deploy/openvino/windows.md @@ -0,0 +1 @@ +# Windows平台 diff --git a/docs/deploy/paddlelite/android.md b/docs/deploy/paddlelite/android.md new file mode 100644 index 0000000000000000000000000000000000000000..738a3ac7127950e1e1ab235538f0d427534bbe15 --- /dev/null +++ b/docs/deploy/paddlelite/android.md @@ -0,0 +1 @@ +# Android平台 diff --git a/docs/deploy/paddlelite/index.rst b/docs/deploy/paddlelite/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..f10931a72b57774630f5aaf1b3dbea4ec3be0acf --- /dev/null +++ b/docs/deploy/paddlelite/index.rst @@ -0,0 +1,10 @@ +PaddleLite移动端部署 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + slim/index + android.md diff --git a/docs/deploy/paddlelite/slim/index.rst b/docs/deploy/paddlelite/slim/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..c76498b82f4fec61c0139296a0ffd7e6ec866ae1 --- /dev/null +++ b/docs/deploy/paddlelite/slim/index.rst @@ -0,0 +1,10 @@ +模型压缩 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + prune.md + quant.md diff --git a/docs/deploy/paddlelite/slim/prune.md b/docs/deploy/paddlelite/slim/prune.md new file mode 100644 index 0000000000000000000000000000000000000000..d6dce828e2a25d1242f9f3aecaa8b8dc1d04e5b9 --- /dev/null +++ b/docs/deploy/paddlelite/slim/prune.md @@ -0,0 +1 @@ +# 模型裁剪 diff --git a/docs/deploy/paddlelite/slim/quant.md b/docs/deploy/paddlelite/slim/quant.md new file mode 100644 index 0000000000000000000000000000000000000000..19de6a8251c8bb22e60ad812a430ed4af83957e4 --- /dev/null +++ b/docs/deploy/paddlelite/slim/quant.md @@ -0,0 +1 @@ +# 模型量化 diff --git a/docs/deploy/server/cpp/index.rst b/docs/deploy/server/cpp/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..b366d1e6aeba1ef191b3a2319825df84ecaf81de --- /dev/null +++ b/docs/deploy/server/cpp/index.rst @@ -0,0 +1,10 @@ +服务端C++部署 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + windows.md + linux.md diff --git a/docs/deploy/server/cpp/linux.md b/docs/deploy/server/cpp/linux.md new file mode 100644 index 0000000000000000000000000000000000000000..f75df4216fb45a0fc6dfbb12d93db7c99ebe9480 --- /dev/null +++ b/docs/deploy/server/cpp/linux.md @@ -0,0 +1,161 @@ +# Linux平台部署 + +## 说明 +本文档在 `Linux`平台使用`GCC 4.8.5` 和 `GCC 4.9.4`测试过,如果需要使用更高G++版本编译使用,则需要重新编译Paddle预测库,请参考: [从源码编译Paddle预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12)。 + +## 前置条件 +* G++ 4.8.2 ~ 4.9.4 +* CUDA 9.0 / CUDA 10.0, CUDNN 7+ (仅在使用GPU版本的预测库时需要) +* CMake 3.0+ + +请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。 + +### Step1: 下载代码 + + `git clone https://github.com/PaddlePaddle/PaddleX.git` + +**说明**:其中`C++`预测代码在`/root/projects/PaddleX/deploy/cpp` 目录,该目录不依赖任何`PaddleX`下其他目录。 + + +### Step2: 下载PaddlePaddle C++ 预测库 paddle_inference + +PaddlePaddle C++ 预测库针对不同的`CPU`,`CUDA`,以及是否支持TensorRT,提供了不同的预编译版本,目前PaddleX依赖于Paddle1.8版本,以下提供了多个不同版本的Paddle预测库: + +| 版本说明 | 预测库(1.8.2版本) | +| ---- | ---- | +| ubuntu14.04_cpu_avx_mkl | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-cpu-avx-mkl/fluid_inference.tgz) | +| ubuntu14.04_cpu_avx_openblas | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-cpu-avx-openblas/fluid_inference.tgz) | +| ubuntu14.04_cpu_noavx_openblas | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-cpu-noavx-openblas/fluid_inference.tgz) | +| ubuntu14.04_cuda9.0_cudnn7_avx_mkl | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-gpu-cuda9-cudnn7-avx-mkl/fluid_inference.tgz) | +| ubuntu14.04_cuda10.0_cudnn7_avx_mkl | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-gpu-cuda10-cudnn7-avx-mkl/fluid_inference.tgz ) | +| ubuntu14.04_cuda10.1_cudnn7.6_avx_mkl_trt6 | [paddle_inference](https://paddle-inference-lib.bj.bcebos.com/1.8.2-gpu-cuda10.1-cudnn7.6-avx-mkl-trt6%2Ffluid_inference.tgz) | + +更多和更新的版本,请根据实际情况下载: [C++预测库下载列表](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html) + +下载并解压后`/root/projects/fluid_inference`目录包含内容为: +``` +fluid_inference +├── paddle # paddle核心库和头文件 +| +├── third_party # 第三方依赖库和头文件 +| +└── version.txt # 版本和编译信息 +``` + +**注意:** 预编译版本除`nv-jetson-cuda10-cudnn7.5-trt5` 以外其它包都是基于`GCC 4.8.5`编译,使用高版本`GCC`可能存在 `ABI`兼容性问题,建议降级或[自行编译预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12)。 + + +### Step3: 编译 + +编译`cmake`的命令在`scripts/build.sh`中,请根据实际情况修改主要参数,其主要内容说明如下: +``` +# 是否使用GPU(即是否使用 CUDA) +WITH_GPU=OFF +# 使用MKL or openblas +WITH_MKL=ON +# 是否集成 TensorRT(仅WITH_GPU=ON 有效) +WITH_TENSORRT=OFF +# TensorRT 的路径,如果需要集成TensorRT,需修改为您实际安装的TensorRT路径 +TENSORRT_DIR=/root/projects/TensorRT/ +# Paddle 预测库路径, 请修改为您实际安装的预测库路径 +PADDLE_DIR=/root/projects/fluid_inference +# Paddle 的预测库是否使用静态库来编译 +# 使用TensorRT时,Paddle的预测库通常为动态库 +WITH_STATIC_LIB=OFF +# CUDA 的 lib 路径 +CUDA_LIB=/usr/local/cuda/lib64 +# CUDNN 的 lib 路径 +CUDNN_LIB=/usr/local/cuda/lib64 + +# 是否加载加密后的模型 +WITH_ENCRYPTION=ON +# 加密工具的路径, 如果使用自带预编译版本可不修改 +sh $(pwd)/scripts/bootstrap.sh # 下载预编译版本的加密工具 +ENCRYPTION_DIR=$(pwd)/paddlex-encryption + +# OPENCV 路径, 如果使用自带预编译版本可不修改 +sh $(pwd)/scripts/bootstrap.sh # 下载预编译版本的opencv +OPENCV_DIR=$(pwd)/deps/opencv3gcc4.8/ + +# 以下无需改动 +rm -rf build +mkdir -p build +cd build +cmake .. \ + -DWITH_GPU=${WITH_GPU} \ + -DWITH_MKL=${WITH_MKL} \ + -DWITH_TENSORRT=${WITH_TENSORRT} \ + -DWITH_ENCRYPTION=${WITH_ENCRYPTION} \ + -DTENSORRT_DIR=${TENSORRT_DIR} \ + -DPADDLE_DIR=${PADDLE_DIR} \ + -DWITH_STATIC_LIB=${WITH_STATIC_LIB} \ + -DCUDA_LIB=${CUDA_LIB} \ + -DCUDNN_LIB=${CUDNN_LIB} \ + -DENCRYPTION_DIR=${ENCRYPTION_DIR} \ + -DOPENCV_DIR=${OPENCV_DIR} +make +``` +**注意:** linux环境下编译会自动下载OPENCV, PaddleX-Encryption和YAML,如果编译环境无法访问外网,可手动下载: + +- [opencv3gcc4.8.tar.bz2](https://paddleseg.bj.bcebos.com/deploy/docker/opencv3gcc4.8.tar.bz2) +- [paddlex-encryption.zip](https://bj.bcebos.com/paddlex/tools/paddlex-encryption.zip) +- [yaml-cpp.zip](https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip) + +opencv3gcc4.8.tar.bz2文件下载后解压,然后在script/build.sh中指定`OPENCE_DIR`为解压后的路径。 + +paddlex-encryption.zip文件下载后解压,然后在script/build.sh中指定`ENCRYPTION_DIR`为解压后的路径。 + +yaml-cpp.zip文件下载后无需解压,在cmake/yaml.cmake中将`URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip` 中的网址,改为下载文件的路径。 + +修改脚本设置好主要参数后,执行`build`脚本: + ```shell + sh ./scripts/build.sh + ``` + +### Step4: 预测及可视化 + +**在加载模型前,请检查你的模型目录中文件应该包括`model.yml`、`__model__`和`__params__`三个文件。如若不满足这个条件,请参考[模型导出为Inference文档](../../export_model.md)将模型导出为部署格式。** + +编译成功后,预测demo的可执行程序分别为`build/demo/detector`,`build/demo/classifier`,`build/demo/segmenter`,用户可根据自己的模型类型选择,其主要命令参数说明如下: + +| 参数 | 说明 | +| ---- | ---- | +| model_dir | 导出的预测模型所在路径 | +| image | 要预测的图片文件路径 | +| image_list | 按行存储图片路径的.txt文件 | +| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | +| use_trt | 是否使用 TensorRT 预测, 支持值为0或1(默认值为0) | +| gpu_id | GPU 设备ID, 默认值为0 | +| save_dir | 保存可视化结果的路径, 默认值为"output",**classfier无该参数** | +| key | 加密过程中产生的密钥信息,默认值为""表示加载的是未加密的模型 | +| batch_size | 预测的批量大小,默认为1 | +| thread_num | 预测的线程数,默认为cpu处理器个数 | +| use_ir_optim | 是否使用图优化策略,支持值为0或1(默认值为1,图像分割默认值为0)| + +## 样例 + +可使用[小度熊识别模型](../../export_model.md)中导出的`inference_model`和测试图片进行预测,导出到/root/projects,模型路径为/root/projects/inference_model。 + +`样例一`: + +不使用`GPU`测试图片 `/root/projects/images/xiaoduxiong.jpeg` + +```shell +./build/demo/detector --model_dir=/root/projects/inference_model --image=/root/projects/images/xiaoduxiong.jpeg --save_dir=output +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + + +`样例二`: + +使用`GPU`预测多个图片`/root/projects/image_list.txt`,image_list.txt内容的格式如下: +``` +/root/projects/images/xiaoduxiong1.jpeg +/root/projects/images/xiaoduxiong2.jpeg +... +/root/projects/images/xiaoduxiongn.jpeg +``` +```shell +./build/demo/detector --model_dir=/root/projects/inference_model --image_list=/root/projects/images_list.txt --use_gpu=1 --save_dir=output --batch_size=2 --thread_num=2 +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 diff --git a/docs/deploy/server/cpp/windows.md b/docs/deploy/server/cpp/windows.md new file mode 100644 index 0000000000000000000000000000000000000000..e8c6a7054dd97e34d109930a8fce19dd78fd7638 --- /dev/null +++ b/docs/deploy/server/cpp/windows.md @@ -0,0 +1,165 @@ +# Windows平台部署 + +## 说明 +Windows 平台下,我们使用`Visual Studio 2019 Community` 进行了测试。微软从`Visual Studio 2017`开始即支持直接管理`CMake`跨平台编译项目,但是直到`2019`才提供了稳定和完全的支持,所以如果你想使用CMake管理项目编译构建,我们推荐你使用`Visual Studio 2019`环境下构建。 + +## 前置条件 +* Visual Studio 2019 +* CUDA 9.0 / CUDA 10.0, CUDNN 7+ (仅在使用GPU版本的预测库时需要) +* CMake 3.0+ + +请确保系统已经安装好上述基本软件,我们使用的是`VS2019`的社区版。 + +**下面所有示例以工作目录为 `D:\projects`演示。** + +### Step1: 下载PaddleX预测代码 + +```shell +d: +mkdir projects +cd projects +git clone https://github.com/PaddlePaddle/PaddleX.git +``` + +**说明**:其中`C++`预测代码在`PaddleX\deploy\cpp` 目录,该目录不依赖任何`PaddleX`下其他目录。 + + +### Step2: 下载PaddlePaddle C++ 预测库 paddle_inference + +PaddlePaddle C++ 预测库针对是否使用GPU、是否支持TensorRT、以及不同的CUDA版本提供了已经编译好的预测库,目前PaddleX依赖于Paddle 1.8,基于Paddle 1.8的Paddle预测库下载链接如下所示: + +| 版本说明 | 预测库(1.8.2版本) | 编译器 | 构建工具| cuDNN | CUDA | +| ---- | ---- | ---- | ---- | ---- | ---- | +| cpu_avx_mkl | [paddle_inference](https://paddle-wheel.bj.bcebos.com/1.8.2/win-infer/mkl/cpu/fluid_inference_install_dir.zip) | MSVC 2015 update 3 | CMake v3.16.0 | +| cpu_avx_openblas | [paddle_inference](https://paddle-wheel.bj.bcebos.com/1.8.2/win-infer/open/cpu/fluid_inference_install_dir.zip) | MSVC 2015 update 3 | CMake v3.16.0 | +| cuda9.0_cudnn7_avx_mkl | [paddle_inference](https://paddle-wheel.bj.bcebos.com/1.8.2/win-infer/mkl/post97/fluid_inference_install_dir.zip) | MSVC 2015 update 3 | CMake v3.16.0 | 7.4.1 | 9.0 | +| cuda9.0_cudnn7_avx_openblas | [paddle_inference](https://paddle-wheel.bj.bcebos.com/1.8.2/win-infer/open/post97/fluid_inference_install_dir.zip) | MSVC 2015 update 3 | CMake v3.16.0 | 7.4.1 | 9.0 | +| cuda10.0_cudnn7_avx_mkl | [paddle_inference](https://paddle-wheel.bj.bcebos.com/1.8.2/win-infer/mkl/post107/fluid_inference_install_dir.zip) | MSVC 2015 update 3 | CMake v3.16.0 | 7.5.0 | 9.0 | + +请根据实际情况选择下载,如若以上版本不满足您的需求,请至[C++预测库下载列表](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/windows_cpp_inference.html)选择符合的版本。 + +将预测库解压后,其所在目录(例如`D:\projects\fluid_inference\`)下主要包含的内容有: +``` +├── \paddle\ # paddle核心库和头文件 +| +├── \third_party\ # 第三方依赖库和头文件 +| +└── \version.txt # 版本和编译信息 +``` + +### Step3: 安装配置OpenCV + +1. 在OpenCV官网下载适用于Windows平台的3.4.6版本, [下载地址](https://bj.bcebos.com/paddleseg/deploy/opencv-3.4.6-vc14_vc15.exe) +2. 运行下载的可执行文件,将OpenCV解压至指定目录,例如`D:\projects\opencv` +3. 配置环境变量,如下流程所示 + - 我的电脑->属性->高级系统设置->环境变量 + - 在系统变量中找到Path(如没有,自行创建),并双击编辑 + - 新建,将opencv路径填入并保存,如`D:\projects\opencv\build\x64\vc14\bin` + +### Step4: 使用Visual Studio 2019直接编译CMake + +1. 打开Visual Studio 2019 Community,点击`继续但无需代码` + +![step2](../../images/vs2019_step1.png) +2. 点击: `文件`->`打开`->`CMake` + +![step2.1](../../images/vs2019_step2.png) + +选择C++预测代码所在路径(例如`D:\projects\PaddleX\deploy\cpp`),并打开`CMakeList.txt`: + +![step2.2](../../images/vs2019_step3.png) +3. 点击:`项目`->`CMake设置` + +![step3](../../images/vs2019_step4.png) +4. 点击`浏览`,分别设置编译选项指定`CUDA`、`OpenCV`、`Paddle预测库`的路径 + +![step3](../../images/vs2019_step5.png) + +依赖库路径的含义说明如下(带*表示仅在使用**GPU版本**预测库时指定, 其中CUDA库版本尽量与Paddle预测库的对齐,例如Paddle预测库是**使用9.0、10.0版本**编译的,则编译PaddleX预测代码时**不使用9.2、10.1等版本**CUDA库): + +| 参数名 | 含义 | +| ---- | ---- | +| *CUDA_LIB | CUDA的库路径, 注:请将CUDNN的cudnn.lib文件拷贝到CUDA_LIB路径下 | +| OPENCV_DIR | OpenCV的安装路径, | +| PADDLE_DIR | Paddle c++预测库的路径 | + +**注意:** +1. 如果使用`CPU`版预测库,请把`WITH_GPU`的`值`去掉勾 +2. 如果使用的是`openblas`版本,请把`WITH_MKL`的`值`去掉勾 +3. Windows环境下编译会自动下载YAML,如果编译环境无法访问外网,可手动下载: [yaml-cpp.zip](https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip) +yaml-cpp.zip文件下载后无需解压,在cmake/yaml.cmake中将`URL https://bj.bcebos.com/paddlex/deploy/deps/yaml-cpp.zip` 中的网址,改为下载文件的路径。 +4. 如果需要使用模型加密功能,需要手动下载[Windows预测模型加密工具](https://bj.bcebos.com/paddlex/tools/win/paddlex-encryption.zip)。例如解压到D:/projects,解压后目录为D:/projects/paddlex-encryption。编译时需勾选WITH_EBNCRYPTION并且在ENCRTYPTION_DIR填入D:/projects/paddlex-encryption。 + +![step_encryption](../../images/vs2019_step_encryption.png) + +![step4](../../images/vs2019_step6.png) + +**设置完成后**, 点击上图中`保存并生成CMake缓存以加载变量`。 +5. 点击`生成`->`全部生成` + +![step6](../../images/vs2019_step7.png) + +### Step5: 预测及可视化 + +**在加载模型前,请检查你的模型目录中文件应该包括`model.yml`、`__model__`和`__params__`三个文件。如若不满足这个条件,请参考[模型导出为Inference文档](../../export_model.md)将模型导出为部署格式。** + +上述`Visual Studio 2019`编译产出的可执行文件在`out\build\x64-Release`目录下,打开`cmd`,并切换到该目录: + +``` +D: +cd D:\projects\PaddleX\deploy\cpp\out\build\x64-Release +``` + +编译成功后,预测demo的入口程序为`paddlex_inference\detector.exe`,`paddlex_inference\classifier.exe`,`paddlex_inference\segmenter.exe`,用户可根据自己的模型类型选择,其主要命令参数说明如下: + +| 参数 | 说明 | +| ---- | ---- | +| model_dir | 导出的预测模型所在路径 | +| image | 要预测的图片文件路径 | +| image_list | 按行存储图片路径的.txt文件 | +| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | +| gpu_id | GPU 设备ID, 默认值为0 | +| save_dir | 保存可视化结果的路径, 默认值为"output",classfier无该参数 | +| key | 加密过程中产生的密钥信息,默认值为""表示加载的是未加密的模型 | +| batch_size | 预测的批量大小,默认为1 | +| thread_num | 预测的线程数,默认为cpu处理器个数 | +| use_ir_optim | 是否使用图优化策略,支持值为0或1(默认值为1,图像分割默认值为0)| + +## 样例 + +可使用[小度熊识别模型](../../export_model.md)中导出的`inference_model`和测试图片进行预测, 例如导出到D:\projects,模型路径为D:\projects\inference_model。 + +### 样例一:(使用未加密的模型对单张图像做预测) + +不使用`GPU`测试图片 `D:\images\xiaoduxiong.jpeg` + +``` +.\paddlex_inference\detector.exe --model_dir=D:\projects\inference_model --image=D:\images\xiaoduxiong.jpeg --save_dir=output + +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + + +### 样例二:(使用未加密的模型对图像列表做预测) + +使用`GPU`预测多个图片`D:\images\image_list.txt`,image_list.txt内容的格式如下: +``` +D:\images\xiaoduxiong1.jpeg +D:\images\xiaoduxiong2.jpeg +... +D:\images\xiaoduxiongn.jpeg +``` +``` +.\paddlex_inference\detector.exe --model_dir=D:\projects\inference_model --image_list=D:\images\image_list.txt --use_gpu=1 --save_dir=output --batch_size=2 --thread_num=2 +``` +图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + +### 样例三:(使用加密后的模型对单张图片进行预测) + +如果未对模型进行加密,请参考[加密PaddleX模型](../encryption.html#paddlex)对模型进行加密。例如加密后的模型所在目录为`D:\projects\encrypted_inference_model`。 + +``` +.\paddlex_inference\detector.exe --model_dir=D:\projects\encrypted_inference_model --image=D:\images\xiaoduxiong.jpeg --save_dir=output --key=kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c= +``` + +`--key`传入加密工具输出的密钥,例如`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`, 图片文件可视化预测结果会保存在`save_dir`参数设置的目录下。 diff --git a/docs/deploy/server/encryption.md b/docs/deploy/server/encryption.md new file mode 100644 index 0000000000000000000000000000000000000000..fa9c65efae1ef135381d4c9df7696f40aec3e204 --- /dev/null +++ b/docs/deploy/server/encryption.md @@ -0,0 +1,167 @@ +# 模型加密部署 + +PaddleX提供一个轻量级的模型加密部署方案,通过PaddleX内置的模型加密工具对推理模型进行加密,预测部署SDK支持直接加载密文模型并完成推理,提升AI模型部署的安全性。 + +**目前加密方案已支持Windows,Linux系统** + +## 1. 方案简介 + +### 1.1 简介 + +(1)加密算法的选择和支持的库 + +一般使用OpenSSL库来支持数据的加解密,OpenSSL提供了大量的加解密算法,包括对称加密算法(AES等)和非对称加密算法(RSA等)。 + +两种算法使用的场景不同,非对称加密算法一般应用于数字签名和密钥协商的场景下,而对称加密算法一般应用于纯数据加密场景,性能更优。在对模型的加密过程中使用对称加密算法。 + +以下对模型加密场景实现的说明中以开发一个C/C++库为基础,采用AES对称加密算法,为了加解密前后能够快速判断解密是否成功,使用AES-GCM加解密模式,在密钥的安全性上使用长度为256位的密钥数据。 + +(2)实现模型保护的一般步骤: + +![](../images/encryption_process.png) + +下面是对提供的C/C++加解密库内部实现的中文描述,参考以下步骤可以实现一套加解密库来适应自己的场景并通过内存数据加载到Paddle Inference预测库中 + +> 1)考虑到加密的模型文件解密后需要从内存加载数据,使用conbine的模式生成模型文件和参数文件。 +> +> 2)项目集成OpenSSL,使用静态库的形式。 +> +> 3)实现AES算法接口,借助OpenSSL提供的EVP接口,在EVP接口中指定算法类型,算法使用对称加解密算法中的AES,加解密模式使用AES-GCM, 密钥长度为256位,AES-GCM的实现可以参考官方提供的例子自己进行封装接口:[AES-GCM实现](https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)。 +> +> 4)利用OpenSSL库实现SHA256摘要算法,这部分下面有用(可选)。关于SHA256的hash计算可以参考OpenSSL提供的example:[OpenSSL 信息摘要例子](https://wiki.openssl.org/index.php/EVP_Message_Digests)。 +> +> 5)在模型加密环节直接对model文件和params文件的数据内容进行加密后保存到新的文件,为了新的文件能够被区分和可迭代,除了加密后的数据外还添加了头部信息,比如为了判断该文件类型使用固定的魔数作为文件的开头;为了便于后面需求迭代写入版本号以示区别;为了能够在解密时判断是否采用了相同的密钥将加密时的密钥进行SHA256计算后存储;这三部分构成了目前加密后文件的头部信息。加密后的文件包含头部信息 + 密文信息。 +> +> 6)在模型解密环节根据加密后的文件读取相关的加密数据到内存中,对内存数据使用AES算法进行解密,注意解密时需要采用与加密时一致的加密算法和加密的模式,以及密钥的数据和长度,否则会导致解密后数据错误。 +> +> 7)集成模型预测的C/C++库,在具体使用预测时一般涉及paddle::AnalysisConfig和paddle:Predictor,为了能够从内存数据中直接load解密后的模型明文数据(避免模型解密后创建临时文件),这里需要将AnalysisConfig的模型加载函数从SetModel替换为SetModelBuffer来实现从内存中加载模型数据。 + +需要注意的是,在本方案中,密钥集成在上层预测服务的代码中。故模型的安全强度等同于代码抵御逆向调试的强度。为了保护密钥和模型的安全,开发者还需对自己的应用进行加固保护。常见的应用加固手段有:代码混淆,二进制文件加壳 等等,亦或将加密机制更改为AES白盒加密技术来保护密钥。这类技术领域内有大量商业和开源产品可供选择,此处不一一赘述。 + +### 1.2 加密工具 + +[Linux版本 PaddleX模型加密工具](https://bj.bcebos.com/paddlex/tools/paddlex-encryption.zip),编译脚本会自动下载该版本加密工具,您也可以选择手动下载。 + +[Windows版本 PaddleX模型加密工具](https://bj.bcebos.com/paddlex/tools/win/paddlex-encryption.zip),该版本加密工具需手动下载,如果您在使用Visual Studio 2019编译C++预测代码的过程中已经下载过该工具,此处可不必重复下载。 + +Linux加密工具包含内容为: +``` +paddlex-encryption +├── include # 头文件:paddle_model_decrypt.h(解密)和paddle_model_encrypt.h(加密) +| +├── lib # libpmodel-encrypt.so和libpmodel-decrypt.so动态库 +| +└── tool # paddlex_encrypt_tool +``` + +Windows加密工具包含内容为: +``` +paddlex-encryption +├── include # 头文件:paddle_model_decrypt.h(解密)和paddle_model_encrypt.h(加密) +| +├── lib # pmodel-encrypt.dll和pmodel-decrypt.dll动态库 pmodel-encrypt.lib和pmodel-encrypt.lib静态库 +| +└── tool # paddlex_encrypt_tool.exe 模型加密工具 +``` +### 1.3 加密PaddleX模型 + +对模型完成加密后,加密工具会产生随机密钥信息(用于AES加解密使用),需要在后续加密部署时传入该密钥来用于解密。 +> 密钥由32字节key + 16字节iv组成, 注意这里产生的key是经过base64编码后的,这样可以扩充key的选取范围 + +Linux平台: +``` +# 假设模型在/root/projects下 +./paddlex-encryption/tool/paddlex_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 +``` + +`-model_dir`用于指定inference模型路径(参考[导出inference模型](../export_model.md)将模型导出为inference格式模型),可使用[导出小度熊识别模型](../export_model.md)中导出的`inference_model`。加密完成后,加密过的模型会保存至指定的`-save_dir`下,包含`__model__.encrypted`、`__params__.encrypted`和`model.yml`三个文件,同时生成密钥信息,命令输出如下图所示,密钥为`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=` + +![](../images/encrypt.png) + +## 2. PaddleX C++加密部署 + +### 2.1 Linux平台使用 +参考[Linux平台编译指南](cpp/linux.md)编译C++部署代码。编译成功后,预测demo的可执行程序分别为`build/demo/detector`,`build/demo/classifier`,`build/demo/segmenter`,用户可根据自己的模型类型选择,其主要命令参数说明如下: + +| 参数 | 说明 | +| ---- | ---- | +| model_dir | 导出的预测模型所在路径 | +| image | 要预测的图片文件路径 | +| image_list | 按行存储图片路径的.txt文件 | +| use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | +| use_trt | 是否使用 TensorRT 预测, 支持值为0或1(默认值为0) | +| gpu_id | GPU 设备ID, 默认值为0 | +| save_dir | 保存可视化结果的路径, 默认值为"output",classifier无该参数 | +| key | 加密过程中产生的密钥信息,默认值为""表示加载的是未加密的模型 | +| batch_size | 预测的批量大小,默认为1 | +| thread_num | 预测的线程数,默认为cpu处理器个数 | +| use_ir_optim | 是否使用图优化策略,支持值为0或1(默认值为1,图像分割默认值为0)| + + +### 样例 + +可使用[导出小度熊识别模型](../export_model.md)中的测试图片进行预测。 + +#### 样例一: + +不使用`GPU`测试图片 `/root/projects/images/xiaoduxiong.jpeg` + +```shell +./build/demo/detector --model_dir=/root/projects/paddlex_encrypted_model --image=/root/projects/xiaoduxiong.jpeg --save_dir=output --key=kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c= +``` +`--key`传入加密工具输出的密钥,例如`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`, 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + + +#### 样例二: + +使用`GPU`预测多个图片`/root/projects/image_list.txt`,image_list.txt内容的格式如下: +``` +/root/projects/images/xiaoduxiong1.jpeg +/root/projects/xiaoduxiong2.jpeg +... +/root/projects/xiaoduxiongn.jpeg +``` +```shell +./build/demo/detector --model_dir=/root/projects/models/paddlex_encrypted_model --image_list=/root/projects/images_list.txt --use_gpu=1 --save_dir=output --key=kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c= +``` +`--key`传入加密工具输出的密钥,例如`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`, 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + +### 2.2 Windows平台使用 +参考[Windows平台编译指南](cpp/windows.md)。需自行下载Windows版PaddleX加密工具压缩包,解压,在编译指南的编译流程基础上,在CMake设置中勾选WITH_ENCRYPTION,ENCRYPTION_DIR填写为加密工具包解压后的目录,再进行编译。参数与Linux版本预测部署一致。预测demo的入口程序为paddlex_inference\detector.exe,paddlex_inference\classifier.exe,paddlex_inference\segmenter.exe。 + +### 样例 + +可使用[导出小度熊识别模型](../export_model.md)中的测试图片进行预测。 + +#### 样例一: + +不使用`GPU`测试单张图片,例如图片为`D:\images\xiaoduxiong.jpeg`,加密后的模型目录为`D:\projects\paddlex_encrypted_model` + +```shell +.\paddlex_inference\detector.exe --model_dir=D:\projects\paddlex_encrypted_model --image=D:\images\xiaoduxiong.jpeg --save_dir=output --key=kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c= +``` +`--key`传入加密工具输出的密钥,例如`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`, 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 + + +#### 样例二: + +使用`GPU`预测图片列表,例如图片列表为`D:\projects\image_list.txt`,`image_list.txt`的内容如下: +``` +D:\projects\images\xiaoduxiong1.jpeg +D:\projects\images\xiaoduxiong2.jpeg +... +D:\projects\images\xiaoduxiongn.jpeg +``` + +加密后的模型目录例如为`D:\projects\paddlex_encrypted_model` + +``` +.\paddlex_inference\detector.exe --model_dir=D:\projects\paddlex_encrypted_model --image_list=D:\projects\images_list.txt --use_gpu=1 --save_dir=output --key=kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c= +``` +`--key`传入加密工具输出的密钥,例如`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=`, 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 diff --git a/docs/deploy/server/index.rst b/docs/deploy/server/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..f362afa915f85a832ed1aa152d845333f3764f45 --- /dev/null +++ b/docs/deploy/server/index.rst @@ -0,0 +1,11 @@ +服务端部署 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + python.md + cpp/index + encryption.md diff --git a/docs/deploy/server/python.md b/docs/deploy/server/python.md new file mode 100644 index 0000000000000000000000000000000000000000..50315650a4e808a785e2b5ec266ee2053bf238d2 --- /dev/null +++ b/docs/deploy/server/python.md @@ -0,0 +1,42 @@ +# Python部署 +PaddleX已经集成了基于Python的高性能预测接口,在安装PaddleX后,可参照如下代码示例,进行预测。相关的接口文档可参考[paddlex.deploy](../../../apis/deploy.md) + +## 导出预测模型 +可参考[模型导出](../export_model.md)将模型导出为inference格式的模型。 + +## 预测部署 +**注意:由于PaddleX代码的持续更新,版本低于1.0.0的模型暂时无法直接用于预测部署,参考[模型版本升级](../upgrade_version.md)对模型版本进行升级。** + +> 点击下载测试图片 [xiaoduxiong_test_image.tar.gz](https://bj.bcebos.com/paddlex/datasets/xiaoduxiong_test_image.tar.gz) + +``` +import paddlex as pdx +predictor = pdx.deploy.Predictor('./inference_model') +result = predictor.predict(image='xiaoduxiong_test_image/JPEGImages/WeChatIMG110.jpeg') +``` + +## 预测性能对比 +### 测试环境 + +- CUDA 9.0 +- CUDNN 7.5 +- PaddlePaddle 1.71 +- GPU: Tesla P40 +- AnalysisPredictor 指采用Python的高性能预测方式 +- Executor 指采用paddlepaddle普通的python预测方式 +- Batch Size均为1,耗时单位为ms/image,只计算模型运行时间,不包括数据的预处理和后处理 + +### 性能对比 + + +| 模型 | AnalysisPredictor耗时 | Executor耗时 | 输入图像大小 | +| :---- | :--------------------- | :------------ | :------------ | +| resnet50 | 4.84 | 7.57 | 224*224 | +| mobilenet_v2 | 3.27 | 5.76 | 224*224 | +| unet | 22.51 | 34.60 |513*513 | +| deeplab_mobile | 63.44 | 358.31 |1025*2049 | +| yolo_mobilenetv2 | 15.20 | 19.54 | 608*608 | +| faster_rcnn_r50_fpn_1x | 50.05 | 69.58 |800*1088 | +| faster_rcnn_r50_1x | 326.11 | 347.22 | 800*1067 | +| mask_rcnn_r50_fpn_1x | 67.49 | 91.02 | 800*1088 | +| mask_rcnn_r50_1x | 326.11 | 350.94 | 800*1067 | diff --git a/docs/deploy/upgrade_version.md b/docs/deploy/upgrade_version.md new file mode 100644 index 0000000000000000000000000000000000000000..3fbe92026593b0f0deb39f0e5b6cd2baa4b953b2 --- /dev/null +++ b/docs/deploy/upgrade_version.md @@ -0,0 +1,14 @@ +# 模型版本升级 + +由于PaddleX代码的持续更新,版本低于1.0.0的模型暂时无法直接用于预测部署,用户需要按照以下步骤对模型版本进行转换,转换后的模型可以在多端上完成部署。 + +## 检查模型版本 + +存放模型的文件夹存有一个`model.yml`文件,该文件的最后一行`version`值表示模型的版本号,若版本号小于1.0.0,则需要进行版本转换,若版本号大于及等于1.0.0,则不需要进行版本转换。 + +## 版本转换 + +``` +paddlex --export_inference --model_dir=/path/to/low_version_model --save_dir=SSpath/to/high_version_model +``` +`--model_dir`为版本号小于1.0.0的模型路径,可以是PaddleX训练过程保存的模型,也可以是导出为inference格式的模型。`--save_dir`为转换为高版本的模型,后续可用于多端部署。 diff --git a/docs/examples/human_segmentation/index.rst b/docs/examples/human_segmentation/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..ea4d395da595431a291dbd05c857f97f70793380 --- /dev/null +++ b/docs/examples/human_segmentation/index.rst @@ -0,0 +1,5 @@ +人像分割案例 +======================================= + + +这里面写人像分割案例,可根据需求拆分为多个文档 diff --git a/docs/examples/index.rst b/docs/examples/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..f01fded9bf32d45b02856ac1f582eebc7029ff05 --- /dev/null +++ b/docs/examples/index.rst @@ -0,0 +1,12 @@ +产业案例集 +======================================= + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + solutions.md + meter_reading/index + human_segmentation/index + remote_sensing/index diff --git a/docs/examples/meter_reading/index.rst b/docs/examples/meter_reading/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..1e4eede02894a774db4615515f437630ac0e8628 --- /dev/null +++ b/docs/examples/meter_reading/index.rst @@ -0,0 +1,5 @@ +工业表计读数案例 +======================================= + + +这里面写表计读数案例,可根据需求拆分为多个文档 diff --git a/docs/examples/remote_sensing/index.rst b/docs/examples/remote_sensing/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..dc375659be121c4bd04843fd281416a4d00ad865 --- /dev/null +++ b/docs/examples/remote_sensing/index.rst @@ -0,0 +1,5 @@ +遥感分割案例 +======================================= + + +这里面写遥感分割案例,可根据需求拆分为多个文档 diff --git a/docs/examples/solutions.md b/docs/examples/solutions.md new file mode 100644 index 0000000000000000000000000000000000000000..b9bae385b0392d6df5f90352e2cfe3de732e7d48 --- /dev/null +++ b/docs/examples/solutions.md @@ -0,0 +1 @@ +# PaddleX模型介绍 diff --git a/docs/gui/index.rst b/docs/gui/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..b8657db2a54c119f8043a850664fbdae84f2299b --- /dev/null +++ b/docs/gui/index.rst @@ -0,0 +1,26 @@ +PaddleX GUI +======================================= + +PaddleX GUI是基于PaddleX开发实现的可视化模型训练套件,可以让开发者免去代码开发的步骤,通过点选式地操作就可以快速完成模型的训练开发。PaddleXGUI具有 **数据集可视化分析** 、**模型参数自动推荐** 、**跨平台使用** 三大特点。 + +数据集可视化分析 + | PaddleX支持导入常见的图像分类、目标检测、实例分割和语义分割数据集,并对数据集的样本分布,标注结果进行可视化展示,数据集的情况一目了然! + +模型参数自动推荐 + | 根据用户的电脑配置和数据集情况,自动推荐模型训练参数,免去用户查看文档,被各种参数所烦的忧心事! + +跨平台使用 + | PaddleX GUI完全跨平台,支持Linux、Windows和Mac三大主流系统! + + +.. toctree:: + :maxdepth: 2 + :caption: 文档目录: + + +* PaddleX GUI版本: v1.0 +* 项目官网: http://www.paddlepaddle.org.cn/paddle/paddlex +* 项目GitHub: https://github.com/PaddlePaddle/PaddleX/tree/develop +* 官方QQ用户群: 1045148026 +* GitHub Issue反馈: http://www.github.com/PaddlePaddle/PaddleX/issues + diff --git a/docs/index.rst b/docs/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..b95bed141e17ba80f4fc21958ac3287648e13b05 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,20 @@ +欢迎使用PaddleX! +======================================= + +PaddleX是基于飞桨核心框架、开发套件和工具组件的深度学习全流程开发工具。具备 **全流程打通** 、**融合产业实践** 、**易用易集成** 三大特点。 + + +.. toctree:: + :maxdepth: 2 + :caption: PaddleX使用文档目录 + + quick_start.md + install.md + data/index + train/index + deploy/index + examples/index + gui/index + apis/index + change_log.md + appendix/index diff --git a/docs/install.md b/docs/install.md new file mode 100755 index 0000000000000000000000000000000000000000..f087632aaf65e55279b43bdcdd40223c93886c66 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,43 @@ +# 快速安装 + +以下安装过程默认用户已安装好**paddlepaddle-gpu或paddlepaddle(版本大于或等于1.8.1)**,paddlepaddle安装方式参照[飞桨官网](https://www.paddlepaddle.org.cn/install/quick) + +## pip安装 + +> 注意其中pycocotools在Windows安装较为特殊,可参考下面的Windows安装命令 + +``` +pip install paddlex -i https://mirror.baidu.com/pypi/simple +``` + +## Anaconda安装 +Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。使用Anaconda可以通过创建多个独立的Python环境,避免用户的Python环境安装太多不同版本依赖导致冲突。 +- 参考[Anaconda安装PaddleX文档](appendix/anaconda_install.md) + +## 代码安装 + +github代码会跟随开发进度不断更新 + +``` +git clone https://github.com/PaddlePaddle/PaddleX.git +cd PaddleX +git checkout develop +python setup.py install +``` + + +## pycocotools安装问题 + +> PaddleX依赖pycocotools包,如安装pycocotools失败,可参照如下方式安装pycocotools + +> Windows安装时可能会提示缺少`Microsoft Visual C++ 2015 build tools`,[点击下载VC build tools](https://go.microsoft.com/fwlink/?LinkId=691126)安装再执行如下pip命令 +``` +pip install cython +pip install git+https://gitee.com/jiangjiajun/philferriere-cocoapi.git#subdirectory=PythonAPI +``` + +> Linux/Mac系统下,直接使用pip安装如下两个依赖即可 +``` +pip install cython +pip install pycocotools +``` diff --git a/docs/make.bat b/docs/make.bat new file mode 100755 index 0000000000000000000000000000000000000000..2119f51099bf37e4fdb6071dce9f451ea44c62dd --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/paddlex.png b/docs/paddlex.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1135abfab7aa48f29392da4bca614f688314af Binary files /dev/null and b/docs/paddlex.png differ diff --git a/docs/quick_start.md b/docs/quick_start.md new file mode 100644 index 0000000000000000000000000000000000000000..db23eb58b71b72b72d3bedb7290a9d6b967ddaa2 --- /dev/null +++ b/docs/quick_start.md @@ -0,0 +1,124 @@ +# 10分钟快速上手使用 + +本文档在一个小数据集上展示了如何通过PaddleX进行训练,您可以阅读PaddleX的**使用教程**来了解更多模型任务的训练使用方式。本示例同步在AIStudio上,可直接[在线体验模型训练](https://aistudio.baidu.com/aistudio/projectdetail/439860) + +PaddleX中的所有模型训练跟随以下3个步骤,即可快速完成训练代码开发! + +| 步骤 | |说明 | +| :--- | :--------------- | :-------------- | +| 第1步| 定义transforms | 用于定义模型训练、验证、预测过程中,
输入图像的预处理和数据增强操作 | +| 第2步| 定义datasets | 用于定义模型要加载的训练、验证数据集 | +| 第3步| 定义模型开始训练 | 选择需要的模型,进行训练 | + +> **注意**:不同模型的transforms、datasets和训练参数都有较大差异,更多模型训练,可直接根据文档教程获取更多模型的训练代码。[模型训练教程](train/index.html) + +PaddleX的其它用法 + +- 加载训练保存的模型进行预测 +- [使用VisualDL查看训练过程中的指标变化]() + + + +**1. 安装PaddleX** +> 安装相关过程和问题可以参考PaddleX的[安装文档](./install.md)。 +``` +pip install paddlex -i https://mirror.baidu.com/pypi/simple +``` + + +**2. 准备蔬菜分类数据集** +``` +wget https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz +tar xzvf vegetables_cls.tar.gz +``` + + +**3. 定义训练/验证图像处理流程transforms** + +由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在`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([ + 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() +]) +``` + + +**4. 定义`dataset`加载图像分类数据集** + +定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集 +- [paddlex.datasets.ImageNet接口说明](apis/datasets/classification.md) +- [ImageNet数据格式说明](data/format/classification.md) + +``` +train_dataset = pdx.datasets.ImageNet( + data_dir='vegetables_cls', + file_list='vegetables_cls/train_list.txt', + label_list='vegetables_cls/labels.txt', + transforms=train_transforms, + shuffle=True) +eval_dataset = pdx.datasets.ImageNet( + data_dir='vegetables_cls', + file_list='vegetables_cls/val_list.txt', + label_list='vegetables_cls/labels.txt', + transforms=eval_transforms) +``` + + +**5. 使用MobileNetV3_small_ssld模型开始训练** + +本文档中使用百度基于蒸馏方法得到的MobileNetV3预训练模型,模型结构与MobileNetV3一致,但精度更高。PaddleX内置了20多种分类模型,查阅[PaddleX模型库](appendix/model_zoo.md)了解更多分类模型。 +``` +num_classes = len(train_dataset.labels) +model = pdx.cls.MobileNetV3_small_ssld(num_classes=num_classes) + +model.train(num_epochs=20, + train_dataset=train_dataset, + train_batch_size=32, + eval_dataset=eval_dataset, + lr_decay_epochs=[4, 6, 8], + save_dir='output/mobilenetv3_small_ssld', + use_vdl=True) +``` + + +**6. 训练过程使用VisualDL查看训练指标变化** + +模型在训练过程中,训练指标和在验证集上的指标,均会以标准输出流形式,输出到命令终端。在用户设定`use_vdl=True`的前提下,也会使用VisualDL格式打点到`save_dir`目录下的`vdl_log`文件夹,用户可都终端通过如下命令启动visualdl,查看可视化的指标变化趋势。 +``` +visualdl --logdir output/mobilenetv3_small_ssld --port 8001 +``` +服务启动后,通过浏览器打开https://0.0.0.0:8001或https://localhost:8001即可。 + +> 如果您使用的是AIStudio平台进行训练,不能通过此方式启动visualdl,请参考AIStudio VisualDL启动教程使用 + + +**7. 加载训练保存的模型预测** + +模型在训练过程中,会每间隔一定轮数保存一次模型,在验证集上评估效果最好的一轮会保存在`save_dir`目录下的`best_model`文件夹。通过如下方式可加载模型,进行预测。 +- [load_model接口说明](apis/load_model.md) +- [分类模型predict接口说明](apis/models/classification.html#predict) +``` +import paddlex as pdx +model = pdx.load_model('output/mobilenetv3_small_ssld/best_model') +result = model.predict('vegetables_cls/bocai/100.jpg') +print("Predict Result: ", result) +``` +预测结果输出如下, +``` +Predict Result: Predict Result: [{'score': 0.9999393, 'category': 'bocai', 'category_id': 0}] +``` + + +**更多使用教程** +- 1.[目标检测模型训练](tutorials/train/detection.md) +- 2.[语义分割模型训练](tutorials/train/segmentation.md) +- 3.[实例分割模型训练](tutorials/train/instance_segmentation.md) +- 3.[模型太大,想要更小的模型,试试模型裁剪吧!](tutorials/compress/classification.md) diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100755 index 0000000000000000000000000000000000000000..f11fa32f6f465f7b002d7fd37cbd78203206d8d7 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +sphinx +recommonmark +sphinx_markdown_tables +sphinx_rtd_theme diff --git a/docs/train/classification.md b/docs/train/classification.md new file mode 100644 index 0000000000000000000000000000000000000000..289ab23cdf539cbe9e4bcce086d858000326dd23 --- /dev/null +++ b/docs/train/classification.md @@ -0,0 +1,32 @@ +# 图像分类 + +## 介绍 + +PaddleX共提供了20+的图像分类模型,可满足开发者不同场景的需求下的使用。 + +- **Top1精度**: 模型在ImageNet数据集上的测试精度 +- **预测速度**:单张图片的预测用时(不包括预处理和后处理) +- "-"表示指标暂未更新 + +| 模型(点击获取代码) | Top1精度 | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | :----- | +| [MobileNetV3_small_ssld](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/mobilenetv3_small_ssld.py) | 71.3% | 21.0MB | 6.809ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [MobileNetV2](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/mobilenetv2.py) | 72.2% | 14.0MB | 4.546ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [ShuffleNetV2](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/shufflenetv2.py) | 68.8% | 9.0MB | 6.101ms | - | 模型体积小,预测速度快,适用于低性能或移动端设备 | +| [ResNet50_vd_ssld](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/resnet50_vd_ssld.py) | 82.4% | 102.8MB | 9.058ms | - | 模型精度高,适用于服务端部署 | + + +## 开始训练 + +> 代码保存到本地后,即可直接训练,**训练代码会自动下载训练数据开始训练** +> > 如保存为`mobilenetv3_small_ssld.py`,如下命令即可开始训练 +> > ``` +> > python mobilenetv3_small_ssld.py +> > ``` + + +## 相关文档 + +- 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) +- 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) +- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/docs/train/index.rst b/docs/train/index.rst new file mode 100755 index 0000000000000000000000000000000000000000..d88ea52dce1b5b9dbdb9d0101454fde8d4aac5c7 --- /dev/null +++ b/docs/train/index.rst @@ -0,0 +1,15 @@ +模型训练 +======================================= + +PaddleX目前集成了XX模型,涵盖视觉领域的图像分类、目标检测、实例分割和语义分割四大主流任务 + + +.. toctree:: + :maxdepth: 1 + :caption: 文档目录: + + classification.md + object_detection.md + instance_segmentation.md + semantic_segmentation.md + prediction.md diff --git a/docs/train/instance_segmentation.md b/docs/train/instance_segmentation.md new file mode 100644 index 0000000000000000000000000000000000000000..51b7337c3df3ce9a707c7c038ded5279e1159ae2 --- /dev/null +++ b/docs/train/instance_segmentation.md @@ -0,0 +1,30 @@ +# 实例分割 + +## 介绍 + +PaddleX目前提供了MaskRCNN实例分割模型结构,多种backbone模型,可满足开发者不同场景和性能的需求。 + +- **Box MMAP/Seg MMAP**: 模型在COCO数据集上的测试精度 +- **预测速度**:单张图片的预测用时(不包括预处理和后处理) +- "-"表示指标暂未更新 + +| 模型(点击获取代码) | Box MMAP/Seg MMAP | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | :----- | +| [MaskRCNN-ResNet50-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_r50_fpn.py) | -/- | 136.0MB | 197.715ms | - | 模型精度高,适用于服务端部署 | +| [MaskRCNN-ResNet18-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_r18_fpn.py) | -/- | - | - | - | 模型精度高,适用于服务端部署 | +| [MaskRCNN-HRNet-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_hrnet_fpn.py) | -/- | 115.MB | 81.592ms | - | 模型精度高,预测速度快,适用于服务端部署 | + + +## 开始训练 + +> 代码保存到本地后,即可直接训练,**训练代码会自动下载训练数据开始训练** +> > 如保存为`mask_r50_fpn.py`,如下命令即可开始训练 +> > ``` +> > python mask_r50_fpn.py +> > ``` + +## 相关文档 + +- 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) +- 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) +- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/docs/train/object_detection.md b/docs/train/object_detection.md new file mode 100644 index 0000000000000000000000000000000000000000..e1aae0bbf619010a67f592ac490cb45cddd88666 --- /dev/null +++ b/docs/train/object_detection.md @@ -0,0 +1,34 @@ +# 目标检测 + +## 介绍 + +PaddleX目前提供了FasterRCNN和YOLOv3两种检测结构,多种backbone模型,可满足开发者不同场景和性能的需求。 + +- **Box MMAP**: 模型在COCO数据集上的测试精度 +- **预测速度**:单张图片的预测用时(不包括预处理和后处理) +- "-"表示指标暂未更新 + +| 模型(点击获取代码) | Box MMAP | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | :----- | +| [YOLOv3-MobileNetV1](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_mobilenetv1.py) | 29.3% | 99.2MB | 15.442ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [YOLOv3-MobileNetV3](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_mobilenetv3.py) | 31.6% | 100.7MB | 143.322ms | - | 模型小,移动端上预测速度有优势 | +| [YOLOv3-DarkNet53](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_darknet53.py) | 38.9 | 249.2MB | 42.672ms | - | 模型较大,预测速度快,适用于服务端 | +| [FasterRCNN-ResNet50-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/faster_r50_fpn.py) | 37.2% | 136.0MB | 197.715ms | - | 模型精度高,适用于服务端部署 | +| [FasterRCNN-ResNet18-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/faster_r18_fpn.py) | - | - | - | - | 模型精度高,适用于服务端部署 | +| [FasterRCNN-HRNet-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/faster_hrnet_fpn.py) | 36.0% | 115.MB | 81.592ms | - | 模型精度高,预测速度快,适用于服务端部署 | + + +## 开始训练 + +> 代码保存到本地后,即可直接训练,**训练代码会自动下载训练数据开始训练** +> > 如保存为`yolov3_mobilenetv1.py`,如下命令即可开始训练 +> > ``` +> > python yolov3_mobilenetv1.py +> > ``` + + +## 相关文档 + +- 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) +- 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) +- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/docs/train/prediction.md b/docs/train/prediction.md new file mode 100644 index 0000000000000000000000000000000000000000..9d08500f3480d4b430966bee34a238de353fbfdb --- /dev/null +++ b/docs/train/prediction.md @@ -0,0 +1,40 @@ +# 加载模型预测 + +PaddleX可以使用`load_model`接口加载模型(包括训练过程中保存的模型,导出的部署模型,量化模型以及裁剪的模型)进行预测,同时PaddleX中也内置了一系列的可视化工具函数,帮助用户方便地检查模型的效果。 + +## 图像分类 +``` +import paddlex as pdx +model = pdx.load_model('./mobilenetv2') +result = model.predict('./mobilenetv2/test.jpg') +print("Predict Result: ", result) +``` + + +## 目标检测和实例分割 +``` +import paddlex as pdx +test_jpg = './xiaoduxiong_epoch_12/test.jpg' +model = pdx.load_model('./xiaoduxiong_epoch_12') +result = model.predict(test_jpg) +pdx.det.visualize(test_jpg, result, thresh=0.5, save_dir='./') +``` +在上述示例代码中,通过调用`paddlex.det.visualize`可以对目标检测/实例分割的预测结果进行可视化,可视化的结果保存在`save_dir`下。 +> 注意:目标检测和实例分割模型在调用`predict`接口得到的结果需用户自行过滤低置信度结果,在`paddlex.det.visualize`接口中,我们提供了`thresh`用于过滤,置信度低于此值的结果将被过滤,不会可视化。 + + +## 语义分割 +``` +import paddlex as pdx +test_jpg = './deeplabv3p_mobilenetv2_coco/test.jpg' +model = pdx.load_model('./deeplabv3p_mobilenetv2_coco') +result = model.predict(test_jpg) +pdx.seg.visualize(test_jpg, result, weight=0.0, save_dir='./') +``` +在上述示例代码中,通过调用`paddlex.seg.visualize`可以对语义分割的预测结果进行可视化,可视化的结果保存在`save_dir`下。其中`weight`参数用于调整预测结果和原图结果融合展现时的权重,0.0时只展示预测结果mask的可视化,1.0时只展示原图可视化。 + + +PaddleX的`load_model`接口可以满足用户一般的模型调研需求,如若为更高性能的预测部署,可以参考如下文档 + +- [服务端Python部署]() +- [服务端C++部署]() diff --git a/docs/train/semantic_segmentation.md b/docs/train/semantic_segmentation.md new file mode 100644 index 0000000000000000000000000000000000000000..f9fba81f39c840ab82006ff7f398b73de237a4cb --- /dev/null +++ b/docs/train/semantic_segmentation.md @@ -0,0 +1,34 @@ +# 语义分割 + +## 介绍 + +PaddleX目前提供了DeepLabv3p、UNet、HRNet和FastSCNN四种语义分割结构,多种backbone模型,可满足开发者不同场景和性能的需求。 + +- **mIOU**: 模型在COCO数据集上的测试精度 +- **预测速度**:单张图片的预测用时(不包括预处理和后处理) +- "-"表示指标暂未更新 + +| 模型(点击获取代码) | Box MMAP | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | :----- | +| [DeepLabv3p-MobileNetV2-x0.25](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_mobilenetv1.py) | 29.3% | 99.2MB | 15.442ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [DeepLabv3p-MobileNetV2-x1.0](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_mobilenetv1.py) | 29.3% | 99.2MB | 15.442ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [DeepLabv3p-Xception65](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_mobilenetv3.py) | 31.6% | 100.7MB | 143.322ms | - | 模型小,移动端上预测速度有优势 | +| [UNet](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/yolov3_darknet53.py) | 38.9 | 249.2MB | 42.672ms | - | 模型较大,预测速度快,适用于服务端 | +| [HRNet](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/faster_r50_fpn.py) | 37.2% | 136.0MB | 197.715ms | - | 模型精度高,适用于服务端部署 | +| [FastSCNN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/image_classification/faster_r18_fpn.py) | - | - | - | - | 模型精度高,适用于服务端部署 | + + +## 开始训练 + +> 代码保存到本地后,即可直接训练,**训练代码会自动下载训练数据开始训练** +> > 如保存为`deeplabv3p_mobilenetv2_x0.25.py`,如下命令即可开始训练 +> > ``` +> > python deeplabv3p_mobilenetv2_x0.25.py +> > ``` + + +## 相关文档 + +- 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) +- 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) +- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。