![cover](https://img-blog.csdnimg.cn/img_convert/b843cf1279d01c523cc715e3d20fa5cf.jpeg)
[AI达人特训营第3期]基于遥感影像的飞行器旋转检测
使用DOTA数据集,基于PaddleDetection提供的旋转目标检测模型对遥感影像中的旋转物体进行检测,检测的结果可用于后续的目标追踪研究
★★★ 本文源自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做了以下几点改动:
部分模型库:
模型 | Backbone | mAP | V100 TRT FP16 (FPS) | Params (M) | FLOPs (G) | 学习率策略 | 角度表示 | 数据增广 | GPU数目 | 每GPU图片数目 |
---|---|---|---|---|---|---|---|---|---|---|
PP-YOLOE-R-s | CRN-s | 73.82 | 69.8 | 8.09 | 43.46 | 3x | oc | RR | 4 | 2 |
PP-YOLOE-R-m | CRN-m | 77.64 | 55.1 | 23.96 | 127.00 | 3x | oc | RR | 4 | 2 |
PP-YOLOE-R-x | CRN-x | 78.28 | 37.1 | 100.27 | 529.82 | 3x | oc | RR | 4 | 2 |
PP-YOLOE-R-l | CRN-l | 78.14 | 69.7 | 53.29 | 281.65 | 3x | oc | RR | 4 | 2 |
注意
-
如果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 在此感谢!
此文章为转载
原文链接
更多推荐
所有评论(0)