PaddleX 使用案例
以下是PaddleX的典型使用案例,涵盖图像分类、目标检测和语义分割三大场景,展示其从数据准备到模型部署的全流程:
案例1:图像分类 - 垃圾分类识别
场景:识别可回收垃圾、有害垃圾、厨余垃圾和其他垃圾四类图片。
步骤1:数据准备与标注
# 1. 创建项目目录
mkdir garbage_classification && cd garbage_classification# 2. 下载示例数据集(约2000张图片,4分类)
wget https://bj.bcebos.com/paddlex/datasets/garbage4.tar.gz
tar -zxvf garbage4.tar.gz# 3. 数据结构(自动按8:1:1划分训练/验证/测试集)
garbage4/
├── train_list.txt # 训练集(路径+标签)
├── val_list.txt # 验证集
├── test_list.txt # 测试集
└── labels.txt # 类别名称(如:可回收垃圾、有害垃圾等)
步骤2:模型训练与评估
import paddlex as pdx
from paddlex import transforms as T# 定义数据增强
train_transforms = T.Compose([T.RandomResizeByShort(short_sizes=[640, 672, 704, 736, 768, 800], max_size=1333),T.RandomHorizontalFlip(),T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])# 加载数据集
train_dataset = pdx.datasets.ImageNet(data_dir='garbage4',file_list='garbage4/train_list.txt',label_list='garbage4/labels.txt',transforms=train_transforms,shuffle=True)# 初始化模型(使用MobileNetV3小模型,适合移动端部署)
num_classes = len(train_dataset.labels)
model = pdx.cls.MobileNetV3_large_x1_0(num_classes=num_classes)# 模型训练
model.train(num_epochs=10,train_dataset=train_dataset,train_batch_size=32,eval_dataset=eval_dataset,learning_rate=0.001,lr_decay_epochs=[4, 6, 8],save_dir='output/mobilenetv3',use_vdl=True) # 启用VisualDL可视化训练过程
步骤3:模型评估与预测
# 加载最佳模型
model = pdx.load_model('output/mobilenetv3/best_model')# 单张图片预测
result = model.predict('test_image.jpg')
print("预测结果:", result) # 输出类别概率# 批量评估
eval_metrics = model.evaluate(eval_dataset, batch_size=32, return_details=False)
print("评估指标:", eval_metrics) # 输出准确率、F1分数等
步骤4:模型导出与部署
# 导出为推理模型
pdx.deploy export_inference --model_dir=output/mobilenetv3/best_model --save_dir=inference_model# 使用PaddleLite部署到移动端(Android示例)
paddle_lite_opt --model_file=inference_model/model.pdmodel \--param_file=inference_model/model.pdiparams \--optimize_out=garbage_model
案例2:目标检测 - 交通标志识别
场景:识别道路上的各类交通标志(限速、禁止通行、转弯等)。
步骤1:数据标注(使用PaddleX内置工具)
# 启动标注工具(图形界面)
paddlex --data_annotation --task det --annotation_dir=traffic_annotation
- 在界面中导入图片,绘制矩形框标注交通标志类别。
- 导出为COCO或VOC格式。
步骤2:模型训练(使用YOLOv3)
import paddlex as pdx
from paddlex import transforms as T# 定义数据增强
train_transforms = T.Compose([T.RandomResizeByShort(short_sizes=[320, 352, 384, 416, 448, 480, 512, 544, 576, 608], max_size=1333),T.RandomHorizontalFlip(),T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])# 加载数据集
train_dataset = pdx.datasets.VOCDetection(data_dir='traffic_data',file_list='traffic_data/train_list.txt',label_list='traffic_data/labels.txt',transforms=train_transforms,shuffle=True)# 初始化YOLOv3模型(基于DarkNet53骨干网络)
num_classes = len(train_dataset.labels)
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53')# 模型训练
model.train(num_epochs=20,train_dataset=train_dataset,train_batch_size=8,eval_dataset=eval_dataset,learning_rate=0.0001,lr_decay_epochs=[15, 20],save_dir='output/yolov3_darknet53',use_vdl=True)
步骤3:模型预测与可视化
# 加载模型
model = pdx.load_model('output/yolov3_darknet53/best_model')# 单张图片预测并可视化
result = model.predict('test_traffic.jpg')
pdx.det.visualize('test_traffic.jpg', result, threshold=0.5, save_dir='./')
案例3:语义分割 - 土地覆盖分类
场景:将卫星图像中的土地类型(森林、水域、城市、农田等)进行像素级分类。
步骤1:数据准备(假设已标注为PNG掩码)
landcover/
├── images/ # 原始卫星图像
├── masks/ # 对应掩码图像(不同颜色代表不同类别)
├── train_list.txt # 训练集路径对
├── val_list.txt # 验证集路径对
└── labels.txt # 类别名称
步骤2:模型训练(使用DeepLabv3+)
import paddlex as pdx
from paddlex import transforms as T# 定义数据增强
train_transforms = T.Compose([T.RandomResizeByShort(short_sizes=[512, 544, 576, 608, 640, 672, 704], max_size=1024),T.RandomHorizontalFlip(),T.RandomVerticalFlip(),T.RandomRotate(rotate_range=90),T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])# 加载数据集
train_dataset = pdx.datasets.SegDataset(data_dir='landcover',file_list='landcover/train_list.txt',label_list='landcover/labels.txt',transforms=train_transforms,shuffle=True)# 初始化DeepLabv3+模型(基于ResNet50骨干网络)
num_classes = len(train_dataset.labels)
model = pdx.seg.DeepLabv3p(num_classes=num_classes, backbone='ResNet50_vd')# 模型训练
model.train(num_epochs=30,train_dataset=train_dataset,train_batch_size=4,eval_dataset=eval_dataset,learning_rate=0.01,lr_decay_epochs=[20, 25],save_dir='output/deeplabv3p_resnet50',use_vdl=True)
步骤3:模型预测与可视化
# 加载模型
model = pdx.load_model('output/deeplabv3p_resnet50/best_model')# 单张图片预测并可视化
result = model.predict('test_satellite.jpg')
pdx.seg.visualize('test_satellite.jpg', result, weight=0.6, save_dir='./')
案例4:服务化部署(以Flask API为例)
from flask import Flask, request, jsonify
import paddlex as pdx
import cv2
import base64
import numpy as npapp = Flask(__name__)
model = pdx.load_model('inference_model') # 加载导出的推理模型@app.route('/predict', methods=['POST'])
def predict():# 获取图像数据img_data = request.json['image']img_bytes = base64.b64decode(img_data)img_array = np.frombuffer(img_bytes, np.uint8)img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)# 模型预测result = model.predict(img)# 返回结果return jsonify({'status': 'success','result': result})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
关键特性总结
- 简化流程:统一API覆盖数据标注、训练、评估、部署全流程。
- 预训练模型:内置ResNet、MobileNet、YOLOv3、DeepLabv3+等多种预训练模型。
- 自动优化:支持自动超参数搜索(如学习率、batch_size)。
- 多端部署:无缝导出到PaddleInference、PaddleLite、TensorRT等推理引擎。
- 可视化:集成VisualDL监控训练过程,支持损失曲线、模型结构可视化。
通过以上案例可以看出,PaddleX通过封装底层细节,使开发者能够专注于业务问题,大幅降低AI项目落地门槛,尤其适合政府、学校等需要快速验证和部署的场景。