★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

项目背景

PP-YOLOE-R是一个高效的单阶段Anchor-free旋转框检测模型。基于PP-YOLOE, PP-YOLOE-R以极少的参数量和计算量为代价,引入了一系列有用的设计来提升检测精度。在DOTA 1.0数据集上,PP-YOLOE-R-l和PP-YOLOE-R-x在单尺度训练和测试的情况下分别达到了78.14和78.27 mAP,这超越了几乎所有的旋转框检测模型。通过多尺度训练和测试,PP-YOLOE-R-l和PP-YOLOE-R-x的检测精度进一步提升至80.02和80.73 mAP。在这种情况下,PP-YOLOE-R-x超越了所有的anchor-free方法并且和最先进的anchor-based的两阶段模型精度几乎相当。此外,PP-YOLOE-R-s和PP-YOLOE-R-m通过多尺度训练和测试可以达到79.42和79.71 mAP。考虑到这两个模型的参数量和计算量,其性能也非常卓越。在保持高精度的同时,PP-YOLOE-R避免使用特殊的算子,例如Deformable Convolution或Rotated RoI Align,以使其能轻松地部署在多种多样的硬件上。在1024x1024的输入分辨率下,PP-YOLOE-R-s/m/l/x在RTX 2080 Ti上使用TensorRT FP16分别能达到69.8/55.1/48.3/37.1 FPS,在Tesla V100上分别能达到114.5/86.8/69.7/50.7 FPS.

可以看出,PP-YOLOE-R真可谓是【又快又好】的典型!

1. 环境准备

1.1数据集准备

  • 数据集介绍

Dota是用于航拍图像中物体检测的大型数据集。它可用于开发和评估航拍图像中的物体探测器。对于DOTA-v1.0,如本文所述,它包含来自不同传感器和平台的2806幅航拍图像。每个图像的尺寸在约800×800到4000×4000像素的范围内,并且包含呈现出各种尺度,方向和形状的物体。随后,这些DOTA图像由航空图像解释专家以15个常见对象类别注释。完全注释的DOTA图像包含188,282个实例,每个实例由任意(8自由度)四边形标记。

  • 解压数据集

可以从DOTA数据集官网下载数据集并解压,解压后的数据集目录结构如下所示:

${DOTA_ROOT}
├── test
│   └── images
├── train
│   ├── images
│   └── labelTxt
└── val
    ├── images
    └── labelTxt

对于有标注的数据,每一张图片会对应一个同名的txt文件,文件中每一行为一个旋转框的标注,其格式如下:

x1 y1 x2 y2 x3 y3 x4 y4 class_name difficult
!rar x data/data181025/val.rar -d dataset/val/
!rar x data/data181025/test.rar -d dataset/test/
!rar x data/data181025/train.rar -d dataset/train/

1.2训练环境准备

克隆PaddleDetection

!git clone https://gitee.com/paddlepaddle/PaddleDetection.git
  • 单尺度切图

DOTA数据集分辨率较高,因此一般在训练和测试之前对图像进行离线切图,使用单尺度进行切图可以使用以下命令:

# 对于有标注的数据进行切图
!python PaddleDetection/configs/rotate/tools/prepare_data.py \
--input_dirs dataset/train/ dataset/val/ \
    --output_dir dataset/trainval1024/ \
    --coco_json_file DOTA_trainval1024.json \
    --subsize 1024 \
    --gap 200 \
    --rates 1.0
# 对于无标注的数据进行切图需要设置--image_only
!python PaddleDetection/configs/rotate/tools/prepare_data.py \
    --input_dirs dataset/test/test/ \
    --output_dir dataset/test1024/ \
    --coco_json_file DOTA_test1024.json \
    --subsize 1024 \
    --gap 200 \
    --rates 1.0 \
    --image_only
  • 用户自定义数据集

旋转框使用标准COCO数据格式,你可以将你的数据集转换成COCO格式以训练模型。COCO标准数据格式的标注信息中包含以下信息:

'annotations': [
    {
        'id': 2083, 'category_id': 9, 'image_id': 9008,
        'bbox': [x, y, w, h], # 水平框标注
        'segmentation': [[x1, y1, x2, y2, x3, y3, x4, y4]], # 旋转框标注
        ...
    }
    ...
]

需要注意的是bbox的标注是水平框标注,segmentation为旋转框四个点的标注(顺时针或逆时针均可)。在旋转框训练时bbox是可以缺省,一般推荐根据旋转框标注segmentation生成。 在PaddleDetection 2.4及之前的版本,bbox为旋转框标注[x, y, w, h, angle],segmentation缺省,目前该格式已不再支持,请下载最新数据集或者转换成标准COCO格式

  • 编译旋转框自定义外部算子
!cd PaddleDetection/ppdet/ext_op && python setup.py install
!python PaddleDetection/ppdet/ext_op/unittest/test_matched_rbox_iou.py
  • 安装训练所需要的库
!pip install pycocotools lap motmetrics filterpy

2.模型训练

2.1模型选择

PP-YOLOE-R相较于PP-YOLOE做了以下几点改动:

  • Rotated Task Alignment Learning
  • 解耦的角度预测头
  • 使用DFL进行角度预测
  • 可学习的门控单元
  • ProbIoU损失函数

部分模型库:

模型BackbonemAPV100 TRT FP16 (FPS)Params (M)FLOPs (G)学习率策略角度表示数据增广GPU数目每GPU图片数目
PP-YOLOE-R-sCRN-s73.8269.88.0943.463xocRR42
PP-YOLOE-R-mCRN-m77.6455.123.96127.003xocRR42
PP-YOLOE-R-xCRN-x78.2837.1100.27529.823xocRR42
PP-YOLOE-R-lCRN-l78.1469.753.29281.653xocRR42

注意

  • 如果GPU卡数或者batch size发生了改变,你需要按照公式 lrnew = lrdefault * (batch_sizenew * GPU_numbernew) / (batch_sizedefault * GPU_numberdefault) 调整学习率。
  • 模型库中的模型默认使用单尺度训练单尺度测试。如果数据增广一栏标明MS,意味着使用多尺度训练和多尺度测试。如果数据增广一栏标明RR,意味着使用RandomRotate数据增广进行训练。
  • CRN表示在PP-YOLOE中提出的CSPRepResNet
  • PP-YOLOE-R的参数量和计算量是在重参数化之后计算得到,输入图像的分辨率为1024x1024
  • 速度测试使用TensorRT 8.2.3在DOTA测试集中测试2000张图片计算平均值得到

2.2模型训练

# 使用单卡进行训练, 卡数或者batch_size变化需要调整学习率
!CUDA_VISIBLE_DEVICES=0 python -u PaddleDetection/tools/train.py -c PaddleDetection/configs/rotate/ppyoloe_r/ppyoloe_r_crn_l_3x_dota.yml --use_vdl=true --vdl_log_dir=vdl_dir/scalar
# GPU多卡训练
``python
# GPU多卡训练
!CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch --gpus 0,1,2,3 PaddleDetection/tools/train.py -c PaddleDetection/configs/rotate/ppyoloe_r/ppyoloe_r_crn_l_3x_dota.yml --use_vdl=true --vdl_log_dir=vdl_dir/scalar

损失函数如图所示:




2.3导出模型

正常导出的是最好的模型,即best_model,在此处我只导出第30轮的模型

!python PaddleDetection/tools/export_model.py -c PaddleDetection/configs/rotate/ppyoloe_r/ppyoloe_r_crn_l_3x_dota.yml -o weights=output/ppyoloe_r_crn_l_3x_dota/30

2.4模型评估

!python PaddleDetection/tools/eval.py -c PaddleDetection/configs/rotate/ppyoloe_r/ppyoloe_r_crn_l_3x_dota.yml -o weights=output/ppyoloe_r_crn_l_3x_dota/28.pdparams

2.5 预测

推理单张图片

!python PaddleDetection/deploy/python/infer.py --model_dir=output_inference/ppyoloe_r_crn_l_3x_dota --image_file=image.png --threshold=0.2

3.利用卡尔曼滤波进行运动预测

  • 初始化卡尔曼滤波器

进入PaddleDetection/deploy/python/

新建一个kalmanfilter.py文件,用来初始化滤波器

import cv2
import numpy as np


class KalmanFilter:
    自己根据情况定义

进入PaddleDetection/deploy/python/infer.py

把之前写好的初始化import进来。

之后创建滤波器

kf=KalmanFilter() 

在第431行找到predict_video函数进行修改

在457行 results = self.predict_image([frame[:, :, ::-1]], visual=False)之后加入代码

result其实是一个字典

其中array里分别存放了置信度和旋转框四点个的坐标,有了置信度和坐标,我们就能根据这些信息来预测轨迹啦

            box=results["boxes"]
            box_num=results["boxes_num"][0]
            for i in range(box_num):
                if box[i][1]>0.2:    #只预测置信度大于0.2的目标
                     x1 = box[i][2]     ,
                     x2 = box[i][4]  
                     x3 = box[i][6]
                     x4 = box[i][8]
                     y1 = box[i][3]  
                     y2 = box[i][5]  
                     y3 = box[i][7]
                     y4 = box[i][9]
                     

拿到上述坐标就可以用之前定义好的卡尔曼滤波器进行轨迹预测了.
上述过程全部完成后,就可以进行视频推理,检验效果
此处只给出了轨迹预测的大致思想,不同场景下卡尔曼滤波器的初始化均不相同,大家可以查阅资料。

  • 视频推理

!python PaddleDetection/deploy/python/infer.py --model_dir=output_inference/ppyoloe_r_crn_l_3x_dota/ --video_file=video.mp4 --thresh=0.2 --device=GPU

3.项目总结

本项目是一个基于遥感影像的飞行器旋转检测,使用PPYOLOE-R模型来训练,能够很快收敛,而且精度也是非常高,再一次证实了PPYOLOE-R真是又快又好!在完成检测任务后,我们还能通过被检测目标在图像中的坐标,分析前后两帧的坐标变化从而进行进一步的处理,例如目标进行跟踪和轨迹预测。对于一些复杂的运动,用卡尔曼滤波来进行预测会有更好的效果哟.
以上就是本项目的所有内容啦,赶紧试试吧!

作者简介:叶不羞.江苏某大学的秃头大学生.萌新一枚,请多指教。

飞浆导师:高睿 TowerNet 在此感谢!

此文章为转载
原文链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐