查看全课大纲(第 25 / 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
行人检测DPM
小象实战讲义 · 基于深度学习的计算机视觉
在掌握了HOG+SVM这一经典的行人检测方法后,我们自然会思考:如何进一步提升检测的精度,特别是应对人体姿态变化、遮挡等复杂情况?本节将介绍目标检测领域在深度学习崛起前的“最后一座高峰”——可变形部件模型(DPM)。它通过“整体观轮廓、局部看部件、部件间有弹性”的巧妙设计,在PASCAL VOC竞赛中连续三年夺冠,其思想至今仍对理解目标的结构化表示有重要启发。
💡 核心导读
- DPM是什么:一种基于组件的、可变形的人体/物体检测模型,是传统机器学习方法在目标检测上的集大成者。
- 核心思想:“整体像” + “每个部件像” + “部件间位置合理” = 检测目标。
- 关键技术:改进的HOG特征、图像金字塔、多示例支持向量机(MI-SVM)以及隐变量支持向量机(Latent SVM)。
- 检测流程:通过根滤波器(Root Filter)和部件滤波器(Part Filter)在图像金字塔上进行卷积响应计算与融合。
DPM:传统目标检测的巅峰
可变形部件模型(Deformable Part Model, DPM)由Felzenszwalb等人提出,它并非一个全新的特征,而是一个集成了特征提取、组件建模、形变处理和学习策略的完整检测框架。在2007至2009年,它连续三年获得PASCAL VOC目标检测比赛的冠军,其作者因此在2010年被授予该赛事的“终身成就奖”。可以说,DPM是深度学习统治计算机视觉之前,传统方法所能达到的最后一个高峰。
它的基本思想非常直观,以检测人为例:
- 整体像个人(Root):从远处看,目标的整体轮廓和形状符合人的特征。
- 部件像对应部分(Part):凑近看,头部、胳膊、腿部等各个组成部分也分别符合对应人体部件的特征。
- 部件间位置合理(Deformation):这些头、胳膊、腿之间的相对位置关系是合乎常理的(例如头不会长在脚的位置)。
DPM将这一思想建模为一个包含根模型(Root Model) 和若干部件模型(Part Model) 的结构,并允许部件相对于其“理想位置”有一定的弹性形变,但形变需要付出代价。
DPM模型构成与特征改进
模型组件:根滤波器与部件滤波器
DPM模型主要包含两种滤波器:
- 根滤波器(Root Filter):对应目标的整体外观模板。尺寸通常较小(课件示例为 8×8 个 HOG 细胞,注意不是像素),用于在较低分辨率上捕捉目标的全局轮廓。
- 部件滤波器(Part Filter):对应目标的局部部件模板。它作用在 2 倍分辨率的特征图上,因此同样大小的细胞所覆盖的原图区域只有根滤波器的一半,能捕捉更精细的梯度细节;滤波器本身的细胞数反而更小(课件示例为 4×4 个细胞)。
import numpy as np
import cv2
# 模拟一个简单的8x8根滤波器(HOG特征向量形式,这里用随机权重示意)
np.random.seed(42)
root_filter = np.random.randn(8, 8, 31) # DPM改进的HOG为31维
print("根滤波器权重形状(高,宽,特征维):", root_filter.shape)
# 模拟一个4x4的部件滤波器(分辨率更高,维度相同)
part_filter = np.random.randn(4, 4, 31)
print("部件滤波器权重形状:", part_filter.shape)根滤波器权重形状(高,宽,特征维): (8, 8, 31)
部件滤波器权重形状: (4, 4, 31)改进的HOG特征
DPM对标准的HOG特征进行了关键改进,旨在降低维度、提升计算效率,同时保持甚至提升判别能力。
- 细胞单元(Cell):与HOG相同,将图像划分为小的细胞单元(如8×8像素)。
- 梯度方向划分:作者研究发现,对于不同任务,梯度方向的表示方式有优劣。
- 有符号梯度:0-360度,划分为18个方向区间(bins)。
- 无符号梯度:0-180度(不考虑梯度方向正负),划分为9个方向区间。对称方向的梯度被合并到同一个区间。
- 区域归一化简化:DPM简化了标准HOG的块级特征拼接——不再按重叠块串联输出高维特征,而是让每个细胞单元在所属的4个相互重叠的2×2邻域下分别归一化,再通过求和降维。具体做法是:让每个细胞单元分别与相邻细胞组成 4 个不同的 2×2 区域(该细胞依次位于左上、右上、左下、右下),得到 4 份归一化后的梯度直方图。这样,每个细胞单元会得到4个直方图向量(每个向量包含有符号18维+无符号9维=27维)。
- 快速降维(近似PCA):4个27维向量直接拼接得到108维特征,维度仍然较高。作者提出了一种巧妙的降维方法:
- 首先,只使用无符号梯度(9维):每个细胞在 4 个重叠的 2×2 邻域下各得到一份归一化结果(共 4 份),于是得到 4×9=36 维矩阵(视为 4 行 9 列)。
- 然后,分别对这个矩阵的行求和(得到4维)和列求和(得到9维),拼接得到13维特征。
- 最后,再加入有符号梯度的18维特征(对这 4 种归一化下的对应 bin 求和),最终形成 13 + 18 = 31维 的特征向量。 这种方法通过简单的加法运算,近似达到了PCA降维的效果,且速度极快。
DPM的训练:多示例与隐变量SVM
DPM的训练过程复杂且精巧,其核心是解决样本标注噪声和模型组件隐变量问题。
多示例支持向量机(MI-SVM)
在目标检测中,我们通常有标注了边界框的正样本图像。但框内的区域并不全是纯粹的正样本(可能包含部分背景),而负样本(背景)则数量巨大且容易获取。MI-SVM针对此问题提出:
- 正样本包:一个边界框内的所有图像块构成一个“包”。这个包中至少包含一个真正的正样本,但其他可能是背景(负样本)。
- 负样本包:从背景区域提取的图像块构成的包,其中不能包含任何正样本。
- 训练策略:在每次训练迭代中,从正样本包中选出最像正样本的那个样本作为代表参与训练;从负样本包中选出最难区分(最像正样本)的样本,即难例(Hard Negative) 参与训练。这迫使分类器关注那些具有挑战性的边界样本。
隐变量支持向量机(Latent SVM)
DPM将MI-SVM的思想进一步扩展为Latent SVM,引入了更多的隐变量(Latent Variables)。对于一个正样本图像,以下信息在训练初期是未知的(隐变量):
- 目标具体位于特征金字塔的哪一层(尺度)。
- 目标属于哪个组件类别(Component,例如人的不同姿态类别)。
- 每个部件滤波器相对于根滤波器的精确位置。
DPM的训练因此是一个三阶段的迭代过程:
- 初始化根滤波器:根据正样本长宽比聚类,训练m个初始的根滤波器(使用传统SVM)。
- 合并组件:使用Latent SVM,将m个根滤波器模型集成,此时隐变量包括目标位置和所在金字塔层。
- 添加部件滤波器:固定根滤波器,为每个组件(Component)训练6个部件滤波器及其形变参数。此阶段隐变量最多,包括所有部件的位置、所属层等。
训练过程通过坐标下降法交替进行:固定模型参数,为每个样本选择最优的隐变量(例如部件的最佳位置);固定隐变量,更新模型参数(SVM的权重)。
DPM的检测流程
训练完成后,DPM的检测过程可以看作一个在图像金字塔上进行的“模板匹配”过程。
# 模拟DPM单点检测分数计算(高度简化版)
import numpy as np
np.random.seed(42)
def dpm_detection_score_at_point(root_response, part_response, deformation_cost, b):
"""
计算在某个位置和尺度的检测分数。
公式简化版: score = root_response + sum(part_response - deformation_cost) + b
"""
total_part_score = np.sum([p - d for p, d in zip(part_response, deformation_cost)])
final_score = root_response + total_part_score + b
return final_score
# 1. 假设我们有一张输入图像的特征金字塔某一层的特征图 (16x16x31)
feature_map = np.random.randn(16, 16, 31)
# 2. 与根滤波器卷积,得到根响应图 (假设无填充,步长1,输出 9x9)
# 这里简化计算,随机生成一个9x9的响应图模拟
root_response_map = np.random.randn(9, 9)
# 取其中一点(1,1)的响应值
root_response_val = root_response_map[1, 1]
# 3. 处理部件滤波器:需要对原图上采样(2倍)后提取特征,再与部件滤波器卷积。
# 然后下采样回原图尺度,得到部件响应图。此处简化,随机生成一个部件响应值。
part_response_val = np.random.randn() # 模拟一个部件的响应
# 4. 计算该部件相对于理想位置的形变代价(偏移(dx,dy)的二次函数)
dx, dy = 0.5, -0.5 # 假设偏移量
deformation_cost = 0.5 * (dx**2 + dy**2) # 简化形变代价模型
# 5. 偏移系数b (模型偏置)
b = 1.0
# 6. 计算最终检测分数(假设只有一个部件)
score = dpm_detection_score_at_point(root_response_val, [part_response_val], [deformation_cost], b)
print(f"根响应: {root_response_val:.4f}")
print(f"部件响应: {part_response_val:.4f}")
print(f"形变代价: {deformation_cost:.4f}")
print(f"最终检测分数: {score:.4f}")根响应: 1.1210
部件响应: -0.7402
形变代价: 0.2500
最终检测分数: 1.1307完整检测流程概述:
- 构建图像金字塔:输入图像按尺度逐层缩放,每经过 λ 层分辨率降为原来的一半,即尺度步长为 (论文中训练取 λ=5,检测取 λ=10)。
- 提取特征金字塔:对金字塔的每一层图像,提取改进的31维HOG特征,形成特征金字塔。
- 根滤波器卷积:用训练好的根滤波器与特征金字塔的每一层进行卷积,得到根响应图。
- 部件滤波器卷积:
- 对图像金字塔的每一层图像进行 2 倍上采样,再重新提取 DPM 特征图(等价于得到 2 倍分辨率的特征图)。
- 用训练好的部件滤波器与上采样后的特征图卷积,得到高分辨率的部件响应图。
- 将部件响应图下采样回根响应图的尺度。
- 分数融合:对于每个候选位置
(x0, y0, l0)(坐标和金字塔层),其最终分数S由以下公式给出:S = R0(x0,y0) + Σ [ Di(2*(x0,y0)+vi) - di * Φ(Δxi, Δyi) ] + bR0: 根滤波器在(x0,y0)处的响应。Di: 第i个部件滤波器在其位置(由根位置和预设偏移vi决定)的响应。Φ(Δxi, Δyi): 部件实际位置相对于其“理想位置”的形变代价函数(通常是偏移量的二次型)。b: 模型偏置项。
- 非极大值抑制(NMS):对所有位置和尺度的检测分数应用NMS,得到最终的检测框。
流程示意图:
输入图像
│
▼
图像金字塔 ────┐
│ │
▼ ▼
特征金字塔 上采样特征
│ │
▼ ▼
根滤波器卷积 部件滤波器卷积
│ │
▼ ▼
根响应图 部件响应图(下采样后)
│ │
└─────┬────┘
▼
分数融合(加权求和)
▼
最终响应图
▼
NMS -> 检测框DPM的意义与局限
DPM是传统目标检测方法的智慧结晶,它成功地将组件化表示、形变建模和多层次特征结合在一起。其“整体-局部”的分析思想对后续的深度学习方法(如基于部件的CNN、注意力机制)仍有影响。
然而,DPM也有其明显的局限性:
- 特征表达能力有限:尽管改进了HOG,但其手工特征仍无法与深度学习从数据中自动学习到的深层特征相比。
- 训练和检测复杂:多阶段训练、隐变量推断、图像金字塔处理等导致流程繁琐,速度较慢。
- 对剧烈形变和遮挡处理能力仍不足:其形变模型相对简单,难以应对极端姿态变化或严重遮挡。
随着2012年AlexNet的横空出世以及R-CNN系列等深度学习检测方法的出现,DPM迅速被性能更强、端到端训练的深度网络所取代。但理解DPM,对于深入把握目标检测问题的本质和演进脉络,仍然具有重要的价值。
📝 动手练一练
- 概念辨析:DPM中“多示例学习”(MI-SVM)要解决的核心问题是什么?它与传统SVM在训练样本的利用上有何根本不同?
👉 点击查看参考答案
核心问题:解决目标检测中正样本标注不“纯净”的问题。一个标注框(正样本包)内既包含目标,也包含一些背景,我们无法确定具体哪个子区域是“最正”的样本。同时,负样本(背景)数量极多,需要高效利用。
根本不同:
- 传统SVM:每个训练样本都有明确的“正”或“负”标签,直接用于最大化间隔。
- MI-SVM(多示例SVM):
- 正样本:以“包”为单位。训练时,从正样本包中动态选择最像正样本的那个实例(隐变量)参与计算。
- 负样本:从负样本包中主动挖掘最难区分的样本(难负例,Hard Negative)参与训练,而不是使用所有简单的负样本。
这使模型能够聚焦于模糊的边界和具有挑战性的样本,从而学习到更鲁棒的分类界面。
- 流程理解:在DPM检测流程中,为什么部件滤波器(Part Filter)需要先对特征图进行上采样,计算响应后再下采样?
👉 点击查看参考答案
这是为了实现部件滤波器具有比根滤波器更高的空间分辨率这一设计目标。
- 设计意图:部件用于检测目标的局部细节(如人的头部、车轮),需要更精细的特征。因此,部件滤波器的训练是在比根滤波器分辨率高一倍的图像块上进行的。
- 检测时的对齐:在检测时,根滤波器直接在原始特征金字塔的某一层上进行卷积。为了能让在高分辨率上训练的部件滤波器与根滤波器在同一空间尺度上进行响应融合,就需要:
- 上采样:先把当前层对应的图像放大 2 倍并重新提取特征图,使其与部件滤波器训练时的分辨率匹配。
- 部件卷积:在高分辨率特征图上进行卷积,得到部件响应图。
- 下采样:将高分辨率的部件响应图下采样回原始层的尺度,这样才能与根响应图在相同坐标下进行分数相加(加权求和)。 这个过程确保了局部细节信息能够被有效捕获并整合到最终的检测决策中。
本章小结
本节我们深入剖析了传统目标检测的巅峰之作——可变形部件模型(DPM)。它通过根模型与部件模型的协同、改进的HOG特征、以及结合多示例学习和隐变量推断的SVM训练策略,构建了一个强大而复杂的检测系统。DPM体现了在深度学习之前,研究者们如何通过精巧的建模和优化来逼近视觉识别问题的本质。
📋 行动清单
- 理解DPM的核心思想:能够清晰阐述“整体-部件-形变”三层验证逻辑是如何对应到根滤波器、部件滤波器和形变代价上的。
- 复现关键计算:尝试手动计算一个小示例中,给定根响应、部件响应和形变偏移后,某一点的最终检测分数。
- 对比与思考:将DPM与上节课的HOG+SVM进行对比,思考DPM引入了哪些新组件和新思想来解决HOG+SVM的哪些不足。
—— 小象教研组