IoU 是什么:目标检测评估的核心指标

副标题 / 摘要 IoU(Intersection over Union)衡量两个边界框的重叠程度,是目标检测评估的核心指标。本文用 ACERS 框架拆解公式、计算步骤与工程应用。 预计阅读时长:12~16 分钟 标签:iou、object-detection、bbox SEO 关键词:IoU, 交并比, 目标检测, BBox 元描述:讲清 IoU 的计算方法、阈值含义与工程实践。 目标读者 想快速理解 IoU 公式与计算的入门读者 需要调试检测指标的工程实践者 关注视觉评估标准的开发者 背景 / 动机 目标检测不仅要“找对类别”,还要“框得准确”。 IoU 是衡量框是否准确的标准指标,直接影响 AP、mAP 等评估结果。 理解 IoU 的定义与阈值意义,是检测工程的基本功。 核心概念 BBox(边界框):用 (x1, y1, x2, y2) 表示左上与右下坐标。 交集面积:两个框重叠部分的面积。 并集面积:两个框面积之和减去交集。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 IoU 就是“重叠面积 / 总面积”。 重叠越大,IoU 越接近 1;完全不相交则为 0。 基础示例(1) 框 A:[(0,0),(2,2)] 框 B:[(1,1),(3,3)] 交集面积 = 1,A 面积 = 4,B 面积 = 4 → IoU = 1 / (4 + 4 - 1) = 1/7。 基础示例(2) IoU ≥ 0.5 → 常视为检测正确(TP)。 IoU ≥ 0.75 → 更严格的高质量检测。 实践指南 / 步骤 计算交集框坐标。 得到交集面积。 计算两框面积。 交并比 = 交集 / 并集。 可运行示例(最小 IoU 计算) def iou(box1, box2): x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) inter_w = max(0, x2 - x1) inter_h = max(0, y2 - y1) inter = inter_w * inter_h area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]) union = area1 + area2 - inter return inter / union if union > 0 else 0.0 box_a = (0, 0, 2, 2) box_b = (1, 1, 3, 3) print(iou(box_a, box_b)) 解释与原理 IoU 是一个归一化指标,与尺度无关。 交集为 0 时,IoU 为 0。 在训练时常用 IoU 作为正负样本匹配标准。 C — Concepts(核心思想) 方法类型 IoU 属于几何评估指标,用于衡量两个区域的重叠程度。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

空洞卷积(Dilated Convolution):扩大感受野的工程利器

副标题 / 摘要 空洞卷积通过插入“空洞”扩大感受野,在不显著增加参数的情况下捕获长距离上下文。本文按 ACERS 结构解析原理、复杂度与工程场景,并提供最小可运行示例。 预计阅读时长:14~18 分钟 标签:dilated-convolution、segmentation、vision SEO 关键词:空洞卷积, Dilated Convolution, Atrous 元描述:解释空洞卷积的原理、复杂度与工程应用,含最小示例。 目标读者 想理解感受野扩大策略的入门读者 从事语义分割、时序建模的工程实践者 需要在算力与效果间权衡的开发者 背景 / 动机 传统卷积增大感受野通常靠加深网络或增大核尺寸,但这会带来更多参数与计算。 空洞卷积用“稀疏采样”的方式扩大感受野,是更高效的替代方案。 核心概念 空洞率(dilation):卷积核元素之间的间隔。 感受野:输出特征与输入区域的覆盖范围。 稀疏采样:在输入上跳步取样。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 空洞卷积就是“把卷积核撑开”,让核的元素之间有空洞,从而覆盖更大的输入范围。 基础示例(1) 3x3 卷积,dilation=2 → 覆盖 5x5 的感受野。 基础示例(2) 不增加参数数量,但能捕捉更大上下文。 实践指南 / 步骤 选择基础卷积核(如 3x3)。 设置 dilation(常用 2、4、8)。 观察感受野与特征分辨率变化。 避免过大 dilation 导致“栅格效应”。 可运行示例(最小 PyTorch 空洞卷积) import torch import torch.nn as nn x = torch.randn(1, 3, 32, 32) conv = nn.Conv2d(3, 8, kernel_size=3, dilation=2, padding=2) out = conv(x) print(out.shape) 解释与原理 有效感受野:k_eff = k + (k-1) * (d-1)。 参数量与标准卷积相同,计算量近似不变。 C — Concepts(核心思想) 方法类型 空洞卷积属于扩大感受野的卷积变体,常用于分割与时序模型。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

ViT 结构描述:从 Patch Embedding 到 Transformer 编码器

副标题 / 摘要 ViT 把图像切成 patch 序列,再交给 Transformer 编码器处理。本文用 ACERS 框架拆解 ViT 的核心结构与工程选择,并提供最小可运行的 PyTorch 示例。 预计阅读时长:16~20 分钟 标签:vit、transformer、vision SEO 关键词:ViT, Vision Transformer, Patch Embedding, 图像分类 元描述:系统描述 ViT 架构与工程实践,含最小 PyTorch 示例。 目标读者 想理解 ViT 架构的入门读者 需要做视觉模型选型的工程实践者 想从 CNN 迁移到 Transformer 的开发者 背景 / 动机 CNN 通过局部卷积捕获特征,但长程依赖与全局建模能力有限。 ViT 把图像当成序列,直接用自注意力做全局建模, 在大规模数据预训练下表现非常强。 核心概念 Patch Embedding:将图像切成 patch 并线性投影。 Position Embedding:补充位置信息。 [CLS] Token:聚合全局特征用于分类。 Transformer Encoder:多头自注意力 + FFN 堆叠。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 ViT 的核心流程: 把图像切成固定大小 patch。 每个 patch 拉平成向量并投影成 token。 加上位置编码和 [CLS] token。 送入 Transformer Encoder 得到全局表征。 用 [CLS] token 输出做分类。 基础示例(1) 图像 224x224,patch 16x16 → 196 个 patch + 1 个 [CLS]。 基础示例(2) 只保留编码器,就能做图像分类与检索。 实践指南 / 步骤 选择 patch 大小(8/16/32)。 设置隐藏维度与层数(如 12 层,768 维)。 添加位置编码与 [CLS] token。 训练:优先用预训练权重再微调。 可运行示例(最小 ViT 前向) import torch import torch.nn as nn torch.manual_seed(42) class MiniViT(nn.Module): def __init__(self, img_size=32, patch=8, dim=64, depth=2, heads=4): super().__init__() self.patch = patch self.unfold = nn.Unfold(kernel_size=patch, stride=patch) num_patches = (img_size // patch) ** 2 self.proj = nn.Linear(3 * patch * patch, dim) self.cls = nn.Parameter(torch.zeros(1, 1, dim)) self.pos = nn.Parameter(torch.zeros(1, num_patches + 1, dim)) enc_layer = nn.TransformerEncoderLayer(d_model=dim, nhead=heads, batch_first=True) self.encoder = nn.TransformerEncoder(enc_layer, num_layers=depth) self.head = nn.Linear(dim, 10) def forward(self, x): patches = self.unfold(x).transpose(1, 2) # B, N, patch_dim tokens = self.proj(patches) cls = self.cls.expand(x.size(0), -1, -1) tokens = torch.cat([cls, tokens], dim=1) + self.pos z = self.encoder(tokens) return self.head(z[:, 0]) x = torch.randn(2, 3, 32, 32) model = MiniViT() print(model(x).shape) 解释与原理 patch embedding 把图像变成序列。 self-attention 能在全局范围建模依赖。 [CLS] token 作为全局聚合向量用于分类。 C — Concepts(核心思想) 方法类型 ViT 属于基于注意力的视觉表征模型,用 Transformer Encoder 替代卷积堆叠。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]