F-score 和 Dice Loss 原理及代码

文章目录

    • 1. F-score
    • 1. 1 原理
    • 1. 2 代码
    • 2. Dice Loss
      • 2.1 原理
      • 2.2 代码

通过看开源图像语义分割库的源码,发现它对 Dice Loss 的实现方式,是直接调用 F-score 函数,换言之,Dice LossF-score的特殊情况。于是就研究了一下这背后的原理,作文以记之。

1. F-score

1. 1 原理

首先介绍 F-score:
在这里插入图片描述
要理解F-score,就要先回顾一下 PrecisionRecall,首先给出公式:

在这里插入图片描述
两个指标衡量算法的准确性时,通常是相互排斥的。例如,输入一个数据,算法根据数据预测一个分数,现在为该分数设定阈值,大于阈值的预测为真,小于该阈值的预测为假。

  • 如果这个阈值得过低,低到测试集中所有的样本均判定为真,那么此时,FN=0(False negative, 压根就没有预测出来 negative 的样本),代入公式 (2) 得 Recall = 1。但此时,预测为真的样本中,包含大量的 FP,即 False Positive,将会导致 Precision 过低
  • 如果这个阈值设置得过高,使得所有被判定为正的样本都是真的,那么 FP=0,Precision=1,此时将不可避免有很多本应被判定为正的样本,被错误地判定为负,也就是 FN 很大,导致 Recall 过低

不同的应用场景下,对这两个指标的侧重不同。例如新冠感染者检测,就应该尽量提高 Recall,务求没有漏网之鱼。但在检测垃圾邮件时,应该尽量提升 Precision,即每个被判定为垃圾邮件的,都是板上钉钉毫无争议的,防止出现误伤,把正常邮件当成垃圾邮件处理。

F-score 则是将这两个指标综合起来:
在这里插入图片描述

  • β \beta β控制 Precision 和 Recall 的重要程度, 当 β = 1 \beta=1 β=1, 对应 F1-score,此时 Precision 和 Recall 同样重要。

  • β \beta β两个常用的取值是 0.5 2,当取 0.5 时,Precision 对 F-score 的影响更大,当取 2 时,Recall 对 F-score 的影响更大。(可以考虑得更极端一点,当 β → 0 \beta\rightarrow0 β0,公式(3)趋于 Precision;当 β → ∞ \beta\rightarrow\infty β,公式(3)上下同除以分子,易知其将趋于 Recall)

最后,把 (1) (2) 代入 (3) 得:
在这里插入图片描述

1. 2 代码

def f_score(inputs, target, beta=1, smooth = 1e-5, threhold = 0.5):n, c, h, w = inputs.size()nt, ht, wt, ct = target.size()if h != ht and w != wt:inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)temp_target = target.view(n, -1, ct)#--------------------------------------------##   计算dice系数#--------------------------------------------#temp_inputs = torch.gt(temp_inputs, threhold).float()tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])fp = torch.sum(temp_inputs                       , axis=[0,1]) - tpfn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tpscore = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)score = torch.mean(score)return score
  • inputs为分割模型的预测输出,未经过softmax, target为gt
  • temp_target中将channels维度设为num_classes+1,为了方便处理白边,因此在实际计算时需要去掉最后一个channel: temp_target[...,:-1]
    在这里插入图片描述
  • 预测分割图temp_inputs与 GT 分割图的点乘,然后再(n,hw)方向上求和作为tp
    参考自: Dice系数(Dice coefficient)与mIoU与Dice Loss
    在这里插入图片描述
  • 因为预测temp_inputs (pred) = fp+tp, 因此已知temp_inputstp, 就可以求出fp
  • 同理temp_target (gt) = fn+tp, 因此已知temp_targettp, 就可以求出`fn
  • 然后根据F-score的计算公式,在已知tp,fp,fn以及beta系数,就可以计算出F-score值了
    在这里插入图片描述
    score = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)score = torch.mean(score)

2. Dice Loss

2.1 原理

Dice Loss 是语义分割中常用的一种损失,它的计算方法如下:
在这里插入图片描述
即,分子为预测值与真实值的交集元素数目的两倍,分母为两个集合元素数目之和(注意并不是并集,而是和)。而
在这里插入图片描述
因此,(6) 相当于:
1 − 2 T P 2 T P + F P + F N 1-\frac{2TP}{2TP+FP+FN} 12TP+FP+FN2TP

而上式的结果,正是公式 (5) 中 β = 1 \beta =1 β=1的情况,也就是F1 score。因此,

Dice Loss = 1 - F1 score 

2.2 代码

def Dice_loss(inputs, target, beta=1, smooth = 1e-5):n, c, h, w = inputs.size()nt, ht, wt, ct = target.size()if h != ht and w != wt:inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)temp_target = target.view(n, -1, ct)#--------------------------------------------##   计算dice loss#--------------------------------------------#tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])fp = torch.sum(temp_inputs                       , axis=[0,1]) - tpfn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tpscore = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)dice_loss = 1 - torch.mean(score)return dice_loss
  • 可以看到dice_loss的实现,跟F-score基本上是一模一样的, 将torch.mean(score)求得的F-soce, 然后通过dice_loss = 1- F-score 来实现。
  • 代码中默认 β = 1 \beta=1 β=1, 所以更精确的说: dice_loss = 1- F1-score
  • DIce _loss的在训练损失中的使用如下:
    在这里插入图片描述

参考:

  • F-score 和 Dice Loss
  • https://github.com/bubbliiiing/deeplabv3-plus-pytorch/blob/main/utils/utils_metrics.py

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

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

相关文章

训练FastestDet(Anchor-Free、参数量仅0.24M),稍改代码使得符合YOLO数据集排布

文章目录 0 参考链接1 准备数据1.1 使用以下代码生成绝对路径的txt文件1.2 在config文件夹下新建一个xxx.names文件 2 配置训练参数3 稍改代码使得符合YOLO数据集排布4 开始训练 0 参考链接 官方的代码:FastestDet 1 准备数据 我已有的数据集排布:&am…

【Fiddler抓包】微信扫码访问链接打不开网页

又来每天进步一点点~~~ 背景:某天发版的时候,手机连接电脑抓包查看用户登录之前的sessionID,由于业务需要,是需要用户登录微信扫码跳转至某一页面的,微信(分身)扫码成功,跳转时打不…

【已解决】fatal: Authentication failed for ‘https://github.com/.../‘

文章目录 异常原因解决方法 异常原因 在 Linux 服务器上使用git push命令,输入用户名和密码之后,总会显示一个报错: fatal: Authentication failed for https://github.com/TianJiaQi-Code/Linux.git/ # 致命:无法通过验证访问起…

5V高细分步进电机驱动芯片选型分析

单通道5V高细分步进电机GC6139 GC6106 GC6107 GC6119 GC6151 GC6236 GC8558 它们应用在摇头机,X,Y控制,聚焦控制等产品上。其中GC8558为24V H 桥驱动,大电流,具有短地短电源保护,限流保护等功能。

从 PDF 删除PDF 页面的 10 大工具

PDF 文件是全世界几乎每个人最常用的页面之一。借助 PDF 文件,您可以通过任何在线或离线媒体轻松共享信息。但是,如果您想编辑这些 PDF 文件,那么这个过程就很难改变,因为保持文件的原始形式和质量很重要。应该注意的是&#xff0…

java数据结构与算法:双链表 LinkedList

双链表 LinkedList 实现代码 package com.lhs;public class LinkedList<E> implements List<E>{// 定义链表长度private int size;// 定义头节点private Node<E> first;// 定义尾节点private Node<E> last;// 内部类&#xff0c;定义节点public stat…

RK3568平台 温度传感器芯片SD5075

一.SD5075芯片简介 SD5075 是一款高准确度温度传感器芯片内含高精度测温 ADC&#xff0c;在-40C ~100C 范围内典型误差小于0.5C&#xff0c;在-55C~125C 范围内典型误差小于士1.0C。通过两线 IC/SMBus接口可以很方便与其他设备建立通信。设置 A2~A0 的地址线&#xff0c;可支持…

网络配置以及命令详解

传统linux中,网络接口为eth0,eth1,eth2,..... RHEL 7以上版本默认命名是基于分配上的固定名称,ens33 接口类型: en:以太网有线接口 wl:无线局域网接口 ww:无线广域网 dmesg:显示开机信息 适配器类型: s:热插拔插槽 o:板载 p:pci类型 ifconfig ens160(命令行配置,临时生效):查…

算法通关村第十五关—海量数据场景下的热门算法题(白银)

海量数据场景下的热门算法题 一、从40个亿中产生一个不存在的整数 题目要求&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你有1GB的内存来完成这项任务。 进阶&#xff1a…

玩转 openEuler (一)-- 系统安装

简介 openEuler 是一款开源操作系统。当前 openEuler 内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智能等…

电子电器架构车载软件 —— 集中化架构软件开发

电子电器架构车载软件 —— 集中化架构软件开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任…

Failed to save password Error code: -34018

1. 卸载navicat 2.打开终端&#xff1a;执行下列命令 sudo rm -Rf /Applications/Navicat\ Premium.app sudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlist sudo rm -Rf ~/Library/Caches/com.apple.help…

汽车ECU的虚拟化技术初探(四)--U2A内存管理

目录 1.内存管理概述 2. 内存保护功能 2.1 SPID 2.2 Slave Guard 3.小结 1.内存管理概述 为了讲清楚U2A 在各种运行模式、特权模式下的区别&#xff0c;其实首先应该搞清楚不同模式下可以操作的寄存器有哪些。 但是看到这个寄存器模型就头大。 再加上之前没有研究过G4MH…

文件操作(二)

͟͟͞͞&#x1f3c0;前言上一篇我们加们讲了什么是文件&#xff0c;为什么使用文件&#xff0c;以及流的概念。我们继续接上一篇来继续讲解我们的文件操作&#xff0c;这一篇将会详细的讲如何对文件进行读写。 目录 &#x1f680;一.文件的顺序读写 1.fgetc和fputc 2.fget…

【ROS2简单例程】基于python的发布订阅实现

1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为接口文件生成源代码 ro…

Shell中cp和mv命令说明

在Shell&#xff08;如Bash&#xff09;中&#xff0c;cp 和 mv 是两个常用的命令&#xff0c;用于处理文件和目录。它们的用法和作用如下&#xff1a; cp 命令 作用&#xff1a;cp&#xff08;copy的缩写&#xff09;用于复制文件或目录。基本用法&#xff1a;cp [选项] 源文…

【OJ】环形链表

目录 1. 环形链表||&#xff08;142&#xff09;1.1 题目描述1.2 题目分析1.3 代码 2. 环形链表&#xff08;141&#xff09;2.1 题目描述2.2 题目分析2.3 代码 1. 环形链表||&#xff08;142&#xff09; 1.1 题目描述 1.2 题目分析 带环链表&#xff1a;尾节点的next指向链…

ROS OpenCV ROI

在图像处理和计算机视觉领域&#xff0c;ROI&#xff08;Region of Interest&#xff09;是一个核心概念&#xff0c;它指的是从原始图像中定义出的特定区域&#xff0c;该区域对于后续的分析、处理或操作具有特别的意义。 ROI的选择通常基于应用需求&#xff0c;例如目标检测…

【Rust日报】Xilem 项目在 2024 年的计划

Xilem 项目在 2024 年的计划 2024 年&#xff0c;Xilem 项目备受关注。Google Fonts 将资助四位开源贡献者&#xff1a;Aaron Muir Hamilton、Daniel McNab、Matt Campbell 和 Olivier Faure&#xff0c;他们将主导项目的不同方面。Aaron 将专注于文本布局和 Android 集成&…

Python异步网络编程库之twisted 详解

概要 Python twisted 是一个强大的异步网络编程框架&#xff0c;它允许开发者轻松构建高性能的网络应用和协议。无论是构建网络服务器、客户端、聊天应用还是实时通信工具&#xff0c;twisted 都提供了丰富的工具和组件。本文将深入探讨 twisted 的基本概念、安装方法以及详细…