PaddleX 使用案例

发布于:2025-05-24 ⋅ 阅读:(14) ⋅ 点赞:(0)

以下是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 np

app = 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)

关键特性总结

  1. 简化流程:统一API覆盖数据标注、训练、评估、部署全流程。
  2. 预训练模型:内置ResNet、MobileNet、YOLOv3、DeepLabv3+等多种预训练模型。
  3. 自动优化:支持自动超参数搜索(如学习率、batch_size)。
  4. 多端部署:无缝导出到PaddleInference、PaddleLite、TensorRT等推理引擎。
  5. 可视化:集成VisualDL监控训练过程,支持损失曲线、模型结构可视化。

通过以上案例可以看出,PaddleX通过封装底层细节,使开发者能够专注于业务问题,大幅降低AI项目落地门槛,尤其适合政府、学校等需要快速验证和部署的场景。


网站公告

今日签到

点亮在社区的每一天
去签到