当前位置: 首页 > news >正文

角度回归——角度编码方式

文章目录

  • 1.为什么研究角度的编码方式?
    • 1.1 角度本身具有周期性
    • 1.2 深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定
    • 1.3 那么如何处理边界问题呢:(以θ的边界问题为例)
    • 1.3 顺时针(CW)
    • 1.4 逆时针(CCW)
  • 2 角度回归的方式
    • 2.1 长边定义法,强制W<H,range范围 [-90,+90)
    • 2.3 长边定义135度
    • 2.4 OpenCV旧版本定义法
    • 2.5 OpenCV新版本定义法
  • 不同编码方式之间的转化
  • 4 各种表示方法的边界问题
  • 参考:

1.为什么研究角度的编码方式?

从框的形式划分,可分为水平检测和旋转检测(即DOTA数据集比赛的task2和task1)。遥感目标检测难点主要包括小目标(small objects)、密集(cluttered arrangement)、方向任意(arbitary orientations)。

1.1 角度本身具有周期性

[ b x , b y , b w , b h , b a n g l e ] [{bx},{by},{bw},{bh},{bangle}] [bx,by,bw,bh,bangle] and [ b x , b y , b w , b h , b a n g l e + π ] [{bx},{by},{bw},{bh},{bangle+π}] [bx,by,bw,bh,bangle+π] 可以表征相同的旋转矩形框

[ b x , b y , b w , b h , b a n g l e ] [{bx},{by},{bw},{bh},{bangle}] [bx,by,bw,bh,bangle] and [ b x , b y , b h , b w , b a n g l e + π / 2 ] [{bx},{by},{bh},{bw},{bangle+π/2}] [bx,by,bh,bw,bangle+π/2] 可以表征相同的旋转矩形框

1.2 深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定

由于学习的目标参数具有周期性,在周期变化的边界处会导致损失值突增,因此增大网络的学习难度。这句话可以参考下图进行理解:
在这里插入图片描述

1.3 那么如何处理边界问题呢:(以θ的边界问题为例)

1、寻找一种新的旋转目标定义方式,定义方式中不含具有周期变化性的参数,却又能表示周期旋转的目标物体,根本上杜绝边界问题的产生;(Anchor free/mask的思路,PolarDet、P-RSDet基于极坐标系表示一个任意四边形物体,BBA-Vectors、O^2-DNet基于向量来表示一个有向矩形,ROPDet、Beyond Bounding Box、Oriented Reppoints基于点集来表示一个任意形状的物体,)

2、从损失函数上入手,使用Smooth L1单独考虑每个参数时,赋予损失函数和角度同样的周期性,使得边界处θ之间差值可以很大,但loss变化实际很小;或者综合考虑所有回归参数的影响,使用旋转IoU损失函数也可以规避边界问题,不过RIoU不可导,近似可导的相关工作可以参考KLD、GWD,工程上实现RIoU可导的工作可以参考s2anet/README.md at master · csuhan/s2anet (github.com)

3、θ由回归问题转为分类问题。(把连续问题直接离散化,避开边界情况),当θ变为分类问题后,网络就无法学习到角度距离信息了,比如真实角度为-90,网络预测成89和-89产生的损失值我们期望是一样的,因为角度距离实际上都是1

1.3 顺时针(CW)

在这里插入图片描述

1.4 逆时针(CCW)

在这里插入图片描述
注:在MMCV中可以设置旋转方向的算子有:box_iou_rotated (默认为CW),nms_rotated (默认为CW),RoIAlignRotated (默认为CCW),RiRoIAlignRotated (默认为CCW)。

2 角度回归的方式

  • opencv定义法、
  • 长边定义法,
  • 四边形定义法

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
实际上,旋转框既可以由水平框绕在中心点顺时针旋转得到,也可以由水平框绕在中心点逆时针旋转得到。 旋转方向和坐标系的选择密切相关。图像空间采用右手坐标系(y,x) ,其中y轴 是上->下, x轴是左->右。 此时存在2种相反的旋转方向。

2.1 长边定义法,强制W<H,range范围 [-90,+90)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们采用的是长边定义法,所以我们的注释文件格式为:

[  classid    x_c   y_c   longside   shortside    Θ  ]  Θ∈[0, 180)* longside: 旋转矩形框的最长边* shortside: 与最长边对应的另一边* Θ: x轴顺时针旋转遇到最长边所经过的角度

利用好cv2.minAreaRect()函数+总结规律就可以

注意opencv4.1.2版本cv2.minAreaRect()函数生成的最小外接矩形框(x,y,w,h,θ)的几个大坑:

(1) 在绝大数情况下 Θ∈[-90, 0);

(2) 部分水平或垂直的目标边框,其θ值为0;

(3) width或height有时输出0, 与此同时Θ = 90;

(4) 输出的width或height有时会超过图片本身的宽高,即归一化时数据>1。

注意:数据加载器中存在大量的归一化和反归一化的操作,以及大量涉及到图像宽高度的数据变化,因此网络输入的图像size:HEIGHT 必须= WIDTH,因为长边定义法中的longside和shorside与图像的宽高没有严格的对应关系。

数据加载器中涉及三类数据增强方式:Mosaic,random_perspective(仿射矩阵增强),普通数据增强方式。

其中Mosaic,仿射矩阵增强都是针对(X_LT, Y_LT, X_RB, Y_RB)数据格式进行增强,修改时添加θ维度就可以,不过仿射矩阵增强函数内共有 Translation、Shear、Rotation、Scale、Perspective、Center 6种数据增强方式,其中旋转与形变仿射的变换会引起目标角度上的改变。

所以只要超参数中的 [‘perspective’]=0,[‘degrees’]=0 ,这块函数代码就不需要修改逻辑部分,为了方便我们直接把涉及到角度的增强放在最后的普通数据增强方式中。

注意:Mosaic操作中会同时触发MixUp数据增强操作,但是在遥感/无人机应用场景中我个人认为并不适用,首先背景复杂就是该场景中的普遍难题,MixUp会融合两张图像,图像中的小目标会掺杂另一张图的背景信息(包含形似物或噪声),从而影响小目标的特征提取。(不过一切以实验结果为准)

2.3 长边定义135度

在这里插入图片描述

2.4 OpenCV旧版本定义法

在这里插入图片描述

2.5 OpenCV新版本定义法

在这里插入图片描述

不同编码方式之间的转化

查阅

上面只列了三种转换关系,未列的可以通过这三个进行多步转换或者有兴趣的可以自己总结一下转换关系。不管是哪个表示法的转换,我们可以发现当需要进行变换操作的时候一般是这两种:

边进行交换,同时角度加减 pi/2

边不交换,角度加减 pi

这就很有意思,熟悉GWD论文的朋友可能也回想起不同定义法下的边界问题好像也是这两个关系。我们再来回顾一下为什么高斯建模可以统一不同的定义法和边界问题:

在这里插入图片描述

红框中是协方差

中三种不同的元素,这三个元素有一个共同的特点就是经过上面两种变换前后还是相同的,所以高斯建模的优势就在于此。之所以需要三个,那是因为这里有三个参数。抛开高斯分布这个框架,我们是不是可以自己先构造三个这样性质的不同组合,通过直接回归这些参数组合而不是采用GWD和KLD也能成功。

如果再思考得深入一点,我们发现对于不同的表示方式,它们计算IoU的代码其实都是通用的。这是为什么呢?因为IoU的计算过程是和第2节讲的旋转变换有关。在框的旋转过程中我们是不需要考虑旋转角度是怎么定义的,也就不需要担心变换之后是否超过定义范围,逆时针旋转5度对应的就是原始角度减去5度。检测器的参数回归也是这么做的,即使在解码中出现了我们所说的边界问题,其本质还是一个正常的旋转变换。边界问题是针对某一个确定的表示法来说的,因此如果使用IoU损失这种不用考虑框表示方式的损失函数来优化检测器就能完全不用在意边界问题。相同的,高斯建模中的协方差

也存在旋转变换,基于它的回归损失同样不需要考虑定义方式和边界问题。我暂将这种回归损失称为表示方式无关和边界问题免疫。

因此在设计旋转检测器过程中,表示法的作用应该局限于给初始候选框(如anchor)一个初始的表示形式,不能参与回归损失的计算,否则不同表示法和边界问题都会对检测器的优化带来影响,即回归损失应该是表示方式无关和边界问题免疫的。

MMRotate支持 OpenCV、长边135°、长边90° 3 种角度定义法,也支持 DOTA、SSDD、HRSID 3 个遥感数据集。

在OpenMMLab的MMCV中,实现了RiRoIAlignRotated, RotatedFeatureAlign 等高性能旋转框 CUDA 算子,因此 MMRotate 无愧是真正的史上最全、最统一的旋转目标检测算法框架。

4 各种表示方法的边界问题

由于大长宽比的目标对于角度的变化是非常敏感的,因此研究边界问题是比较有意义的。我们希望在边界情况也能预测的比较准确,减少有预测框但是不准被当FP的情况。先给出上面三种定义方法边界问题的描述图:

在这里插入图片描述

(a)90-regression-based:最理想的角度回归路线是由蓝色框逆时针旋转到红色框,但由于角度的周期性,导致按照这个回归方式的损失非常大(参见上图右边的Example)。此时模型必须以更复杂的形式回归(例如蓝色框顺时针旋转,同时缩放w和h),增加了回归的难度。通过下图(a)右边的example,我们可以发现损失值的突增来源于两部分,一个是角度周期性(periodicity of angular,PoA),另一个是边的交换性(exchangeability of edges,EoE)。

(b) 180-regression-based:相同的,这种方式比上面稍微简单一些,损失值的突增只来源于PoA。

© Point-based: 看©图,如果是蓝框是anchor,红框是ground-truth,那么通过点的排序之后,实际和理想的回归方式是一样的(按照回归的距离定义),都是:

在这里插入图片描述

通过上述三种例子的分析,我们不难得出这样的结论:理想的预测结果超出了我们所定义的范围,导致出现边界问题,即产生一个较大的损失值。

参考:

论文:RAPiD Rotation-Aware People Detection in Overhead Fisheye Images
https://zhuanlan.zhihu.com/p/358441134
https://zhuanlan.zhihu.com/p/108185873
https://zhuanlan.zhihu.com/p/111493759

相关文章:

角度回归——角度编码方式

文章目录 1.为什么研究角度的编码方式&#xff1f;1.1 角度本身具有周期性1.2 深度学习的损失函数因为角度本身的周期性&#xff0c;在周期性的点上可能产生很大的Loss&#xff0c;造成训练不稳定1.3 那么如何处理边界问题呢&#xff1a;&#xff08;以θ的边界问题为例&#x…...

【C# Programming】值类型、良构类型

值类型 1、值类型 值类型的变量直接包含值。换言之&#xff0c; 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用&#xff08;通常为内存地址)。 复制引用类型的值时&#xff0c;复制的只是引用。这个引用非常小&#xf…...

Linux Day18 TCP_UDP协议及相关知识

一、网络基础概念 1.1 网络 网络是由若干结点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机&#xff0c;交换机、 路由器等设备。 1.2 互联网 把多个网络连接起来就构成了互联网。目前最大的互联网就是因特网。 网络设备有&#xff1a;交换机、路由器、…...

【Java 基础篇】Java网络编程实时数据流处理

在现代计算机应用程序中&#xff0c;处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据&#xff0c;需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库&#xff0c;可以用于处理实时数据流。本文将详细介绍如何使用Java进…...

Oracle 和 mysql 增加字段SQL

在Oracle和MySQL中&#xff0c;可以使用ALTER TABLE语句来增加字段。下面是分别是两种数据库增加字段的SQL示例&#xff1a; 在Oracle中增加字段的SQL示例&#xff1a; ALTER TABLE 表名ADD (新字段名 数据类型);例如&#xff0c;如果要在名为"employees"的表中添加…...

【脚本】 【Linux】循环执行命令

loop.sh #!/bin/bashif [ "" "$1" ]; thenecho 用法: ./loop.sh 命令内容 时间间隔(毫秒) 循环次数(小于0表示无限循环)echo 示例: ./loop.sh "ps -ef" 1000 10exit 0 fiinterval1000 if [ "" ! "$2" ]; thenif echo &quo…...

快速用Python进行数据分析技巧详解

概要 一些小提示和小技巧可能是非常有用的&#xff0c;特别是在编程领域。有时候使用一点点黑客技术&#xff0c;既可以节省时间&#xff0c;还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物&#xff0c;并且可以成为真正的生产力助推器。所以&#xff0…...

BD就业复习第二天

Hbase 1. 架构 HBase&#xff08;Hadoop Database&#xff09;是一个开源的分布式、面向列族&#xff08;Column Family&#xff09;的NoSQL数据库&#xff0c;它是构建在Hadoop之上的。HBase的架构设计旨在处理大规模的数据&#xff0c;特别适用于需要快速读写和随机访问大量…...

大数据Flink(八十五):Window TVF 支持多维数据分析

文章目录 Window TVF 支持多维数据分析 一、Grouping Sets 二、​​​​​​​Rollup...

css-边框原理教程

1. CSS中边框原理 他不是一条直线&#xff0c;根据盒子原理&#xff0c;当边框宽度大于元素的长和宽时&#xff0c;呈现一个梯形和三角形的形状&#xff0c;用如下的代码来实地理解一下边框画法实现的原理 注&#xff1a;学习网址&#xff1a; CSS画几种图形的方法_css画图_老…...

【数据结构】时间、空间复杂度

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 时间、空间复杂度 1. 算法效率3. 时…...

Databend 开源周报第 111 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 理解 SHARE END…...

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录 一、环境准备二、基础软件三、扩展&#xff1a;usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子&#xff0c;安装并注册软件(可以百度注册码)&#xff0c;最新版本&#xff1a;v17 2、下MacOS系统iOS镜像文件&#xff0c;用于vmware虚拟机安装&#xff0c;当前镜…...

vue3 - Vue 项目处理GitHub Pages 部署后 _plugin-vue_export-helper.js 404

GitHub Demo 地址 在线预览 vue3项目打包后部署到github pages 后&#xff0c;预览网站提示下划线开头的一个文件_plugin-vue_export-helper访问不到&#xff0c;网络请求显示404 处理GitHub Pages 部署 _plugin-vue_export-helper.js 404 https://github.com/rollup/rollup/b…...

一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)

一、目的 当Hive的计算引擎是spark或mr时&#xff0c;发现海豚调度HQL任务的脚本并不同&#xff0c;mr更简洁 二、Hive的计算引擎是Spark时 &#xff08;一&#xff09;海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…...

Linux 隔离网段下端口转发

设备在隔离网段下&#xff0c;设置端口转发。使A设备可访问C设备的服务 #!/bin/bash #输出成绩脚本 echo -n "请输入外网服务器的IP地址&#xff1a;" read score sudo iptables -t nat -A PREROUTING -p tcp --dport 1883 -j DNAT --to-destination $score:1883 s…...

【CDN和UDN】CDN和UDN技术特点以及使用场景

内容分发网络&#xff08;CDN&#xff09;和用户自定义网络&#xff08;UDN&#xff09;是两种不同的网络技术&#xff0c;在选择时&#xff0c;往往不能准备把握具不同的技术特点和应用场景。CDN 主要用于加速内容分发&#xff0c;而 UDN 则主要用于支持用户自定义的网络需求。…...

【Linux】改变缓存路径、清理缓存

写在前面 在做项目的过程中&#xff0c;服务器base路径下空间不足&#xff0c;准备在另一个目录下创建虚拟环境&#xff0c;但在安装的过程中&#xff0c;发现base路径下的空间还是在减少&#xff0c;后来经过学习了解到&#xff0c;pip安装下载依赖包时&#xff0c;会先下载缓…...

python+opencv寻找图片或视频中颜色进行追踪之HSV颜色处理

pythonopencv寻找图片或视频中颜色进行追踪之HSV颜色处理 1.颜色空间转换 import cv2img cv2.imread(1.jpg) # 转换为灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(img, img) cv2.imshow(gray, img_gray) cv2.waitKey(0)cv2.cvtColor()用来进行颜色模…...

ubuntu 22.04 服务器网卡无IP地址

ssh连接服务器连接不上&#xff0c;提示如下&#xff1b; 连接显示器&#xff0c;ip addr ls 命令查看IP地址&#xff0c;有网卡但没有IP地址 solution&#xff1a; sudo dhclient enp10s0用于通过 DHCP 协议获取网络配置信息并为名为 enp10s0 的网络接口分配 IP 地址,enp1…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...