用PaddleDetection套件训练自己的数据集,PP-YOLO-SOD训练全流程

文章目录

官方资料

PaddlePaddle框架官方文档:https://www.paddlepaddle.org.cn/

论文:PP-YOLOE: An evolved version of YOLO

PaddleDection套件:pp-yoloe-sod-高精度小目标检测模型

小目标检测模型说明:PP-YOLOE-SOD 小目标检测模型(PP-YOLOE Small Object Detection)

PP-YOLOE-SOD预训练权重:模型库

ppyoloe+ 训练全流程

环境配置与套件准备

python 复制代码
pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/
python 复制代码
# 进入套件
cd PaddleDetection-release-2.8.1

# 初始化
python setup.py install

# 安装依赖
pip install -r requirements.txt
python 复制代码
pip install visualdl -i https://mirror.baidu.com/pypi/simple

直接运行以下命令安装 libgomp1

python 复制代码
apt-get update && apt-get install -y libgomp1

数据集准备与VOC格式ppdet的要求

VOC格式数据集,训练集、验证集、测试集划分好,本别一个文件夹。

以训练集为例,需要含这四个:

  • 图片文件夹:JPEGImages

  • 标签文件夹:Annotations

  • 类别列表文件:label_list.txt

  • 标签列表文件:train_list.txt

标签列表txt文件生成脚本

python 复制代码
import os

def generate_list_file(voc_root, output_list_path):
    """
    生成VOC数据集的列表文件,每行格式为:JPEGImages/图像名 Annotations/标注名
    
    参数:
    voc_root: VOC数据集根目录(包含JPEGImages和Annotations文件夹)
    output_list_path: 输出的列表文件路径(如train_list.txt)
    """
    # 检查输入目录是否存在
    jpeg_dir = os.path.join(voc_root, "JPEGImages")
    anno_dir = os.path.join(voc_root, "Annotations")
    if not os.path.exists(jpeg_dir):
        raise ValueError(f"JPEGImages目录不存在:{jpeg_dir}")
    if not os.path.exists(anno_dir):
        raise ValueError(f"Annotations目录不存在:{anno_dir}")
    
    # 获取所有图像文件(仅保留常见图像格式)
    image_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.JPG', '.JPEG', '.PNG', '.BMP')
    image_files = [f for f in os.listdir(jpeg_dir) if f.endswith(image_extensions)]
    
    if not image_files:
        print(f"警告:在 {jpeg_dir} 中未找到任何图像文件")
        return
    
    # 写入列表文件
    with open(output_list_path, 'w') as f:
        count = 0
        for img_file in image_files:
            # 图像文件名(不含扩展名)
            img_name = os.path.splitext(img_file)[0]
            # 对应的标注文件名称
            anno_file = f"{img_name}.xml"
            
            # 检查标注文件是否存在
            anno_path = os.path.join(anno_dir, anno_file)
            if not os.path.exists(anno_path):
                print(f"警告:未找到 {img_file} 对应的标注文件 {anno_file},已跳过")
                continue
            
            # 按要求格式写入(相对路径)
            line = f"JPEGImages/{img_file} Annotations/{anno_file}\n"
            f.write(line)
            count += 1
    
    print(f"已生成 {output_list_path},包含 {count} 对有效图像和标注")

if __name__ == "__main__":
    # 配置你的数据集路径
    train_voc_root = "/mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-train-VOC"
    val_voc_root = "/mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOC"
    
    # 输出列表文件路径(可根据需要修改,建议放在数据集根目录)
    train_list_path = os.path.join(train_voc_root, "train_list.txt")
    val_list_path = os.path.join(val_voc_root, "val_list.txt")
    
    # 生成训练集列表
    print("开始处理训练集...")
    generate_list_file(train_voc_root, train_list_path)
    
    # 生成验证集列表
    print("\n开始处理验证集...")
    generate_list_file(val_voc_root, val_list_path)
    

数据集配置

PaddleDetection套件的所有配置文件都在PaddleDetection-release-2.8.1/configs目录下,数据集的配置文件在PaddleDetection-release-2.8.1/configs/datasets
voc.yml是官方的VOC数据集的配置文件,自己新建一个DUT-drone_voc.yaml配置文件

后面的模型配置文件中需要修改为../datasets/DUT-drone_voc.yaml

yml 复制代码
metric: VOC
map_type: 11point
num_classes: 1

TrainDataset:
  name: VOCDataSet  # 使用框架默认的VOC数据集类
  dataset_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-train-VOC  # 绝对路径
  anno_path: train_list.txt
  label_list: label_list.txt
  data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

EvalDataset:
  name: VOCDataSet
  dataset_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOC
  anno_path: val_list.txt
  label_list: label_list.txt
  data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

TestDataset:
  name: ImageFolder
  image_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOC/JPEGImages
  anno_path: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOC/label_list.txt

预训练权重

模型库地址:https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.8.1/configs/smalldet

模型库含有的:

  • VisDrone模型
  • COCO模型
  • 切图模型
  • 拼图模型

我下载的是PP-YOLOE+_l的模型

随后在模型配置文件中指定路径

yml 复制代码
pretrain_weights: /mnt/Virgil/PaddleDetetion/ppyoloe_plus_crn_l_80e_coco.pdparams

模型配置

模型的配置文件在PaddleDetection-release-2.8.1/configs/ppyoloe

PaddleDetection-release-2.8.1/configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml是官方的模型配置文件,自己新建一个DUT_ppyoloe_plus_crn_l_80e_coco.yml

python 复制代码
_BASE_: [
  '../datasets/DUT-drone_voc.yaml',
  '../runtime.yml',
  './_base_/optimizer_80e.yml',
  './_base_/ppyoloe_plus_crn.yml',
  './_base_/ppyoloe_plus_reader.yml',
]

log_iter: 100
epoch: 100
snapshot_epoch: 5

weights: output/ppyoloe_plus_crn_l_80e_coco/model_final
#pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/pretrained/ppyoloe_crn_l_obj365_pretrained.pdparams
pretrain_weights: /mnt/Virgil/PaddleDetetion/ppyoloe_plus_crn_l_80e_coco.pdparams

depth_mult: 1.0
width_mult: 1.0

TrainReader:
  batch_size: 8

ppyoloe训练命令

参考飞浆官方乒乓球识别比赛的命令:

python 复制代码
python tools/train.py -c configs/picodet/ppq.yml \
                        --use_vdl=true \
                        --vdl_log_dir=/home/aistudio/work/vdl_dir \
                        --eval \
                        -o save_dir=/home/aistudio/work/model
python 复制代码
cd /mnt/Virgil/PaddleDetetion/PaddleDetection-release-2.8.1
python 复制代码
python -u tools/train.py -c configs/ppyoloe/DUT_ppyoloe_plus_crn_l_80e_coco.yml \
                        --use_vdl=true \
                        --vdl_log_dir=vdl_dir/scalar \
                        --eval

ppyoloe评估命令

参考飞浆官方乒乓球识别比赛的命令:

python 复制代码
python tools/eval.py -c configs/picodet/ppq.yml \
                    -o weights=/home/aistudio/work/model/ppq/best_model.pdparams \
                    # --classwise \

ppyoloe推理命令与可视化结果

参考飞浆官方乒乓球识别比赛的命令:

python 复制代码
cd PaddleDetection-2.5.0
!python tools/infer.py -c configs/picodet/ppq.yml \
                    --infer_img=/home/aistudio/work/dataset/val/JPEGImages/game_1_frame_012375.png \
                    -o weights=/home/aistudio/work/model/ppq/best_model.pdopt \
                    --output_dir=/home/aistudio/work/img

参考飞浆官方乒乓球识别比赛的可视化:

python 复制代码
import matplotlib.pyplot as plt
import cv2

# 读取图像
image_path = "/home/aistudio/work/img/game_1_frame_012375.png"
image = cv2.imread(image_path)

# 检查图像是否成功加载
if image is None:
    print(f"Failed to load image: {image_path}")
else:
    # 转换 BGR 到 RGB
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
    # 显示图像
    plt.imshow(image)
    plt.axis("off")  # 关闭坐标轴
    plt.show()

ppyoloe-SOD 训练全流程

预训练权重

模型库地址:https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.8.1/configs/smalldet

我下载的是PP-YOLOE+_SOD-l的模型

随后在模型配置文件中指定路径

yml 复制代码
pretrain_weights: /mnt/Virgil/PaddleDetetion/ppyoloe_plus_sod_crn_l_80e_visdrone.pdparams

模型配置

模型的配置文件在PaddleDetection-release-2.8.1/configs/smalldet

PaddleDetection-release-2.8.1/configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml是官方的模型配置文件,自己新建一个DUT_ppyoloe_plus_sod_crn_l_80e_coco.yml

修改数据集目录为:../datasets/DUT-drone_voc.yaml

python 复制代码
_BASE_: [
  '../datasets/DUT-drone_voc.yaml',
  '../runtime.yml',
  '../ppyoloe/_base_/optimizer_80e.yml',
  '../ppyoloe/_base_/ppyoloe_plus_crn.yml',
  '../ppyoloe/_base_/ppyoloe_plus_reader.yml',
]

log_iter: 100
epoch: 100
snapshot_epoch: 5
weights: output/ppyoloe_plus_sod_crn_l_80e_coco/model_final

#pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/pretrained/ppyoloe_crn_l_obj365_pretrained.pdparams
pretrain_weights: /mnt/Virgil/PaddleDetetion/ppyoloe_plus_sod_crn_l_80e_visdrone.pdparams

depth_mult: 1.0
width_mult: 1.0

CustomCSPPAN:
  num_layers: 4
  use_trans: True

PPYOLOEHead:
  reg_range: [-2, 17]
  static_assigner_epoch: -1
  assigner:
    name: TaskAlignedAssigner_CR
    center_radius: 1
  nms:
    name: MultiClassNMS
    nms_top_k: 1000
    keep_top_k: 300
    score_threshold: 0.01
    nms_threshold: 0.7



TrainReader:
  batch_size: 2

ppyoloe训练命令

bash 复制代码
cd /mnt/Virgil/PaddleDetetion/PaddleDetection-release-2.8.1
bash 复制代码
python -u tools/train.py -c configs/smalldet/DUT_ppyoloe_plus_sod_crn_l_80e_coco.yml \
                        --use_vdl=true \
                        --vdl_log_dir=vdl_dir/scalar \
                        --eval
相关推荐
飞翔的佩奇42 分钟前
【完整源码+数据集+部署教程】食品分类与实例分割系统源码和数据集:改进yolo11-AggregatedAttention
python·yolo·计算机视觉·数据集·yolo11·食品分类与实例分割
Coovally AI模型快速验证1 天前
YOLO、DarkNet和深度学习如何让自动驾驶看得清?
深度学习·算法·yolo·cnn·自动驾驶·transformer·无人机
程序猿小D2 天前
【完整源码+数据集+部署教程】孔洞检测系统源码和数据集:改进yolo11-RetBlock
yolo·计算机视觉·毕业设计·数据集·yolo11·孔洞检测
钓了猫的鱼儿3 天前
无人机航拍数据集|第14期 无人机水体污染目标检测YOLO数据集3000张yolov11/yolov8/yolov5可训练
yolo·目标检测·猫脸码客·yolo数据集·无人机航拍数据集·无人机水体污染目标检测
飞翔的佩奇4 天前
【完整源码+数据集+部署教程】武器目标检测系统源码和数据集:改进yolo11-AggregatedAtt
人工智能·python·yolo·目标检测·计算机视觉·数据集·yolo11
欣赏你流浪^5 天前
物联网智能感知进阶:基于YOLO的琏雾系统视频分析
物联网·yolo·音视频
cver1235 天前
人脸情绪检测数据集-9,400 张图片 智能客服系统 在线教育平台 心理健康监测 人机交互优化 市场研究与广告 安全监控系统
人工智能·安全·yolo·计算机视觉·目标跟踪·机器人·人机交互
ChironW5 天前
Ubuntu 22.04 离线环境下完整安装 Anaconda、CUDA 12.1、NVIDIA 驱动及 cuDNN 8.9.3 教程
linux·运维·人工智能·深度学习·yolo·ubuntu
雪可问春风5 天前
YOLOv8 训练报错:PyTorch 2.6+ 模型加载兼容性问题解决
人工智能·pytorch·yolo