用PaddleDetection套件训练自己的数据集,PP-YOLO-SOD训练全流程
文章目录
- 官方资料
- ppyoloe+ 训练全流程
- 环境配置与套件准备
- 数据集准备与VOC格式ppdet的要求
- 标签列表txt文件生成脚本
- 数据集配置
- 预训练权重
- 模型配置
- ppyoloe训练命令
- ppyoloe评估命令
- ppyoloe推理命令与可视化结果
- ppyoloe-SOD 训练全流程
- 预训练权重
- 模型配置
- ppyoloe训练命令
官方资料
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+ 训练全流程
环境配置与套件准备
pip install paddlepaddle-gpu==3.0.0b1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/
# 进入套件
cd PaddleDetection-release-2.8.1# 初始化
python setup.py install# 安装依赖
pip install -r requirements.txt
pip install visualdl -i https://mirror.baidu.com/pypi/simple
直接运行以下命令安装 libgomp1
apt-get update && apt-get install -y libgomp1
数据集准备与VOC格式ppdet的要求
VOC格式数据集,训练集、验证集、测试集划分好,本别一个文件夹。
以训练集为例,需要含这四个:
-
图片文件夹:
JPEGImages
-
标签文件夹:
Annotations
-
类别列表文件:
label_list.txt
-
标签列表文件:
train_list.txt
标签列表txt文件生成脚本
import osdef 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 = 0for 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 += 1print(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
metric: VOC
map_type: 11point
num_classes: 1TrainDataset:name: VOCDataSet # 使用框架默认的VOC数据集类dataset_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-train-VOC # 绝对路径anno_path: train_list.txtlabel_list: label_list.txtdata_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']EvalDataset:name: VOCDataSetdataset_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOCanno_path: val_list.txtlabel_list: label_list.txtdata_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']TestDataset:name: ImageFolderimage_dir: /mnt/Virgil/PaddleDetetion/DUT-datasets/DUT-Anti-UAV-val-VOC/JPEGImagesanno_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的模型
随后在模型配置文件中指定路径
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
_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: 5weights: 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.pdparamsdepth_mult: 1.0
width_mult: 1.0TrainReader:batch_size: 8
ppyoloe训练命令
参考飞浆官方乒乓球识别比赛的命令:
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
cd /mnt/Virgil/PaddleDetetion/PaddleDetection-release-2.8.1
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 tools/eval.py -c configs/picodet/ppq.yml \-o weights=/home/aistudio/work/model/ppq/best_model.pdparams \# --classwise \
ppyoloe推理命令与可视化结果
参考飞浆官方乒乓球识别比赛的命令:
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
参考飞浆官方乒乓球识别比赛的可视化:
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 到 RGBimage = 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的模型
随后在模型配置文件中指定路径
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
_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.pdparamsdepth_mult: 1.0
width_mult: 1.0CustomCSPPAN:num_layers: 4use_trans: TruePPYOLOEHead:reg_range: [-2, 17]static_assigner_epoch: -1assigner:name: TaskAlignedAssigner_CRcenter_radius: 1nms:name: MultiClassNMSnms_top_k: 1000keep_top_k: 300score_threshold: 0.01nms_threshold: 0.7TrainReader:batch_size: 2
ppyoloe训练命令
cd /mnt/Virgil/PaddleDetetion/PaddleDetection-release-2.8.1
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