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

【Datawhale组队学习202506】YOLO-Master task03 IOU总结

系列文章目录

task01 导学课程
task02 YOLO系列发展线


文章目录

  • 系列文章目录
  • 前言
  • 1 功能分块
    • 1.1 骨干网络 Backbone
    • 1.2 颈部网络 Neck
    • 1.3 头部网络 Head
      • 1.3.1 边界框回归头
      • 1.3.2 分类头
  • 2 关键概念
  • 3 典型算法
    • 3.1 NMS
    • 3.2 IoU
  • 总结


前言

  • Datawhale是一个专注于AI与数据科学的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员
  • YOLO-Master
  • 本章学习资料

1 功能分块

1.1 骨干网络 Backbone

  • 它的任务是把一张图片的关键信息浓缩出来,比如形状、纹理、颜色等特征,就像把水果榨成汁一样,保留精华,去掉多余水分(无关背景)。

1.2 颈部网络 Neck

1.3 头部网络 Head

1.3.1 边界框回归头

1.3.2 分类头


2 关键概念


3 典型算法

3.1 NMS

3.2 IoU

IoU(Intersection over Union):衡量两个边界框(Bounding Box)之间重叠程度和匹配度,常用于目标检测任务中评估预测框 Predicted Box真实框 Ground Truth Box的匹配度。相比于 Jaccard Index

  • 其值范围在 [ 0 , 1 ] [0,1] [0,1]1 表示完全重叠,0 表示无重叠。

  • 数学定义

I o U = 交集面积 并集面积 \mathrm{IoU} = \frac{交集面积}{并集面积} IoU=并集面积交集面积

  • 即:

IoU = A inter A union = A inter A box1 + A box2 − A inter \text{IoU} = \frac{A_{\text{inter}}}{A_{\text{union}}} = \frac{A_{\text{inter}}}{A_{\text{box1}} + A_{\text{box2}} - A_{\text{inter}}} IoU=AunionAinter=Abox1+Abox2AinterAinter

  • 计算步骤:
  1. 交集坐标
    • 左上角:取两框左上坐标的较大值
    • 右下角:取两框右下坐标的较小值
    • 若右下坐标 < 左上坐标,则交集面积为 0

x LeftTop = max ⁡ ( x 1 a , x 1 b ) , y LeftTop = min ⁡ ( y 1 a , y 1 b ) x_{\text{LeftTop}} = \max(x_1^a, x_1^b), \quad y_{\text{LeftTop}} = \min(y_1^a, y_1^b) xLeftTop=max(x1a,x1b),yLeftTop=min(y1a,y1b)
x RightBottom = min ⁡ ( x 2 a , x 2 b ) , y RightBottom = max ⁡ ( y 2 a , y 2 b ) x_{\text{RightBottom}} = \min(x_2^a, x_2^b), \quad y_{\text{RightBottom}} = \max(y_2^a, y_2^b) xRightBottom=min(x2a,x2b),yRightBottom=max(y2a,y2b)

  1. 面积计算

    • 交集面积 = max ⁡ ( 0 , x RightBottom − x LeftTop ) × max ⁡ ( 0 , y RightBottom − y LeftTop ) \max(0, x_{\text{RightBottom}} - x_{\text{LeftTop}}) \times \max(0, y_{\text{RightBottom}} - y_{\text{LeftTop}}) max(0,xRightBottomxLeftTop)×max(0,yRightBottomyLeftTop)
    • 并集面积 = 框1面积 + 框2面积 - 交集面积
  • 代码实践
import matplotlib.pyplot as plt
import matplotlib.patches as pts# 现在定义一个函数,接收两个参数,都是两个点坐标,以数组的形式
def calculate_iou(box1, box2):"""计算两个边界框之间的 IoU (Intersection over Union)参数:box1: 第一个边界框,格式为 [x1, y1, x2, y2]box2: 第二个边界框,格式为 [x1, y1, x2, y2]返回:iou: 两个边界框之间的 IoU 值"""# 解析边界框坐标x1_box1, y1_box1, x2_box1, y2_box1 = box1x1_box2, y1_box2, x2_box2, y2_box2 = box2# 确保坐标的有效性assert x1_box1 < x2_box1, f"无效的 box1 x坐标: {x1_box1} >= {x2_box1}"assert y1_box1 < y2_box1, f"无效的 box1 y坐标: {y1_box1} >= {y2_box1}"assert x1_box2 < x2_box2, f"无效的 box2 x坐标: {x1_box2} >= {x2_box2}"assert y1_box2 < y2_box2, f"无效的 box2 y坐标: {y1_box2} >= {y2_box2}"# 计算交集区域的坐标x_left = max(x1_box1, x1_box2)y_top = max(y1_box1, y1_box2)x_right = min(x2_box1, x2_box2)y_bottom = min(y2_box1, y2_box2)# 检查是否有交集if x_right < x_left or y_bottom < y_top:return 0.0# 计算交集区域面积intersection_area = (x_right - x_left) * (y_bottom - y_top)# 计算两个边界框各自的面积area_box1 = (x2_box1 - x1_box1) * (y2_box1 - y1_box1)area_box2 = (x2_box2 - x1_box2) * (y2_box2 - y1_box2)# 计算并集区域面积union_area = area_box1 + area_box2 - intersection_area# 计算IOU,并避免除零错误if union_area == 0:iou = 0else:iou = intersection_area / union_areareturn iou# 定义一个函数,根据坐标画出两个框
def plot_boxes(box1, box2):fig, ax = plt.subplots()# 绘制第一个框rect1 = pts.Rectangle((box1[0], box1[1]), box1[2]-box1[0], box1[3]-box1[1], linewidth=1, edgecolor='r', facecolor='none')ax.add_patch(rect1)# 绘制第二个框rect2 = pts.Rectangle((box2[0], box2[1]), box2[2]-box2[0], box2[3]-box2[1], linewidth=1, edgecolor='b', facecolor='none')ax.add_patch(rect2)# 设置坐标轴范围ax.set_xlim(0, 100)ax.set_ylim(0, 100)# 显示图像plt.show()# 测试用例
if __name__ == "__main__":# # 测试1: 完全重叠box_a = [10, 10, 50, 50]# box_b = [10, 10, 50, 50]# iou = calculate_iou(box_a, box_b)# print(f"测试1 (完全重叠): IoU = {iou:.2f} (预期: 1.00)")# 测试2: 部分重叠box_c = [20, 20, 60, 60]iou = calculate_iou(box_a, box_c)print(f"测试2 (部分重叠): IoU = {iou:.2f} (预期: 0.47)")# 绘制框plot_boxes(box_a, box_c)
  • 效果图
    请添加图片描述

总结

  • 分段介绍YOLO的框架和基本原理。
http://www.xdnf.cn/news/1065457.html

相关文章:

  • 【51单片机】串口通信
  • 在windows上使用file命令
  • 2140、解决智力问题
  • 核心概念解析:AI、数据挖掘、机器学习与深度学习的关系
  • P99延迟:系统性能优化的关键指标
  • 管理综合知识点
  • Kafka与Zookeeper在linux上的下载记录
  • 【PyTorch项目实战】CycleGAN:无需成对训练样本,支持跨领域图像风格迁移
  • git 如何忽略某个文件夹文件
  • dijkstra(迪杰斯特拉)算法详解
  • React 核心原理与Fiber架构
  • Python 的内置函数 help
  • 【力扣 中等 C】983. 最低票价
  • Linux内核中安全创建套接字:为何inet_create未导出及正确替代方案
  • rust单体web项目模板搭建
  • JAVA集合篇--深入理解ConcurrentHashMap图解版
  • Dalvik和ART的区别
  • 华为云Flexus+DeepSeek征文|开启DeepSeek-V3+R1商用服务之旅
  • 顶顶通AI呼叫软件(大模型电话机器人)介绍
  • Flink源码阅读环境准备全攻略:搭建高效探索的基石
  • [论文阅读] 软件工程 + 教学 | 软件工程项目管理课程改革:从传统教学到以学生为中心的混合式学习实践
  • Spark教程6:Spark 底层执行原理详解
  • C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。
  • Java八股文——系统场景设计
  • 多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • Linux->进程概念(精讲)
  • GPU机器安装docker
  • Python下构建毫秒级低延迟RTSP/RTMP播放器并实现AI视觉处理
  • 数据库(1)-SQL