现在百度飞桨的框架越做越火热,pp飞桨的目标检测框架开发套件也发布多时了,本文就利用自定义的VOC数据集来进行目标检测.下面是一些官方资料的参考地址
PaddleDetection Github
PaddleDetection 安装说明
PaddleDetection 数据集准备
PaddleDetection 如何上手
PaddleDetection 支持的数据格式
[PaddleDetection保姆级教程]使用自定义数据集实现吸烟识别预测
PaddleDetection 官方教程文档
先来讲一下目标检测从安装到训练的我的配置:
显卡: RTX 3090 * 2
CUDA版本:11.4
数据集:10W +
首先需要安装paddlepaddle官方库
环境要求
PaddlePaddle 2.2
OS 64位操作系统
Python 3(3.5.1+/3.6/3.7/3.8/3.9),64位版本
pip/pip3(9.0.1+),64位版本
CUDA >= 10.1
cuDNN >= 7.6
PaddleDetection 依赖 PaddlePaddle 版本关系:
安装paddlepaddle
# CUDA10.1
python -m pip install paddlepaddle-gpu==2.2.0.post101 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
# CPU
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
由于我的cuda版本是11.4,过高了,所以我直接去官方网站找下载方式:paddlepaddle 官方下载地址
我选择的计算平台是CUDA11.2,直接复制上方的安装信息到命令行即可。
python -m pip install paddlepaddle-gpu==2.3.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
注意: pip安装方式只支持Python3
# 克隆PaddleDetection仓库
cd <path/to/clone/PaddleDetection>
git clone https://github.com/PaddlePaddle/PaddleDetection.git
# 安装其他依赖
cd PaddleDetection
pip install -r requirements.txt
# 编译安装paddledet
python setup.py install
安装后确认测试通过:
python ppdet/modeling/tests/test_architectures.py
测试通过后会提示如下信息:
.......
----------------------------------------------------------------------
Ran 7 tests in 12.816s
OK
接下来快速体验目标检测效果
# 在GPU上预测一张图片
export CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=true weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg
会在output文件夹下生成一个画有预测结果的同名图像。
目前#PaddleDetection支持43种数据格式:coco voc widerface。在这里我们主要说明一下如何使用自定义COCO进行目标检测、实例分割;如何使用自定义VOC数据集进行目标检测。
当用户使用VOC数据集进行的,只需要对voc.yml进行修改即可实现正常训练。
我们提供了一个自定义的VOC数据集,并整理成如图如下图所示的形式。用户在voc.yml文件中修改路径即可。
dataset_dir: 表示数据集的路径(该路径下保存数据集、标注文件、标签以及训练验证数据集说明txt文件)
anno_path: 表示训练/验证数据集的说明txt文件路径 (该处填写相对于dataset_dir的相对路径)
label_list: 表示label的txt文件路径(该处填写相对于dataset_dir的相对路径)
在TestDataset的配置中,对于的主要是label_list的路径,确保在测试过程中,有正确的标签
我们只需要更改…/datasets/voc.yml 这个voc文件即可配置我们的数据集
各个文件说明
label_list.txt 是类别名称列表,文件名必须是 label_list.txt。若使用VOC数据集,config文件中use_default_label为true时不需要这个文件
cat label_list.txt
aeroplane
bicycle
…
trainval.txt 是训练数据集文件列表
cat trainval.txt
VOCdevkit/VOC2007/JPEGImages/007276.jpg VOCdevkit/VOC2007/Annotations/007276.xml
VOCdevkit/VOC2012/JPEGImages/2011_002612.jpg VOCdevkit/VOC2012/Annotations/2011_002612.xml
…
test.txt 是测试数据集文件列表
cat test.txt
VOCdevkit/VOC2007/JPEGImages/000001.jpg VOCdevkit/VOC2007/Annotations/000001.xml
…
label_list.txt voc 类别名称列表
cat label_list.txt
aeroplane
bicycle
…
VOC数据标注文件介绍
VOC数据是每个图像文件对应一个同名的xml文件,xml文件中标记物体框的坐标和类别等信息。例如图像2007_002055.jpg:
图片对应的xml文件内包含对应图片的基本信息,比如文件名、来源、图像尺寸以及图像中包含的物体区域信息和类别信息等。
xml文件中包含以下字段:
filename,表示图像名称。
size,表示图像尺寸。包括:图像宽度、图像高度、图像深度。
本项目中,使用YOLOv3模型里的yolov3_mobilenet_v3_large_ssld_270e_voc.yml进行训练
从上图看到yolov3_mobilenet_v3_large_ssld_270e_voc.yml配置需要依赖其他的配置文件。在该例子中需要依赖:
在修改文件之前,先给大家解释一下各依赖文件的作用:
'…/datasets/voc.yml’主要说明了训练数据和验证数据的路径,包括数据格式(coco、voc等)
‘…/runtime.yml’,主要说明了公共的运行状态,比如说是否使用GPU、迭代轮数等等
‘base/optimizer_270e.yml’,主要说明了学习率和优化器的配置,以及设置epochs。在其他的训练的配置中,学习率和优化器是放在了一个新的配置文件中。 ‘base/yolov3_mobilenet_v3_large.yml’,主要说明模型、和主干网络的情况说明
‘base/yolov3_reader.yml’, 主要说明了读取后的预处理操作,比如resize、数据增强等等。
介绍一下需要修改的几个地方(画红线的地方):
…/datasets/voc.yml,数据集配置的路径文件
base/optimizer_270e.yml,这里可以更改训练epoch次数和学习率等参数
如果训练时发现内存不够,溢出等情况,可以修改base/yolov3_reader.yml文件,可以通过修改batch_size大小
PaddleDetection提供了单卡/多卡训练模式,满足用户多种训练需求
首先进入目录
cd PaddleDetection/
export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml
首先指定CUDA的环境变量
其中 -c 代表指定配置文件的路径
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 #windows和Mac下不需要执行该命令
python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml