一、计算机视觉概述
计算机视觉(Computer Vision, CV)是人工智能领域最重要的分支之一,旨在让计算机能够从图像或视频中理解视觉世界。随着深度学习技术的快速发展,计算机视觉在诸多领域都取得了突破性进展。
计算机视觉的三大核心任务
计算机视觉的研究体系可以归纳为三大基本任务:
- 图像分类(Classification): 判断图像中包含了什么类别的物体,是一个从图像到标签的映射过程。例如输入一张猫的图片,输出"猫"这个类别标签。这是最基础的视觉任务。
- 目标检测(Detection): 不仅要判断图像中有哪些物体,还要确定每个物体的具体位置,通常用边界框(Bounding Box)来表示。例如在一张街景图中,检测出所有行人、车辆并用矩形框标出。
- 图像分割(Segmentation): 进一步细化到像素级别的分类。语义分割将图像中每个像素分配一个类别标签;实例分割则能区分同一类别的不同个体。
图像分类 vs 目标检测
图像分类关注的是全局识别——"这是什么?"它输出一个单一的类别标签,描述整个图像的内容。目标检测关注的是局部定位与识别——"有什么?在哪里?"它输出多个边界框及其对应的类别标签。
举例来说,面对一张包含猫和狗的图片:图像分类只能判断"这张图里有猫"或"这张图里有狗";而目标检测能同时框出猫和狗的位置,并分别标注它们的类别。
计算机视觉的主要挑战
尽管深度学习极大地推动了视觉技术的发展,计算机视觉仍面临诸多挑战:
- 光照变化: 同一物体在不同光照条件下呈现迥异的视觉效果,模型需要具备光照不变性。
- 姿态变化: 物体从不同角度观察时形态差异很大,模型需要理解物体的三维结构和旋转不变性。
- 遮挡问题: 现实场景中物体常被部分遮挡,模型需要基于可见部分推断被遮挡的区域。
- 类别多样性: 现实世界包含成千上万的物体类别,模型需要处理长尾分布和开放集识别问题。
- 尺度变化: 同一物体在图像中的尺寸可能差异巨大(近大远小),模型需要具备多尺度感知能力。
- 背景干扰: 复杂背景中的纹理、图案会干扰物体的识别,模型需要聚焦于目标本身。
核心理解:
图像分类和目标检测构成了计算机视觉应用的基础。分类解决"是什么"的问题,检测解决"在哪里+是什么"的问题。两者结合为更高级的视觉任务(图像分割、目标跟踪、动作识别等)提供了基础能力。在实际工程中,分类网络常作为检测模型的骨干网络(Backbone),两种技术深度耦合。
二、图像分类基础
图像分类的定义
图像分类是指给定一张输入图像,计算机模型基于其视觉内容将其分配到一个预定义的类别标签中的任务。形式上,分类模型学习一个映射函数 f: I → y,其中 I 是输入图像张量,y 是类别标签。现代图像分类系统通常基于卷积神经网络(CNN)构建,通过端到端的训练方式学习从像素到类别的映射。
经典数据集
图像分类领域的发展离不开标准化的基准数据集。以下是三个最具影响力的数据集:
| 数据集 |
图像数量 |
类别数 |
图像尺寸 |
特点 |
| ImageNet |
超过1400万 |
1000 |
各尺寸(需resize) |
大规模、多样性高,是分类竞赛标准 |
| CIFAR-10 |
60000 |
10 |
32x32 |
小尺寸、快速实验验证 |
| CIFAR-100 |
60000 |
100 |
32x32 |
细粒度分类,类别更多 |
| MNIST |
70000 |
10 |
28x28 |
手写数字,入门级"Hello World" |
图像预处理
在将图像输入神经网络之前,通常需要经过以下预处理步骤:
- 归一化(Normalization): 将像素值从 [0, 255] 缩放到 [0, 1] 或标准化到均值为0、标准差为1的分布。归一化可以加速模型收敛并提高数值稳定性。
- 尺寸调整(Resizing): 将输入图像调整为网络所需的固定尺寸(如224x224、256x256等)。常见的插值方法包括双线性插值(bilinear)和最近邻插值(nearest)。
- 数据增强(Data Augmentation): 在训练过程中对原始图像施加随机变换以增加训练数据的多样性,包括随机翻转、旋转、裁剪、颜色抖动、高斯模糊等。数据增强是防止过拟合最有效的手段之一。
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
分类评估指标
图像分类模型的性能主要通过以下指标评估:
- Top-1 准确率: 模型预测的最可能的类别就是正确类别的概率。这是最严格的评估方式。
- Top-5 准确率: 模型预测的前5个最可能的类别中包含正确类别的概率。在类别数量多(如ImageNet的1000类)时,Top-5更具包容性。
- 混淆矩阵(Confusion Matrix): 展示每个类别的真正例、假正例等详细分类结果,帮助分析模型在哪些类别上容易混淆。
实践要点:
图像分类是计算机视觉的基础能力,几乎所有视觉任务都依赖或借鉴分类网络的架构设计。ResNet提出的残差连接(Skip Connection)已成为现代深度学习网络的标配设计模式。在实际项目中,ImageNet预训练权重的迁移学习是最高效的方法,通常比从头训练收敛更快、效果更好。
三、图像分类架构
经典分类网络发展史
从2012年AlexNet在ImageNet竞赛中大幅超越传统方法开始,图像分类网络经历了快速迭代:
AlexNet (2012)
Alex Krizhevsky等人提出的8层深度卷积网络,使用ReLU激活函数、Dropout正则化和GPU并行训练技术,在ImageNet上以巨大优势夺冠,标志着深度学习时代的正式开启。
VGG (2014)
牛津大学Visual Geometry Group提出,核心思想是使用连续的小卷积核(3x3)堆叠来替代大卷积核,在增加网络深度的同时控制参数量。VGG-16和VGG-19是常用变体,结构规整、易于理解。
ResNet (2015)
微软亚洲研究院何恺明等人提出的残差网络,通过引入跨层连接(Skip Connection)解决了深层网络的退化问题,使网络深度首次突破100层。ResNet-50/101/152成为工业界最广泛使用的骨干网络。
EfficientNet (2019)
Google提出的高效网络,通过神经架构搜索(NAS)系统地优化网络深度、宽度和输入分辨率三个维度,在同样计算量下达到了最优的准确率。EfficientNet-B0到B7覆盖不同计算预算。
迁移学习在图像分类中的应用
迁移学习是深度学习工程实践中最核心的技术之一。其基本思路是:在一个大规模数据集(如ImageNet)上预训练的模型,已经学到了通用的视觉特征(边缘、纹理、形状等),将这些知识迁移到目标任务上,可以显著降低对目标域数据量的需求。
迁移学习的两种主要方式:
- 特征提取(Feature Extraction): 冻结预训练模型的卷积层(Backbone),只训练新增的分类头(Classifier Head)。预训练模型作为固定的特征提取器。
- 微调(Fine-Tuning): 将预训练模型的全部或部分层与新增的分类头一起在目标数据集上训练。通常使用较小的学习率(如1e-4 ~ 1e-5),防止破坏预训练学到的特征。
torchvision.models 加载预训练模型
PyTorch的torchvision库提供了丰富的预训练模型接口,支持一键加载:
import torchvision.models as models
model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)
全连接分类头的替换原理:
预训练模型的最后一层全连接层(fc layer)的维度是ImageNet的1000类。当迁移到自己的数据集时,需要将最后一层替换为与目标类别数匹配的新全连接层。新层的参数可以随机初始化或使用较小的学习率训练。替换后整个模型就可以在目标数据集上微调。
经验法则: 当目标数据集较小时(每类几百张),建议冻结Backbone只训练分类头;当目标数据集中等或较大时(每类数千张以上),可以进行全模型微调;目标数据与ImageNet数据分布差异大时(如医学影像),应使用更小的学习率微调更多层。
四、目标检测概述
目标检测 = 定位(Bounding Box)+ 分类
目标检测任务要求模型同时完成两个子任务:定位——确定图像中每个目标对象的边界框(Bounding Box)位置和大小;分类——判断每个边界框内对象的类别标签。因此,目标检测模型的输出通常是一个列表,每个元素包含4个坐标值(x, y, w, h 或 x1, y1, x2, y2)和一个类别ID。
IoU(交并比)评估指标
Intersection over Union(IoU)是目标检测中衡量预测框与真实框重叠程度的核心指标:
IoU = (预测框与真实框的交集面积) / (预测框与真实框的并集面积)
IoU的取值范围在0到1之间。通常IoU大于0.5被认为是有效检测(匹配成功),但在严格评估中阈值可能设为0.75甚至0.95。
mAP(平均精度均值)
mAP(mean Average Precision)是目标检测领域最权威的综合评估指标。计算过程如下:
- 对每个类别,根据置信度排序预测框,计算在不同召回率下的精确率(Precision),得到该类别的AP(Average Precision)。
- 对所有类别的AP取平均值,得到mAP。
- 常用的变体包括 mAP@0.5(IoU阈值为0.5时的mAP)和 mAP@0.5:0.95(从IoU 0.5到0.95,步长0.05的mAP平均值),后者更为严格。
mAP@0.5:0.95 为什么是更严格的指标?
mAP@0.5:0.95在多个IoU阈值下计算mAP并取平均,要求模型不仅能检出目标,还要求定位足够精确(IoU接近0.95)。一个只能大致框出目标但定位不精确的模型,其mAP@0.5可能不错,但mAP@0.5:0.95会显著下降。因此,这一指标更适合实际应用中对定位精度要求高的场景。
非极大值抑制(NMS)
目标检测模型在处理同一目标时,通常会生成多个高度重叠的候选框(例如中心点附近会聚集大量预测框)。非极大值抑制(Non-Maximum Suppression, NMS)是一种后处理算法,用于筛选出最佳预测框:
- 将所有预测框按置信度从高到低排序。
- 选择置信度最高的框作为保留框。
- 删除与保留框的IoU超过设定阈值(通常为0.5)的其他框。
- 从剩余框中重复步骤2和3,直到处理完所有框。
NMS的核心思路是保留局部最大值,抑制冗余的重复检测。它虽然简单,但对于提升检测结果的质量至关重要。
五、两阶段检测器
两阶段检测器(Two-Stage Detector)的核心思路是"先提议,再分类"。第一阶段生成可能包含物体的候选区域(Region Proposals),第二阶段对每个候选区域进行分类和边界框精修。这种"粗筛+细判"的设计通常能获得更高的检测精度。
R-CNN — 区域建议 + CNN分类
R-CNN(Region-based CNN)是目标检测深度学习的奠基之作。其工作流程如下:
- 使用选择性搜索(Selective Search)从图像中提取约2000个候选区域。
- 将每个候选区域缩放到固定尺寸(227x227)。
- 将每个候选区域送入CNN(AlexNet)提取特征。
- 使用SVM分类器对每个区域进行分类。
- 使用回归器对边界框进行精修。
缺点:每个候选区域都需独立通过CNN计算,速度极慢(每张图约47秒),无法实现实时检测。
Fast R-CNN — 共享卷积计算
Fast R-CNN引入了关键创新——RoI Pooling(兴趣区域池化):
- 先将整张图像一次性通过CNN得到共享的特征图(Feature Map)。
- 将每个候选区域映射到特征图上的对应区域。
- 通过RoI Pooling将不同尺寸的区域映射为固定大小的特征向量。
- 使用全连接层同时进行分类和边界框回归(多任务学习)。
共享卷积计算的策略使得检测速度大幅提升(约2秒/图),但仍未实现端到端训练。
Faster R-CNN — RPN区域建议网络
Faster R-CNN是两阶段检测器的巅峰之作,其核心创新是区域建议网络(Region Proposal Network, RPN):
- RPN与检测网络共享卷积特征图,是一个全卷积网络。
- 在特征图上滑动一个3x3的窗口,每个位置预测 k个锚点框(Anchor Boxes) 的前景/背景分数和边界框偏移量。
- 锚点框是多尺度和多长宽比的预定义参考框,覆盖了不同形状的物体。
- RPN代替了Selective Search,实现了端到端的区域提议生成。
Faster R-CNN将检测速度提升到约0.2秒/图(5 FPS),实现了接近实时的性能,同时保持了最高的检测精度。其架构设计深深影响了后续的目标检测研究。
Mask R-CNN — 实例分割扩展
Mask R-CNN在Faster R-CNN的基础上增加了实例分割分支。关键改进包括:
- RoI Align: 替代RoI Pooling,使用双线性插值解决了量化误差问题,更适合像素级预测任务。
- 并行输出: 在分类和回归的基础上并行输出一个二值掩码(Binary Mask),实现像素级的分割。
- 一个模型同时完成检测、分类和分割三个任务,展现了两阶段框架强大的扩展能力。
两阶段检测器方法论总结:
- R-CNN建立了"区域提议+分类"的基本范式,但计算冗余严重。
- Fast R-CNN通过RoI Pooling实现了共享卷积计算,大幅提升了效率。
- Faster R-CNN通过RPN实现了端到端训练,速度和精度达到最优平衡。
- Mask R-CNN通过RoI Align进一步提升了定位精度,并扩展到了实例分割。
- 两阶段检测器在精度上通常优于单阶段检测器,适用于对精度要求极高的应用场景。
六、单阶段检测器
单阶段检测器(One-Stage Detector)放弃了"候选区域提议"阶段,直接在图像上一次性预测所有边界框和类别。这种设计使得检测速度更快,但在早期精度不如两阶段方法。随着YOLO和SSD等方法的改进,单阶段检测器在速度和精度上都达到了很高的水平。
YOLO(You Only Look Once)
YOLO的核心思想是将目标检测视为一个回归问题,单个神经网络在整张图像上直接预测边界框和类别概率。
YOLOv1(2016)
- 将输入图像划分为 S x S 的网格(如7x7)。
- 每个网格负责预测 B 个边界框(如2个),每个框包含5个预测值:x, y, w, h, confidence。
- 同时每个网格预测 C 个类别条件概率。
- 最终输出张量尺寸为 S x S x (B*5 + C)。
- 优点:速度极快(45 FPS),能理解图像的整体上下文。
- 缺点:网格划分较为粗糙,对小目标和密集目标的检测效果不佳。
YOLOv2/YOLO9000(2017)
- 引入锚点框(Anchor Boxes),借鉴Faster R-CNN的先验思想。
- 使用K-means聚类从数据集中学习锚点框的尺寸分布。
- 引入Batch Normalization和高分辨率分类器训练。
- YOLO9000实现了9000类目标检测的联合训练。
YOLOv3(2018)
- 使用Darknet-53作为骨干网络,引入残差连接。
- 采用特征金字塔(FPN)结构,在三个不同尺度上进行检测,提升了对小目标的检测能力。
- 使用逻辑回归替代softmax进行类别预测,支持多标签分类。
YOLOv4/v5 到 YOLOv8
- YOLOv4(2020):集成了大量trick,如Mosaic数据增强、CIoU损失、PANet特征融合等。
- YOLOv5(2020):基于PyTorch的重新实现,在易用性和工程部署上进行了大量优化。
- YOLOv8(2023):Ultralytics最新版本,在检测、分割、姿态估计等任务上统一了框架,模型结构进一步优化,推理速度更快。
YOLO系列的核心优势
- 推理速度极快: YOLO系列从诞生之初就以速度著称,YOLOv8能在GPU上达到数百FPS的推理速度。
- 端到端单阶段: 不需要RPN等中间模块,模型结构简洁高效,部署方便。
- 全局理解: 在整张图像上进行推理,能更好地利用上下文信息,减少背景误检。
- 工程友好: 在推理速度和检测精度之间提供了丰富的模型变体(nano到extra-large),满足不同部署需求。
SSD(Single Shot MultiBox Detector)
SSD是与YOLO同时期的另一代表性单阶段检测器,其核心设计理念是:
- 在特征金字塔的多个层级上直接预测边界框和类别。
- 低层特征图(分辨率高)负责检测小目标,高层特征图(语义信息丰富)负责检测大目标。
- 每个特征图位置使用不同尺度和长宽比的默认框(Default Boxes)作为先验。
- 使用了Hard Negative Mining技术处理正负样本不平衡问题。
YOLO vs SSD vs Faster R-CNN 对比
| 特性 |
Faster R-CNN |
YOLO |
SSD |
| 范式 |
两阶段 |
单阶段 |
单阶段 |
| 预测方式 |
RPN提议 + RoI分类 |
网格直接回归 |
多尺度特征图预测 |
| 推理速度 |
慢(~5-15 FPS) |
极快(~45-数百FPS) |
快(~30-60 FPS) |
| 定位精度 |
高 |
中等(YOLOv3后提升明显) |
中等 |
| 小目标检测 |
好 |
一般(YOLOv3后改善) |
较好(多尺度策略) |
| 部署难度 |
较复杂 |
简单 |
中等 |
| 适用场景 |
高精度要求场景 |
实时场景、移动端部署 |
速度和精度平衡场景 |
工程选型建议: 如果项目对检测精度有极致要求且计算资源充足(如遥感图像分析),优先选择Faster R-CNN或Mask R-CNN。如果项目需要实时推理或部署在边缘设备(如视频监控、无人机),YOLO系列是最佳选择。SSD作为经典方法,在校验集或作为baseline时仍有参考价值。
七、目标检测应用
人脸检测
人脸检测是目标检测最成熟的应用之一。从早期的Haar Cascade到基于深度学习的MTCNN、RetinaFace,人脸检测技术已经能够在各种复杂条件下(姿态变化、遮挡、光照变化)实现高精度的实时检测。现代智能手机的人脸解锁、相机的人脸对焦、社交平台的自动标注都依赖于人脸检测技术。
自动驾驶(车辆、行人检测)
自动驾驶是目标检测技术最具挑战性的应用场景之一:
- 多类别检测: 需要同时检测车辆、行人、自行车、交通标志、交通信号灯等多种目标。
- 实时性要求极高: 通常要求检测延迟低于30毫秒,以保证行车安全。
- 远距离小目标: 需要在远处就检测到行人或障碍物,为决策系统留出足够的反应时间。
- 多传感器融合: 通常结合摄像头、激光雷达(LiDAR)、毫米波雷达等多种传感器数据。
特斯拉的纯视觉方案、Waymo的多传感器融合方案都大量使用了目标检测技术。
工业质检
在制造业中,目标检测被广泛用于自动化质量检测:
- 表面缺陷检测: 检测金属、玻璃、纺织品等材料表面的划痕、凹坑、气泡等缺陷。
- 装配完整性检查: 检测零部件是否漏装、错装、位置偏移。
- 产品分类: 在传送带上自动识别不同型号的产品并进行分拣。
工业场景的特点是:目标小、类别单一但形态多样、对误报率要求极低。通常需要在小样本数据上进行精细微调。
视频监控
智能视频监控是目标检测的大规模落地场景:
- 人群密度估计: 通过检测人数变化进行客流统计和安全预警。
- 异常行为检测: 检测闯入禁区、奔跑、聚集等异常事件。
- 车辆跟踪: 在城市交通监控中实现车辆检测、追踪和车牌识别。
- 安防巡检: 无人机自动巡检中检测电力线缺陷、管道泄漏等异常。
应用落地要点
- 数据质量优先: 高质量的标注数据比复杂的模型更有效。确保标注的一致性、边界框精度和类别覆盖度。
- 模型-硬件协同优化: 根据部署硬件(GPU/CPU/边缘设备)选择模型大小,合理使用模型量化、剪枝、蒸馏等压缩技术。
- 场景适配: 在目标场景下大量采集数据并进行领域自适应(Domain Adaptation),避免在部署场景下出现性能崩溃。
- 持续迭代: 建立数据闭环——对模型预测的不确定样本或者误检样本进行人工标注,不断扩充训练集,持续提升模型表现。
八、核心要点总结
- 两大任务的关系: 图像分类是基础能力,输出单一类别标签;目标检测是分类的延伸,同时输出位置和类别。分类网络常作为检测模型的骨干(Backbone)。
- 技术演进主线: 分类网络从AlexNet发展到ResNet再到EfficientNet,核心趋势是更深、更宽、更高效;检测网络从R-CNN到Faster R-CNN实现了端到端,从YOLO到YOLOv8实现了极致速度。
- 两阶段 vs 单阶段: 两阶段检测器(Faster R-CNN系列)精度更高,适用于精度第一的场景;单阶段检测器(YOLO系列)速度更快,适用于实时场景。两者之间的差距在逐渐缩小。
- 迁移学习的重要性: 利用ImageNet预训练权重进行迁移学习,可以极大缩短训练时间并提高模型性能,是视觉任务的标配做法。
- 工程实践的关键: 数据质量、模型压缩、场景适配和持续迭代是模型从实验室走向生产环境的核心挑战。
- 评估指标: Top-1/Top-5准确率用于分类;IoU、mAP用于检测。理解指标内涵比记住数字更重要。
- 未来展望: Transformer架构(ViT、DETR)正在改变分类和检测的范式,端到端的检测方法(如DETR系列)取消了锚点框和NMS等手工设计组件,是值得关注的技术趋势。
九、进一步思考
目标检测和图像分类是计算机视觉的基石,理解这两个任务的核心原理对于深入学习更高级的视觉技术(语义分割、实例分割、目标跟踪、动作识别、视觉问答等)至关重要。在实际应用中,以下方向值得持续关注:
扩展研究方向:
- Vision Transformer(ViT): 将Transformer架构引入图像分类,在大型数据集上超越CNN。其变体(Swin Transformer、DETR)在检测和分割任务上也取得了突破。
- 开放集/零样本检测: 如GLIP、Grounding DINO等模型,通过图文对齐实现开放词汇的目标检测。
- 小样本目标检测: 在极少量标注样本下实现检测能力的快速学习,是工业落地的重要方向。
- 模型轻量化: 量化(INT8/FP16)、剪枝、知识蒸馏等技术使得大模型可以在移动设备上运行。
- 多模态融合: 视觉+语言+语音的联合理解是下一代AI系统的核心方向。
学习建议: 动手实践是最好的学习方式。建议读者使用torchvision加载预训练模型在自己的数据集上进行迁移学习实验,然后使用YOLOv8或MMDetection框架训练自己的目标检测模型。理论与实践结合才能深刻理解算法的设计思想和工程技巧。