查看全课大纲(第 55 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

目标识别任务综述

小象实战讲义 · 基于深度学习的计算机视觉

欢迎来到目标检测篇章的开篇。在之前的课程中,我们学习了如何让模型“看懂”一张图片里“是什么”(图像分类)。现在,我们将面对一个更贴近真实世界的任务:不仅要识别出图片里“有什么”,还要精确地指出它们“在哪里”。本节将为你勾勒出目标检测任务的全景图,明确其定义、与其他视觉任务的差异,并介绍支撑这一领域发展的关键数据集。

💡 核心导读

  • 目标检测的定义:识别图像中所有预定义物体的类别,并用最小外接矩形(Bounding Box)标定其位置。
  • 任务间的区别:从单物体分类、分类与定位,到多物体检测,再到更精细的实例分割,任务复杂度逐级递增。
  • 关键数据集:了解通用目标检测数据集(如ILSVRC)和特定领域数据集(如FDDB人脸检测、Caltech行人检测)的特点与挑战。
  • 技术演进脉络:初步了解从R-CNN到Faster R-CNN、YOLO等经典模型的进化路线。

什么是目标检测?

目标检测(Object Detection),有时也称为目标识别,是计算机视觉中的一项核心任务。其目标是对输入图像中的所有预定义类别的物体进行识别与定位。

具体而言,对于图像中的每一个目标物体,我们需要输出两个信息:

  1. 类别标签(Category Label):指明物体属于哪个类别(例如:狗、猫、鸭子)。
  2. 所处位置(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”思想,将检测视为单次回归问题,速度极快。

我们将沿着这条主线,逐一剖析每个模型的核心创新与实现细节。

📝 动手练一练

  1. 概念辨析:假设你有一张公园的照片,里面有长椅、行人、狗、远处的树木和天空中的云。如果你只定义了“行人”和“狗”为目标检测类别,那么“长椅”、“树木”和“云”在模型中会被视为什么?模型需要输出它们的Bounding Box吗?
👉 点击查看参考答案

“长椅”、“树木”和“云”在模型中被视为背景。目标检测模型只对预定义类别(这里是“行人”和“狗”)进行识别和定位。因此,模型不需要也不应该输出这些未定义类别的Bounding Box。模型的职责是找出所有“行人”和“狗”并标出位置,其他内容一律忽略。

  1. 坐标计算:在一个宽度为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 = 80
  • y_min = y - h/2 = 300 - 120 = 180
  • x_max = x + w/2 = 200 + 120 = 320
  • y_max = y + h/2 = 300 + 120 = 420

因此,该Bounding Box的像素坐标为:左上角(80, 180),右下角(320, 420)。

本章小结

本节作为目标检测篇章的绪论,明确了任务的核心是多目标的分类与定位,并通过与分类、定位、分割任务的对比,确立了其在整个视觉任务体系中的位置。我们还认识了支撑该领域发展的关键数据集,并对即将学习的经典模型序列有了宏观的了解。

今天,目标检测已进入以 YOLO 系列、DETR/Transformer 检测器、开放词汇检测(如 Grounding DINO)为代表的新阶段;本节介绍的 R-CNN 系列,是理解两阶段与单阶段检测范式的历史起点。

📋 行动清单

  • 在脑海中清晰复述目标检测的输出是什么(类别+位置框)。
  • 能够区分图像分类、分类与定位、目标检测和实例分割这四个任务。
  • 记住至少一个通用目标检测数据集(ILSVRC)和一个特定领域数据集(如FDDB或Caltech)的名字及特点。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第9章《目标检测技术_上集》配套课件(PDF)
    PDF · 2.9MB · 原课教辅
    下载
  • 第9章《目标检测技术_上集》配套代码包
    RAR · 2116.5MB · 原课教辅
    下载