夏天就要到了,一起找个游泳池清凉一夏
转自AI Studio,原文链接:夏天就要到了,一起找个游泳池清凉一夏 - 飞桨AI Studio
基于PaddleX2.0的卫星图像游泳池检测
一、项目背景
夏天就要到了,炎热的夏天没个泳池怎么能行。这里介绍一种通过PaddleX2.0-PicoDet目标检测模型来快速在地图上找游泳池的方法。

二、PaddleX 介绍
PaddleX 集成飞桨智能视觉领域图像分类、目标检测、语义分割、实例分割任务能力,将深度学习开发全流程从数据准备、模型训练与优化到多端部署端到端打通,并提供统一任务API接口及图形化开发界面Demo。开发者无需分别安装不同套件,以低代码的形式即可快速完成飞桨全流程开发。PaddleX 经过质检、安防、巡检、遥感、零售、医疗等十多个行业实际应用场景验证,沉淀产业实际经验,并提供丰富的案例实践教程,全程助力开发者产业实践落地。
模型丰富: 包含目标检测、实例分割、人脸检测、关键点检测、多目标跟踪等250+个预训练模型,涵盖多种全球竞赛冠军方案。
使用简洁: 模块化设计,解耦各个网络组件,开发者轻松搭建、试用各种检测模型及优化策略,快速得到高性能、定制化的算法。
端到端打通: 从数据增强、组网、训练、压缩、部署端到端打通,并完备支持云端/边缘端多架构、多设备部署。
高性能: 基于飞桨的高性能内核,模型训练速度及显存占用优势明显。支持FP16训练, 支持多机训练。

三、PP-PicoDet算法介绍

百度研发团队提出的全新轻量级系列模型PP-PicoDet,在移动端具有卓越的性能,成为全新SOTA轻量级模型。详细的技术细节可以参考我们的arXiv技术报告。
PP-PicoDet模型有如下特点:
- 🌟 更高的mAP: 第一个在1M参数量之内
mAP(0.5:0.95)超越30+(输入416像素时)。 - 🚀 更快的预测速度: 网络预测在ARM CPU下可达150FPS。
- 😊 部署友好: 支持PaddleLite/MNN/NCNN/OpenVINO等预测库,支持转出ONNX,提供了C++/Python/Android的demo。
- 😍 先进的算法: 我们在现有SOTA算法中进行了创新, 包括:ESNet, CSP-PAN, SimOTA等等。目前
2.数据格式
目前PP-PicoDet支持 VOC 和 COCO 两种格式,可根据需要选择。

3.基线
| 模型 | 输入尺寸 | mAPval 0.5:0.95 | mAPval 0.5 | 参数量 (M) | FLOPS (G) | 预测时延NCNN (ms) | 预测时延Lite (ms) | 下载 | 配置文件 |
|---|---|---|---|---|---|---|---|---|---|
| PicoDet-S | 320*320 | 27.1 | 41.4 | 0.99 | 0.73 | 8.13 | 6.65 | model | log | config |
| PicoDet-S | 416*416 | 30.7 | 45.8 | 0.99 | 1.24 | 12.37 | 9.82 | model | log | config |
| PicoDet-M | 320*320 | 30.9 | 45.7 | 2.15 | 1.48 | 11.27 | 9.61 | model | log | config |
| PicoDet-M | 416*416 | 34.8 | 50.5 | 2.15 | 2.50 | 17.39 | 15.88 | model | log | config |
| PicoDet-L | 320*320 | 32.9 | 48.2 | 3.30 | 2.23 | 15.26 | 13.42 | model | log | config |
| PicoDet-L | 416*416 | 36.6 | 52.5 | 3.30 | 3.76 | 23.36 | 21.85 | model | log | config |
| PicoDet-L | 640*640 | 40.9 | 57.6 | 3.30 | 8.91 | 54.11 | 50.55 | model | log | config |
更多的配置
| 模型 | 输入尺寸 | mAPval 0.5:0.95 | mAPval 0.5 | 参数量 (M) | FLOPS (G) | 预测时延NCNN (ms) | 预测时延Lite (ms) | 下载 | 配置文件 |
|---|---|---|---|---|---|---|---|---|---|
| PicoDet-Shufflenetv2 1x | 416*416 | 30.0 | 44.6 | 1.17 | 1.53 | 15.06 | 10.63 | model | log | config |
| PicoDet-MobileNetv3-large 1x | 416*416 | 35.6 | 52.0 | 3.55 | 2.80 | 20.71 | 17.88 | model | log | config |
| PicoDet-LCNet 1.5x | 416*416 | 36.3 | 52.2 | 3.10 | 3.85 | 21.29 | 20.8 | model | log | config |
| PicoDet-LCNet 1.5x | 640*640 | 40.6 | 57.4 | 3.10 | - | - | - | model | log | config |
| PicoDet-R18 | 640*640 | 40.7 | 57.2 | 11.10 | - | - | - | model | log | config |
注意事项:
- 时延测试: 我们所有的模型都在
骁龙865(4xA77+4xA55)上测试(4线程,FP16预测)。上面表格中标有NCNN的是使用NCNN库测试,标有Lite的是使用Paddle Lite进行测试。 测试的benchmark脚本来自: MobileDetBenchmark。 - PicoDet在COCO train2017上训练,并且在COCO val2017上进行验证。
- PicoDet使用4卡GPU训练(PicoDet-L-640使用8卡训练),并且所有的模型都是通过发布的默认配置训练得到。
其他模型的基线
| 模型 | 输入尺寸 | mAPval 0.5:0.95 | mAPval 0.5 | 参数量 (M) | FLOPS (G) | 预测时延NCNN (ms) |
|---|---|---|---|---|---|---|
| YOLOv3-Tiny | 416*416 | 16.6 | 33.1 | 8.86 | 5.62 | 25.42 |
| YOLOv4-Tiny | 416*416 | 21.7 | 40.2 | 6.06 | 6.96 | 23.69 |
| PP-YOLO-Tiny | 320*320 | 20.6 | - | 1.08 | 0.58 | 6.75 |
| PP-YOLO-Tiny | 416*416 | 22.7 | - | 1.08 | 1.02 | 10.48 |
| Nanodet-M | 320*320 | 20.6 | - | 0.95 | 0.72 | 8.71 |
| Nanodet-M | 416*416 | 23.5 | - | 0.95 | 1.2 | 13.35 |
| Nanodet-M 1.5x | 416*416 | 26.8 | - | 2.08 | 2.42 | 15.83 |
| YOLOX-Nano | 416*416 | 25.8 | - | 0.91 | 1.08 | 19.23 |
| YOLOX-Tiny | 416*416 | 32.8 | - | 5.06 | 6.45 | 32.77 |
| YOLOv5n | 640*640 | 28.4 | 46.0 | 1.9 | 4.5 | 40.35 |
| YOLOv5s | 640*640 | 37.2 | 56.0 | 7.2 | 16.5 | 78.05 |
四、项目具体内容
该项目内容主要包括环境的配置,数据的准备,配置文件的修改,模型训练,模型评估,模型推理测试等
In [ ]
!unzip -oq /home/aistudio/data/data147252/Annotations.zip -d work/
4.1环境配置
安装PaddleX的依赖,这里使用的Paddle版本为paddlepaddle-gpu2.3
In [1]
!pip install paddlex
4.2划分数据集
由于相关的数据集较少,数据集里面包括156张包含泳池的卫星图像图片,使用Labelme进行标注,生成voc格式数据集。
只需要下面一行代码就可以将数据集进行划分
In [ ]
!paddlex --split_dataset --format voc --dataset_dir work/ --val_value 0.2
2022-05-18 11:24:42 [INFO] Dataset split starts...
2022-05-18 11:24:42 [INFO] Dataset split done.
2022-05-18 11:24:42 [INFO] Train samples: 125
2022-05-18 11:24:42 [INFO] Eval samples: 31
2022-05-18 11:24:42 [INFO] Test samples: 0
2022-05-18 11:24:42 [INFO] Split files saved in work/
4.3开始训练
In [ ]
import paddlex as pdx
from paddlex import transforms as T# 定义训练和验证时的transforms
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/transforms/transforms.md
train_transforms = T.Compose([T.RandomCrop(), T.RandomHorizontalFlip(), T.RandomDistort(),T.BatchRandomResize(target_sizes=[576, 608, 640, 672, 704], interp='RANDOM'), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])eval_transforms = T.Compose([T.Resize(target_size=640, interp='CUBIC'), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/datasets.md
train_dataset = pdx.datasets.VOCDetection(data_dir='work/',file_list='work/train_list.txt',label_list='work/labels.txt',transforms=train_transforms,shuffle=True)eval_dataset = pdx.datasets.VOCDetection(data_dir='work/',file_list='work/val_list.txt',label_list='work/labels.txt',transforms=eval_transforms,shuffle=False)# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/visualdl.md
num_classes = len(train_dataset.labels)
model = pdx.det.PicoDet(num_classes=num_classes, backbone='ESNet_l')# API说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/apis/models/detection.md
# 各参数介绍与调整说明:https://github.com/PaddlePaddle/PaddleX/blob/develop/docs/parameters.md
model.train(num_epochs=100,train_dataset=train_dataset,train_batch_size=16,eval_dataset=eval_dataset,pretrain_weights='COCO',learning_rate=.01,warmup_steps=24,warmup_start_lr=0.005,save_interval_epochs=1,lr_decay_epochs=[6, 8, 11],use_ema=True,save_dir='output/picodet_esnet_l',use_vdl=True)
2022-05-18 11:36:13 [INFO] Start to evaluate(total_samples=31, total_steps=31)...
2022-05-18 11:36:15 [INFO] Accumulating evaluatation results...
2022-05-18 11:36:15 [INFO] [EVAL] Finished, Epoch=100, bbox_map=98.818871 .
2022-05-18 11:36:15 [INFO] Current evaluated best model on eval_dataset is epoch_53, bbox_map=99.45796500418349
2022-05-18 11:36:15 [INFO] Model saved in output/picodet_esnet_l/epoch_100.
4.4训练结果可视化
最终训练结果map=98.82,训练的效果非常不错

4.5模型测试
使用模型进行预测,同时使用pdx.det.visualize将结果可视化,可视化结果将保存到./output/picodet_esnet_l下,其中threshold代表Box的置信度阈值,将Box置信度低于该阈值的框过滤不进行可视化。
In [2]
import paddlex as pdx
model = pdx.load_model('output/picodet_esnet_l/best_model')
image_name = 'work/31.jpg'
result = model.predict(image_name)
pdx.det.visualize(image_name, result, threshold=0.5, save_dir='./output/')
4.6模型测试结果可视化
通过预测结果可以发现模型很好地检测出了游泳池

五、项目总结
1、PaddleX2.0将强大的目标检测算法PicoDet集成在内,大大方便了开发者的模型训练,本项目提供的Baseline很好地展示了这一强大功能,非常推荐各位小伙伴使用!
2、在模型部署方面,PaddleX2.0同样提供了C++ inference部署方案,在GitHub中提供了C#部署Demo,欢迎大家学习参考https://github.com/PaddlePaddle/PaddleX
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
