Point2RBox, 点直接生成旋转框, 代码已集成至mmrotate | CVPR 2024

论文介绍

题目:Point2RBox: Combine Knowledge from Synthetic Visual Patterns for End-to-end Oriented Object Detection with Single Point Supervision

会议:2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)

论文:http://arxiv.org/abs/2311.14758

代码:https://github.com/yuyi1005/point2rbox-mmrotate

图片

创新点

  • 基于合成图案的知识组合:通过在原始图像上叠加合成的视觉图案,来模拟具有明确尺寸和方向的目标,从而帮助模型学习如何从一个单独的点出发,推断出目标的具体形状、大小和方向。这个过程允许模型从非常有限的监督中学习框的回归。

  • 基于变换的自监督:通过强制模型学习图像变换(翻转、旋转和缩放)后目标的一致性表征,提高模型对目标尺寸、位置和方向估计的准确性和鲁棒性。

  • 端到端框架:Point2RBox是点监督的端到端解决方案,与先将点注释转换为水平框(HBox)或掩膜(Mask)然后再转换为RBox的两步方法形成对比。这种直接方法既创新又节省计算资源。

图片

区别于现有的两种“Point-to-RBox”的方式:

  • Point-to-HBox-to-RBox

    简单的结合P2B和H2RBOX两种算法,缺点是可能带来累积误差,即把P2B结果作为了真值。

  • Point-to-Mask-RBox

    点生成掩膜,再得到RBox。缺点是比较耗时,且无法真正学习到目标的角度。

本文提出的方法是由点直接生成有向框,与上一篇文章来自同一研究团队: 论文赏读 |CVPR24 |单点直接生成旋转框用于遥感目标检测, PointOBB模型 两篇论文代码都已集成至mmrotate。

数据

DIOR-R数据集

DIOR-R是基于其先前版本DIOR的航拍图像数据集的OBB注释版本,包括23,463张图像,20个类别,以及190,288个实例。

https://gcheng-nwpu.github.io/

DOTA-v1.0数据集

基础信息:DOTA-v1.0是一个大规模的航拍图像数据集,用于遥感目标检测,包含2,806张图像、15个类别以及188,282个带有OBB和HBB注释的实例。

https://captain-whu.github.io/DOTA/dataset.html

HRSC数据集

基础信息:包含海上和近岸的船舶实例,具有任意方向。训练集、验证集和测试集分别包含 436、181 和 444 张图像。

https://www.scitepress.org/PublishedPapers/2017/61206/

方法

训练流程

图片

用图像中每个目标对象的单一标记点来预测目标的旋转边界框(RBox)。这一方法通过合成模式知识组合和变换自监督两个关键策略实现。

1. 基于合成图案的知识组合(Synthetic Pattern Knowledge Combination)

基本流程

  • 图案生成:在每个标记点周围生成合成图案。这些图案旨在模仿对象的形状和外观,但是以合成的方式构造,并具有已知的边界框。

    使用了两套基础图案:

    • SetRC:包含具有曲线纹理的矩形和圆形,旨在增加多样性并帮助网络学习大小和角度估计。首先生成矩形或圆形,然后再叠加曲线纹理。

    • SetSK:包含每个类别的基本图案。每个类别使用一张样本作为基本图案,样本来自于训练数据集中的前面几张图像。研究从DOTA数据集中截取了15张图像作为基本图案。

      图片

  • 颜色采样和重新着色:对于每个标记点,从其邻域采样颜色特征(包括填充颜色和边缘颜色)。这些颜色随后通过重新着色过程映射到基本图案上。

  • 叠加到输入图像上:这些图案在经过数据增强(随机缩放翻转平移旋转)后被重新叠加回输入图像上(上面的图3)。在叠加时,为了避免图案之间的重叠,应用非极大值抑制NMS,确保图案之间的IOU小于0.05。为了避免合成图案完全遮挡真实目标,使用了透明混合技术。另外,随机选取的一些模式会通过平移操作生成一组紧密排列的模式集合,以模拟现实世界中目标可能紧密分布的情况。

  • 训练中的使用:通过将这些带有已知边界框的合成图像叠加到原始图像上,模型被训练以识别和预测这些合成对象的尺寸和方向,从而间接学习到如何处理真实的、未标记尺寸的目标。

2. 变换自监督(Transform Self-supervision)

自监督策略:

  • 对输入图像进行一系列的几何变换(如翻转、旋转、缩放),并让模型预测变换后图像中对象的RBox(其中缩放专门用来学习目标尺度)。

  • 使用一个原始分支和一个变换分支(图2右侧上方为原始分支,右侧为变换后分支)。两个分支之间进行自我监督,相互监督。每次训练变换分支会随机从翻转、旋转、缩放中选择一个,这样训练时显存占用更小。

  • 通过比较变换前后模型的预测结果,并确保这些预测在几何变换下是一致的,使模型学习到更加准确的目标定位和方向估计方法。

损失函数

  • 点监督损失 (Loss from Point Supervision)

    包含点的分类损失 (Lcls) 和目标中心损失 (Lcen)

图片

  • 知识组合损失 (Loss from Knowledge Combination)

    通过合成图案提供的知识来训练边界框回归的损失。

图片

  • 变换自监督损失 (Loss from Transform Self-supervision)

图片

  • 总体损失函数

图片

标签分配

选用YOLOF-A1作为基座。YOLOF-A1是在原始的YOLOF模型基础上的一个变种,其中"A1"指的是该模型仅使用一种尺寸的锚点(Anchor)。保持Anchor的数量为5个,但尺寸相同。点标签被分配给那些能够生成最高类别评分的锚点。这一步是基于假设:能够给出高类别评分的锚点更有可能正确地预测出对象的位置。

精度

精度对比

DOTA数据集

图片

DIOR和HRSC数据集精度

图片

可视结

图片

消融实验

基本图案设置

  • SetSK相比SetRC有更优的性能。

图片

变换自监督设置

  • 通过引入变换自监督损失(包括翻转、旋转和缩放),能够显著提升模型性能。

图片

标注误差

  • 即使在点注释存在一定噪声(即标注点的位置不完全准确)的情况下,文章方法也表现出了比较好的鲁棒性。特别是在一定范围内增加点注释的随机偏移,对性能影响不大,甚至在某些情况下能够提高性能。

图片

锚点尺寸和数量的选择

  • 即使所有锚点尺寸相同,使用多个锚点(而不是减少为一个)也可以提升性能。

参考

论文作者文章:https://zhuanlan.zhihu.com/p/668627776

<think>嗯,用户想了解如何对旋转数据进行裁剪处理的方法或工具。首先,我需要回忆一下旋转和普通边界的区别。旋转通常用中心、宽高和旋转角度来表示,比如$(x_c, y_c, w, h, \theta)$,而普通边界是轴对齐的,用$(x1, y1, x2, y2)$。所以处理裁剪的时候,需要考虑旋转角度的影响,这会比普通裁剪复杂。 用户的问题可能涉及数据增强中的裁剪操作,特别是在处理旋转时如何保持正确的坐标变换。根据之前的引用内容,比如引用[1]提到反向裁剪需要更多的代码,并且边界坐标必须是x1,y1,x2,y2的格式。但旋转的结构不同,可能需要先将旋转转换到新的坐标系下,然后应用裁剪,再转换回来。 接下来,我需要考虑具体的方法步骤。比如,首先进行坐标变换,将旋转从原图坐标系转换到裁剪后的图像坐标系。这涉及到平移和可能的旋转调整。例如,如果裁剪区域是从原图中选了一个子区域,那么旋转的中心需要减去裁剪区域的左上角坐标,并且如果裁剪后的图像本身有旋转,可能还需要调整角度θ。 然后,工具方面,用户可能需要一些现有的库或架。比如,MMRotate是基于PyTorch的旋转检测库,可能内置了数据增强功能。另外,Albumentations库支持旋转的数据增强,但需要确认是否支持裁剪操作。OpenCV虽然常用,但处理旋转可能需要手动计算坐标变换,比如使用cv2.getRotationMatrix2D和仿射变换。 还要注意旋转的越界处理。裁剪后的图像区域可能只包含原图的一部分,旋转可能在裁剪后部分或全部超出边界,这时候需要进行截断或者过滤掉无效的。另外,角度归一化也是必要的,确保旋转角度在合理的范围内,比如0到180度或-90到90度,避免后续处理出错。 然后,根据引用[3]提到的CameraX的旋转角度处理,如果应用支持横竖屏切换,旋转角度的确定可能需要参考设备的方向传感器数据,这可能涉及到动态调整裁剪区域和旋转的角度。 总结一下,处理旋转的裁剪需要:坐标系的转换、角度调整、越界处理,以及可能的工具库支持。需要分步骤详细说明,并推荐合适的工具,同时引用相关的资料作为支持。</think>### 旋转数据裁剪处理方法与工具 #### 1. **旋转定义与裁剪难** 旋转通常用五参数表示:中心坐标$(x_c, y_c)$、宽度$w$、高度$h$、旋转角度$\theta$(如目标检测中的旋转矩形)。裁剪时需保持旋转与裁剪区域的空间关系,难在于: - 坐标系的平移变换(裁剪后图像的原变化); - 旋转角度的保持或修正; - 边界越界的处理(部分超出裁剪区域的情况)。 #### 2. **核心方法步骤** **步骤1:坐标系转换** 将旋转从原图坐标系转换到裁剪后的局部坐标系: - 计算裁剪区域左上角在原图中的坐标$(x_{crop}, y_{crop})$; - 调整旋转中心坐标: $$x_c' = x_c - x_{crop},\quad y_c' = y_c - y_{crop}$$ **步骤2旋转角度修正** 若裁剪后的图像自身发生旋转(如数据增强中的随机旋转),需叠加角度变化: $$\theta' = \theta + \alpha \quad (\alpha为裁剪图像的旋转角度)$$ **步骤3:越界处理** 对裁剪后超出边界的部分进行截断或过滤: - 计算旋转在局部坐标系中的包围盒; - 若包围盒与裁剪区域无交集,则丢弃该; - 若部分越界,可保留但标注为“截断”属性[^1]。 #### 3. **常用工具与实现** **(1) MMRotate(推荐工具)** 基于PyTorch的旋转目标检测架,内置旋转数据增强工具: ```python from mmrotate.datasets import RotatedCrop aug = RotatedCrop(crop_size=(512, 512)) result = aug({'img': img, 'gt_bboxes': rotated_boxes}) ``` **(2) Albumentations扩展** 通过自定义变换实现旋转裁剪: ```python import albumentations as A def rotated_crop(image, boxes, crop_x, crop_y, crop_w, crop_h): # 转换坐标系并过滤越界 transformed_boxes = [] for (xc, yc, w, h, theta) in boxes: new_xc = xc - crop_x new_yc = yc - crop_y if 0 <= new_xc <= crop_w and 0 <= new_yc <= crop_h: transformed_boxes.append([new_xc, new_yc, w, h, theta]) return image[crop_y:crop_y+crop_h, crop_x:crop_x+crop_w], transformed_boxes ``` **(3) OpenCV手动实现** 适合需要精细控制的情况: ```python import cv2 import math def crop_rotated_box(img, crop_region, rotated_box): x, y, w, h = crop_region # 裁剪图像 cropped_img = img[y:y+h, x:x+w] # 转换坐标 new_cx = rotated_box[0] - x new_cy = rotated_box[1] - y # 计算旋转后是否越界 rect = ((new_cx, new_cy), (rotated_box[2], rotated_box[3]), rotated_box[4]) box_pts = cv2.boxPoints(rect) # 检查所有角是否在裁剪区域内 return cropped_img, rect ``` #### 4. **特殊场景处理** - **反向裁剪**:当裁剪区域包含图像边缘时,需要特殊处理坐标系原偏移。引用[1]提到,反向裁剪需要保证$x_2$始终是更远的坐标,可通过坐标归一化实现: $$x_{norm} = \frac{x - x_{crop}}{w_{crop}}$$ - **动态旋转适配**:如引用[3]所述,当应用涉及屏幕方向切换时,需要根据设备旋转状态动态计算角度补偿值[^3]。 #### 5. **验证方法** 通过可视化检查裁剪结果: ```python # 绘制旋转验证 def draw_rotated_box(img, box): rect = ((box[0], box[1]), (box[2], box[3]), box[4]) box_pts = cv2.boxPoints(rect).astype(int) cv2.drawContours(img, [box_pts], 0, (0,255,0), 2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值