0

0

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力

P粉084495128

P粉084495128

发布时间:2025-07-31 15:23:30

|

890人浏览过

|

来源于php中文网

原创

本文介绍多目标跟踪中二分图匹配的匈牙利算法与KM算法。先解释完美匹配、二分图、最大匹配、交错路径等概念,以男女配对为例,演示匈牙利算法流程:通过匹配与寻找增广路径交替操作实现最大匹配,并附代码及输入输出说明,展示算法如何解决二分图无权匹配问题。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【ai达人特训营】siou论文复现:powerful的回归框学习能力 - php中文网

SIoU Loss:Powerful Learning for Bounding Box Regression

目标检测任务是计算机视觉中的核心问题之一,而不同目标检测模型的性能很大程度上取决于损失函数的设计。以YOLO系列举例,一般YOLO系列的输出头都包含Regression和Classification两部分。

  • 其中Regression用于回归目标框,则其包含的损失即为预测框和真实框之间的损失
  • Classification用于对预测框进行分类,即此目标框中是否包含物体,如果包含物体,应该属于哪类物体,所以在Classification中就包含了,对此预测框是否含有物体的损失和如果是物体,对此物体分类的损失两部分。

故以YOLO系列为例,目标检测的损失就包含了三部分,而今天要介绍的SIoU则属于第一类损失,回归框损失 【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

正如标题所说,SIoU是一种对于目标框回归有更强大学习能力的损失函数,但其表现的强大在哪呢,要先回顾一下传统的GIOU和CIOU。

Regression Loss 介绍

传统的回归框损失主要从三个方面进行考虑,即两框的重叠区域,两框之间的距离和两框的长宽比例。(上面说的两框均值真实框与预测框)

重叠区域的表示:大部分算法都以IOU的形式来表达,即通过计算真实框与预测框之间的交集和并集的比来表示。即下图黄色面积和蓝色面积的比值来表示IOU。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

但上图所表示的IOU,最大的问题在于没有办法解决两框没有交集的情况,而这其实在目标检测的训练中是常常出现的。所以就有了GIOU的表示方法。

GIOU引入了两个方框中最小外接矩形的概念,来解决两个方框不相交的问题。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

上式中Ac为下图黄色框的面积,u为两框相交的面积。

两框之间距离表示: 在CIoU的设计里,作者考虑到了两个目标框距离对收敛的影响性,所以通过两框中心之间的距离和两框对角线距离之比来衡量两个框之间的距离。

两框长宽比例表示: 在上述公式中,还有aV一项,其通过计算两框长宽之比的差来表示(arctan设计用于在反向传播求导时,防止梯度爆炸),而a这一项的设计在与:当两个框的IOU很小时,即两框不相交时,没必要考虑两个框之间的长框比例,只有IOU较大,也即两框较接近时,才去考虑长框的事。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

SIoU设计思路

SIoU的设计总体来说,相较于之前的设计,除了考虑了重叠区域,距离和长宽,还多考虑了两个框之间的角度问题,下面依次看看其是如何设计。

两框角度考虑: 作者在SIoU中引入角度的损失,主要是为了辅助两框之间的距离来计算的,因为在目标检测的一开始的训练中,大多少的预测框是跟真实框不相交的,所以如何快速的收敛两框之间的距离是值得考虑的。

而其具体的作用,跟下面的两框的距离结合起来一起来看。(这里的公式a,在大于45°时,换成β,即从x轴上的角度考虑转换成考虑y轴)

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

两框距离考虑: 其实这里的距离考虑,整体来说和上面介绍CIOU的思想是差不多的,通过两框中心的距离和外接矩形的长框来构建,但其多了一项γ,这一项则是和上面两框之间角度的考虑是挂钩的。

具体的说:以X轴为例,即两框近乎平行时,a趋近与0,这样计算出来两框之间的角度距离接近于0,此时γ也接近于2,那么两框之间的距离对于整体loss的贡献变少了。而当a趋近与45°时,计算出来两框之间的角度为1,此时γ接近1,则两框之间的距离应该被重视,需要占更大的loss。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

两框长宽考虑: 这里作者考虑的两框之间的长宽比,是通过计算两框之间宽之差和二者之间最大宽之比(长同理)来定义的,个人感觉和CIOU的相比,虽然形式上不一样,但大体思路是一样的,只不过CIOU可以的考虑是两框整体形状的收敛,而SIoU是以长、宽两个边收敛来达到整体形状收敛的效果。

这里另外一说,θ是个可调变量,来表示网络需要对形状这个,给予多少注意力,即占多少权重。实验中设置为4。

Bika.ai
Bika.ai

打造您的AI智能体员工团队

下载

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

重叠区域考虑: 重叠区域的考虑其实就是普通的IoU啦,最后整体Loss以下式表达。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

复现SIoU流程

说了这么多,下面就以PaddleDetection套件为开发环境,来复现一下SIoU,并和传统的GIOU以及CIOU进行比较。

以套件中提供的交通标志数据集为参考数据集,以YOLOE网络为基础,复现SIoU。

Paddledetction下载安装、数据集下载

这里下载下来的数据集是VOC格式的,只需要用套件自带的脚本,非常方便就可以转换为COCO格式,用于训练。

In [ ]
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git
   
In [ ]
# 按照Paddledetection%cd PaddleDetection/
!pip install -r /home/aistudio/PaddleDetection/requirements.txt  
!python setup.py install
%cd ..
   
In [ ]
# 下载数据集%cd PaddleDetection/
!python dataset/roadsign_voc/download_roadsign_voc.py
   
In [ ]
# 利用paddledetection自带的脚本,来将数据集转成coco形式%cd /home/aistudio/PaddleDetection/#转换train!python tools/x2coco.py \
        --dataset_type voc \
        --voc_anno_dir /home/aistudio/PaddleDetection/dataset/roadsign_voc/ \
--voc_anno_list /home/aistudio/PaddleDetection/dataset/roadsign_voc/train.txt \
--voc_label_list /home/aistudio/PaddleDetection/dataset/roadsign_voc/label_list.txt \
--voc_out_name /home/aistudio/PaddleDetection/dataset/roadsign_voc/voc_train.json#转换val!python tools/x2coco.py \
        --dataset_type voc \
        --voc_anno_dir /home/aistudio/PaddleDetection/dataset/roadsign_voc/ \
--voc_anno_list /home/aistudio/PaddleDetection/dataset/roadsign_voc/valid.txt \
--voc_label_list /home/aistudio/PaddleDetection/dataset/roadsign_voc/label_list.txt \
--voc_out_name /home/aistudio/PaddleDetection/dataset/roadsign_voc/voc_val.json# 移入coco数据集!mv dataset/roadsign_voc/* dataset/coco
   

训练

训练前,我们需要配置一下config文件,具体我们将config/datasets/coco_detection.yml修改为如下。

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

修改configs/ppyoloe/ppyoloe_crn_m_300e_coco.yml文件中的学习率为0.003.

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

Loss修改

如果我们不修改Loss,默认使用的是GIOU loss

要修改YOLOE的loss,要去ppdet/modeling/heads/ppyoloe_head.py文件下进行修改。

我们将第21行改为

from ..losses import GIoULoss, DIouLoss
       

并将ppdet/modeling/losses/iou_loss.py中的class DIouLoss类,修改如下。

class DIouLoss(GIoULoss):    """
    Distance-IoU Loss, see https://arxiv.org/abs/1911.08287
    Args:
        loss_weight (float): giou loss weight, default as 1
        eps (float): epsilon to avoid divide by zero, default as 1e-10
        use_complete_iou_loss (bool): whether to use complete iou loss
    """

    def __init__(self, loss_weight=1., eps=1e-10, siou=False,use_complete_iou_loss=True):
        super(DIouLoss, self).__init__(loss_weight=loss_weight, eps=eps)
        self.use_complete_iou_loss = use_complete_iou_loss
        self.siou = siou

    def __call__(self, pbox, gbox, iou_weight=1.):
        x1, y1, x2, y2 = paddle.split(pbox, num_or_sections=4, axis=-1)
        x1g, y1g, x2g, y2g = paddle.split(gbox, num_or_sections=4, axis=-1)
        cx = (x1 + x2) / 2
        cy = (y1 + y2) / 2
        w = x2 - x1        h = y2 - y1        cxg = (x1g + x2g) / 2
        cyg = (y1g + y2g) / 2
        wg = x2g - x1g        hg = y2g - y1g        x2 = paddle.maximum(x1, x2)        y2 = paddle.maximum(y1, y2)        # A and B
        xkis1 = paddle.maximum(x1, x1g)        ykis1 = paddle.maximum(y1, y1g)        xkis2 = paddle.minimum(x2, x2g)        ykis2 = paddle.minimum(y2, y2g)        # A or B
        xc1 = paddle.minimum(x1, x1g)        yc1 = paddle.minimum(y1, y1g)        xc2 = paddle.maximum(x2, x2g)        yc2 = paddle.maximum(y2, y2g)        intsctk = (xkis2 - xkis1) * (ykis2 - ykis1)        intsctk = intsctk * paddle.greater_than(
            xkis2, xkis1) * paddle.greater_than(ykis2, ykis1)        unionk = (x2 - x1) * (y2 - y1) + (x2g - x1g) * (y2g - y1g
                                                        ) - intsctk + self.eps        iouk = intsctk / unionk        if self.siou:            cw = xc2 - xc1            ch = yc2 - yc1            s_cw = (x1g + x1 - x2g - x2) * 0.5
            s_ch = (y1g + y1 - y2g - y2) * 0.5
            sigma = paddle.pow(s_cw ** 2 + s_ch ** 2, 0.5) + self.eps            sin_alpha_1 = paddle.abs(s_cw) / sigma            sin_alpha_2 = paddle.abs(s_ch) / sigma            threshold = pow(2, 0.5) / 2
            sin_alpha = paddle.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1)            angle_cost = paddle.sin(paddle.asin(sin_alpha) * 2)            rho_x = (s_cw / (cw + self.eps)) ** 2
            rho_y = (s_ch / (ch + self.eps)) ** 2
            gamma = angle_cost - 2
            distance_cost = 2 - paddle.exp(gamma * rho_x) - paddle.exp(gamma * rho_y)            omiga_w = paddle.abs(w - wg) / paddle.maximum(w, wg)            omiga_h = paddle.abs(h - hg) / paddle.maximum(h, hg)            shape_cost = paddle.pow(1 - paddle.exp(-1 * omiga_w), 4) + paddle.pow(1 - paddle.exp(-1 * omiga_h), 4)
            return paddle.mean((1- (iouk - 0.5 * (distance_cost + shape_cost))))*self.loss_weight        # DIOU term
        dist_intersection = (cx - cxg) * (cx - cxg) + (cy - cyg) * (cy - cyg)        dist_union = (xc2 - xc1) * (xc2 - xc1) + (yc2 - yc1) * (yc2 - yc1)        diou_term = (dist_intersection + self.eps) / (dist_union + self.eps)        # CIOU term
        ciou_term = 0
        if self.use_complete_iou_loss:            ar_gt = wg / hg            ar_pred = w / h            arctan = paddle.atan(ar_gt) - paddle.atan(ar_pred)            ar_loss = 4. / np.pi / np.pi * arctan * arctan            alpha = ar_loss / (1 - iouk + ar_loss + self.eps)
            alpha.stop_gradient = True            ciou_term = alpha * ar_loss        diou = paddle.mean((1 - iouk + ciou_term + diou_term) * iou_weight)

        return diou * self.loss_weight
       

这样我们在ppyoloe_head文件的81行,使用下面的代码,即开启了SIoU的使用。

        self.iou_loss = DIouLoss(siou=True, use_complete_iou_loss=False)
   
In [ ]
%cd PaddleDetection/
!python tools/train.py -c ../myconfig/ppyoloe_crn_m_300e_coco.yml --use_vdl=true --vdl_log_dir=vdl_dir/Test --eval \
   

GIoU、CIoU、SIoU训练mAP可视化

  • 紫色为SIOU曲线

  • 深蓝色为CIOU曲线

  • 绿色为GIOU曲线

【AI达人特训营】SIOU论文复现:Powerful的回归框学习能力 - php中文网        

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.11.27

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

408

2023.08.14

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

141

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

24

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号