本项目以路标数据集roadsign为例,详细说明了如何使用PaddleDetection训练一个目标检测模型,并对模型进行评估和预测。
本项目提供voc格式的roadsign数据集和coco格式的roadsign数据集。
本项目提供 YOLOv3、FasterRCNN、FCOS这几个算法的配置文件。
您可以选择其中一个配置开始训练,快速体验PaddleDeteciton。
效果请戳这里:
PaddleDetection
# 查看当前挂载的数据集目录, 该目录下的变更重启环境后会自动还原
# View dataset directory. This directory will be recovered automatically after resetting environment.
!ls /home/aistudio/data
# 查看工作区文件, 该目录下的变更将会持久保存. 请及时清理不必要的文件, 避免加载过慢.
# View personal work directory. All changes under this directory will be kept even after reset. Please clean unnecessary files in time to speed up environment loading.
!ls /home/aistudio/work
# 如果需要进行持久化安装, 需要使用持久化路径, 如下方代码示例:
# If a persistence installation is required, you need to use the persistence path as the following:
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可:
# Also add the following code, so that every time the environment (kernel) starts, just run the following code:
import sys
sys.path.append('/home/aistudio/external-libraries')
AIStudio上已经安装好paddlepaddle 1.8.4。
import paddle
print(paddle.__version__)
通过以下命令克隆最新的PaddleDetection代码库。
! git clone https://github.com/PaddlePaddle/PaddleDetection
如果因为网络问题clone较慢,可以:
git clone https://hub.fastgit.org/PaddlePaddle/PaddleDetection.git
git clone https://gitee.com/paddlepaddle/PaddleDetection
注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先从github上克隆。
work/PaddleDetection.zip
这里采用项目提供的代码库
! ls ~/work/PaddleDetection.zip
%cd ~/work/
! unzip -o PaddleDetection.zip
通过如下方式安装PaddleDetection依赖,并设置环境变量
安装 cocoapi
如果因为网络问题clone较慢,可以:
pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI"
# github
#! pip install "git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI"
# fast github
# ! pip install "git+https://hub.fastgit.org/cocodataset/cocoapi.git#subdirectory=PythonAPI"
#
! pip install pycocotools
设置环境
%cd ~/work/PaddleDetection/
!pip install -r requirements.txt
%env PYTHONPATH=.:$PYTHONPATH
%env CUDA_VISIBLE_DEVICES=0
验证安装
! python ppdet/modeling/tests/test_architectures.py
本项目使用road-sign-detection 比赛数据,检测4种路标:
划分成训练集和测试集,总共877张图,其中训练集701张图、测试集176张图。
本项目提供voc格式和coco格式的数据:
voc格式:
划分好的数据下载地址为: roadsign_voc.tar。
AiStudio上数据地址:roadsign_voc
coco格式:
划分好的数据下载地址为::roadsign_coco.tar。
AiStudio上数据地址:roadsign_coco
将~/data/
文件夹下的数据解压到PaddleDetection/dataset/
文件夹下。
%cd ~/work/PaddleDetection/dataset/
! pwd
! ls ~/data -l
VOC数据格式的目标检测数据,是指每个图像文件对应一个同名的xml文件,xml文件中标记物体框的坐标和类别等信息。
Pascal VOC比赛对目标检测任务,对目标物体是否遮挡、是否被截断、是否是难检测物体进行了标注。对于用户自定义数据可根据实际情况对这些字段进行标注。
xml文件中包含以下字段:
road650.png
300
400
3
object字段,表示每个物体。包括
name
: 目标物体类别名称pose
: 关于目标物体姿态描述(非必须字段)truncated
: 目标物体目标因为各种原因被截断(非必须字段)occluded
: 目标物体是否被遮挡(非必须字段)difficult
: 目标物体是否是很难识别(非必须字段)bndbox
: 物体位置坐标,用左上角坐标和右下角坐标表示:xmin
、ymin
、xmax
、ymax
将~/data/data49531/roadsign_voc.tar
解压到PaddleDetection/dataset/roadsign_voc
下
%cd ~/work/PaddleDetection/dataset/roadsign_voc/
! pwd
# copy roadsign_voc.tar and extract
! cp ~/data/data49531/roadsign_voc.tar .
! tar -xvf roadsign_voc.tar
! rm -rf roadsign_voc.tar
# 查看一条数据
! cat ./annotations/road650.xml
coco数据格式,是指将所有训练图像的标注都存放到一个json文件中。数据以字典嵌套的形式存放。
json文件中存放了 info licenses images annotations categories
的信息:
{
'area': 899,
'iscrowd': 0,
'image_id': 839,
'bbox': [114, 126, 31, 29],
'category_id': 0, 'id': 1,
'ignore': 0,
'segmentation': []
}
将~/data/data49531/roadsign_coco.tar
解压到PaddleDetection/dataset/roadsign_coco
下
%cd ~/work/PaddleDetection/dataset/
! mkdir roadsign_coco
%cd ~/work/PaddleDetection/dataset/roadsign_coco/
! pwd
# copy roadsign_coco.tar and extract
! cp ~/data/data52968/roadsign_coco.tar .
! tar -xvf roadsign_coco.tar
! rm -rf roadsign_coco.tar
# 查看一条数据
import json
coco_anno = json.load(open('./annotations/train.json'))
# coco_anno.keys
print('\nkeys:', coco_anno.keys())
# 查看类别信息
print('\n物体类别:', coco_anno['categories'])
# 查看一共多少张图
print('\n图像数量:', len(coco_anno['images']))
# 查看一共多少个目标物体
print('\n标注物体数量:', len(coco_anno['annotations']))
# 查看一条目标物体标注信息
print('\n查看一条目标物体标注信息:', coco_anno['annotations'][0])
本项目在work/hw_configs/
目录下提供以下配置文件
将~/work/hw_configs.zip
解压到 configs
文件夹下
%cd ~/work/PaddleDetection/
!unzip -o ~/work/hw_configs.zip -d configs/
! ls configs/hw_configs/
# 选择配置开始训练。可以通过 -o 选项覆盖配置文件中的参数
# faster_rcnn_r50_vd_fpn
! python -u tools/train.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True --eval
# yolov3
#! python -u tools/train.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True --eval
# fcos
#! python -u tools/train.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True --eval
您可以通过指定visualDL可视化工具,对loss变化曲线可视化。您仅需要指定 use_vdl
参数和 vdl_log_dir
参加即可。
点击左侧 可视化 按钮,设置 logdir
和模型文件,就可以对训练过程loss变化曲线和模型进行可视化。
# 选择配置开始训练。可以通过 -o 选项覆盖配置文件中的参数 vdl_log_dir 设置vdl日志文件保存路径
# faster_rcnn_r50_vd_fpn
! python -u tools/train.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval
# yolov3
#! python -u tools/train.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval
# fcos
#! python -u tools/train.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True --use_vdl=True --vdl_log_dir=vdl_dir/scalar --eval
PaddleDetection也提供了tools/eval.py
脚本用于评估模型,评估是可以通过-o weights=
指定待评估权重。
PaddleDetection训练过程中若开始了--eval
,会将所有checkpoint中评估结果最好的checkpoint保存为best_model.pdparams
,可以通过如下命令一键式评估最优checkpoint
这里我们加载预训练好的权重进行预测:
# 评估
# faster_rcnn_r50_vd_fpn
! python -u tools/eval.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_r50_fpn_best_model_roadsign.pdparams
# yolov3
#! python -u tools/eval.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_best_model_roadsign.pdparams
# fcos
#! python -u tools/eval.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/fcos_best_model_roadsign.pdparams
PaddleDetection提供了tools/infer.py预测工具,可以使用训练好的模型预测图像并可视化,通过-o weights=指定加载训练过程中保存的权重。
预测脚本如下:
img_path = './dataset/roadsign_voc/images/road554.png'
# faster_rcnn_r50_vd_fpn
! python tools/infer.py -c configs/hw_configs/faster_rcnn_r50_vd_fpn_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/faster_r50_fpn_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png
# yolov3
#! python tools/infer.py -c configs/hw_configs/yolov3_mobilenet_v1_roadsign_voc_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/yolov3_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png
# fcos
#! python tools/infer.py -c configs/hw_configs/fcos_r50_roadsign_coco_template.yml -o use_gpu=True weights=https://paddlemodels.bj.bcebos.com/object_detection/fcos_best_model_roadsign.pdparams --infer_img=dataset/roadsign_voc/images/road554.png
%matplotlib inline
import matplotlib.pyplot as plt
import cv2
infer_img = cv2.imread("output/road554.png")
plt.figure(figsize=(15,10))
plt.imshow(cv2.cvtColor(infer_img, cv2.COLOR_BGR2RGB))
plt.show()