文章目录
- 官方资料
- [ppyoloe+ 训练全流程](#ppyoloe+ 训练全流程)
- [ppyoloe-SOD 训练全流程](#ppyoloe-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