DPM(Defomatble Parts Model)原理

本文深入探讨了可变形部件模型(DPM)的原理与应用,作为目标检测领域的佼佼者,DPM通过多模型策略解决了视角变化和物体运动带来的挑战,同时介绍了多示例学习(Multiple-instance learning)如何优化分类器训练过程。文章还详细解释了HOG特征的改进、轮廓预测和子模型的引入,以及LSVM在DPM训练中的关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DPM(Deformable Parts Model)

Reference:

Object detection with discriminatively trained partbased models. IEEE Trans. PAMI, 32(9):1627–1645, 2010.

"Support Vector Machines for Multiple-Instance Learning,"Proc. Advances in Neural Information Processing Systems,2003.

作者主页:http://www.cs.berkeley.edu/~rbg/latent/index.html

  1. 大体思路

DPM是一个非常成功的目标检测算法,连续获得VOC(Visual Object Class)07,08,09年的检测冠军。目前已成为众多分类器、分割、人体姿态和行为分类的重要部分。2010年Pedro Felzenszwalb被VOC授予"终身成就奖"DPM可以看做是HOG(Histogrrams of Oriented Gradients)的扩展,大体思路与HOG一致。先计算梯度方向直方图,然后用SVM(Surpport Vector Machine )训练得到物体的梯度模型(Model)。有了这样的模板就可以直接用来分类了,简单理解就是模型和目标匹配。DPM只是在模型上做了很多改进工作。

上图是HOG论文中训练出来的人形模型。它是单模型,对直立的正面和背面人检测效果很好,较以前取得了重大的突破。也是目前为止最好的的特征(最近被CVPR20 13年的一篇论文 《Histograms of Sparse Codes for Object Detection》 超过了)。但是, 如果是侧面呢?所以自然我们会想到用多模型来做。DPM就使用了2个模型,主页上最新版本Versio5的程序使用了12个模型。

                                                                                                                                             

                                                                 

上图就是自行车的模型,左图为侧面看,右图为从正前方看。好吧,我承认已经面目全非了,这只是粗糙版本。训练的时候只是给了一堆自行车的照片,没有标注是属于component 1,还是component 2.直接按照边界的长宽比,分为2半训练。这样肯定会有很多很多分错了的情况,训练出来的自然就失真了。不过没关系,论文里面只是把这两个Model当做初始值。重点就是作者用了多模型。

 

上图右边的两个模型各使用了6个子模型,白色矩形框出来的区域就是一个子模型。基本上见过自行车的人都知道这是自行车。之所以会比左边好辨识,是因为分错component类别的问题基本上解决了,还有就是图像分辨率是左边的两倍,这个就不细说,看论文。

有了多模型就能解决视角的问题了,还有个严重的问题,动物是动的,就算是没有生命的车也有很多款式,单单用一个Model,如果动物动一下,比如美女搔首弄姿,那模型和这个美女的匹配程度就低了很多。也就是说,我们的模型太死板了,不能适应物体的运动,特别是非刚性物体的运动。自然我们又能想到添加子模型,比如给手一个子模型,当手移动时,子模型能够检测到手的位置。把子模型和主模型的匹配程度综合起来,最简单的就是相加,那模型匹配程度不就提高了吗?思路很简单吧!还有个小细节,子模型肯定不能离主模型太远了,试想下假如手到身体的位置有两倍身高那么远,那这还是人吗?也许这是个检测是不是鬼的好主意。所以我们加入子模型与主模型的位置偏移作为Cost,也就是说综合得分要减去偏移Cost.本质上就是使用子模型和主模型的空间先验知识。

好了,终于来了一张合影。最右边就是我们的偏移Cost,圆圈中心自然就是子模型的理性位置,如果检测出来的子模型的位置恰好在此,那Cost就为0,在周边那就要减掉一定的值,偏离的越远减掉的值越大。

最后再理一下继承发展关系,HOG特征源自于SIFT,参见《Distinctive image features from scale-invariant Keypoints》。Part Model 早在1973年就被提出参见《The representation and matching of pictorial structures》(木有看……)。

另外HOG特征可以参考鄙人博客:Opencv HOG行人检测 源码分析SIFT特征本来也想写的但是,那时候懒,而且表述比较啰嗦,就参考一位跟我同一届的北大美女的系列博客吧。【OpenCV】SIFT原理与源码分析

2.检测

检测过程比较简单:

综合得分:

是rootfilter (我前面称之为主模型)的得分,或者说是匹配程度,本质就是的卷积,后面的partfilter也是如此。中间是n个partfilter(前面称之为子模型)的得分。是为了component之间对齐而设的rootoffset. 为rootfilter的left-top位置在root feature map中的坐标,为第个partfilter映射到part feature map中的坐标。是因为part feature map的分辨率是root feature map的两倍,为相对于rootfilter left-top 的偏移。

 的得分如下:

上式是在patfilter理想位置,即anchor position的一定范围内,寻找一个综合匹配和形变最优的位置。为偏移向量,为偏移向量为偏移的Cost权值。比如即为最普遍的欧氏距离。这一步称为距离变换,即下图中的transformed response。这部分的主要程序有train.m、featpyramid.m、dt.cc.

3.训练

3.1多示例学习(Multiple-instance learning)

3.1.1 MI-SVM

一般机器学习算法,每一个训练样本都需要类别标号(对于二分类:1/-1)。实际上那样的数据其实已经经过了抽象,实际的数据要获得这样的标号还是很难,图像就是个典型。还有就是数据标记的工作量太大,我们想偷懒了,所以多只是给了正负样本集。负样本集里面的样本都是负的,但是正样本里面的样本不一定都是正的,但是至少有一个样本是正的。比如检测人的问题,一张天空的照片就可以是一个负样本集;一张某某自拍照就是一个正样本集(你可以在N个区域取N个样本,但是只有部分是有人的正样本)。这样正样本的类别就很不明确,传统的方法就没法训练。

疑问来了,图像的不是有标注吗?有标注就应该有类别标号啊?这是因为图片是人标的,数据量特大,难免会有些标的不够好,这就是所谓的弱监督集(weakly supervised set)。所以如果算法能够自动找出最优的位置,那分类器不就更精确吗? 标注位置不是很准确,这个例子不是很明显,还记得前面讲过的子模型的位置吗?比如自行车的车轮的位置,是完全没有位置标注的,只知道在bounding box区域附件有一个车轮。不知道精确位置,就没法提取样本。这种情况下,车轮会有很多个可能的位置,也就会形成一个正样本集,但里面只有部分是包含轮子的。

针对上述问题《Support Vector Machines for Multiple-Instance Learning》提出了MI-SVM。本质思想是将标准SVM的最大化样本间距扩展为最大化样本集间距。具体来说是选取正样本集中最像正样本的样本用作训练,正样本集内其它的样本就等候发落。同样取负样本中离分界面最近的负样本作为负样本。因为我们的目的是要保证正样本中有正,负样本不能为正。就基本上化为了标准SVM。取最大正样本(离分界面最远),最小负样本(离分界面最近):

对于正样本: 为正样本集中选中的最像大正样本的样本。

对于负样本:可以将max展开,因为最小的负样本满足的话,其余负样本就都能满足,所以任意负样本有:

目标函数:

也就是说选取正样本集中最大的正样本,负样本集中的所有样本。与标准SVM的唯一不同之处在于拉格朗日系数的界限。

而标准SVM的约束是:

最终化为一个迭代优化问题:

思想很简单:第一步是在正样本集中优化;第二步是优化SVM模型。与K-Means这类聚类算法一样都只是简单的两步,却爆发了无穷的力量。

这里可以参考一篇博客Multiple-instance learning

关于SVM的详细理论推导就不得不推荐我最为膜拜的MIT Doctor pluskid: 支持向量机系列

关于SVM的求解:SVM学习——Sequential Minimal Optimization

SVM学习——Coordinate Desent Method

此外,与多示例学习对应的还有多标记学习(multi-lable learning)有兴趣可以了解下。二者联系很大,多示例是输入样本的标记具有歧义(可正可负),而多标记是输出样本有歧义。

3.1.2 Latent SVM

1)Latent-SVM实质上和MI-SVM是一样的。区别在于扩展了Latent变量。首先解释下Latent变量,MI-SVM决定正样本集中哪一个样本作为正样本的就是一个latent变量。不过这个变量是单一的,比较简单,取值只是正样本集中的序号而已。DPM中也是要选择最大的正样本,但是它的latent变量就特别多。比如bounding box的实际位置,在HOG特征金字塔中的level,某样本属于哪一类component。也就是说我们有了一张正样本的图片,标注了bounding box,我们要在某一位置,某一尺度,提取出一个最大正样本作为某一component的正样本。

直接看Latent-SVM的训练过程:

这一部分还牵扯到了Data-minig。先不管,先只看循环中的3-6,12.

3-6就对于MI-SVM的第一步。12就对应了MI-SVM的第二步。作者这里直接用了梯度下降法,求解最优模型β。

2)现在说下Data-minig。作者为什么不直接优化,还搞个Data-minig干嘛呢?因为,负样本数目巨大,Version3中用到的总样本数为2^28,其中Pos样本数目占的比例特别低,负样本太多,直接导致优化过程很慢,因为很多负样本远离分界面对于优化几乎没有帮助。Data-minig的作用就是去掉那些对优化作用很小的Easy-examples保留靠近分界面的Hard-examples。分别对应13和10。这样做的的理论支撑证明如下:

3)再简单说下随机梯度下降法(Stochastic Gradient Decent):

首先梯度表达式:

梯度近似:

优化流程:

这部分的主要程序:pascal_train.m->train.m->detect.m->learn.cc

3.2 训练初始化

LSVM对初始值很敏感,因此初始化也是个重头戏。分为三个阶段。英语方面我就不班门弄斧了,直接上截图。

下面稍稍提下各阶段的工作,主要是论文中没有的Latent 变量分析:

Phase1:是传统的SVM训练过程,与HOG算法一致。作者是随机将正样本按照aspect ration(长宽比)排序,然后很粗糙的均分为两半训练两个component的rootfilte。这两个rootfilter的size也就直接由分到的pos examples决定了。后续取正样本时,直接将正样本缩放成rootfilter的大小。

Phase2:是LSVM训练。Latent variables 有图像中正样本的实际位置包括空间位置(x,y),尺度位置level,以及component的类别c,即属于component1 还是属于 component 2。要训练的参数为两个 rootfilter,offset(b)

Phase3:也是LSVM过程。

先提下子模型的添加。作者固定了每个component有6个partfilter,但实际上还会根据实际情况减少。为了减少参数,partfilter都是对称的。partfilter在rootfilter中的锚点(anchor location)在按最大energy选取partfilter的时候就已经固定下来了。

这阶段的Latent variables是最多的有:rootfilter(x,y,scale),partfilters(x,y,scale)。要训练的参数为 rootfilters, rootoffset, partfilters, defs(的偏移Cost)。

这部分的主要程序:pascal_train.m

  1. 4.细节

4.1轮廓预测(Bounding Box Prediction)

仔细看下自行车的左轮,如果我们只用rootfilter检测出来的区域,即红色区域,那么前轮会被切掉一部分,但是如果能综合partfilter检测出来的bounding box就能得到更加准确的bounding box如右图。

这部分很简单就是用最小二乘(Least Squres)回归,程序中trainbox.m中直接左除搞定。

4.2 HOG

作者对HOG进行了很大的改动。作者没有用4*9=36维向量,而是对每个8x8的cell提取18+9+4=31维特征向量。作者还讨论了依据PCA(Principle Component Analysis)可视化的结果选9+4维特征,能达到HOG 4*9维特征的效果。

这里很多就不细说了。开题一个字都还没写,要赶着开题……主要是features.cc。有了下面这张图,自己慢慢研究下:

源码分析:

DPM(Defomable Parts Model) 源码分析-检测

DPM(Defomable Parts Model) 源码分析-训练



<think>我们正在讨论嵌入式系统的电源管理模型测试,特别是使用动态电源管理(DPM)来测试。根据引用[1]和[2],我们知道DPM是一种通过调整处理器工作状态来节省能量的技术,而动态电压调整(DVS)则通过降低供电电压来减少能耗。此外,引用[2]提到了基于指令的能耗模型,如SimplePower,它可以评估每条指令的能耗。 用户的问题:如何通过DPM测试嵌入式系统中的Power Model方法? 回答步骤: 1. 理解DPM和Power Model的概念。 2. 设计测试方案,包括测试环境搭建、数据采集和分析。 3. 具体实施步骤,包括选择工具、设置测试场景和运行测试。 4. 结果分析,验证Power Model的准确性。 详细回答: ### 1. 理解DPM和Power Model - **动态电源管理(DPM)**:通过调整处理器的工作状态(如休眠、空闲、运行)来节省能量。例如,当系统空闲时,DPM可以将处理器切换到低功耗状态。 - **Power Model(功耗模型)**:用于预测或评估系统在不同状态或执行不同任务时的能耗。引用[2]提到两种模型:基于指令的模型(测量每条指令的能耗)和基于周期的模型(在更细的粒度上模拟功耗)。 ### 2. 测试方案设计 为了测试嵌入式系统中的Power Model,我们需要: - **搭建测试环境**:包括目标嵌入式设备、电源监测设备(如功率计)、数据采集工具和运行DPM策略的软件。 - **定义测试场景**:包括不同的工作负载(如空闲、满负荷)和不同的DPM策略(如不同的休眠时间、电压调整)。 - **数据采集**:记录实际功耗数据(通过功率计)和系统状态(如CPU利用率、频率等)。 ### 3. 实施步骤 具体步骤如下: **步骤1:选择或构建Power Model** 根据引用[2],可以选择已有的功耗模型(如SimplePower)或根据目标处理器构建自定义模型。例如,基于指令的模型需要测量每条指令的能耗,这通常通过实验或处理器手册获得。 **步骤2:实现DPM策略** 在嵌入式系统中实现DPM策略,例如: - 使用动态电压频率调整(DVFS)技术,根据负载调整电压和频率。 - 设置不同的休眠状态和唤醒条件。 **步骤3:运行测试并采集数据** - 在目标设备上运行一系列基准测试程序(如计算密集型、I/O密集型等)。 - 同时使用功率计测量实际功耗,并记录系统状态(通过系统日志或专用监控工具)。 - 运行不同的DPM策略,记录每种策略下的功耗。 **步骤4:对比分析** 将实际测量的功耗数据与Power Model预测的功耗进行对比,计算误差(如均方根误差),以验证模型的准确性。 ### 4. 工具选择 根据引用[2],可以使用以下工具: - **SimplePower**:用于基于指令的能耗模拟,支持架构修改和编译器优化对功耗的影响评估。 - **PowerTimer**和**Wattch**:用于周期级或寄存器传输级(RTL)的功耗模拟。 此外,还可以使用实际测量工具,如数字功率计或嵌入式板载电流传感器。 ### 5. 优化与验证 根据引用[3],算法优化可以提高系统的效率和可靠性。在测试过程中,可能需要对Power Model进行优化,例如: - 使用滤波器(如卡尔曼滤波器)对采集的数据进行平滑处理。 - 调整模型参数,使其更符合实际测量结果。 通过多次迭代测试和优化,最终得到一个准确的Power Model,用于预测不同DPM策略下的能耗。 ### 总结 通过上述步骤,我们可以使用DPM策略测试嵌入式系统中的Power Model。关键点在于实际功耗数据的采集和模型的对比验证。引用[1]和[2]提供了理论基础和工具参考,而引用[3]则强调了算法优化的重要性。 §§相关问题§§ 1. 如何构建一个自定义的基于指令的功耗模型? 2. 动态电压调整(DVS)在DPM中如何具体实现? 3. 有哪些常见的嵌入式系统功耗测量工具? 4. 如何优化Power Model以提高其预测准确性?</think>### 使用DPM测试嵌入式系统电源管理模型的方法 动态电源管理(DPM)是优化嵌入式系统能耗的核心技术[^1]。以下是测试DPM电源模型(Power Model)的步骤: #### 1. **建立功耗模型** - **选择建模粒度**: - **指令级模型**:测量每条指令的能耗(如SimplePower工具[^2]),适用于CPU密集型场景 $$ E_{total} = \sum_{i=1}^{n} (E_{inst_i} \times N_{exec_i}) $$ - **周期级模型**:使用RTL级仿真(如PowerTimer/Wattch[^2]),精确到时钟周期 - **参数校准**: - 通过实际测量基准负载(如Dhrystone)的功耗 - 使用最小二乘法拟合模型参数 #### 2. **构建DPM测试框架** ```c // 伪代码示例:DPM状态机实现 void dpm_policy() { if (workload < threshold_low) { enter_sleep_state(); // 进入低功耗状态 } else if (workload > threshold_high) { scale_voltage_frequency(); // 动态电压/频率调整 } } ``` - **关键组件**: - **功耗监测单元**:实时采集电流/电压(精度需达±1%) - **事件触发器**:模拟负载突变(如中断风暴) - **状态记录器**:跟踪DPM状态迁移(运行→休眠→唤醒) #### 3. **测试场景设计** | 测试场景 | 负载特征 | DPM策略验证目标 | |-------------------|-------------------|----------------------| | 持续空闲 | CPU利用率 < 5% | 休眠状态保持能力 | | 突发负载 | 0% → 100%瞬时切换 | 状态切换延迟/能耗 | | 周期性任务 | 50%占空比方波 | 阈值策略稳定性 | | 混合负载 | CPU+I/O+网络并发 | 协同管理策略有效性 | #### 4. **能效评估指标** - **状态切换能耗**:测量 $E_{transition} = E_{active} - (E_{sleep} \times T)$ - **策略收益比**: $$ R = \frac{E_{without\_DPM} - E_{with\_DPM}}{E_{without\_DPM}} \times 100\% $$ - **QoS影响**:记录最大延迟/任务完成时间 #### 5. **优化验证(引用[3]算法优化)** - **数据滤波**:使用卡尔曼滤波器消除传感器噪声 - **参数自适应**:基于负载历史动态调整阈值 ```python # 伪代码:动态阈值调整 def update_threshold(history): avg_load = np.mean(history[-10:]) new_threshold = 0.7 * avg_load + 0.3 * current_load return new_threshold ``` #### 6. **工具链集成** - **仿真层**:QEMU+Gem5模拟器(注入功耗事件) - **物理层**:Joule-meter或Monsoon功率监测仪 - **分析层**:使用Python脚本实现: ```python import pandas as pd def analyze_power_log(log): df = pd.read_csv(log) idle_energy = df[df.state=='SLEEP'].energy.sum() return idle_energy / df.energy.sum() # 计算节能占比 ``` **测试关键点**: 1. 验证模型在状态切换边界的准确性(如唤醒瞬间的电流尖峰) 2. 持续运行压力测试(>72小时)检测策略稳定性 3. 对比不同输入模式(音频/视频/控制信号)下的模型泛化能力 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值