【计算机视觉(19)】语义理解-CNN应用_目标检测_语义分割 - 指南

CNN应用:目标检测与语义分割

适合对象:计算机视觉初学者、深度学习入门者
⏱️ 预计阅读时间:70-80分钟
学习目标:理解CNN在语义分割和目标检测中的应用,掌握全卷积网络、R-CNN系列和单阶段检测器的基本原理


学习路线图

计算机视觉任务
分类/分割/检测
语义分割
全卷积网络
目标检测
R-CNN系列
实例分割
Mask R-CNN
上采样
转置卷积
两阶段检测
Faster R-CNN
单阶段检测
YOLO/SSD
检测+分割
Mask R-CNN

本文内容一览(快速理解)

  1. 计算机视觉任务(Computer Vision Tasks):分类、语义分割、目标检测、实例分割的区别
  2. 语义分割(Semantic Segmentation):全卷积网络和上采样方法
  3. 目标检测(Object Detection):从单目标到多目标,从R-CNN到Faster R-CNN
  4. 实例分割(Instance Segmentation):Mask R-CNN结合检测和分割

一、计算机视觉任务(Computer Vision Tasks):从分类到检测

这一章要建立的基础:理解不同计算机视觉任务的区别和联系

核心问题:分类、分割、检测有什么区别?它们之间有什么关系?


[!NOTE]
关键点总结:计算机视觉任务包括图像分类(识别类别)、语义分割(像素级分类)、目标检测(定位+分类)和实例分割(检测+分割)。这些任务从简单到复杂,相互关联。

1.1 四种主要任务(Four Main Tasks):分类、分割、检测、实例分割

概念的本质

计算机视觉有四种主要任务:

  1. 图像分类(Image Classification):识别图像中的主要物体类别,无空间信息
  2. 语义分割(Semantic Segmentation):对每个像素进行分类,不区分实例
  3. 目标检测(Object Detection):定位多个物体并分类,输出边界框和类别
  4. 实例分割(Instance Segmentation):检测+分割,区分不同的实例

图解说明

输入图像
图像分类
CAT
语义分割
像素级分类
目标检测
边界框+类别
实例分割
检测+分割

说明

  • 分类:只识别类别,无空间信息
  • 语义分割:像素级分类,不区分实例
  • 目标检测:定位+分类,输出边界框
  • 实例分割:检测+分割,区分不同实例

类比理解

想象你在看一幅画。不同任务就像:

  • 分类:只回答"画里有什么"(如"有猫")
  • 语义分割:给每个像素贴上标签(如"这是猫的像素")
  • 目标检测:不仅知道"有什么",还知道"在哪里"(如"这里有一只猫")
  • 实例分割:不仅知道"在哪里",还知道"精确的轮廓"(如"这只猫的精确形状")

实际例子

四种任务的例子:
图像分类:
- 输入:一张图像
- 输出:类别标签(如"猫")
- 无空间信息
语义分割:
- 输入:一张图像
- 输出:每个像素的类别标签
- 不区分实例(所有猫的像素都是"猫")
目标检测:
- 输入:一张图像
- 输出:多个边界框和类别
- 例如:[(x1,y1,w1,h1,"猫"), (x2,y2,w2,h2,"狗")]
实例分割:
- 输入:一张图像
- 输出:多个实例的精确分割掩码
- 例如:第一只猫的掩码、第二只猫的掩码、狗的掩码


二、语义分割(Semantic Segmentation):全卷积网络

这一章要建立的基础:理解语义分割的原理和全卷积网络的设计

核心问题:如何对每个像素进行分类?全卷积网络如何工作?


[!NOTE]
关键点总结:语义分割需要对每个像素进行分类。全卷积网络(FCN)使用卷积层进行下采样和上采样,避免了滑动窗口的低效问题。上采样可以使用Unpooling或转置卷积(Transpose Convolution)。

2.1 语义分割的挑战(Challenges of Semantic Segmentation):像素级分类

概念的本质

语义分割需要对图像中的每个像素进行分类。直接使用滑动窗口方法(提取每个像素周围的patch,用CNN分类)非常低效,因为重叠的patch会重复计算相同的特征。

图解说明

滑动窗口方法
提取patch
每个像素
CNN分类
重复计算
问题
效率低

说明

  • 滑动窗口:对每个像素提取patch,用CNN分类
  • 问题:重叠的patch会重复计算相同的特征
  • 解决:使用全卷积网络,一次计算所有像素

实际例子

滑动窗口的问题:
输入图像:224×224
需要分类:每个像素(224×224 = 50,176个像素)
滑动窗口方法:
- 对每个像素提取patch(如32×32)
- 用CNN分类每个patch
- 问题:相邻像素的patch大量重叠
- 结果:重复计算相同的特征,效率极低
全卷积网络方法:
- 一次计算整个图像的特征
- 对所有像素同时进行分类
- 结果:高效,共享计算


2.2 全卷积网络(Fully Convolutional Networks):下采样和上采样

概念的本质

全卷积网络(FCN)使用卷积层进行下采样和上采样:

  1. 下采样(Downsampling):使用池化或步长卷积降低分辨率
  2. 上采样(Upsampling):使用Unpooling或转置卷积恢复分辨率
  3. 端到端:整个网络都是卷积层,可以端到端训练

图解说明

输入
H×W
下采样
H/2×W/2
下采样
H/4×W/4
下采样
H/8×W/8
上采样
H/4×W/4
上采样
H/2×W/2
上采样
H×W
像素分类
每个像素

说明

  • 下采样:降低分辨率,提取高级特征
  • 上采样:恢复分辨率,进行像素级分类
  • 优势:一次计算所有像素,高效

类比理解

想象你在看一幅高分辨率照片。全卷积网络就像:

  • 下采样:先看低分辨率版本,理解整体内容(提取高级特征)
  • 上采样:再放大到高分辨率,给每个像素分类(像素级分类)
  • 优势:不需要逐个像素处理,一次处理整张图像

实际例子

全卷积网络的例子:
输入:224×224×3
  ↓
下采样:112×112×64(池化或步长卷积)
  ↓
下采样:56×56×128
  ↓
下采样:28×28×256
  ↓
上采样:56×56×128(Unpooling或转置卷积)
  ↓
上采样:112×112×64
  ↓
上采样:224×224×C(C是类别数)
  ↓
输出:每个像素的类别分数
优势:
- 一次计算所有像素
- 共享特征计算
- 端到端训练


2.3 上采样方法(Upsampling Methods):Unpooling和转置卷积

概念的本质

上采样有两种主要方法:

  1. Unpooling:反向池化操作,包括最近邻插值、"Bed of Nails"和Max Unpooling
  2. 转置卷积(Transpose Convolution):可学习的上采样,通过转置卷积核实现

图解说明

上采样方法
Unpooling
反向池化
转置卷积
可学习上采样
最近邻
Bed of Nails
Max Unpooling
转置卷积核
可学习参数

说明

  • Unpooling:简单的上采样方法,不可学习
  • 转置卷积:可学习的上采样,效果通常更好
  • 选择:转置卷积更常用,因为可以学习最优的上采样方式

实际例子

上采样方法的例子:
Unpooling(最近邻):
输入:2×2
[1, 2]
[3, 4]
输出:4×4
[1, 1, 2, 2]
[1, 1, 2, 2]
[3, 3, 4, 4]
[3, 3, 4, 4]
Max Unpooling:
- 记住池化时的最大值位置
- 上采样时在对应位置放置值
- 其他位置填充0
转置卷积:
- 输入:2×2
- 转置卷积核:3×3,步长2
- 输出:4×4
- 可学习:卷积核参数可以训练
- 优势:可以学习最优的上采样方式


三、目标检测(Object Detection):从单目标到多目标

这一章要建立的基础:理解目标检测的原理和R-CNN系列的发展

核心问题:如何检测图像中的多个物体?R-CNN如何工作?


[!NOTE]
关键点总结:目标检测需要定位和分类多个物体。单目标检测可以看作分类+回归问题。多目标检测更复杂,R-CNN使用区域提议(Region Proposals)和CNN分类,Fast R-CNN共享计算,Faster R-CNN使用RPN生成提议。

3.1 单目标检测(Single Object Detection):分类+定位

概念的本质

单目标检测可以看作分类+定位问题:

  1. 分类:识别物体类别(使用Softmax损失)
  2. 定位:预测边界框坐标 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)(使用L2损失)
  3. 多任务损失:分类损失 + 定位损失

图解说明

输入图像
CNN特征提取
分类分支
Softmax损失
定位分支
L2损失
类别分数
边界框坐标
(x,y,w,h)

说明

  • 分类分支:全连接层输出类别分数
  • 定位分支:全连接层输出4个坐标值
  • 多任务损失:同时优化分类和定位

实际例子

单目标检测的例子:
网络架构:
输入图像 → CNN → 特征向量(4096维)
  ↓
分类分支:4096 → 1000(类别数)
  ↓
定位分支:4096 → 4(x, y, w, h)
损失函数:
总损失 = 分类损失(Softmax) + 定位损失(L2)
训练:
- 使用ImageNet预训练模型(迁移学习)
- 微调分类和定位分支
- 多任务学习,同时优化
问题:
- 只能检测一个物体
- 实际图像通常有多个物体


3.2 多目标检测的挑战(Challenges of Multiple Object Detection):可变数量的输出

概念的本质

多目标检测的挑战是:

  1. 可变输出:每张图像的物体数量不同
  2. 计算量大:需要对大量候选区域进行分类
  3. 效率问题:滑动窗口方法计算量巨大

实际例子

多目标检测的挑战:
问题1:可变输出
- 图像1:2个物体
- 图像2:5个物体
- 图像3:10个物体
- 网络输出数量需要可变
问题2:计算量大
- 滑动窗口:需要检查所有可能的位置、尺度、长宽比
- 计算量:巨大,不可行
解决方案:
- 区域提议(Region Proposals):先找到可能包含物体的区域
- 然后只对这些区域进行分类
- 大幅减少计算量


3.3 R-CNN(Region-based CNN):区域提议+CNN分类

概念的本质

R-CNN(Region-based CNN)的流程:

  1. 区域提议:使用Selective Search等方法生成约2000个候选区域
  2. 特征提取:对每个候选区域用CNN提取特征
  3. 分类和回归:用SVM分类,用回归器精调边界框

图解说明

输入图像
区域提议
~2000个
对每个区域
CNN特征提取
SVM分类
边界框回归
输出
检测结果

说明

  • 区域提议:快速找到可能包含物体的区域
  • CNN特征:对每个区域提取特征
  • 分类和回归:识别类别并精调边界框

实际例子

R-CNN的流程:
步骤1:区域提议
- 使用Selective Search
- 生成~2000个候选区域
- 时间:几秒(CPU)
步骤2:特征提取
- 对每个候选区域
- 调整大小到固定尺寸(如224×224)
- 用CNN提取特征(4096维)
- 时间:~2000次前向传播
步骤3:分类和回归
- 用SVM分类
- 用回归器精调边界框
- 时间:很快
问题:
- 非常慢:需要~2000次前向传播
- 每个区域独立处理,没有共享计算


3.4 Fast R-CNN(Fast R-CNN):共享计算

概念的本质

Fast R-CNN的改进:

  1. 共享计算:先对整个图像提取特征,再对每个区域裁剪特征
  2. RoI Pooling:将不同大小的区域映射到固定大小的特征
  3. 端到端训练:整个网络可以端到端训练

图解说明

输入图像
CNN特征提取
一次
区域提议
~2000个
RoI Pooling
裁剪特征
分类+回归
每个区域

说明

  • 共享计算:只对图像提取一次特征
  • RoI Pooling:将不同大小的区域映射到固定大小
  • 效率:比R-CNN快很多

实际例子

Fast R-CNN的改进:
R-CNN:
- 对每个区域独立提取特征
- ~2000次前向传播
- 非常慢
Fast R-CNN:
- 对整个图像提取一次特征
- 对每个区域裁剪特征(RoI Pooling)
- 1次前向传播 + ~2000次RoI Pooling
- 快很多
RoI Pooling:
- 输入:不同大小的区域
- 输出:固定大小的特征(如7×7)
- 方法:将区域分成固定网格,每个网格内最大池化
优势:
- 共享计算,大幅提速
- 端到端训练
- 但仍然受限于区域提议的速度


3.5 Faster R-CNN(Faster R-CNN):RPN生成提议

概念的本质

Faster R-CNN的改进:

  1. RPN(Region Proposal Network):用CNN生成区域提议,替代Selective Search
  2. 端到端:整个网络(RPN + 检测)可以端到端训练
  3. 速度:比Fast R-CNN快很多,接近实时

图解说明

输入图像
CNN特征提取
RPN
生成提议
RoI Pooling
分类+回归

说明

  • RPN:在特征图上预测区域提议
  • 锚框(Anchor):在每个位置使用多个锚框(不同大小和长宽比)
  • 端到端:RPN和检测网络联合训练

实际例子

Faster R-CNN的RPN:
输入:特征图(如512×20×15)
RPN操作:
1. 在每个位置放置K个锚框(如K=9,3种大小×3种长宽比)
2. 对每个锚框预测:
   - 是否包含物体(二分类)
   - 边界框变换(4个值)
输出:
- 物体分数:K×20×15
- 边界框变换:4K×20×15
选择提议:
- 对所有K×20×15个候选框按分数排序
- 选择前~300个作为区域提议
优势:
- 用CNN生成提议,速度快
- 端到端训练
- 接近实时检测


3.6 单阶段检测器(Single-Stage Detectors):YOLO和SSD

概念的本质

单阶段检测器(如YOLO、SSD)直接在特征图上预测检测结果,不需要两阶段(提议+分类):

  1. YOLO:将图像分成网格,每个网格预测多个边界框和类别
  2. SSD:在多个尺度的特征图上预测检测结果
  3. 优势:速度快,适合实时应用
  4. 劣势:精度可能不如两阶段检测器

实际例子

单阶段检测器的例子:
YOLO:
- 将图像分成7×7网格
- 每个网格预测B个边界框(如B=3)
- 每个边界框:5个值(dx, dy, dh, dw, confidence)
- 每个网格预测C个类别分数
- 输出:7×7×(5B+C)
SSD:
- 在多个尺度的特征图上预测
- 每个位置使用多个锚框
- 预测类别和边界框
- 多尺度检测,精度更高
对比:
- 两阶段(Faster R-CNN):精度高,速度慢
- 单阶段(YOLO/SSD):速度快,精度稍低
- 选择:根据应用需求选择


四、实例分割(Instance Segmentation):Mask R-CNN

这一章要建立的基础:理解实例分割的原理和Mask R-CNN的设计

核心问题:如何同时进行检测和分割?Mask R-CNN如何工作?


[!NOTE]
关键点总结:实例分割需要同时进行目标检测和语义分割。Mask R-CNN在Faster R-CNN的基础上添加了掩码预测分支,可以对每个检测到的物体生成精确的分割掩码。

4.1 实例分割的挑战(Challenges of Instance Segmentation):检测+分割

概念的本质

实例分割需要:

  1. 检测:找到所有物体并分类
  2. 分割:对每个物体生成精确的分割掩码
  3. 区分实例:区分不同的实例(即使类别相同)

图解说明

实例分割
目标检测
定位+分类
语义分割
像素级分类
检测结果
边界框+类别
分割掩码
像素级标签
实例分割
每个实例的掩码

说明

  • 检测:找到物体位置和类别
  • 分割:生成精确的像素级掩码
  • 结合:对每个检测到的物体生成掩码

实际例子

实例分割的例子:
输入:一张图像,包含2只猫和1只狗
目标检测输出:
- 边界框1:(x1,y1,w1,h1,"猫")
- 边界框2:(x2,y2,w2,h2,"猫")
- 边界框3:(x3,y3,w3,h3,"狗")
实例分割输出:
- 掩码1:第一只猫的精确轮廓
- 掩码2:第二只猫的精确轮廓
- 掩码3:狗的精确轮廓
区别:
- 语义分割:所有猫的像素都是"猫",不区分实例
- 实例分割:区分第一只猫和第二只猫


4.2 Mask R-CNN(Mask R-CNN):检测+分割的统一框架

概念的本质

Mask R-CNN在Faster R-CNN的基础上添加了掩码预测分支:

  1. 检测分支:分类和边界框回归(与Faster R-CNN相同)
  2. 掩码分支:对每个RoI预测分割掩码(28×28)
  3. RoI Align:改进的RoI Pooling,更精确的对齐

图解说明

输入图像
CNN特征提取
RPN
生成提议
RoI Align
分类分支
类别分数
回归分支
边界框
掩码分支
28×28掩码

说明

  • 三个分支:分类、回归、掩码
  • RoI Align:更精确的特征对齐
  • 掩码预测:对每个类别预测掩码

实际例子

Mask R-CNN的架构:
输入图像 → CNN特征提取 → RPN生成提议
  ↓
RoI Align(对每个提议)
  ↓
三个分支:
1. 分类分支:预测类别分数(C类)
2. 回归分支:预测边界框(4个值)
3. 掩码分支:预测掩码(C×28×28)
掩码分支:
- 输入:RoI特征(256×14×14)
- 输出:C×28×28掩码(每个类别一个掩码)
- 使用:选择对应类别的掩码
RoI Align vs RoI Pooling:
- RoI Pooling:量化操作,可能不对齐
- RoI Align:双线性插值,精确对齐
- 结果:分割精度更高
训练:
- 多任务损失:分类损失 + 回归损失 + 掩码损失
- 端到端训练
- 效果:在COCO数据集上取得很好性能


本章总结

核心要点回顾

  1. 计算机视觉任务

    • 分类:识别类别
    • 语义分割:像素级分类
    • 目标检测:定位+分类
    • 实例分割:检测+分割
  2. 语义分割

    • 全卷积网络:下采样+上采样
    • 上采样:Unpooling或转置卷积
    • 端到端训练
  3. 目标检测

    • R-CNN:区域提议+CNN分类
    • Fast R-CNN:共享计算
    • Faster R-CNN:RPN生成提议
    • 单阶段检测器:YOLO/SSD
  4. 实例分割

    • Mask R-CNN:检测+分割
    • 三个分支:分类、回归、掩码
    • RoI Align:精确对齐

知识地图

CNN应用
语义分割
全卷积网络
目标检测
R-CNN系列
实例分割
Mask R-CNN
上采样
转置卷积
两阶段
Faster R-CNN
单阶段
YOLO/SSD
检测+分割
统一框架

关键决策点

  • 任务选择:根据需求选择分类、分割或检测
  • 精度vs速度:两阶段检测器精度高但慢,单阶段检测器速度快但精度稍低
  • 上采样方法:转置卷积通常比Unpooling效果好
  • 实际应用:考虑计算资源和精度要求

延伸阅读

推荐资源

  1. 语义分割

    • Long et al., “Fully Convolutional Networks for Semantic Segmentation”, CVPR 2015
    • Noh et al., “Learning Deconvolution Network for Semantic Segmentation”, ICCV 2015
  2. 目标检测

    • Girshick et al., “Rich feature hierarchies for accurate object detection”, CVPR 2014
    • Girshick, “Fast R-CNN”, ICCV 2015
    • Ren et al., “Faster R-CNN: Towards Real-Time Object Detection”, NIPS 2015
    • Redmon et al., “You Only Look Once: Unified, Real-Time Object Detection”, CVPR 2016
  3. 实例分割

    • He et al., “Mask R-CNN”, ICCV 2017
  4. 实践项目

    • 实现简单的全卷积网络进行语义分割
    • 使用预训练的Faster R-CNN进行目标检测
    • 尝试Mask R-CNN进行实例分割
posted @ 2026-01-16 11:36  yangykaifa  阅读(0)  评论(0)    收藏  举报