diff --git a/docs/data/format/classification.md b/docs/data/format/classification.md index 70ed5ac34e07ee97321b9eb51168f964ed82f274..131e283b256ec99b53cb14b30ed504739395972e 100644 --- a/docs/data/format/classification.md +++ b/docs/data/format/classification.md @@ -24,10 +24,13 @@ MyDataset/ # 图像分类数据集根目录 ## 划分训练集验证集 **为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载图像分类示例数据集](https://bj.bcebos.com/paddlex/datasets/vegetables_cls.tar.gz) + + **labels.txt** @@ -60,8 +63,14 @@ val_list列出用于验证时的图片集成,与其对应的类别id,格式 ``` 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_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_dataset = pdx.datasets.ImageNet( data_dir='./MyDataset', file_list='./MyDataset/train_list.txt', diff --git a/docs/data/format/detection.md b/docs/data/format/detection.md index 19d2ed339bb1424df57b519abf100ae398f35f96..82c3110043b39e5a0d008f4cd1c9b4a7fe1aa040 100644 --- a/docs/data/format/detection.md +++ b/docs/data/format/detection.md @@ -21,10 +21,13 @@ MyDataset/ # 目标检测数据集根目录 ## 划分训练集验证集 **为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载目标检测示例数据集](https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz) + + **labels.txt** @@ -56,8 +59,18 @@ val_list列出用于验证时的图片集成,与其对应的标注文件,格 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_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) + +eval_transforms = transforms.Compose([ + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32), +]) train_dataset = pdx.datasets.VOCDetection( data_dir='./MyDataset', diff --git a/docs/data/format/instance_segmentation.md b/docs/data/format/instance_segmentation.md index d28852485aee17fbebe57d5a0cc32754a6740713..c4f4e424e93745b7c5f2be2aed52905c47b8f574 100644 --- a/docs/data/format/instance_segmentation.md +++ b/docs/data/format/instance_segmentation.md @@ -17,10 +17,13 @@ MyDataset/ # 实例分割数据集根目录 ## 划分训练集验证集 在PaddleX中,为了区分训练集和验证集,在`MyDataset`同级目录,使用不同的json表示数据的划分,例如`train.json`和`val.json`。[点击下载实例分割示例数据集](https://bj.bcebos.com/paddlex/datasets/garbage_ins_det.tar.gz)。 + + MSCOCO数据的标注文件采用json格式,用户可使用Labelme, 精灵标注助手或EasyData等标注工具进行标注,参见[数据标注工具](../annotations.md) @@ -30,8 +33,18 @@ MSCOCO数据的标注文件采用json格式,用户可使用Labelme, 精灵标 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_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) + +eval_transforms = transforms.Compose([ + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32), +]) train_dataset = pdx.dataset.CocoDetection( data_dir='./MyDataset/JPEGImages', diff --git a/docs/data/format/segmentation.md b/docs/data/format/segmentation.md index f91a9ea28368e8e0d14462a002ed0482d3843d25..87590befe9b3d2277b135d9a4ddf3f40cc029502 100644 --- a/docs/data/format/segmentation.md +++ b/docs/data/format/segmentation.md @@ -22,10 +22,13 @@ MyDataset/ # 语义分割数据集根目录 ## 划分训练集验证集 **为了用于训练,我们需要在`MyDataset`目录下准备`train_list.txt`, `val_list.txt`和`labels.txt`三个文件**,分别用于表示训练集列表,验证集列表和类别标签列表。[点击下载语义分割示例数据集](https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz) + + **labels.txt** @@ -58,8 +61,18 @@ val_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', train_crop_size=[512, 512]) +train_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() +]) + +eval_transforms = transforms.Compose([ + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), + transforms.Normalize() +]) train_dataset = pdx.datasets.SegDataset( data_dir='./MyDataset', @@ -71,5 +84,4 @@ eval_dataset = pdx.datasets.SegDataset( file_list='./MyDataset/val_list.txt', label_list='MyDataset/labels.txt', transforms=eval_transforms) - ``` diff --git a/docs/quick_start.md b/docs/quick_start.md index 8a538387779f519b72f0dc0fe27c22f83c2b3644..760b15bb8cdc3c292d86c7a6d87e5e4b0b8676a1 100644 --- a/docs/quick_start.md +++ b/docs/quick_start.md @@ -14,8 +14,8 @@ PaddleX中的所有模型训练跟随以下3个步骤,即可快速完成训练 PaddleX的其它用法 +- 使用VisualDL查看训练过程中的指标变化 - 加载训练保存的模型进行预测 -- [使用VisualDL查看训练过程中的指标变化]() diff --git a/docs/train/instance_segmentation.md b/docs/train/instance_segmentation.md index 51b7337c3df3ce9a707c7c038ded5279e1159ae2..bb2d9f3ecac5ca1a5e69edb0650599a2509db27f 100644 --- a/docs/train/instance_segmentation.md +++ b/docs/train/instance_segmentation.md @@ -10,9 +10,9 @@ PaddleX目前提供了MaskRCNN实例分割模型结构,多种backbone模型, | 模型(点击获取代码) | 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 | - | 模型精度高,预测速度快,适用于服务端部署 | +| [MaskRCNN-ResNet50-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_r50_fpn.py) | 36.5%/32.2% | 170.0MB | 160.185ms | - | 模型精度高,适用于服务端部署 | +| [MaskRCNN-ResNet18-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_r18_fpn.py) | -/- | 120.0MB | - | - | 模型精度高,适用于服务端部署 | +| [MaskRCNN-HRNet-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/instance_segmentation/mask_hrnet_fpn.py) | -/- | 116.MB | - | - | 模型精度高,预测速度快,适用于服务端部署 | ## 开始训练 @@ -27,4 +27,4 @@ PaddleX目前提供了MaskRCNN实例分割模型结构,多种backbone模型, - 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) - 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) -- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 +- 【**拓展**】更多实例分割模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/docs/train/object_detection.md b/docs/train/object_detection.md index e1aae0bbf619010a67f592ac490cb45cddd88666..26c22679260cfc9ba84f45c909578cd08db59d8f 100644 --- a/docs/train/object_detection.md +++ b/docs/train/object_detection.md @@ -10,12 +10,12 @@ PaddleX目前提供了FasterRCNN和YOLOv3两种检测结构,多种backbone模型 | 模型(点击获取代码) | 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](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/yolov3_mobilenetv1.py) | 29.3% | 99.2MB | 15.442ms | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [YOLOv3-MobileNetV3](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/yolov3_mobilenetv3.py) | 31.6% | 100.7MB | 143.322ms | - | 模型小,移动端上预测速度有优势 | +| [YOLOv3-DarkNet53](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/yolov3_darknet53.py) | 38.9 | 249.2MB | 42.672ms | - | 模型较大,预测速度快,适用于服务端 | +| [FasterRCNN-ResNet50-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/faster_r50_fpn.py) | 37.2% | 136.0MB | 197.715ms | - | 模型精度高,适用于服务端部署 | +| [FasterRCNN-ResNet18-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/faster_r18_fpn.py) | - | - | - | - | 模型精度高,适用于服务端部署 | +| [FasterRCNN-HRNet-FPN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/object_detection/faster_hrnet_fpn.py) | 36.0% | 115.MB | 81.592ms | - | 模型精度高,预测速度快,适用于服务端部署 | ## 开始训练 @@ -31,4 +31,4 @@ PaddleX目前提供了FasterRCNN和YOLOv3两种检测结构,多种backbone模型 - 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) - 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) -- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 +- 【**拓展**】更多目标检测模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/docs/train/prediction.md b/docs/train/prediction.md index 9d08500f3480d4b430966bee34a238de353fbfdb..51aa0833f8447b682929e92fec7fda7301d73880 100644 --- a/docs/train/prediction.md +++ b/docs/train/prediction.md @@ -34,7 +34,23 @@ pdx.seg.visualize(test_jpg, result, weight=0.0, save_dir='./') 在上述示例代码中,通过调用`paddlex.seg.visualize`可以对语义分割的预测结果进行可视化,可视化的结果保存在`save_dir`下。其中`weight`参数用于调整预测结果和原图结果融合展现时的权重,0.0时只展示预测结果mask的可视化,1.0时只展示原图可视化。 +## 公开数据集训练模型下载 + +PaddleX提供了部分公开数据集上训练好的模型,用户可以直接下载后参照本文档加载使用。 + +| 类型 | 模型(点击下载) | 数据集 | 大小 | 指标 | 指标数值 | +|:--- | :---------- | :----------- | :---------- | :---------- | :------------- | +| 图像分类 | [MobileNetV3_small_ssld](https://bj.bcebos.com/paddlex/models/mobilenetv3_small_ssld_imagenet.tar.gz) | ImageNet | 13MB | Accuracy | 71.3% | +| 图像分类 | [ResNet50_vd_ssld](https://bj.bcebos.com/paddlex/models/resnet50_vd_ssld_imagenet.tar.gz) | ImageNet | 110MB | Accuracy | 82.4% | +| 目标检测 | [FasterRCNN-ResNet50-FPN](https://bj.bcebos.com/paddlex/models/faster_r50_fpn_coco.tar.gz) | MSCOCO | 179MB | Box MAP | 37.7% | +| 目标检测 | [YOLOv3-MobileNetV1](https://bj.bcebos.com/paddlex/models/yolov3_mobilenetv1_coco.tar.gz) | MSCOCO | 106MB | Box MAP | 29.3% | +| 目标检测 | [YOLOv3-DarkNet53](https://bj.bcebos.com/paddlex/models/yolov3_darknet53_coco.tar.gz) | MSCOCO | 266MMB | Box MAP | 34.8% | +| 目标检测 | [YOLOv3-MobileNetV3](https://bj.bcebos.com/paddlex/models/yolov3_mobilenetv3_coco.tar.gz) | MSCOCO | 101MB | Box MAP | 31.6% | +| 实例分割 | [MaskRCNN-ResNet50-FPN](https://bj.bcebos.com/paddlex/models/mask_r50_fpn_coco.tar.gz) | MSCOCO | 193MB | Box MAP/Seg MAP | 38.7% / 34.7% | +| 语义分割 | [DeepLabv3p-Xception65]() | 人像分割 | xxMB | mIoU | - | +| 语义分割 | [HRNet_w18_small]() | 人像分割 | xxMB | mIou | - | + PaddleX的`load_model`接口可以满足用户一般的模型调研需求,如若为更高性能的预测部署,可以参考如下文档 -- [服务端Python部署]() -- [服务端C++部署]() +- [服务端Python部署](../deploy/server/python.md) +- [服务端C++部署](../deploy/server/cpp/index.html) diff --git a/docs/train/semantic_segmentation.md b/docs/train/semantic_segmentation.md index f9fba81f39c840ab82006ff7f398b73de237a4cb..0ef48be853e1b6e8f7d4b362fad8e08e1660dc8e 100644 --- a/docs/train/semantic_segmentation.md +++ b/docs/train/semantic_segmentation.md @@ -4,18 +4,18 @@ PaddleX目前提供了DeepLabv3p、UNet、HRNet和FastSCNN四种语义分割结构,多种backbone模型,可满足开发者不同场景和性能的需求。 -- **mIOU**: 模型在COCO数据集上的测试精度 +- **mIOU**: 模型在CityScape数据集上的测试精度 - **预测速度**:单张图片的预测用时(不包括预处理和后处理) - "-"表示指标暂未更新 -| 模型(点击获取代码) | Box MMAP | 模型大小 | GPU预测速度 | Arm预测速度 | 备注 | +| 模型(点击获取代码) | mIOU | 模型大小 | 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](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py) | - | 2.9MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [DeepLabv3p-MobileNetV2-x1.0](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py) | 69.8% | 11MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | +| [DeepLabv3p-Xception65](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/deeplabv3p_xception65.pyy) | 79.3% | 158MB | - | - | 模型大,精度高,适用于服务端 | +| [UNet](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/unet.py) | - | 52MB | - | - | 模型较大,精度高,适用于服务端 | +| [HRNet](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/hrnet.py) | 79.4% | 37MB | - | - | 模型较小,模型精度高,适用于服务端部署 | +| [FastSCNN](https://github.com/PaddlePaddle/PaddleX/blob/doc/tutorials/train/semantic_segmentation/fast_scnn.py) | - | 4.5MB | - | - | 模型小,预测速度快,适用于低性能或移动端设备 | ## 开始训练 @@ -31,4 +31,4 @@ PaddleX目前提供了DeepLabv3p、UNet、HRNet和FastSCNN四种语义分割结 - 【**重要**】针对自己的机器环境和数据,调整训练参数?先了解下PaddleX中训练参数作用。[——>>传送门](../appendix/parameters.md) - 【**有用**】没有机器资源?使用AIStudio免费的GPU资源在线训练模型。[——>>传送门](https://aistudio.baidu.com/aistudio/projectdetail/450925) -- 【**拓展**】更多图像分类模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 +- 【**拓展**】更多语义分割模型,查阅[PaddleX模型库](../appendix/model_zoo.md)和[API使用文档](../apis/models/index.html)。 diff --git a/paddlex/cv/models/hrnet.py b/paddlex/cv/models/hrnet.py index d3af363ceac925d40552da22360759553c0090f7..691114da8caffb2bf86860ed51cd07e449ae7cd7 100644 --- a/paddlex/cv/models/hrnet.py +++ b/paddlex/cv/models/hrnet.py @@ -25,7 +25,7 @@ class HRNet(DeepLabv3p): Args: num_classes (int): 类别数。 width (int|str): 高分辨率分支中特征层的通道数量。默认值为18。可选择取值为[18, 30, 32, 40, 44, 48, 60, 64, '18_small_v1']。 - '18_small_v1'是18的轻量级版本。 + '18_small_v1'是18的轻量级版本,默认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。 diff --git a/paddlex/interpret/interpretation_predict.py b/paddlex/interpret/interpretation_predict.py index 31b3b47e86613f62ba1c63b4ba2041357cc6bdc7..2ebe9a87d7fc80a6379331b7e4d0ef7c2da304bb 100644 --- a/paddlex/interpret/interpretation_predict.py +++ b/paddlex/interpret/interpretation_predict.py @@ -15,11 +15,17 @@ import numpy as np import cv2 import copy +import paddle.fluid as fluid +from paddlex.cv.transforms import arrange_transforms def interpretation_predict(model, images): images = images.astype('float32') - model.arrange_transforms(transforms=model.test_transforms, mode='test') + arrange_transforms( + model.model_type, + model.__class__.__name__, + transforms=model.test_transforms, + mode='test') tmp_transforms = copy.deepcopy(model.test_transforms.transforms) model.test_transforms.transforms = model.test_transforms.transforms[-2:] @@ -29,9 +35,11 @@ def interpretation_predict(model, images): new_imgs.append(model.test_transforms(images[i])[0]) new_imgs = np.array(new_imgs) - out = model.exe.run(model.test_prog, - feed={'image': new_imgs}, - fetch_list=list(model.interpretation_feats.values())) + with fluid.scope_guard(model.scope): + out = model.exe.run( + model.test_prog, + feed={'image': new_imgs}, + fetch_list=list(model.interpretation_feats.values())) model.test_transforms.transforms = tmp_transforms diff --git a/paddlex/interpret/visualize.py b/paddlex/interpret/visualize.py index 6c3570b05d99f359452116542c82cb9a8cbc555b..2d7c096175ce0ff7f10c33696cac42a9f1a64e99 100644 --- a/paddlex/interpret/visualize.py +++ b/paddlex/interpret/visualize.py @@ -1,11 +1,11 @@ # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. -# +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,6 +22,7 @@ from .interpretation_predict import interpretation_predict from .core.interpretation import Interpretation from .core.normlime_base import precompute_global_classifier from .core._session_preparation import gen_user_home +from paddlex.cv.transforms import arrange_transforms def lime(img_file, model, num_samples=3000, batch_size=50, save_dir='./'): @@ -48,7 +49,11 @@ def lime(img_file, model, num_samples=3000, batch_size=50, save_dir='./'): 'The interpretation only can deal with the Normal model') if not osp.exists(save_dir): os.makedirs(save_dir) - model.arrange_transforms(transforms=model.test_transforms, mode='test') + arrange_transforms( + model.model_type, + model.__class__.__name__, + transforms=model.test_transforms, + mode='test') tmp_transforms = copy.deepcopy(model.test_transforms) tmp_transforms.transforms = tmp_transforms.transforms[:-2] img = tmp_transforms(img_file)[0] @@ -94,7 +99,11 @@ def normlime(img_file, 'The interpretation only can deal with the Normal model') if not osp.exists(save_dir): os.makedirs(save_dir) - model.arrange_transforms(transforms=model.test_transforms, mode='test') + arrange_transforms( + model.model_type, + model.__class__.__name__, + transforms=model.test_transforms, + mode='test') tmp_transforms = copy.deepcopy(model.test_transforms) tmp_transforms.transforms = tmp_transforms.transforms[:-2] img = tmp_transforms(img_file)[0] diff --git a/tutorials/train/image_classification/alexnet.py b/tutorials/train/image_classification/alexnet.py index fc4357c5eb61def3932b5489c9271fa5282035ea..b78f45bbc0f6889452ad0953062b78daca428aa9 100644 --- a/tutorials/train/image_classification/alexnet.py +++ b/tutorials/train/image_classification/alexnet.py @@ -1,4 +1,3 @@ -import os from paddlex.cls import transforms import paddlex as pdx @@ -8,12 +7,14 @@ pdx.utils.download_and_decompress(veg_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(), + transforms.RandomCrop(crop_size=224), + transforms.RandomHorizontalFlip(), transforms.Normalize() ]) eval_transforms = transforms.Compose([ transforms.ResizeByShort(short_size=256), - transforms.CenterCrop(crop_size=224), transforms.Normalize() + transforms.CenterCrop(crop_size=224), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/image_classification/mobilenetv2.py b/tutorials/train/image_classification/mobilenetv2.py index bc30dfdaf93558842712ab863655639b6b99ddfb..5edbf587a2831b1c0118526fe28f6add32df4be8 100644 --- a/tutorials/train/image_classification/mobilenetv2.py +++ b/tutorials/train/image_classification/mobilenetv2.py @@ -8,12 +8,14 @@ pdx.utils.download_and_decompress(veg_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(), + transforms.RandomCrop(crop_size=224), + transforms.RandomHorizontalFlip(), transforms.Normalize() ]) eval_transforms = transforms.Compose([ transforms.ResizeByShort(short_size=256), - transforms.CenterCrop(crop_size=224), transforms.Normalize() + transforms.CenterCrop(crop_size=224), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/image_classification/mobilenetv3_small_ssld.py b/tutorials/train/image_classification/mobilenetv3_small_ssld.py index b8e5e432b1169a76d1d2ba2206fac77aea074525..6d52775f33987507878ef77b2485ebe3ce2f6881 100644 --- a/tutorials/train/image_classification/mobilenetv3_small_ssld.py +++ b/tutorials/train/image_classification/mobilenetv3_small_ssld.py @@ -8,12 +8,14 @@ pdx.utils.download_and_decompress(veg_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(), + transforms.RandomCrop(crop_size=224), + transforms.RandomHorizontalFlip(), transforms.Normalize() ]) eval_transforms = transforms.Compose([ transforms.ResizeByShort(short_size=256), - transforms.CenterCrop(crop_size=224), transforms.Normalize() + transforms.CenterCrop(crop_size=224), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/image_classification/resnet50_vd_ssld.py b/tutorials/train/image_classification/resnet50_vd_ssld.py index 97a2e318426e97427a49d7a4d2f188153b98c0ce..ca94f7f19055b67fbfcd0cb29b34cd55b69a90e6 100644 --- a/tutorials/train/image_classification/resnet50_vd_ssld.py +++ b/tutorials/train/image_classification/resnet50_vd_ssld.py @@ -8,12 +8,14 @@ pdx.utils.download_and_decompress(veg_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(), + transforms.RandomCrop(crop_size=224), + transforms.RandomHorizontalFlip(), transforms.Normalize() ]) eval_transforms = transforms.Compose([ transforms.ResizeByShort(short_size=256), - transforms.CenterCrop(crop_size=224), transforms.Normalize() + transforms.CenterCrop(crop_size=224), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/image_classification/shufflenetv2.py b/tutorials/train/image_classification/shufflenetv2.py index 244c43419607c78321c3c8243f2e67ca23d2e3d5..29272df3f13bb28524c942c11f6714e459427345 100644 --- a/tutorials/train/image_classification/shufflenetv2.py +++ b/tutorials/train/image_classification/shufflenetv2.py @@ -8,12 +8,14 @@ pdx.utils.download_and_decompress(veg_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomCrop(crop_size=224), transforms.RandomHorizontalFlip(), + transforms.RandomCrop(crop_size=224), + transforms.RandomHorizontalFlip(), transforms.Normalize() ]) eval_transforms = transforms.Compose([ transforms.ResizeByShort(short_size=256), - transforms.CenterCrop(crop_size=224), transforms.Normalize() + transforms.CenterCrop(crop_size=224), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py b/tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py index 920c5f27298d49ad3a5ab7288a0ed7dc9f56d8d9..7f8e1eb35ddda3e7f27916e4756e8103f62ee88b 100644 --- a/tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py +++ b/tutorials/train/instance_segmentation/mask_rcnn_hrnet_fpn.py @@ -11,15 +11,15 @@ pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32) + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) eval_transforms = transforms.Compose([ transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), + transforms.ResizeByShort(short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32), ]) diff --git a/tutorials/train/instance_segmentation/mask_rcnn_r18_fpn.py b/tutorials/train/instance_segmentation/mask_rcnn_r18_fpn.py new file mode 100644 index 0000000000000000000000000000000000000000..a4105159e633e67f63fcd5ee0354599cf994263d --- /dev/null +++ b/tutorials/train/instance_segmentation/mask_rcnn_r18_fpn.py @@ -0,0 +1,54 @@ +import os +# 选择使用0号卡 +os.environ['CUDA_VISIBLE_DEVICES'] = '0' + +from paddlex.det import transforms +import paddlex as pdx + +# 下载和解压小度熊分拣数据集 +xiaoduxiong_dataset = 'https://bj.bcebos.com/paddlex/datasets/xiaoduxiong_ins_det.tar.gz' +pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./') + +# 定义训练和验证时的transforms +train_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) + +eval_transforms = transforms.Compose([ + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) + +# 定义训练和验证所用的数据集 +train_dataset = pdx.datasets.CocoDetection( + data_dir='xiaoduxiong_ins_det/JPEGImages', + ann_file='xiaoduxiong_ins_det/train.json', + transforms=train_transforms, + shuffle=True) +eval_dataset = pdx.datasets.CocoDetection( + data_dir='xiaoduxiong_ins_det/JPEGImages', + ann_file='xiaoduxiong_ins_det/val.json', + transforms=eval_transforms) + +# 初始化模型,并进行训练 +# 可使用VisualDL查看训练指标 +# VisualDL启动方式: visualdl --logdir output/mask_rcnn_r50_fpn/vdl_log --port 8001 +# 浏览器打开 https://0.0.0.0:8001即可 +# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP +# num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1 +num_classes = len(train_dataset.labels) + 1 +model = pdx.det.MaskRCNN(num_classes=num_classes, backbone='ResNet18') +model.train( + num_epochs=12, + train_dataset=train_dataset, + train_batch_size=1, + eval_dataset=eval_dataset, + learning_rate=0.00125, + warmup_steps=10, + lr_decay_epochs=[8, 11], + save_dir='output/mask_rcnn_r18_fpn', + use_vdl=True) diff --git a/tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py b/tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py index bacbe615d0813040f9a34a70c0dcde31c86a54f9..817499815979cbadfe9c3a1b80bc94dc00cb53a0 100644 --- a/tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py +++ b/tutorials/train/instance_segmentation/mask_rcnn_r50_fpn.py @@ -11,16 +11,16 @@ pdx.utils.download_and_decompress(xiaoduxiong_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32) + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) eval_transforms = transforms.Compose([ - transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), - transforms.Padding(coarsest_stride=32), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) # 定义训练和验证所用的数据集 @@ -41,7 +41,7 @@ eval_dataset = pdx.datasets.CocoDetection( # 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1 num_classes = len(train_dataset.labels) + 1 -model = pdx.det.MaskRCNN(num_classes=num_classes, backbone='ResNet50_vd') +model = pdx.det.MaskRCNN(num_classes=num_classes, backbone='ResNet50') model.train( num_epochs=12, train_dataset=train_dataset, diff --git a/tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py b/tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py index 83f9b69c344981fa1de108a9ebe19d2cab5fb686..3d1650f3768a6b0207011aa215596b5c46c8852d 100644 --- a/tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py +++ b/tutorials/train/object_detection/faster_rcnn_hrnet_fpn.py @@ -11,16 +11,16 @@ pdx.utils.download_and_decompress(insect_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32) + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) eval_transforms = transforms.Compose([ - transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), - transforms.Padding(coarsest_stride=32), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/object_detection/faster_rcnn_r18_fpn.py b/tutorials/train/object_detection/faster_rcnn_r18_fpn.py new file mode 100644 index 0000000000000000000000000000000000000000..cd8928ad48dae42e134607cf84332fa51467b464 --- /dev/null +++ b/tutorials/train/object_detection/faster_rcnn_r18_fpn.py @@ -0,0 +1,51 @@ +import os +from paddlex.det import transforms +import paddlex as pdx + +# 下载和解压昆虫检测数据集 +insect_dataset = 'https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz' +pdx.utils.download_and_decompress(insect_dataset, path='./') + +# 定义训练和验证时的transforms +train_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) +]) + +eval_transforms = transforms.Compose([ + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32), +]) +# 定义训练和验证所用的数据集 +train_dataset = pdx.datasets.VOCDetection( + data_dir='insect_det', + file_list='insect_det/train_list.txt', + label_list='insect_det/labels.txt', + transforms=train_transforms, + shuffle=True) +eval_dataset = pdx.datasets.VOCDetection( + data_dir='insect_det', + file_list='insect_det/val_list.txt', + label_list='insect_det/labels.txt', + transforms=eval_transforms) + +# 初始化模型,并进行训练 +# 可使用VisualDL查看训练指标 +# VisualDL启动方式: visualdl --logdir output/faster_rcnn_r50_fpn/vdl_log --port 8001 +# 浏览器打开 https://0.0.0.0:8001即可 +# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP +# num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1 +num_classes = len(train_dataset.labels) + 1 +model = pdx.det.FasterRCNN(num_classes=num_classes, backbone='ResNet18') +model.train( + num_epochs=12, + train_dataset=train_dataset, + train_batch_size=2, + eval_dataset=eval_dataset, + learning_rate=0.0025, + lr_decay_epochs=[8, 11], + save_dir='output/faster_rcnn_r50_fpn', + use_vdl=True) diff --git a/tutorials/train/object_detection/faster_rcnn_r50_fpn.py b/tutorials/train/object_detection/faster_rcnn_r50_fpn.py index 6c7987a74f8216b4a448624096aceb0a7db522f8..350c40fd12651e3dfe155b0b95cc702e741e1de4 100644 --- a/tutorials/train/object_detection/faster_rcnn_r50_fpn.py +++ b/tutorials/train/object_detection/faster_rcnn_r50_fpn.py @@ -8,15 +8,15 @@ pdx.utils.download_and_decompress(insect_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32) + transforms.RandomHorizontalFlip(), + transforms.Normalize(), + transforms.ResizeByShort(short_size=800, max_size=1333), + transforms.Padding(coarsest_stride=32) ]) eval_transforms = transforms.Compose([ transforms.Normalize(), - transforms.ResizeByShort( - short_size=800, max_size=1333), + transforms.ResizeByShort(short_size=800, max_size=1333), transforms.Padding(coarsest_stride=32), ]) # 定义训练和验证所用的数据集 @@ -39,7 +39,7 @@ eval_dataset = pdx.datasets.VOCDetection( # 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP # num_classes 需要设置为包含背景类的类别数,即: 目标类别数量 + 1 num_classes = len(train_dataset.labels) + 1 -model = pdx.det.FasterRCNN(num_classes=num_classes, backbone='ResNet50_vd') +model = pdx.det.FasterRCNN(num_classes=num_classes, backbone='ResNet50') model.train( num_epochs=12, train_dataset=train_dataset, diff --git a/tutorials/train/object_detection/yolov3_darknet53.py b/tutorials/train/object_detection/yolov3_darknet53.py index facb3e558b422ac5c73db275eec9efc62de34054..a15e5cbcfd037e75eadc65bfb42320f8c13f8e54 100644 --- a/tutorials/train/object_detection/yolov3_darknet53.py +++ b/tutorials/train/object_detection/yolov3_darknet53.py @@ -8,20 +8,18 @@ pdx.utils.download_and_decompress(insect_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.MixupImage(mixup_epoch=250), + transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(), - transforms.RandomExpand(), - transforms.RandomCrop(), - transforms.Resize( - target_size=608, interp='RANDOM'), + transforms.RandomExpand(), + transforms.RandomCrop(), + transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(), - transforms.Normalize(), + transforms.Normalize() ]) eval_transforms = transforms.Compose([ - transforms.Resize( - target_size=608, interp='CUBIC'), - transforms.Normalize(), + transforms.Resize(target_size=608, interp='CUBIC'), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/object_detection/yolov3_mobilenetv1.py b/tutorials/train/object_detection/yolov3_mobilenetv1.py index c74572640bc0ceb0f0fcf45180bbdc7a038a317d..9b621851bcc5f0f058129c5ad9a666503cbda667 100644 --- a/tutorials/train/object_detection/yolov3_mobilenetv1.py +++ b/tutorials/train/object_detection/yolov3_mobilenetv1.py @@ -12,15 +12,13 @@ train_transforms = transforms.Compose([ transforms.RandomDistort(), transforms.RandomExpand(), transforms.RandomCrop(), - transforms.Resize( - target_size=608, interp='RANDOM'), + transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(), transforms.Normalize(), ]) eval_transforms = transforms.Compose([ - transforms.Resize( - target_size=608, interp='CUBIC'), + transforms.Resize(target_size=608, interp='CUBIC'), transforms.Normalize(), ]) diff --git a/tutorials/train/object_detection/yolov3_mobilenetv3.py b/tutorials/train/object_detection/yolov3_mobilenetv3.py index 3fab5255b9f3a1a8ce537fa5b202916b147f380e..4eb06099e7320655310b77c7166a022b363e4bbe 100644 --- a/tutorials/train/object_detection/yolov3_mobilenetv3.py +++ b/tutorials/train/object_detection/yolov3_mobilenetv3.py @@ -8,20 +8,18 @@ pdx.utils.download_and_decompress(insect_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.MixupImage(mixup_epoch=250), + transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(), - transforms.RandomExpand(), - transforms.RandomCrop(), - transforms.Resize( - target_size=608, interp='RANDOM'), + transforms.RandomExpand(), + transforms.RandomCrop(), + transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(), - transforms.Normalize(), + transforms.Normalize() ]) eval_transforms = transforms.Compose([ - transforms.Resize( - target_size=608, interp='CUBIC'), - transforms.Normalize(), + transforms.Resize(target_size=608, interp='CUBIC'), + transforms.Normalize() ]) # 定义训练和验证所用的数据集 diff --git a/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py b/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py index 9e3a7d5d438373d4d58c0301ab9329847b450980..28931a67da2df3e8c6a3975aa7eb9de542ba6e40 100644 --- a/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py +++ b/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2.py @@ -11,12 +11,15 @@ pdx.utils.download_and_decompress(optic_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(), - transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize() + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() ]) eval_transforms = transforms.Compose([ - transforms.ResizeByLong(long_size=512), transforms.Padding(target_size=512), + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), transforms.Normalize() ]) @@ -39,7 +42,7 @@ eval_dataset = pdx.datasets.SegDataset( # 浏览器打开 https://0.0.0.0:8001即可 # 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP num_classes = len(train_dataset.labels) -model = pdx.seg.DeepLabv3p(num_classes=num_classes) +model = pdx.seg.DeepLabv3p(num_classes=num_classes, backbone='MobileNetV2_x1.0') model.train( num_epochs=40, train_dataset=train_dataset, diff --git a/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py b/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py new file mode 100644 index 0000000000000000000000000000000000000000..04553e3b07e72a9cb7939bdd00e1b8321fbad04c --- /dev/null +++ b/tutorials/train/semantic_segmentation/deeplabv3p_mobilenetv2_x0.25.py @@ -0,0 +1,53 @@ +import os +# 选择使用0号卡 +os.environ['CUDA_VISIBLE_DEVICES'] = '0' + +import paddlex as pdx +from paddlex.seg import transforms + +# 下载和解压视盘分割数据集 +optic_dataset = 'https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz' +pdx.utils.download_and_decompress(optic_dataset, path='./') + +# 定义训练和验证时的transforms +train_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() +]) + +eval_transforms = transforms.Compose([ + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), + transforms.Normalize() +]) + +# 定义训练和验证所用的数据集 +train_dataset = pdx.datasets.SegDataset( + data_dir='optic_disc_seg', + file_list='optic_disc_seg/train_list.txt', + label_list='optic_disc_seg/labels.txt', + transforms=train_transforms, + shuffle=True) +eval_dataset = pdx.datasets.SegDataset( + data_dir='optic_disc_seg', + file_list='optic_disc_seg/val_list.txt', + label_list='optic_disc_seg/labels.txt', + transforms=eval_transforms) + +# 初始化模型,并进行训练 +# 可使用VisualDL查看训练指标 +# VisualDL启动方式: visualdl --logdir output/deeplab/vdl_log --port 8001 +# 浏览器打开 https://0.0.0.0:8001即可 +# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP +num_classes = len(train_dataset.labels) +model = pdx.seg.DeepLabv3p(num_classes=num_classes, backbone='MobileNetV2_x0.25') +model.train( + num_epochs=40, + train_dataset=train_dataset, + train_batch_size=4, + eval_dataset=eval_dataset, + learning_rate=0.01, + save_dir='output/deeplabv3p_mobilenetv2_x0_25', + use_vdl=True) diff --git a/tutorials/train/semantic_segmentation/deeplabv3p_xception65.py b/tutorials/train/semantic_segmentation/deeplabv3p_xception65.py new file mode 100644 index 0000000000000000000000000000000000000000..70167ff05d280d6ab96c42e080ca132ac17e39ef --- /dev/null +++ b/tutorials/train/semantic_segmentation/deeplabv3p_xception65.py @@ -0,0 +1,53 @@ +import os +# 选择使用0号卡 +os.environ['CUDA_VISIBLE_DEVICES'] = '0' + +import paddlex as pdx +from paddlex.seg import transforms + +# 下载和解压视盘分割数据集 +optic_dataset = 'https://bj.bcebos.com/paddlex/datasets/optic_disc_seg.tar.gz' +pdx.utils.download_and_decompress(optic_dataset, path='./') + +# 定义训练和验证时的transforms +train_transforms = transforms.Compose([ + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() +]) + +eval_transforms = transforms.Compose([ + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), + transforms.Normalize() +]) + +# 定义训练和验证所用的数据集 +train_dataset = pdx.datasets.SegDataset( + data_dir='optic_disc_seg', + file_list='optic_disc_seg/train_list.txt', + label_list='optic_disc_seg/labels.txt', + transforms=train_transforms, + shuffle=True) +eval_dataset = pdx.datasets.SegDataset( + data_dir='optic_disc_seg', + file_list='optic_disc_seg/val_list.txt', + label_list='optic_disc_seg/labels.txt', + transforms=eval_transforms) + +# 初始化模型,并进行训练 +# 可使用VisualDL查看训练指标 +# VisualDL启动方式: visualdl --logdir output/deeplab/vdl_log --port 8001 +# 浏览器打开 https://0.0.0.0:8001即可 +# 其中0.0.0.0为本机访问,如为远程服务, 改成相应机器IP +num_classes = len(train_dataset.labels) +model = pdx.seg.DeepLabv3p(num_classes=num_classes, backbone='Xception65') +model.train( + num_epochs=40, + train_dataset=train_dataset, + train_batch_size=4, + eval_dataset=eval_dataset, + learning_rate=0.01, + save_dir='output/deeplabv3p_mobilenetv2', + use_vdl=True) diff --git a/tutorials/train/semantic_segmentation/fast_scnn.py b/tutorials/train/semantic_segmentation/fast_scnn.py index a2fdfa40dd94e145c6142b215908e731ec40d3c3..af041cacb95e49170be3af61078b8ea3399145fb 100644 --- a/tutorials/train/semantic_segmentation/fast_scnn.py +++ b/tutorials/train/semantic_segmentation/fast_scnn.py @@ -12,12 +12,15 @@ pdx.utils.download_and_decompress(optic_dataset, path='./') # 定义训练和验证时的transforms # API说明: https://paddlex.readthedocs.io/zh_CN/latest/apis/transforms/seg_transforms.html#composedsegtransforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(), - transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize() + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() ]) eval_transforms = transforms.Compose([ - transforms.ResizeByLong(long_size=512), transforms.Padding(target_size=512), + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), transforms.Normalize() ]) diff --git a/tutorials/train/semantic_segmentation/hrnet.py b/tutorials/train/semantic_segmentation/hrnet.py index 682ce82da4495c80cf504d17477d9ef9e750b963..330a107714ee5fbe7e6e3a021b5afa5737fdd779 100644 --- a/tutorials/train/semantic_segmentation/hrnet.py +++ b/tutorials/train/semantic_segmentation/hrnet.py @@ -11,12 +11,15 @@ pdx.utils.download_and_decompress(optic_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(), - transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize() + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() ]) eval_transforms = transforms.Compose([ - transforms.ResizeByLong(long_size=512), transforms.Padding(target_size=512), + transforms.ResizeByLong(long_size=512), + transforms.Padding(target_size=512), transforms.Normalize() ]) diff --git a/tutorials/train/semantic_segmentation/unet.py b/tutorials/train/semantic_segmentation/unet.py index 327a6ce648c14604fe2861be20af23c4d59089e9..46e93b8c217d11bfa9aa7c003ea28fd1041092ba 100644 --- a/tutorials/train/semantic_segmentation/unet.py +++ b/tutorials/train/semantic_segmentation/unet.py @@ -11,8 +11,10 @@ pdx.utils.download_and_decompress(optic_dataset, path='./') # 定义训练和验证时的transforms train_transforms = transforms.Compose([ - transforms.RandomHorizontalFlip(), transforms.ResizeRangeScaling(), - transforms.RandomPaddingCrop(crop_size=512), transforms.Normalize() + transforms.RandomHorizontalFlip(), + transforms.ResizeRangeScaling(), + transforms.RandomPaddingCrop(crop_size=512), + transforms.Normalize() ]) eval_transforms = transforms.Compose([