查看全课大纲(第 55 / 93 节)
- 1.计算机视觉概述
- 2.计算机视觉应用场景
- 3.困难与挑战
- 4.开源库介绍
- 5.图像显示与存储
- 6.CLAHE
- 7.腐蚀膨胀与开闭运算
- 8.滤波与边缘填充
- 9.各种滤波
- 10.图像金字塔
- 11.傅里叶变换
- 12.短时傅里叶变换与小波变换
- 13.颜色特征与颜色直方图
- 14.几何特征_边缘
- 15.几何特征-角点与斑点
- 16.局部特征-SIFT特征描述子
- 17.局部特征-SURF特征描述子
- 18.局部特征-ORB特征描述子
- 19.其他特征描述子
- 20.传统图像分割技术
- 21.GraphCut
- 22.GrabCut
- 23.人脸检测的传统方法
- 24.行人检测的传统方法HOG+SVM
- 25.行人检测DPM
- 26.人工神经网络的架构
- 27.目标函数与梯度下降
- 28.误差反向传播
- 29.可手算的神经网络
- 30.改进目标函数与克服梯度消散
- 31.神经网络之传统神经网络与深度网络的差异
- 32.各种梯度下降算法
- 33.如何选择合适的梯度下降算法
- 34.避免过适应
- 35.CNN的架构
- 36.CNN的误差反向传播_卷积层
- 37.CNN的误差反向传播_池化层
- 38.分类所用的数据集
- 39.Alexnet详解
- 40.VGG详解
- 41.GoogLeNet_v1
- 42.BatchNormalization
- 43.GoogLeNet_v3v4
- 44.ResNet
- 45.ResNeXt
- 46.CNN设计准则
- 47.图像检索与推土机距离
- 48.基于颜色相似性
- 49.基于形状相似性
- 50.基于纹理相似性
- 51.基于局部特征相似性
- 52.DL的二值哈希编码
- 53.高维空间中检索KDTree
- 54.高维空间中检索LSH
- 55.目标识别任务综述
- 56.RCNN
- 57.SPP-Net
- 58.Fast R-CNN
- 59.Faster R-CNN
- 60.R-CNN系列模型回顾
- 61.R-FCN的设计思路
- 62.R-FCN的实现
- 63.YOLOv1
- 64.YOLOv2_9000
- 65.YOLOv3
- 66.图像分割应用场景与数据集
- 67.上采样的实现方式
- 68.FCN网络架构的由来
- 69.FCN构建细节
- 70.DeepLabv1
- 71.CRF
- 72.DeepLabv2
- 73.DeepLabv3
- 74.特定的医学影像分割任务
- 75.U-Net
- 76.3D U-Net
- 77.V-Net
- 78.DenseNet
- 79.病理切片分析任务及数据集
- 80.病理切片分析
- 81.图说任务及其传统处理方法
- 82.深度语言模型与RNN
- 83.LSTM及其变种
- 84.NIC模型
- 85.SAT模型
- 86.图说的性能指标
- 87.判别模型与生成模型
- 88.KL散度与JS散度
- 89.VAE
- 90.GAN的基本原理
- 91.DCGAN与CGAN
- 92.Wasserstein GAN
- 93.SRGAN
目标识别任务综述
小象实战讲义 · 基于深度学习的计算机视觉
欢迎来到目标检测篇章的开篇。在之前的课程中,我们学习了如何让模型“看懂”一张图片里“是什么”(图像分类)。现在,我们将面对一个更贴近真实世界的任务:不仅要识别出图片里“有什么”,还要精确地指出它们“在哪里”。本节将为你勾勒出目标检测任务的全景图,明确其定义、与其他视觉任务的差异,并介绍支撑这一领域发展的关键数据集。
💡 核心导读
- 目标检测的定义:识别图像中所有预定义物体的类别,并用最小外接矩形(Bounding Box)标定其位置。
- 任务间的区别:从单物体分类、分类与定位,到多物体检测,再到更精细的实例分割,任务复杂度逐级递增。
- 关键数据集:了解通用目标检测数据集(如ILSVRC)和特定领域数据集(如FDDB人脸检测、Caltech行人检测)的特点与挑战。
- 技术演进脉络:初步了解从R-CNN到Faster R-CNN、YOLO等经典模型的进化路线。
什么是目标检测?
目标检测(Object Detection),有时也称为目标识别,是计算机视觉中的一项核心任务。其目标是对输入图像中的所有预定义类别的物体进行识别与定位。
具体而言,对于图像中的每一个目标物体,我们需要输出两个信息:
- 类别标签(Category Label):指明物体属于哪个类别(例如:狗、猫、鸭子)。
- 所处位置(Location):通常用一个最小外接矩形(Bounding Box,简称BB或bbox) 来框定目标。这个矩形需要恰好包围住目标的所有像素。
import numpy as np
import cv2
# 为了演示,我们创建一个纯色背景的“模拟图像”
height, width = 200, 300
# 创建一个白色背景 (BGR格式,白色为255,255,255)
image = np.ones((height, width, 3), dtype=np.uint8) * 255
# 在图像上“画”几个彩色矩形来模拟目标(这里仅用于可视化理解,非检测过程)
# 模拟一个蓝色的“狗”的bbox
dog_bbox = (50, 30, 120, 80) # 格式: (x_top_left, y_top_left, width, height)
cv2.rectangle(image, dog_bbox[:2], (dog_bbox[0]+dog_bbox[2], dog_bbox[1]+dog_bbox[3]), (255, 0, 0), 2)
cv2.putText(image, 'dog', (dog_bbox[0], dog_bbox[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 1)
# 模拟一个红色的“猫”的bbox
cat_bbox = (180, 80, 80, 90)
cv2.rectangle(image, cat_bbox[:2], (cat_bbox[0]+cat_bbox[2], cat_bbox[1]+cat_bbox[3]), (0, 0, 255), 2)
cv2.putText(image, 'cat', (cat_bbox[0], cat_bbox[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1)
# 注意:在实际代码讲义中,我们不会进行imshow。这里用print说明bbox坐标。
print("模拟图像中目标框的坐标(格式:[x, y, width, height]):")
print(f" dog bbox: [{dog_bbox[0]}, {dog_bbox[1]}, {dog_bbox[2]}, {dog_bbox[3]}]")
print(f" cat bbox: [{cat_bbox[0]}, {cat_bbox[1]}, {cat_bbox[2]}, {cat_bbox[3]}]")
print("(注:此代码块旨在说明Bounding Box的概念,未执行图像显示)")模拟图像中目标框的坐标(格式:[x, y, width, height]):
dog bbox: [50, 30, 120, 80]
cat bbox: [180, 80, 80, 90]
(注:此代码块旨在说明Bounding Box的概念,未执行图像显示)关键点:目标检测只关心被预先定义好的类别。图像中未被定义的物体(如背景中的水桶、草地、树木)均被视为背景,模型无需对它们进行检测。
与其他视觉任务的区别
理解目标检测的定位,需要将其放在计算机视觉任务谱系中来看。任务的复杂度通常随着需要处理的物体数量和输出的精细度而增加。
任务复杂度递增:
1. 图像分类 (Image Classification):
输入:一张图片。
输出:一个类别标签。
示例:图片中只有一只占据主要画面的猫,输出“猫”。
2. 分类与定位 (Classification & Localization):
输入:一张图片(通常包含一个主要物体)。
输出:一个类别标签 + 该物体的一个Bounding Box。
示例:图片中有一只猫,输出“猫”及其位置框。
*本质上是目标检测在“单物体”情况下的特例。*
3. 目标检测 (Object Detection):
输入:一张图片。
输出:多个类别标签 + 多个Bounding Boxes。
示例:图片中有狗、猫、鸭子,输出它们各自的类别和位置。
4. 实例分割 (Instance Segmentation):
输入:一张图片。
输出:为每个目标物体生成一个像素级的掩膜(Mask),区分不同实例。
示例:不仅框出狗,还用精确的轮廓把狗的每一个像素都标出来。因此,我们课程从目标检测开始,而非更简单的“分类与定位”,正是因为现实世界通常是多目标的、复杂的。掌握多目标检测,是迈向更高级视觉理解(如分割)的必经之路。
目标检测常用数据集
数据是深度学习的燃料。目标检测任务因其输出是一组标签(类别+位置),所以对标注数据提出了更高要求。以下是几个经典的数据集:
ILSVRC竞赛数据集
我们熟悉的ImageNet大规模视觉识别挑战赛(ILSVRC)不仅包含分类任务,也包含目标检测任务。
- 全称:ImageNet Large Scale Visual Recognition Challenge。
- 检测任务:包含200个物体类别。
- 标注特点:每张图片提供多组标签,每组标签包含类别和Bounding Box(通常以
(x_min, y_min, width, height)或(x_min, y_min, x_max, y_max)格式给出)。 - 历史地位:ILSVRC 的检测任务在 2013–2017 年间推动了目标检测技术的飞速发展;竞赛整体于 2017 年停办,此后研究转向更复杂的视觉任务。
特定领域数据集
许多实际应用催生了垂直领域的数据集。
1. 人脸检测数据集
- FDDB (Face Detection Data set and Benchmark):
- 包含2845张图片,共5171张人脸。
- 采用椭圆标注,能更好地描述人脸的姿态和角度。
- 包含灰度图和彩色图。
- 检测难点:遮挡(Occlusions)、多种姿态(Different Poses)、低分辨率(Low Resolution)、失焦(Out-of-focus)。
- IJB-A (IARPA Janus Benchmark A):
- 更大型、更无约束的人脸数据集,包含图片和视频帧,总计约4.9万张人脸。
- 涵盖500个特定人物,并包含性别、肤色等元数据。
2. 行人检测数据集
- Caltech Pedestrian Dataset:
- 由车载摄像头拍摄,约10小时视频,提取出25万帧。
- 包含约35万个行人的Bounding Box标注。
- 专为自动驾驶等场景中的行人检测任务设计。
import numpy as np
# 演示:模拟一个简单的Bounding Box列表,类似数据集标注格式
# 假设一个图片的标注,包含两个物体
# 格式:每个物体为 [类别ID, x_center, y_center, width, height]
# 这里使用归一化坐标(0-1之间)
# 模拟标注数据
annotations = np.array([
[14, 0.35, 0.45, 0.20, 0.30], # 类别14(如‘人’),中心点(0.35,0.45),宽0.2,高0.3
[ 8, 0.70, 0.60, 0.15, 0.25] # 类别8(如‘车’),中心点(0.70,0.60),宽0.15,高0.25
])
print("模拟图像标注数据(归一化坐标):")
print("格式:[class_id, x_center, y_center, width, height]")
print(annotations)
# 计算一个简单的指标:所有框的平均宽高比(aspect ratio)
widths = annotations[:, 3]
heights = annotations[:, 4]
aspect_ratios = widths / heights
print(f"\n各个Bounding Box的宽高比: {aspect_ratios}")
print(f"平均宽高比: {np.mean(aspect_ratios):.3f}")模拟图像标注数据(归一化坐标):
格式:[class_id, x_center, y_center, width, height]
[[14. 0.35 0.45 0.2 0.3 ]
[ 8. 0.7 0.6 0.15 0.25]]
各个Bounding Box的宽高比: [0.66666667 0.6 ]
平均宽高比: 0.633技术演进脉络预览
从本节开始,我们将深入一系列改变目标检测格局的经典模型。它们的演进主线是提升速度与精度,并简化训练流程。
模型进化史(本节提及部分):
R-CNN (CVPR 2014) -> SPP-Net (ECCV 2014) -> Fast R-CNN (ICCV 2015)
-> Faster R-CNN (NIPS 2015) -> YOLO (CVPR 2016) -> ... (后续课程详解)
核心思想演进:
1. R-CNN: 将检测问题转化为“区域提议(Region Proposal) + CNN分类”。
2. SPP-Net: 引入空间金字塔池化,共享卷积计算,加速特征提取。
3. Fast R-CNN: 提出RoI池化层和多任务损失,实现端到端训练。
4. Faster R-CNN: 引入区域提议网络(RPN),将区域提议也并入网络,实现推理端到端(训练采用四步交替)。
5. YOLO: “You Only Look Once”思想,将检测视为单次回归问题,速度极快。我们将沿着这条主线,逐一剖析每个模型的核心创新与实现细节。
📝 动手练一练
- 概念辨析:假设你有一张公园的照片,里面有长椅、行人、狗、远处的树木和天空中的云。如果你只定义了“行人”和“狗”为目标检测类别,那么“长椅”、“树木”和“云”在模型中会被视为什么?模型需要输出它们的Bounding Box吗?
👉 点击查看参考答案
“长椅”、“树木”和“云”在模型中被视为背景。目标检测模型只对预定义类别(这里是“行人”和“狗”)进行识别和定位。因此,模型不需要也不应该输出这些未定义类别的Bounding Box。模型的职责是找出所有“行人”和“狗”并标出位置,其他内容一律忽略。
- 坐标计算:在一个宽度为800像素,高度为600像素的图像中,一个Bounding Box的归一化坐标为
[0.25, 0.50, 0.30, 0.40](格式:[x_center, y_center, width, height])。请计算该框在图像像素坐标系下的左上角坐标(x_min, y_min)和右下角坐标(x_max, y_max)。
👉 点击查看参考答案
首先将归一化坐标转换为像素坐标:
- 中心点 x = 0.25 * 800 = 200
- 中心点 y = 0.50 * 600 = 300
- 宽度 w = 0.30 * 800 = 240
- 高度 h = 0.40 * 600 = 240
然后计算角点:
x_min = x - w/2 = 200 - 120 = 80y_min = y - h/2 = 300 - 120 = 180x_max = x + w/2 = 200 + 120 = 320y_max = y + h/2 = 300 + 120 = 420
因此,该Bounding Box的像素坐标为:左上角(80, 180),右下角(320, 420)。
本章小结
本节作为目标检测篇章的绪论,明确了任务的核心是多目标的分类与定位,并通过与分类、定位、分割任务的对比,确立了其在整个视觉任务体系中的位置。我们还认识了支撑该领域发展的关键数据集,并对即将学习的经典模型序列有了宏观的了解。
今天,目标检测已进入以 YOLO 系列、DETR/Transformer 检测器、开放词汇检测(如 Grounding DINO)为代表的新阶段;本节介绍的 R-CNN 系列,是理解两阶段与单阶段检测范式的历史起点。
📋 行动清单
- 在脑海中清晰复述目标检测的输出是什么(类别+位置框)。
- 能够区分图像分类、分类与定位、目标检测和实例分割这四个任务。
- 记住至少一个通用目标检测数据集(ILSVRC)和一个特定领域数据集(如FDDB或Caltech)的名字及特点。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。