diff --git a/docs/data/annotation.md b/docs/data/annotation.md new file mode 100755 index 0000000000000000000000000000000000000000..7b65f82c99643c6f1cfd964daeb781623f101f2d --- /dev/null +++ b/docs/data/annotation.md @@ -0,0 +1,31 @@ +# 数据标注工具 + +PaddleX支持图像分类、目标检测、实例分割和语义分割四大视觉领域常见的任务,对于每类视觉任务,都支持了特定的数据格式。PaddleX目前支持了图像分类的ImageNet格式,目标检测的PascalVOC格式,实例分割的MSCOCO格式(MSCOCO也可以用于目标检测)以及语义分割数据格式。 + +## 常见标注工具 + +> 图像分类无需标注工具,用户只需以txt文件记录每张图片的类别标签即可。 +> 对于目标检测、实例分割和语义分割,PaddleX已经与主流的标注工具进行了适配,用户可根据自己的需求,选择以下标注工具进行数据标注。 + +| 标注工具 | 图像分类 | 目标检测 | 实例分割 | 语义分割 | 安装 | +| :--------- | :------- | :------ | :------ | :------- | :----------------------------------------------- | +| Labelme | - | √ | √ | √ | pip install labelme (本地数据标注) | +| 精灵标注 | √ | √ | √ | √ | [官网下载](http://www.jinglingbiaozhu.com/) (本地数据标注) | +| EasyData | √ | √ | √ | √ | [Web页面标注](https://ai.baidu.com/easydata/) (需上传数据进行标注) | + +数据标注完成后,参照如下流程,将标注数据转为可用PaddleX模型训练的数据组织格式。 + + +## 标注数据格式转换 + +目前所有标注工具,生成的标注文件,均为与原图同名的json格式文件,如`1.jpg`在标注完成后,则会在标注文件保存的目录生成`1.json`文件。转换时参照以下步骤 +> 1. 将所有的原图文件放在同一个目录下,如`pics`目录 +> 2. 将所有的标注json文件放在同一个目录下,如`annotations`目录 +> 3. 使用如下命令进行转换 +``` +paddlex --data_conversion --from labelme --to PascalVOC --pics ./pics --annotations ./annotations --save_dir ./converted_dataset_dir +``` +> `--from`表示数据标注来源,支持`labelme`、`jingling`和`easydata`(分别表示数据来源于LabelMe,精灵标注助手和EasyData) +> `--to`表示数据需要转换成为的格式,支持`PascalVOC`(目标检测),`MSCOCO`(实例分割,也可用于目标检测)和`SEG`(语义分割) +> `--pics`指定原图所在的目录路径 +> `--annotations`指定标注文件所在的目录路径 diff --git a/docs/data/annotation/classification.md b/docs/data/annotation/classification.md deleted file mode 100644 index d6f03649ec0f0e19a2a018c147e4643170bd7dd3..0000000000000000000000000000000000000000 --- a/docs/data/annotation/classification.md +++ /dev/null @@ -1 +0,0 @@ -# 图像分类数据准备 diff --git a/docs/data/annotation/conversion.md b/docs/data/annotation/conversion.md deleted file mode 100644 index 368061a6e07a3ac664e6bf475e2b65d07eaa8dc6..0000000000000000000000000000000000000000 --- a/docs/data/annotation/conversion.md +++ /dev/null @@ -1 +0,0 @@ -# 标注数据格式转换 diff --git a/docs/data/annotation/index.rst b/docs/data/annotation/index.rst deleted file mode 100755 index 27eee50ecab85e3e090f96e492c9bcb9b7bae2bd..0000000000000000000000000000000000000000 --- a/docs/data/annotation/index.rst +++ /dev/null @@ -1,13 +0,0 @@ -数据标注 -======================================= - - -.. toctree:: - :maxdepth: 2 - :caption: 文档目录: - - classification.md - object_detection.md - instance_segmentation.md - semantic_segmentation.md - conversion.md diff --git a/docs/data/annotation/instance_segmentation.md b/docs/data/annotation/instance_segmentation.md deleted file mode 100644 index 86d1597d385021fbfac799bd9952836a068caaa6..0000000000000000000000000000000000000000 --- a/docs/data/annotation/instance_segmentation.md +++ /dev/null @@ -1 +0,0 @@ -# 实例分割数据标注 diff --git a/docs/data/annotation/object_detection.md b/docs/data/annotation/object_detection.md deleted file mode 100644 index 0472b4e37403f16a74f2826f48418e647d9862fa..0000000000000000000000000000000000000000 --- a/docs/data/annotation/object_detection.md +++ /dev/null @@ -1 +0,0 @@ -# 目标检测数据标注 diff --git a/docs/data/annotation/semantic_segmentation.md b/docs/data/annotation/semantic_segmentation.md deleted file mode 100644 index c87407888e213d2effc8630545e87e8315aa3500..0000000000000000000000000000000000000000 --- a/docs/data/annotation/semantic_segmentation.md +++ /dev/null @@ -1 +0,0 @@ -# 语义分割数据标注 diff --git a/docs/data/format/classification.md b/docs/data/format/classification.md index b0e756aea5155b88218d5cfddbd785f28b33362d..70ed5ac34e07ee97321b9eb51168f964ed82f274 100644 --- a/docs/data/format/classification.md +++ b/docs/data/format/classification.md @@ -1 +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 index 1659d9cad37505bc829e5fe2c6d2adca8055f63a..19d2ed339bb1424df57b519abf100ae398f35f96 100644 --- a/docs/data/format/detection.md +++ b/docs/data/format/detection.md @@ -1 +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 index a89ba94739f3b59d9ed889f245b58f6541816bd7..98157ad2b3450eb10be43dc4e91fa159dbfdd4a4 100755 --- a/docs/data/format/index.rst +++ b/docs/data/format/index.rst @@ -1,4 +1,4 @@ -PaddleX数据格式说明 +数据格式说明 ======================================= @@ -8,4 +8,5 @@ PaddleX数据格式说明 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 index ea2f90de05f3d7ddcf4aca6b6eded7e8ab6369c9..f91a9ea28368e8e0d14462a002ed0482d3843d25 100644 --- a/docs/data/format/segmentation.md +++ b/docs/data/format/segmentation.md @@ -1 +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 index aa7350873494aec0bb0f5cc74fd1b1ee2cc99ba4..419ed81f528fe786dca3e6a0d777c1412859dfb7 100755 --- a/docs/data/index.rst +++ b/docs/data/index.rst @@ -6,5 +6,5 @@ :maxdepth: 2 :caption: 文档目录: - annotation/index + annotation.md format/index diff --git a/docs/deploy/export_model.md b/docs/deploy/export_model.md new file mode 100644 index 0000000000000000000000000000000000000000..7e9eed088c3db7925cf6564b8d4cb892499209f1 --- /dev/null +++ b/docs/deploy/export_model.md @@ -0,0 +1 @@ +# 部署模型导出 diff --git a/docs/deploy/index.rst b/docs/deploy/index.rst index d2c963a0f2063dd83ae4810438914950941cf608..23337c7d279ce624a22c048c6ffc716c72d89090 100755 --- a/docs/deploy/index.rst +++ b/docs/deploy/index.rst @@ -6,6 +6,7 @@ :maxdepth: 2 :caption: 文档目录: + export_model.md server/index nvidia-jetson.md openvino/index 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..6e2e0c20b536fff2d273cbad3dee9c3002f02123 --- /dev/null +++ b/docs/deploy/server/cpp/linux.md @@ -0,0 +1 @@ +# Linux编译部署 diff --git a/docs/deploy/server/cpp/windows.md b/docs/deploy/server/cpp/windows.md new file mode 100644 index 0000000000000000000000000000000000000000..863bda3b00f1b7d6e11a12f680ba8a9065ac1346 --- /dev/null +++ b/docs/deploy/server/cpp/windows.md @@ -0,0 +1 @@ +# Windows编译部署 diff --git a/docs/deploy/server/index.rst b/docs/deploy/server/index.rst index 0fc4985f0277897ca39de06d031520a139052643..f362afa915f85a832ed1aa152d845333f3764f45 100755 --- a/docs/deploy/server/index.rst +++ b/docs/deploy/server/index.rst @@ -6,6 +6,6 @@ :maxdepth: 2 :caption: 文档目录: - windows.md - linux.md + python.md + cpp/index encryption.md diff --git a/docs/deploy/server/linux.md b/docs/deploy/server/linux.md deleted file mode 100644 index 345abeee1b8c41a835479eca02f7d48473a9ee7f..0000000000000000000000000000000000000000 --- a/docs/deploy/server/linux.md +++ /dev/null @@ -1 +0,0 @@ -# Linux服务端部署 diff --git a/docs/deploy/server/python.md b/docs/deploy/server/python.md new file mode 100644 index 0000000000000000000000000000000000000000..3017d972bb5934f456adb2535ef669290dcced57 --- /dev/null +++ b/docs/deploy/server/python.md @@ -0,0 +1 @@ +# 服务端Python部署 diff --git a/docs/deploy/server/windows.md b/docs/deploy/server/windows.md deleted file mode 100644 index 06bcee7d4f96a60505476ff0cf0dc5f2740c6d28..0000000000000000000000000000000000000000 --- a/docs/deploy/server/windows.md +++ /dev/null @@ -1 +0,0 @@ -# Windows服务端部署 diff --git a/docs/index.rst b/docs/index.rst index 45616d4bbe043c236ff5762e4c364c433cb0380c..8308b56bf1eb330fcf608ddd33132339dd47d7d5 100755 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,23 +3,10 @@ PaddleX是基于飞桨核心框架、开发套件和工具组件的深度学习全流程开发工具。具备 **全流程打通** 、**融合产业实践** 、**易用易集成** 三大特点。 -全流程打通 - | - **数据准备**: 支持 `EasyData智能数据服务平台数据协议 `_ ,通过平台便捷完成智能标注,低质数据清洗工作;同时兼容主流标注工具协议, 助力开发者更快完成数据准备工作。 - | - **模型训练**: 基于飞桨核心框架集成 `PaddleClas `_ ,`PaddleDetection `_ ,`PaddleSeg `_ 视觉开发套件,丰富的高质量预训练模型,更快实现工业级模型训练。 - | - **模型调优**: 内置模型可解释性模块、`VisualDL `_ 可视化分析组件,提供丰富的信息更好地理解模型,优化模型。 - | - **多端安全部署**: 内置 `PaddleSlim `_ 模型压缩工具和AES模型加密SDK,结合Paddle Inference和 `Paddle Lite `_ 便捷完成高性能的多端安全部署。 - -融合产业实践 - | - 精选飞桨产业实践的成熟模型结构,开放案例实践教程,加速开发者产业落地。 - -易用易集成 - | - 统一易用的全流程API,5步完成模型训练,10行代码实现Python/C++高性能部署。 - | - 提供以PaddleX为核心集成的跨平台可视化开发工具PaddleX-GUI,更低门槛快速体验飞桨深度学习全流程。 - .. toctree:: :maxdepth: 2 - :caption: 文档目录: + :caption: PaddleX使用文档目录 quick_start.md install.md diff --git a/docs/install.md b/docs/install.md index cdbc84cab3dc825e69e325348b3c528d83bcd225..d513fab442c8d6139c3850b3d1228dae6e52a671 100755 --- a/docs/install.md +++ b/docs/install.md @@ -1,10 +1,13 @@ # 快速安装 -以下安装过程默认用户已安装好**paddlepaddle-gpu或paddlepaddle(版本大于或等于1.7.1)**,paddlepaddle安装方式参照[飞桨官网](https://www.paddlepaddle.org.cn/install/quick) +以下安装过程默认用户已安装好**paddlepaddle-gpu或paddlepaddle(版本大于或等于1.8.1)**,paddlepaddle安装方式参照[飞桨官网](https://www.paddlepaddle.org.cn/install/quick) -> 推荐使用Anaconda Python环境,Anaconda下安装PaddleX参考文档[Anaconda安装使用](../appendix/anaconda_install.md) +- pip安装PaddleX +- github代码安装PaddleX +- pycocotools安装问题 -## pip安装 + +**安装方式一 pip安装** > 注意其中pycocotools在Windows安装较为特殊,可参考下面的Windows安装命令 @@ -12,8 +15,9 @@ pip install paddlex -i https://mirror.baidu.com/pypi/simple ``` + +**安装方式二 Github代码安装** -## Github代码安装 github代码会跟随开发进度不断更新 ``` @@ -24,18 +28,17 @@ python setup.py install ``` -## 安装问题 -### 1. pycocotools安装问题 + +**pycocotools安装问题** > PaddleX依赖pycocotools包,如安装pycocotools失败,可参照如下方式安装pycocotools -**Windows** -> Windows安装时可能会提示缺少`Microsoft Visual C++ 2015 build tools`,[点击下载](https://go.microsoft.com/fwlink/?LinkId=691126)安装再执行如下pip命令 +> 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安装** +> Linux/Mac系统下,直接使用pip安装如下两个依赖即可 ``` pip install cython pip install pycocotools diff --git a/docs/quick_start.md b/docs/quick_start.md index a24cdadf410abd738750a18b4f5e99b8265cb7d3..5baa679bad17c61b315c21bb421bbbdd55a87bcf 100644 --- a/docs/quick_start.md +++ b/docs/quick_start.md @@ -2,47 +2,51 @@ 本文档在一个小数据集上展示了如何通过PaddleX进行训练,您可以阅读PaddleX的**使用教程**来了解更多模型任务的训练使用方式。本示例同步在AIStudio上,可直接[在线体验模型训练](https://aistudio.baidu.com/aistudio/projectdetail/439860) +PaddleX的模型训练都分为以下几个步骤 +> 1.定义训练/验证图像处理流程transforms +> 2.定义dataset加载数据集 +> 3.定义模型开始训练 +> 4.加载训练保存的模型进行预测 -## 1. 安装PaddleX + +**1. 安装PaddleX** > 安装相关过程和问题可以参考PaddleX的[安装文档](./install.md)。 ``` pip install paddlex -i https://mirror.baidu.com/pypi/simple ``` -## 2. 准备蔬菜分类数据集 + +**2. 准备蔬菜分类数据集** ``` wget https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz tar xzvf vegetables_cls.tar.gz ``` -## 3. 训练代码开发 -PaddleX的所有模型训练和预测均只涉及到5个API接口,分别是 -> - [transforms](apis/transforms/index.html) 图像数据处理 -> - [datasets](apis/datasets/classification.md) 数据集加载 -> - [models](apis/models/classification.md) 模型类型定义 -> - [train](apis/models/classification.html#train) 开始训练 -> - [predict](apis/models/classification.html#predict) 模型预测 - -在本示例,通过如下`train.py`代码进行训练, 训练环境为1张Tesla P40 GPU卡。 + +**3. 定义训练/验证图像处理流程transforms** -### 3.1 定义`transforms`数据处理流程 -由于训练时数据增强操作的加入,因此模型在训练和验证过程中,数据处理流程需要分别进行定义。如下所示,代码在`train_transforms`中加入了[RandomCrop](apis/transforms/cls_transforms.html#RandomCrop)和[RandomHorizontalFlip](apis/transforms/cls_transforms.html#RandomHorizontalFlip)两种数据增强方式, 更多方法可以参考[数据增强文档](apis/transforms/augment.md)。 +使用PaddleX内置的分类模型训练图像处理流程`ComposedClsTransforms`,点击查看[API文档说明](apis/transforms/classification.html#composedclstransforms)。`ComposedClsTransforms`内置`RandomHorizontalFlip`图像增强,用户也可通过`add_augmenters`函数,为训练过程添加更多数据增强操作,目前分类过程支持多程数据增强操作,详情查阅[数据增强文档](apis/transforms/data_augmentations.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() -]) +train_transforms = transforms.ComposedClsTransforms( + mode='train', + crop_size=[224, 224]) +eval_transforms = transforms.ComposedClsTransforms( + mode='eval', + crop_size=[224, 224]) ``` +通过`add_augmenters`添加更多训练过程中的数据增强操作,例如 +``` +train_transforms.add_augmenters([transforms.RandomDistort()]) +``` + + +**4. 定义`dataset`加载图像分类数据集** + +定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集 +- [paddlex.datasets.ImageNet接口说明](apis/datasets/classification.md) +- [ImageNet数据格式说明](data/format/classification.md) -### 3.2 定义`dataset`加载数据集 -定义数据集,`pdx.datasets.ImageNet`表示读取ImageNet格式的分类数据集, 更多数据集细节可以查阅[数据集格式说明](datasets.md)和[ImageNet接口文档](apis/datasets/classification.md) ``` train_dataset = pdx.datasets.ImageNet( data_dir='vegetables_cls', @@ -57,53 +61,53 @@ eval_dataset = pdx.datasets.ImageNet( transforms=eval_transforms) ``` -### 3.3 定义分类模型 + +**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) -``` -### 3.4 定义训练参数 -定义好模型后,即可直接调用`train`接口,定义训练时的参数,分类模型内置了`piecewise_decay`学习率衰减策略,相关参数见[分类train接口文档](apis/models/classification.html#train)。 -``` -model.train(num_epochs=10, +model.train(num_epochs=20, train_dataset=train_dataset, train_batch_size=32, eval_dataset=eval_dataset, lr_decay_epochs=[4, 6, 8], - learning_rate=0.025, - save_dir='output/mobilenetv2', + save_dir='output/mobilenetv3_small_ssld', use_vdl=True) ``` -## 4. 模型开始训练 -`train.py`与解压后的数据集目录`vegetables_cls`放在同一目录下,在此目录下运行`train.py`即可开始训练。如果您的电脑上有GPU,这将会在10分钟内训练完成,如果为CPU也大概会在30分钟内训练完毕。 -``` -python train.py -``` + +**6. 训练过程使用VisualDL查看训练指标变化** -## 5. 训练过程中查看训练指标 -模型在训练过程中,所有的迭代信息将以标注输出流的形式,输出到命令执行的终端上,用户也可通过visualdl以可视化的方式查看训练指标的变化,通过如下方式启动visualdl后,在浏览器打开https://0.0.0.0:8001 (或 https://localhost:8001)即可。 +模型在训练过程中,训练指标和在验证集上的指标,均会以标准输出流形式,输出到命令终端。在用户设定`use_vdl=True`的前提下,也会使用VisualDL格式打点到`save_dir`目录下的`vdl_log`文件夹,用户可都终端通过如下命令启动visualdl,查看可视化的指标变化趋势。 ``` -visualdl --logdir output/mobilenetv2/vdl_log --port 8001 +visualdl --logdir output/mobilenetv3_small_ssld --port 8001 ``` -![](./images/vdl1.jpg) +服务启动后,通过浏览器打开https://0.0.0.0:8001或https://localhost:8001即可。 + +> 如果您使用的是AIStudio平台进行训练,不能通过此方式启动visualdl,请参考AIStudio VisualDL启动教程使用 + + +**7. 加载训练保存的模型预测** -## 6. 训练完成使用模型进行测试 -如下代码使用训练过程中第8轮保存的模型进行测试。 +模型在训练过程中,会每间隔一定轮数保存一次模型,在验证集上评估效果最好的一轮会保存在`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/mobilenetv2/epoch_8') -result = model.predict('vegetables_cls/bocai/100.jpg', topk=3) -print("Predict Result:", result) +model = pdx.load_model('output/mobilenetv3_small_ssld/best_model') +result = model.predict('vegetables_cls/bocai/100.jpg') +print("Predict Result: ", result) ``` -> 预测结果输出如下,预测按score进行排序,得到前三分类结果 +预测结果输出如下, ``` -Predict Result: Predict Result: [{'score': 0.9999393, 'category': 'bocai', 'category_id': 0}, {'score': 6.010089e-05, 'category': 'hongxiancai', 'category_id': 2}, {'score': 5.593914e-07, 'category': 'xilanhua', 'category_id': 5}] +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) diff --git a/docs/train/classification.md b/docs/train/classification.md index b0e756aea5155b88218d5cfddbd785f28b33362d..6ed0a428afa73d5173542f5acc0f8748f41baf07 100644 --- a/docs/train/classification.md +++ b/docs/train/classification.md @@ -1 +1,24 @@ # 图像分类 + +PaddleX共提供了20+的图像分类模型,包括基于大规模数据训练的 + +点击表格中模型名,可获取各模型训练的教程代码 + +| 模型 | Top1精度 | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | | +| ResNet50_vd_ssld | 97.5% | 22M | 10ms | 200ms | | +| ResNet101_vd_ssld | | | | | | +| MobileNetV3_small_ssld | | | | | | +| MobileNetV3_large_ssld | | | | | | +| MobileNetV2 | | | | | | +| ShuffleNetV2 | | | | | | +| AlexNet | | | | | | + + +将对应模型的训练代码保存到本地后,即可直接训练,训练代码会自动下载训练数据开始训练,如保存为`resnet50_vd_ssld.py`,如下命令即可开始训练 +``` +python resnet50_vd_ssld.py +``` + +- 针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数。[——>>传送门]() +- 没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门]() diff --git a/docs/train/index.rst b/docs/train/index.rst index 5995489d59cb87ad4f82913c7f6e7b5647b3bce8..d88ea52dce1b5b9dbdb9d0101454fde8d4aac5c7 100755 --- a/docs/train/index.rst +++ b/docs/train/index.rst @@ -5,7 +5,7 @@ PaddleX目前集成了XX模型,涵盖视觉领域的图像分类、目标检 .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: 文档目录: classification.md diff --git a/docs/train/instance_segmentation.md b/docs/train/instance_segmentation.md index ec1d364fb6e011f89f383da3e7b07b60300011f9..2117dc3124c83c5c1df29d224f416f6671b12866 100644 --- a/docs/train/instance_segmentation.md +++ b/docs/train/instance_segmentation.md @@ -1 +1,15 @@ # 实例分割 + +| 模型 | Top1精度 | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | | +| MaskRCNN-ResNet50-FPN | 97.5% | 22M | 10ms | 200ms | | +| MaskRCNN-ResNet101-FPN | | | | | | +| MaskRCNN-HRNet-FPN | | | | | | + +将对应模型的训练代码保存到本地后,即可直接训练,训练代码会自动下载训练数据开始训练,如保存为`mask_r50_fpn.py`,如下命令即可开始训练 +``` +python mask_r50_fpn.py +``` + +- 针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数。[——>>传送门]() +- 没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门]() diff --git a/docs/train/object_detection.md b/docs/train/object_detection.md index 61e17735f2e59a8d23021fd7d9f32bd05cab794d..20c070c075e886121099edc597b0030acebb2e28 100644 --- a/docs/train/object_detection.md +++ b/docs/train/object_detection.md @@ -1,2 +1,18 @@ # 目标检测 +| 模型 | Top1精度 | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | | +| YOLOv3-MobileNetV1 | 97.5% | 22M | 10ms | 200ms | | +| YOLOv3-MobileNetV3 | | | | | | +| YOLOv3-DarkNet53 | | | | | | +| FasterRCNN-ResNet50-FPN | | | | | | +| FasterRCNN-ResNet101-FPN | | | | | | +| FasterRCNN-HRNet-FPN | | | | | | + +将对应模型的训练代码保存到本地后,即可直接训练,训练代码会自动下载训练数据开始训练,如保存为`faster_r50_fpn.py`,如下命令即可开始训练 +``` +python faster_r50_fpn.py +``` + +- 针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数。[——>>传送门]() +- 没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门]() diff --git a/docs/train/prediction.md b/docs/train/prediction.md index c323cf1122aec605a13ca52b81cb9652e5ea4075..22a7dacabb87b0e8fe23b704bfe099e088c29608 100644 --- a/docs/train/prediction.md +++ b/docs/train/prediction.md @@ -1 +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 index ea2f90de05f3d7ddcf4aca6b6eded7e8ab6369c9..09866b7f13bd30e51799f6bc0a87e9908c76d9ff 100644 --- a/docs/train/semantic_segmentation.md +++ b/docs/train/semantic_segmentation.md @@ -1 +1,17 @@ # 语义分割 + +| 模型 | Top1精度 | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| :---------------- | :------- | :------- | :--------- | :--------- | | +| DeepLabv3p-MobileNetV2 | 97.5% | 22M | 10ms | 200ms | | +| DeepLabv3p-Xception65 | | | | | | +| UNet | | | | | | +| HRNet | | | | | | +| FastSCNN | | | | | | + +将对应模型的训练代码保存到本地后,即可直接训练,训练代码会自动下载训练数据开始训练,如保存为`deeplab_mobilenetv2.py`,如下命令即可开始训练 +``` +python deeplab_mobilenetv2.py +``` + +- 针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数。[——>>传送门]() +- 没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门]() diff --git a/paddlex/cv/models/base.py b/paddlex/cv/models/base.py index 9256bd17a067e9346be760ad00e06fda8a38f2bb..1bf3a2c97a3ef9680aae64206aeb72207b759642 100644 --- a/paddlex/cv/models/base.py +++ b/paddlex/cv/models/base.py @@ -356,23 +356,24 @@ class BaseAPI: def export_inference_model(self, save_dir): test_input_names = [var.name for var in list(self.test_inputs.values())] test_outputs = list(self.test_outputs.values()) - if self.__class__.__name__ == 'MaskRCNN': - from paddlex.utils.save import save_mask_inference_model - save_mask_inference_model( - dirname=save_dir, - executor=self.exe, - params_filename='__params__', - feeded_var_names=test_input_names, - target_vars=test_outputs, - main_program=self.test_prog) - else: - fluid.io.save_inference_model( - dirname=save_dir, - executor=self.exe, - params_filename='__params__', - feeded_var_names=test_input_names, - target_vars=test_outputs, - main_program=self.test_prog) + with fluid.scope_guard(self.scope): + if self.__class__.__name__ == 'MaskRCNN': + from paddlex.utils.save import save_mask_inference_model + save_mask_inference_model( + dirname=save_dir, + executor=self.exe, + params_filename='__params__', + feeded_var_names=test_input_names, + target_vars=test_outputs, + main_program=self.test_prog) + else: + fluid.io.save_inference_model( + dirname=save_dir, + executor=self.exe, + params_filename='__params__', + feeded_var_names=test_input_names, + target_vars=test_outputs, + main_program=self.test_prog) model_info = self.get_model_info() model_info['status'] = 'Infer'