文章目录
- CNN应用:目标检测与语义分割
-
- [📚 学习路线图](#📚 学习路线图)
- 本文内容一览(快速理解)
- [一、计算机视觉任务(Computer Vision Tasks):从分类到检测](#一、计算机视觉任务(Computer Vision Tasks):从分类到检测)
-
- [1.1 四种主要任务(Four Main Tasks):分类、分割、检测、实例分割](#1.1 四种主要任务(Four Main Tasks):分类、分割、检测、实例分割)
- [二、语义分割(Semantic Segmentation):全卷积网络](#二、语义分割(Semantic Segmentation):全卷积网络)
-
- [2.1 语义分割的挑战(Challenges of Semantic Segmentation):像素级分类](#2.1 语义分割的挑战(Challenges of Semantic Segmentation):像素级分类)
- [2.2 全卷积网络(Fully Convolutional Networks):下采样和上采样](#2.2 全卷积网络(Fully Convolutional Networks):下采样和上采样)
- [2.3 上采样方法(Upsampling Methods):Unpooling和转置卷积](#2.3 上采样方法(Upsampling Methods):Unpooling和转置卷积)
- [三、目标检测(Object Detection):从单目标到多目标](#三、目标检测(Object Detection):从单目标到多目标)
-
- [3.1 单目标检测(Single Object Detection):分类+定位](#3.1 单目标检测(Single Object Detection):分类+定位)
- [3.2 多目标检测的挑战(Challenges of Multiple Object Detection):可变数量的输出](#3.2 多目标检测的挑战(Challenges of Multiple Object Detection):可变数量的输出)
- [3.3 R-CNN(Region-based CNN):区域提议+CNN分类](#3.3 R-CNN(Region-based CNN):区域提议+CNN分类)
- [3.4 Fast R-CNN(Fast R-CNN):共享计算](#3.4 Fast R-CNN(Fast R-CNN):共享计算)
- [3.5 Faster R-CNN(Faster R-CNN):RPN生成提议](#3.5 Faster R-CNN(Faster R-CNN):RPN生成提议)
- [3.6 单阶段检测器(Single-Stage Detectors):YOLO和SSD](#3.6 单阶段检测器(Single-Stage Detectors):YOLO和SSD)
- [四、实例分割(Instance Segmentation):Mask R-CNN](#四、实例分割(Instance Segmentation):Mask R-CNN)
-
- [4.1 实例分割的挑战(Challenges of Instance Segmentation):检测+分割](#4.1 实例分割的挑战(Challenges of Instance Segmentation):检测+分割)
- [4.2 Mask R-CNN(Mask R-CNN):检测+分割的统一框架](#4.2 Mask R-CNN(Mask R-CNN):检测+分割的统一框架)
- [📝 本章总结](#📝 本章总结)
- [📚 延伸阅读](#📚 延伸阅读)
CNN应用:目标检测与语义分割
📌 适合对象 :计算机视觉初学者、深度学习入门者
⏱️ 预计阅读时间 :70-80分钟
🎯 学习目标:理解CNN在语义分割和目标检测中的应用,掌握全卷积网络、R-CNN系列和单阶段检测器的基本原理
📚 学习路线图
计算机视觉任务
分类/分割/检测 语义分割
全卷积网络 目标检测
R-CNN系列 实例分割
Mask R-CNN 上采样
转置卷积 两阶段检测
Faster R-CNN 单阶段检测
YOLO/SSD 检测+分割
Mask R-CNN
本文内容一览(快速理解)
- 计算机视觉任务(Computer Vision Tasks):分类、语义分割、目标检测、实例分割的区别
- 语义分割(Semantic Segmentation):全卷积网络和上采样方法
- 目标检测(Object Detection):从单目标到多目标,从R-CNN到Faster R-CNN
- 实例分割(Instance Segmentation):Mask R-CNN结合检测和分割
一、计算机视觉任务(Computer Vision Tasks):从分类到检测
这一章要建立的基础:理解不同计算机视觉任务的区别和联系
核心问题:分类、分割、检测有什么区别?它们之间有什么关系?
!NOTE
📝 关键点总结:计算机视觉任务包括图像分类(识别类别)、语义分割(像素级分类)、目标检测(定位+分类)和实例分割(检测+分割)。这些任务从简单到复杂,相互关联。
1.1 四种主要任务(Four Main Tasks):分类、分割、检测、实例分割
概念的本质:
计算机视觉有四种主要任务:
- 图像分类(Image Classification):识别图像中的主要物体类别,无空间信息
- 语义分割(Semantic Segmentation):对每个像素进行分类,不区分实例
- 目标检测(Object Detection):定位多个物体并分类,输出边界框和类别
- 实例分割(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)使用卷积层进行下采样和上采样:
- 下采样(Downsampling):使用池化或步长卷积降低分辨率
- 上采样(Upsampling):使用Unpooling或转置卷积恢复分辨率
- 端到端:整个网络都是卷积层,可以端到端训练
图解说明:
输入
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和转置卷积
概念的本质:
上采样有两种主要方法:
- Unpooling:反向池化操作,包括最近邻插值、"Bed of Nails"和Max Unpooling
- 转置卷积(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):分类+定位
概念的本质:
单目标检测可以看作分类+定位问题:
- 分类:识别物体类别(使用Softmax损失)
- 定位 :预测边界框坐标 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)(使用L2损失)
- 多任务损失:分类损失 + 定位损失
图解说明:
输入图像 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:可变输出
- 图像1:2个物体
- 图像2:5个物体
- 图像3:10个物体
- 网络输出数量需要可变
问题2:计算量大
- 滑动窗口:需要检查所有可能的位置、尺度、长宽比
- 计算量:巨大,不可行
解决方案:
- 区域提议(Region Proposals):先找到可能包含物体的区域
- 然后只对这些区域进行分类
- 大幅减少计算量
3.3 R-CNN(Region-based CNN):区域提议+CNN分类
概念的本质:
R-CNN(Region-based CNN)的流程:
- 区域提议:使用Selective Search等方法生成约2000个候选区域
- 特征提取:对每个候选区域用CNN提取特征
- 分类和回归:用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的改进:
- 共享计算:先对整个图像提取特征,再对每个区域裁剪特征
- RoI Pooling:将不同大小的区域映射到固定大小的特征
- 端到端训练:整个网络可以端到端训练
图解说明:
输入图像 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的改进:
- RPN(Region Proposal Network):用CNN生成区域提议,替代Selective Search
- 端到端:整个网络(RPN + 检测)可以端到端训练
- 速度:比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)直接在特征图上预测检测结果,不需要两阶段(提议+分类):
- YOLO:将图像分成网格,每个网格预测多个边界框和类别
- SSD:在多个尺度的特征图上预测检测结果
- 优势:速度快,适合实时应用
- 劣势:精度可能不如两阶段检测器
实际例子:
单阶段检测器的例子:
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):检测+分割
概念的本质:
实例分割需要:
- 检测:找到所有物体并分类
- 分割:对每个物体生成精确的分割掩码
- 区分实例:区分不同的实例(即使类别相同)
图解说明:
实例分割 目标检测
定位+分类 语义分割
像素级分类 检测结果
边界框+类别 分割掩码
像素级标签 实例分割
每个实例的掩码
💡 说明:
- 检测:找到物体位置和类别
- 分割:生成精确的像素级掩码
- 结合:对每个检测到的物体生成掩码
实际例子:
实例分割的例子:
输入:一张图像,包含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的基础上添加了掩码预测分支:
- 检测分支:分类和边界框回归(与Faster R-CNN相同)
- 掩码分支:对每个RoI预测分割掩码(28×28)
- 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数据集上取得很好性能
📝 本章总结
核心要点回顾:
-
计算机视觉任务:
- 分类:识别类别
- 语义分割:像素级分类
- 目标检测:定位+分类
- 实例分割:检测+分割
-
语义分割:
- 全卷积网络:下采样+上采样
- 上采样:Unpooling或转置卷积
- 端到端训练
-
目标检测:
- R-CNN:区域提议+CNN分类
- Fast R-CNN:共享计算
- Faster R-CNN:RPN生成提议
- 单阶段检测器:YOLO/SSD
-
实例分割:
- Mask R-CNN:检测+分割
- 三个分支:分类、回归、掩码
- RoI Align:精确对齐
知识地图:
CNN应用 语义分割
全卷积网络 目标检测
R-CNN系列 实例分割
Mask R-CNN 上采样
转置卷积 两阶段
Faster R-CNN 单阶段
YOLO/SSD 检测+分割
统一框架
关键决策点:
- 任务选择:根据需求选择分类、分割或检测
- 精度vs速度:两阶段检测器精度高但慢,单阶段检测器速度快但精度稍低
- 上采样方法:转置卷积通常比Unpooling效果好
- 实际应用:考虑计算资源和精度要求
📚 延伸阅读
推荐资源
-
语义分割:
- Long et al., "Fully Convolutional Networks for Semantic Segmentation", CVPR 2015
- Noh et al., "Learning Deconvolution Network for Semantic Segmentation", ICCV 2015
-
目标检测:
- 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
-
实例分割:
- He et al., "Mask R-CNN", ICCV 2017
-
实践项目:
- 实现简单的全卷积网络进行语义分割
- 使用预训练的Faster R-CNN进行目标检测
- 尝试Mask R-CNN进行实例分割