7 Detection and Segmentation¶
之前我们完成的内容是 Image Classification,我们还可以完成其他的视觉任务,包括 Semantic Segmentation,Classification Localization, Object Detection, Instance Segmentation
Semantic Segmentation¶
对图片的像素进行分类与分割,同时我们并不区分实例(如下图中的牛,并没有区分两头牛)

一个简易的方法是滑动窗口方法,对图片用一个滑动窗口进行提取,然后输入到 CNN 网络中进而得到中心像素的标签
但是这种方法的问题是显而易见的,计算量非常大,同时未重用共享特征(Not reusing shared features between overlapping patches)。由于滑动窗口之间存在重叠区域,导致在处理重叠部分时重复计算相同的特征。例如,图中红色和蓝色框之间有重叠区域,但在处理这两个图像块时,需要分别计算这些重叠区域的特征,造成了大量的冗余计算。
还有一种方法是对图片直接扔到一个 CNN 中,然后一次性得到所有像素的类别
但是这也有一个问题就是在原始图像下的卷积操作非常昂贵,所以我们在网络中加入了 downsampling 层和 upsampling 层
Downsampling 通过减少特征图的空间维度来提取更高级别的抽象特征,并降低计算复杂度。
-
Pooling:通常使用最大池化(Max Pooling)或平均池化(Average Pooling)来减小特征图的尺寸。
-
Strided Convolution:使用步长大于1的卷积操作来实现下采样,同时进行特征提取。
关于 Upsampling 的操作采取的一种方法是 "Unpooling",有两种不同的策略:
那么我们整个网络的过程就大致如下所示:
还有一种方法是 "Transpose Convolution",可以被看做卷积操作的 ”逆操作“,虽然不是严格意义上的,但是大致的计算方式是类似的。
Classification + Localization¶
这里我们既需要分类,也需要对相应的对象进行框选。于是我们在计算神经网络的 loss 的时候是一种多任务的 loss (Multi-task Loss)
还有一个应用就是人类姿态评估,定位人类的关节。计算这里的 Loss 的时候也是 Multi-task Loss, 因为每个关节都可以计算一个 Loss。
Object Detection¶
物体检测这个应用更像是前面那个的升级版,需要框选出图片中所有问题中所有的物体
R-CNN¶
一个大致的想法是先利用算法得到某些感兴趣的区域 (Region of Interest) ,然后对这些区域进行类别判断
R - CNN 有一些问题:
Ad hoc training objectives
R-CNN的训练目标是临时拼凑(ad hoc)的,这意味着它没有一个统一的优化目标,而是分阶段进行训练,每个阶段使用不同的损失函数。
- Fine-tune network with softmax classifier (log loss): 首先,使用softmax分类器对卷积神经网络进行微调,采用的是对数损失(log loss)。这一步是为了让网络能够提取出有用的特征。
- Train post-hoc linear SVMs (hinge loss): 然后,使用线性支持向量机(SVMs)对提取到的特征进行分类,采用的是铰链损失(hinge loss)。这是因为在原始论文中,作者发现SVMs在分类任务上表现更好。
- Train post-hoc bounding-box regressions (least squares): 最后,使用最小二乘法(least squares)对边界框的位置进行回归,以提高检测框的准确性。
这种分阶段、多损失函数的训练方式虽然有效,但缺乏统一性和效率。
Training is slow (84h), takes a lot of disk space
R-CNN的训练过程非常耗时,大约需要84小时才能完成。此外,由于需要存储大量的中间结果和模型参数,因此也占用了大量的磁盘空间。
Inference (detection) is slow
R-CNN的推理(即检测)速度较慢,具体表现为:
- 47s / image with VGG16 [Simonyan & Zisserman. ICLR15]: 使用VGG16网络进行检测时,每张图片需要花费47秒的时间。这对于实时应用来说显然是不可接受的。
Fast R-CNN¶
上述方法一个很大的问题就是对于每个 RoI 都需要经过一个网络来训练,而一开始给的 RoI 数量有 2000 多个,这就导致了速度非常慢。于是我们可以将这些进行重复利用,直接对一开始的图片放到一个网络中去训练,然后在得到的相关特征中找到与 RoI 中对应的区域然后直接计算 Loss

Faster R-CNN¶
对于 Fast R-CNN 来说,候选区域(RoIs)仍然依赖外部算法(如 Selective Search),无法端到端训练,且速度慢、不可学习。Faster R-CNN(2015,Ren et al.)的最大贡献是引入了 Region Proposal Network (RPN),将候选区域的生成也用神经网络实现,从而实现了完全端到端的目标检测。
RPN 的工作流程
- 输入:主干 CNN 提取的特征图(如 VGG 或 ResNet 的 conv5 输出)。
- 滑动窗口:在特征图上使用一个 3×3 的滑动窗口,对每个位置进行处理。
- Anchor 机制: - 在每个滑动窗口位置,预设多个不同尺度和长宽比的“锚框”(Anchors)。 - 例如:3 种尺度(128², 256², 512²) × 3 种长宽比(1:1, 1:2, 2:1) → 每个位置生成 9 个 Anchors。
- 两个输出分支: - 分类分支(cls):判断每个 Anchor 是否包含物体(前景 vs 背景)。 - 回归分支(reg):微调 Anchor 的位置和大小(输出 dx, dy, dw, dh)。
- NMS 后处理:通过非极大值抑制(NMS)筛选出高质量的候选区域(约 2000 个),送入后续的 RoI Head。
🎯 结果:RPN 输出一组“可能包含物体”的候选框(Region Proposals),完全替代了 Selective Search。
也就是说我们的训练需要集成四个 loss
-
RPN classify object / not object
-
RPN regress box coordinates
-
Final classification score (object classes)
-
Final box coordinates
上面这四个 loss 是怎么计算的
第一个主要是判断这个 anchor 是不是包含相应物体,第二个计算的是 anchor 相对于正确的框的差距,第三个和第四个就是计算与正确物体类别和框的区别了。
对比一下这些模型的速度,提升非常明显!
YOLO / SSD¶
我们可以看到之前的所有算法都是两阶段的,得到相应的 RoI 然后对 RoI 进行类别判断,而 YOLO 和 SSD 算法则是单阶段的目标检测器
相应内容可以看 https://lxblog.com/qianwen/share?shareId=c2a27cec-411a-4919-b205-0b8ef2fa73ee
Aside: Object Detection + Captioning = Dense Captioning
利用上述算法得到对物体的检测,加上 RNN 网络,就可以得到一个对图片中的物体进行密集标注的模型
Instance Segmentation¶
对于物体实例分割算法,最为著名的算法就是 Mask R-CNN。它在 Faster R-CNN 的基础上进行扩展,不仅能检测出图像中每个物体的类别和边界框(bounding box),还能为每个实例生成一个高质量的像素级分割掩码(mask)。
在这里有一个详细的解释:https://lxblog.com/qianwen/share?shareId=1b2546c4-e5db-4a54-bd8b-9ec54111b0aa
简洁概括一下就是在 Faster R-CNN 的基础上,加一个 RoI Align 和一个 mask 分支,就实现了像素级的实例理解
对于 Mask R-CNN 来说,也可以做目标的姿态检测,就是增加一个 joint coordinates 的检测头