【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)

前言

最近在研究目标检测算法–PP-PicoDet算法(百度自研**),2021年11月份新鲜出炉。官方介绍说,性能优于YOLOV5 、YOLOX等算法,主要是轻量化部署贡献很大,比如在相同的精度下,PP-PicoDet推理速度高出YOLOv5s 44%,可谓NB,所以作者第一步先搭建环境,试跑一下,记录使用PP-PicoDet算法在paddle框架下训练模型的整个过程,供大家参考交流,欢迎提问。


PP-PicoDet算法源码:GitHub源码地址

一、说明

PP-PicoDet算法支持COCO、Pascal VOCwide - face数据集的PaddleDetection,本文使用的数据集标签格式是voc格式的,也就是标签为xml文件。

二、数据集准备制作

1.标注好的图片和对应标签分开存放

如下图,分别存放在JPEGImagesAnnotations文件夹,JPEGImages和Annotations可以存放在dataset文件夹下,这个可自己安排,只要后面路径对得上就ok
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第1张图片

2.修改CreateTrainValPath_txt_PP-picoDet.py脚本(该脚本是博主自己写的一个,源码中没提供),生成train.txt和val.txt

CreateTrainValPath_txt_PP-picoDet.py脚本说明:
1、该脚本的功能是生成支持PP-PicoDet算法使用train.txt和val.txt
2、该脚本会按照9:1的比例把所有图片划分为训练集验证集
注意:使用前先改成自己的路径

import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = '/PaddleDetection-2.3/dataset/VOCdevkit/VOC2007/Annotations/'  #换成自己标签存放的路径
txtsavepath = '/dataset/VOCdevkit/VOC2007'
imgfilepath = '/PaddleDetection-2.3/dataset/VOCdevkit/VOC2007/JPEGImages/'  #换成自己图片存放的路径
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open('./trainval.txt', 'w')
ftest = open('./test.txt', 'w')
ftrain = open('./train.txt', 'w')
fval = open('./val.txt', 'w')

for i in list:
    name = total_xml[i][:-4]
    if i in trainval:
        ftrainval.write(imgfilepath + name + '.jpg' + ' ' + xmlfilepath + name + '.xml' + '\n')
        if i in train:
            ftest.write(imgfilepath + name + '.jpg' + ' ' + xmlfilepath + name + '.xml' + '\n')
        else:
            fval.write(imgfilepath + name + '.jpg' + ' ' + xmlfilepath + name + '.xml' + '\n')
    else:
        ftrain.write(imgfilepath + name + '.jpg' + ' ' + xmlfilepath + name + '.xml' + '\n')

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

生成的train.txt内容格式如下:

【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第2张图片

3.label_list.txt文件内容

上面截图中说过,内容是训练数据的类别,比如训练集目标有person、dog、cat,则label_list.txt内容如下:
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第3张图片
至此,数据集准备工作已完成!

4. 修改配置文件

本文作者使用的是picodet_s_320_voc.yml来训练模型的,其他类似操作,文件在“PaddleDetection-2.3/configs/picodet”路径下,需要修改的配置文件一共有5个(包括picodet_s_320_voc.yml),

(1)修改前的picodet_s_320_voc.yml内容如下:
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第4张图片

修改后的picodet_s_320_voc.yml内容如下:


【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第5张图片

(2)修改前的voc.yml内容如下:
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第6张图片
修改后的voc.yml内容如下:
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第7张图片

(3)修改后的vruntime.yml内容如下:
【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第8张图片
(4)修改后的picodet_320_reader.yml内容如下:

epoch: 300  #迭代次数,自定义修改

LearningRate:
  base_lr: 0.05  #学习率,本文使用的是单个GPU训练,所以0.4除以8,等于0.05,默认是8块GPU训练
  schedulers:
  - !CosineDecay
    max_epochs: 300
  - !LinearWarmup
    start_factor: 0.1
    steps: 300

OptimizerBuilder:
  optimizer:
    momentum: 0.9
    type: Momentum
  regularizer:
    factor: 0.00004
    type: L2


(5)修改后的optimizer_300e.yml内容如下
只修改batch_size参数

worker_num: 6
TrainReader:
  sample_transforms:
  - Decode: {}
  - RandomCrop: {}
  - RandomFlip: {prob: 0.5}
  - RandomDistort: {}
  batch_transforms:
  - BatchRandomResize: {target_size: [256, 288, 320, 352, 384], random_size: True, random_interp: True, keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_size: 32   #根据自己显卡内存修改batchsize
  shuffle: true
  drop_last: true
  collate_batch: false


EvalReader:
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [320, 320], keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}
  batch_size: 8   #根据自己显卡内存修改batchsize
  shuffle: false


TestReader:
  inputs_def:
    image_shape: [1, 3, 320, 320]
  sample_transforms:
  - Decode: {}
  - Resize: {interp: 2, target_size: [320, 320], keep_ratio: False}
  - NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  - Permute: {}
  batch_transforms:
  - PadBatch: {pad_to_stride: 32}
  batch_size: 1
  shuffle: false

5.训练

执行命令:

1、export CUDA_VISIBLE_DEVICES=0                 #windows和Mac下不需要执行该命令
2、python tools/train.py -c configs/picodet/picodet_s_416_coco.yml

6.成功训练过程截图如下

在这里插入图片描述

7.训练完生成模型

【深度学习笔记】飞桨PP-PicoDet算法训练自己数据(过程超详细)_第9张图片

总结

**其实整个过程并不复杂,主要通过脚本把数据集处理好,另外配置好对应文件即可,有问题可以留言交流!如果本文对你有帮助,谢谢来个三连!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DeepLearning_/article/details/121835969

环境搭建这块参考本文作者另外一篇博客(更新中)。

你可能感兴趣的:(深度学习,计算机视觉,目标识别检测,深度学习,paddlepaddle,目标检测)