深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip

本文主要是介绍深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、 Anchor base和Anchor free

1.1 Anchor base

  1. Anchor base,译为基于锚点的一个物体检测方法,也可以叫做基于一组预定义的框
  2. 模型会预测每个锚点是否存在对象,并预测需要对锚点进行的调整以更好地适应该对象
  3. Anchor base物体检测方法:Fast R-CNN、SSD、YOLO、RetinaNet

1.2 Anchor Free

  1. Anchor Free,无锚点方法则不依赖于预定义的锚点框
  2. 直接在图像的每个空间位置预测对象的存在或对象的特征
  3. CenterNet、CornerNet、FCOS 、DETR

2、NMS基本流程

非极大值抑制(Non-Maximum Suppression, NMS),是当物体检测中同一个物体最后预测出多个候选框的情况,采用NMS后可以有效解决这个问题。

  1. 收集所有边界框
  2. 根据置信度(即预测该框的概率)进行排序
  3. 取出最高置信度的框,与其他所有的框计算IOU
  4. 如果计算出某一个IOU的值,超过设定的阈值(假设是0.5),则认为这个框是重复的,则删除这两个框中置信度比较低的那一个
  5. 重复3-4过程,最终剩下的框全部都是预测的边界框
  6. 这个过程也就是说,置信度最高的那一个框永远都不会被移除,且其他的框也只会与这个框计算IOU值

3、常用的损失函数

3.1 回归

MSE:预测值与真实值差值的平方
MAE:预测值与真实值差值的绝对值

3.2 分类

CE:Cross-EnTropy,二元交叉熵,【(y标签对应的值)乘以(p预测正类别的概率值取对数)的相反数】+【1-(y标签对应的值)乘以(1-p预测正类别的概率值取对数)】的相反数,然后会累加样本数,再除以样本数的就是损失的均值

BCE:Binary Cross-EnTropy,多元交叉熵,(y标签对应的值)乘以(p预测该类别的概率值取对数)的相反数,然后会累加每个类别和样本数,再除以样本数的就是损失的均值

4、BCE和CE除了预测种类个数的区别还有其他区别吗?

BCE通常与sigmoid激活函数一起使用,最后输出是单个神经元,输出预测为正类的概率
CE通常与softmax激活函数一起使用,最后输出是多个神经元,输出每个类别的概率分布

5、两个list变成对应的字典,一个是key一个是values

# Given two lists, one for keys and the other for values, we will convert them into a dictionary.
keys = ['key1', 'key2', 'key3']
values = [1, 2, 3]# Creating the dictionary using zip function
dictionary = dict(zip(keys, values))

6、zip怎么理解和使用

zip 是 Python 中一个非常有用的内置函数,它用于将多个可迭代对象(如列表、元组等)中的元素配对,创建一个新的迭代器。其工作原理可以通过以下几个要点来理解:

  1. 配对元素zip 函数将多个可迭代对象中的对应元素组合在一起,形成一个个元组。例如,如果有两个列表 list1 = [1, 2, 3]list2 = ['a', 'b', 'c']zip(list1, list2) 会生成 [(1, 'a'), (2, 'b'), (3, 'c')]

  2. 不同长度处理:如果可迭代对象的长度不同,zip 会停止于最短的输入序列的末尾。例如,如果一个列表有 3 个元素,另一个列表有 4 个元素,那么 zip 生成的迭代器将只包含 3 个元组

  3. 转换为其他数据结构:虽然 zip 返回的是一个迭代器,但你可以将其转换为列表或字典等其他数据结构。例如,list(zip(list1, list2))dict(zip(list1, list2))

  4. 多个迭代对象zip 不仅限于两个迭代对象,它可以接受任意数量的迭代对象

  5. 解压缩:使用 * 运算符,可以将 zip 的结果“解压缩”回多个独立的序列

下面展示 zip 函数的基本用法:

# 将两个列表压缩成一个由元组组成的列表
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = list(zip(list1, list2))
print(zipped)  # 输出: [(1, 'a'), (2, 'b'), (3, 'c')]# 将两个列表转换为字典
keys = ['key1', 'key2', 'key3']
values = [1, 2, 3]
dictionary = dict(zip(keys, values))
print(dictionary)  # 输出: {'key1': 1, 'key2': 2, 'key3': 3}# 解压缩
pairs = [(1, 'a'), (2, 'b'), (3, 'c')]
numbers, letters = zip(*pairs)
print(numbers)  # 输出: (1, 2, 3)
print(letters)  # 输出: ('a', 'b', 'c')

7、除了交并比(即IOU)还有没有其他计算两个候选框的重叠程度方法

除了交并比(IoU)之外,确实存在其他几种方法来评估和处理目标检测中的边界框重叠情况。这些方法各有特点,适用于不同的场景和需求。以下是一些常见的替代方法:

  1. 交集面积(Intersection Area):直接计算两个边界框的交集面积。
  2. 中心距离(Center Distance)
    • 计算两个边界框中心点之间的距离。
    • 适用于判断边界框是否足够接近,可能用于跟踪或者一些需要边界框位置精确度的应用

8. GIOU:广义交并比

(Generalized Intersection over Union, GIoU),GIoU 在 IoU 的基础上增加了对边界框的尺寸和形状差异的考量,首先计算常规的 IoU,然后找到包含两个边界框的最小闭合区域(通常是一个更大的矩形)

在IoU的计算中,只有当两个边界框存在重叠时,IoU的值才会大于0。这意味着如果两个框不重叠,IoU将始终为0,即使这两个框非常接近。这就是IoU的一个局限性,因为它无法区分“完全不重叠但非常接近”的情况和“相距很远”的情况。

  1. 计算常规IoU:首先计算两个边界框之间的标准IoU。
  2. 找到最小闭合区域:接着,找到能够同时包含这两个边界框的最小闭合矩形区域。
  3. 计算GIoU:GIoU的值是标准IoU减去最小闭合区域与两边界框并集的面积差占最小闭合区域面积的比例。公式可以表示为:

G I o U = I o U − ∣ C − U ∣ ∣ C ∣ GIoU = IoU - \frac{|C - U|}{|C|} GIoU=IoUCCU, 其中,C 是最小闭合区域的面积,U是两边界框并集的面积。

这种计算方式允许GIoU在没有重叠的情况下提供比0更丰富的信息。此时,GIoU不仅表明两个框之间没有重叠(IoU为0),而且还提供了关于它们相对位置和大小的信息。GIoU的值可能小于0,如果两个框完全不重叠但相对较接近,其值将接近0;如果两个框相距很远,其值将更小。

9、DIOU 距离交并比

(Distance Intersection over Union, DIoU)

  • 基本概念:DIoU 除了考虑 IoU 外,还加入了两个边界框中心点之间的距离。
  • 计算方法
    • 计算两个边界框中心点的欧氏距离。
    • 根据中心点距离和 IoU 计算 DIoU。
  • 优点:DIoU 在调整边界框对齐和重叠的同时,还能保持中心点的一致性,特别适用于需要精确中心对齐的应用

10、CIOU完整交并比

(Complete Intersection over Union, CIoU)

  • 基本概念:CIoU 是目前最全面的变体,它考虑了 IoU、中心点距离以及长宽比的一致性。
  • 计算方法
    • 计算 IoU 和两个边界框中心点的距离。
    • 加入对边界框长宽比的考量。
    • 综合这三个因素来计算 CIoU。
  • 优点:CIoU 通过考虑更多的几何因素,能够更准确地评估和优化边界框的位置、尺寸和形状。

这篇关于深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/581684

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”