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

文章目录

  • 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


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

  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进行实例分割
相关推荐
木头程序员15 分钟前
大模型边缘部署突破:动态推理技术与精度-延迟-能耗帕累托优化
大数据·人工智能·计算机视觉·自然语言处理·智能手机·数据挖掘
AI即插即用1 小时前
超分辨率重建 | CVPR 2024 DarkIR:轻量级低光照图像增强与去模糊模型(代码实践)
图像处理·人工智能·深度学习·神经网络·计算机视觉·超分辨率重建
MF_AI3 小时前
苹果病害检测识别数据集:1w+图像,5类,yolo标注
图像处理·人工智能·深度学习·yolo·计算机视觉
爱打代码的小林4 小时前
CNN 卷积神经网络 (MNIST 手写数字数据集的分类)
人工智能·分类·cnn
hoiii1874 小时前
基于混合神经网络(CNN-LSTM)的电能扰动信号特征识别MATLAB实现
神经网络·cnn·lstm
音沐mu.4 小时前
【45】俯拍视角车辆数据集(有v5/v8模型)/YOLO俯拍视角车辆检测
yolo·目标检测·数据集·俯拍视角车辆检测·俯拍视角车辆数据集
美狐美颜sdk4 小时前
Android直播美颜SDK:选择指南与开发方案
android·人工智能·计算机视觉·第三方美颜sdk·视频美颜sdk·人脸美型sdk
sali-tec5 小时前
C# 基于OpenCv的视觉工作流-章7-膨胀
图像处理·人工智能·opencv·算法·计算机视觉
努力犯错5 小时前
LTX-2 进阶 Prompt 技巧:从入门到专业视频创作
人工智能·数码相机·机器学习·计算机视觉·开源·prompt·音视频
杜子不疼.6 小时前
计算机视觉热门模型手册:Spring Boot 3.2 自动装配新机制:@AutoConfiguration 使用指南
人工智能·spring boot·计算机视觉