简单理解小目标分割中的weighted BCE Loss与weighted IoU Loss

news2024/9/24 15:18:25

这两个损失函数出自《F³Net: Fusion, Feedback and Focus for Salient Object Detection》一文中,用于处理显著性检测(二分割)中小目标的问题。对于传统的BCE Loss,其存在以下三个问题:

  • 只是简单的将每个像素求BCE再平均,忽视了目标对象的结构
  • 对于小目标而言,整张图像的loss会被背景类所主导,导致难以对前景进行学习
  • 对象的边缘位置像素非常容易分类错误,不应该与其他位置像素一样给予相似的权重

而解决方案自然是对不同位置的像素进行加权。具体来说,权重最高的地方应该是地方的边缘位置,离边缘越远则越低。那么怎么"非简单粗暴"的实现这一加权过程呢?文章weighted BCE Loss表达式如下: L w b c e s = − ∑ i = 1 H ∑ j = 1 W ( 1 + γ α i j ) ∑ l = 0 1 1 ( g i j s = l ) log ⁡ P r ( p i j s = l ∣ Ψ ) ∑ i = 1 H ∑ j = 1 W γ α i j L_{w b c e}^s=-\frac{\sum_{i=1}^H \sum_{j=1}^W\left(1+\gamma \alpha_{i j}\right) \sum_{l=0}^1 \mathbf{1}\left(g_{i j}^s=l\right) \log \mathbf{P r}\left(p_{i j}^s=l \mid \Psi\right)}{\sum_{i=1}^H \sum_{j=1}^W \gamma \alpha_{i j}} Lwbces=i=1Hj=1Wγαiji=1Hj=1W(1+γαij)l=011(gijs=l)logPr(pijs=lΨ) 这里的 α i j \alpha_{i j} αij指的就是(i, j)位置像素的权重。如果不进行加权的话,则相当于 α i j \alpha_{i j} αij恒为1。

公式的其他部分暂且不管,重点看 α i j \alpha_{i j} αij是如何计算的: α i j s = ∣ ∑ m , n ∈ A i j g m n s ∑ m , n ∈ A i j 1 − g i j s ∣ \alpha_{i j}^s=\left|\frac{\sum_{m, n \in A_{i j}} g_{m n}^s}{\sum_{m, n \in A_{i j}} 1}-g_{i j}^s\right| αijs= m,nAij1m,nAijgmnsgijs 其中 g i j s g_{i j}^s gijs表示(i, j)位置的真值(1或0,对应前景或背景), A i j A_{i j} Aij表示(i, j)周围的像素。

我们取几个特殊值来讨论。假设 g m n s g_{m n}^s gmns均为0, g i j s g_{i j}^s gijs为1,相当于当前像素为前景,而周围像素均为背景,是一个小目标,应该给予高权重。类似的,如果 g m n s g_{m n}^s gmns均为0, g i j s g_{i j}^s gijs也为0,表明当前位置与周围位置均为背景,此时对应着一个低权重。对权重进行可视化如下:
在这里插入图片描述
可以看到,边缘附近的权重偏高(红色),而远离边缘的像素会被归零。从某种程度可以理解为这是不需要显式输入边缘信息的boundary-aware方法。

接下来看weighted IoU Loss。需要注意的是,IoU这个概念天然适合处理小目标,因此对IoU Loss进行加权单纯是为了,其表达式如下: L wiou  s = 1 − ∑ i = 1 H ∑ j = 1 W ( g t i j s ∗ p i j s ) ∗ ( 1 + γ α i j s ) ∑ i = 1 H ∑ j = 1 W ( g t i j s + p i j s − g t i j s ∗ p i j s ) ∗ ( 1 + γ α i j s ) L_{\text {wiou }}^s=1-\frac{\sum_{i=1}^H \sum_{j=1}^W\left(g t_{i j}^s * p_{i j}^s\right) *\left(1+\gamma \alpha_{i j}^s\right)}{\sum_{i=1}^H \sum_{j=1}^W\left(g t_{i j}^s+p_{i j}^s-g t_{i j}^s * p_{i j}^s\right) *\left(1+\gamma \alpha_{i j}^s\right)} Lwiou s=1i=1Hj=1W(gtijs+pijsgtijspijs)(1+γαijs)i=1Hj=1W(gtijspijs)(1+γαijs) 这里需要特别注意的是,分子分母中的 ( 1 + γ α i j s ) \left(1+\gamma \alpha_{i j}^s\right) (1+γαijs)不能直接约掉,因为其并不是一个常数,而是会随(i,j)变化而改变的值。上面这公式的思想依旧为离边缘近的像素对IOU计算的贡献更大。

代码实现如下:

def structure_loss(pred, mask):
    weit = 1 + 5*torch.abs(F.avg_pool2d(mask, kernel_size=31, stride=1, padding=15) - mask)
    wbce = F.binary_cross_entropy_with_logits(pred, mask, reduce='none')
    wbce = (weit*wbce).sum(dim=(2, 3)) / weit.sum(dim=(2, 3))

    pred = torch.sigmoid(pred)
    inter = ((pred * mask)*weit).sum(dim=(2, 3))
    union = ((pred + mask)*weit).sum(dim=(2, 3))
    wiou = 1 - (inter + 1)/(union - inter+1)
    return (wbce + wiou).mean()

需要注意的是,这里输入的pred(即网络的输出)不需要预先经过sigmoid处理,因为在函数中已经进行了sigmoid。使用时应防止出现进行重复两次sigmoid的情况。

该损失函数涉及到两个超参数,一个是 α i j \alpha_{i j} αij的加权值 γ \gamma γ γ \gamma γ为0,表示不进行任何加权; γ \gamma γ越大,表明网络越依赖于 α i j \alpha_{i j} αij来对不同位置进行加权,不同像素位置的权重差异会更大。在代码中 γ = 5 \gamma=5 γ=5

另一个则为 A i j A_{i j} Aij中"周围像素"的具体定义,在代码中使用的是F.avg_pool2d进行平均池化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day5——冒泡排序,选择排序和插入排序的学习

选择排序冒泡排序插入排序 选择排序 选择排序的基本思路就是: 首先假定第一个的下表为所有元素中最小的一个, 然后用后面的每一个元素跟这个元素进行比较, 如果后面的元素比这个元素更小一点, 那么就将找到的最小的元素的下标和…

【c++】vector实现(源码剖析+手画图解)

vector是我接触的第一个容器,好好对待,好好珍惜! 目录 文章目录 前言 二、vector如何实现 二、vector的迭代器(原生指针) 三、vector的数据结构 图解: 四、vector的构造及内存管理 1.push_back() …

《爆肝整理》保姆级系列教程python接口自动化(十二)--https请求(SSL)(详解)

简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编…

C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍

寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stac…

iptables和nftables的使用

文章目录前言iptable简介iptable命令使用iptables的四表五链nftables简介nftables命令的时候nftables与iptables的区别iptables-legacy和iptables-nft实例将指定protocol:ip:port的流量转发到本地指定端口前言 本文展示了,iptables和nftable命令的使用。 # 实验环…

win10 安装rabbitMQ详细步骤

win10 安装rabbitMQ详细步骤 win10 安装rabbitMQ详细步骤win10 安装rabbitMQ详细步骤一、下载安装程序二、安装配置erlang三、安装rabbitMQ四、验证初始可以通过用户名:guest 密码guest来登录。报错:安装RabbitMQ出现Plugin configuration unchanged.问题…

力扣SQL刷题10

目录标题618. 学生地理信息报告--完全不会的新题型1097. 游戏玩法分析 V - 重难点1127. 用户购买平台--难且不会618. 学生地理信息报告–完全不会的新题型 max()函数的功效:(‘jack’, null, null)中得出‘jack’,(nul…

基于微信小程序图书馆座位预约管理系统

开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis本系统分微信小程序和管理后台两部分,项目采用…

索引的基本介绍

索引概述-优缺点 索引介绍:索引是一种高效获取数据的数据结构; 索引优点:提供查询效率;降低IO成本;怎么减低IO成本呢?因为数据库的数据是存放在磁盘的,你要操作数据就会涉及到磁盘IO&#xff0…

Windows11 安装Apache24全过程

Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…

数组常使用的方法

1. join (原数组不受影响)该方法可以将数组里的元素,通过指定的分隔符,以字符串的形式连接起来。返回值:返回一个新的字符串const arr[1,3,4,2,5]console.log(arr.join(-);//1-3-4-2-52. push该方法可以在数组的最后面,添加一个或者多个元素结构: arr.push(值)返回值…

(考研湖科大教书匠计算机网络)第四章网络层-第一、二节:网络层概述及其提供的服务

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:网络层概述(1)概述(2)学习内容二:网络层提供的两种服务(1)面向连…

nginx越界读取缓存漏洞(CVE-2017-7529)

range格式: Range: <unit><range-start>- Range: <unit><range-start>-<range-end> Range: <unit><range-start>-<range-end>, <range-start>-<range-end> range事例&#xff1a; Range: bytes500-999 //表示第…

Spring Security简介

前面我们已经完成了传智健康后台管理系统的部分功能&#xff0c;例如检查项管理、检查组管理、套餐管理、预 约设置等。接下来我们需要思考2个问题&#xff1a; 问题1&#xff1a;在生产环境下我们如果不登录后台系统就可以完成这些功能操作吗&#xff1f; 答案显然是否定的&am…

微前端-模块联邦

一、 Module Federation 模块联邦概述 Module Federation 即为模块联邦&#xff0c;是 Webpack 5 中新增的一项功能&#xff0c;可以实现跨应用共享模块。 二、快速上手 需求 通过模块联邦在容器应用中加载微应用。 应用结构 products ├── package-lock.json ├──…

程序的机器级表示part3——算术和逻辑操作

目录 1.加载有效地址 2. 整数运算指令 2.1 INC 和 DEC 2.2 NEG 2.3 ADD、SUB 和 IMUL 3. 布尔指令 3.1 AND 3.2 OR 3.3 XOR 3.4 NOT 4. 移位操作 4.1 算术左移和逻辑左移 4.2 算术右移和逻辑右移 5. 特殊的算术操作 1.加载有效地址 指令效果描述leaq S, DD…

【项目实战】32G的电脑启动IDEA一个后端服务要2min!谁忍的了?

一、背景 本人电脑性能一般&#xff0c;但是拥有着一台高性能的VDI&#xff08;虚拟桌面基础架构&#xff09;&#xff0c;以下是具体的配置 二、问题描述 但是&#xff0c;即便是拥有这么高的性能&#xff0c;每次运行基于Dubbo微服务架构下的微服务都贼久&#xff0c;以下…

使用太极taichi写一个只有一个三角形的有限元

公式来源 https://blog.csdn.net/weixin_43940314/article/details/128935230 GAME103 https://games-cn.org/games103-slides/ 初始化我们的三角形 全局的坐标范围为0-1 我们的三角形如图所示 ti.kernel def init():X[0] [0.5, 0.5]X[1] [0.5, 0.6]X[2] [0.6, 0.5]x[0…

每天10个前端小知识 【Day 12】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…

I.MX6ULL内核开发9:kobject-驱动的基石

目录 一、摘要 二、重点 三、驱动结构模型 四、关键函数分析 kobject_create_and_add()函数 kobject_create()函数 kobject_init&#xff08;&#xff09;函数 kobject_init_internal(&#xff09;函数 kobject_add&#xff08;&#xff09;函数 kobject_add_varg&am…