关于DPM(Deformable Part Model)算法中模型可视化的解释

DPM源码(voc-release)中的模型可视化做的还算相当炫酷的,可以让我们直观的看到训练好的模型,甚至我们不用去做模型的评价,直接根据肉眼的观察,就能大致了解一个目标训练的好不好,比如我训练一个人体模型,那他的可视化图当然就是越接近人体越好。

下面是对DPM源码中有关模型可视化部分代码的分析,通过分析这些代码,有助于更好的理解DPM模型。

注意:我的源码版本是voc-release3.1,第4版往后的模型变得更复杂,这里不讨论。

有关模型可视化的代码主要在visualizemodel.m,foldHOG.m和HOGpicture.m中。

(1)简化分类器参数向量(或者叫滤波器权重向量)

DPM中使用降维后的31维HOG特征向量,所以,与之对应的,训练好的模型的参数向量也是31维的,为了方便可视化,需要将31维的参数向量简化为9维,foldHOG函数就负责参数向量的简化。

31维的HOG特征向量是有分段含义的,如下:

设C是聚合有9个对比度不敏感方向的像素级特征映射而获得的基于cell的特征映射,D是聚合有18个对比度敏感方向的像素级特征而获得的基于cell的特征映射。用4种不同的归一化方法对C(i,j)和D(i,j)进行归一化和截断(限幅),可以获得一个4*(9+18)=108维的特征向量F(i,j)。实际中我们使用此108维向量的一个解析投影,此投影由下面几个统计量定义:27个在不同归一化因子上的累加和(即列的和),F中的每个方向通道对应一个;以及4个在不同方向(9维对比度不敏感方向)上的累加和(即行的和),每个归一化因子对应一个。cell尺寸k=8,截断(限幅)阈值α=0.2。最终的特征映射是31维向量G(i,j),其中27维对应不同的方向通道(9个对比度不敏感方向和18个对比度敏感方向),剩下4维表示(i,j)周围4个cell组成的block的梯度能量

所以,foldHOG中的简化过程就是将31维参数向量的后4维丢弃,将前27维进行负值抑制折叠累加,缩减为9维的参数向量,源码及注释如下:

function f = foldHOG(w)
% 简化滤波器向量w,用以可视化显示模型
% 将 width*height*31 的滤波器参数向量w浓缩为 width*height*9 的向量(width和height是滤波器的宽度和高度)
% 返回值f是一个width*height*9的矩阵
%
% f = foldHOG(w)
% Condense HOG features into one orientation histogram.
% Used for displaying a feature.

% max(w(:,:,1:9),0)返回w(:,:,1:9)中元素和0两者中的较大值(去除负权重),返回结果组成一个width*height*9维的矩阵
% 所以下面的处理相当于把滤波器参数向量w沿第三维维折叠了两次,形成一个了一个width*height*9的简化版的参数向量
% w的第三维的长度为31,只使用了前27个值,舍弃了后面4个值,这和DPM中使用的31维HOG特征向量所代表的意义有关。
% DPM中的特征向量为31维,其中前27维对应不同的方向通道(9个对比度不敏感方向和18个对比度敏感方向),
% 剩下4维表示(i,j)周围4个cell组成的block的梯度能量。
f = max(w(:,:,1:9),0) + max(w(:,:,10:18),0) + max(w(:,:,19:27),0);

(2)生成滤波器权重向量的可视化图

这一工作在HOGpicture函数中完成,此函数负责为简化后的w*h*9维的权重向量生成可视化图。

首先要生成一个间隔为20度的方向坐标基,然后将滤波器向量中的点(i,j,k)向坐标基中的方向k上投影,而用该点的值衡量(i,j)在k方向的幅度。

源码及注释如下:

function im = HOGpicture(w, bs)
% 画出HOG正权重w的条纹图像
% 参数:
% w:简化后的width*height*9的HOG正权重向量(width和height是滤波器的宽度和高度)
% bs:生成的图像im相比于滤波器尺寸的扩大倍数
% 返回值:
% im:滤波器权重向量的可视化图,是大小为(width*bs)*(height*bs)的图像
%
% HOGpicture(w, bs)
% Make picture of positive HOG weights.

% 为间隔20度的9个方向生成条纹线
% 其实bim相当于有9个方向的方向空间的一个坐标基,将滤波器向量中某点的值w(i,j,:)向bim的各个方向投影可以反映每个点的方向分布
% construct a "glyph" for each orientaion
bim1 = zeros(bs, bs); % 生成一个bs*bs的全零矩阵bim1
bim1(:,round(bs/2):round(bs/2)+1) = 1; % 将bim1的中间两个竖条的值置为1
bim = zeros([size(bim1) 9]); % 生成一个bs*bs*9的全零矩阵bim,可以将bim看做9层bim1叠加在一起
bim(:,:,1) = bim1; % 将bim的第1层bim(:,:,1)赋值为bim1
% 接下来通过20度递进的顺时针旋转依次生成bim的第2到9层,并将旋转后的矩阵裁剪为和bim1相同大小
% 例如,i=2时,顺时针旋转bim1,并裁剪为和bim1相同的大小,赋值给bim的第2层
for i = 2:9,
  bim(:,:,i) = imrotate(bim1, -(i-1)*20, ‘crop‘); % 依次顺时针旋转20度,将结果赋值给bim的第2到9层
end

% 通过添加带有方向权重的条纹来绘制正权重的可视化图
% make pictures of positive weights bs adding up weighted glyphs
s = size(w); % height * width * 9
w(w < 0) = 0; % 保证w中全部是正权重
im = zeros(bs*s(1), bs*s(2)); % 生成一个(width*bs)*(height*bs)的图像,即将滤波器w的尺寸扩大bs倍

% 遍历滤波器权重向量w,将每个坐标的值投影到9个方向上,然后扩大bs倍画到图像im上
for i = 1:s(1), % 第i行(w原尺寸)
  iis = (i-1)*bs+1:i*bs; % 对应在图像im上的横坐标
  for j = 1:s(2), % 第j列(w原尺寸)
    jjs = (j-1)*bs+1:j*bs; % 对应在图像im上的纵坐标
    for k = 1:9, % 遍历9个方向
        % bim(:,:,k) * w(i,j,k):如果滤波器向量在方向k上有正值的话,将这个值w(i,j,k)投影到大小为bs*bs的方向坐标基bim的方向k上,
        % 然后将9个方向上的投影累加,累加值反映了滤波器中(i,j)位置在各个方向上的幅度大小,最后将累加值放到扩大bs倍的显示图像im的对应位置上
        im(iis,jjs) = im(iis,jjs) + bim(:,:,k) * w(i,j,k);
    end
    %imagesc(im); % 自己添加的语句,分析代码用,显示画图过程
  end
  %imagesc(im); % 自己添加的语句,调试用,显示画图过程
end

下面图1-6是HOGpicture中一个根滤波器可视化图的绘制过程:

图1,根滤波器权重向量点(1,1)的可视化                                                    图2,加上点(1,2)的可视化

图3,完成第1行的可视化                                                                图4,完成前2行的可视化

图5,完成前10行的可视化,可以看出人形了                                          图6,完成整个根滤波器的可视化

(3)在visualizemodel函数中进行一些后处理,分割绘图区域,依次调用HOGpicture画出根滤波器和各个部件滤波器的可视化图,以及各个部件的变形花费图

在visualizemodel中调用HOGpicture画出根滤波器的可视化图,返回值为图6,然后将像素值扩充到[0,255]并转换为8位无符号整型,得到图7

图7,根滤波器可视化图_Uint8

然后分割绘图区域,将根滤波器的可视化图画到指定区域,如图8;再转换为灰度图,如图9

图8,根滤波器_subplot                                                                            图9,根滤波器_subplot_gray

再之后依次绘制各个部件的可视化图,如图10是人体头部的可视化图,覆盖到根滤波器的对应位置。

图10,头部部件可视化

图11,左图是根滤波器,右图是各个部件的可视化图覆盖到根的对应位置后的可视化图

从图11中可以看出,部件滤波器明显要比根滤波器细致,能提供更多细节。

最后就是生成各个部件的变形花费图了,这要用到各个部件的变形信息,在模型的defs[]数组中。defs数组中,每个部件对应一个锚点坐标和一个变形花费参数(4维向量)。计算部件内每个位置距离部件中心的距离,用变形特征向量v = [Δx^2, Δx, Δy^2, Δy]‘ 和 部件的变形花费 相乘,得到的结果可以反映此位置的变形花费。值越大,说明变形费用越高,表明不是部件的理想位置;值越小,说明变形费用越低,表明是该部件的理想位置。反映到变形花费图上,越亮(白)的地方花费越大,越暗(黑)的地方花费越小。

如下图12是头部的变形花费图:

图12,头部的变形花费图

最后,就获得了完整的模型可视化图

图13,左图:根滤波器的可视化图;中图:各个部件的可视化图覆盖到根的对应位置后的可视化图;右图:各个部件的变形花费图

相关链接:

Deformable Part Model 相关网页http://www.cs.berkeley.edu/~rbg/latent/index.html

Pedro Felzenszwalb的个人主页http://cs.brown.edu/~pff/

PASCAL VOC 目标检测挑战http://pascallin.ecs.soton.ac.uk/challenges/VOC/

A Discriminatively Trained, Multiscale,
Deformable Part Model [CVPR 2008] 中文翻译

Object Detection with Discriminatively
Trained Part Based Models [PAMI 2010]中文翻译

有关可变形部件模型(Deformable Part Model)的一些说明

在Windows下运行Felzenszwalb的Deformable
Part Models(voc-release4.01)目标检测matlab源码

在Windows下运行Felzenszwalb的star-cascade
DPM(Deformable Part Models)目标检测Matlab源码

在windows下运行Felzenszwalb的Deformable
Part Model(DPM)源码voc-release3.1来训练自己的模型

用DPM(Deformable Part Model,voc-release3.1)算法在INRIA数据集上训练自己的人体检测模型

关于DPM(Deformable Part Model)算法中模型可视化的解释,布布扣,bubuko.com

时间: 2024-10-03 22:40:00

关于DPM(Deformable Part Model)算法中模型可视化的解释的相关文章

关于DPM(Deformable Part Model)算法中模型结构的解释

关于可变部件模型的描写叙述在作者[2010 PAMI]Object Detection with Discriminatively Trained Part Based Models的论文中已经有说明: 含有n个部件的目标模型能够形式上定义为一个(n+2)元组:(F0,P1,..., Pn, b),F0是根滤波器,Pi是第i个部件的模型,b是表示偏差的实数值.每一个部件模型用一个三元组定义:(Fi,vi, di),Fi是第i个部件的滤波器:vi是一个二维向量,指定第i个滤波器的锚点位置(anch

用DPM(Deformable Part Model,voc-release3.1)算法在INRIA数据集上训练自己的人体检测模型

我的环境 DPM源码版本:voc-release3.1 VOC开发包版本:VOC2007_devkit_08-Jun Matlab版本:MatlabR2012b c++编译器:VS2010 系统:Win7 32位 learn.exe迭代次数:5万次 数据集:INRIA 人体数据集,等 步骤一,首先要使voc-release3.1目标检测部分的代码在windows系统下跑起来: 在Windows下运行Felzenszwalb的Deformable Part Models(voc-release4.

用DPM(Deformable Part Model,voc-release4.01)算法在INRIA数据集上训练自己的人体检测模型

步骤一,首先要使voc-release4.01目标检测部分的代码在windows系统下跑起来: 参考在window下运行DPM(deformable part models) -(检测demo部分) 步骤二,把训练部分代码跑通,在VOC数据集上进行测试,如下文: 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型 但是其中的learn.cpp代码有误,其中319行check(argc == 8)通不

DPM(Deformable Parts Model)--原理(一)(转载)

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 Proces

DPM(Deformable Parts Model)

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 Proces

DPM(Deformable Parts Model)--原理(一)

http://blog.csdn.net/ttransposition/article/details/12966521 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-Instan

Struts2之Domain Model(域模型)。

为了避免  在action中有 太多的 类,而需要写大量的get().set().所以,Struts2 使用 了 domain model. eg: private User user;    public String add(){        System.out.println("name:"+user.getUname());        System.out.println("pwd:"+user.getPwd());        System.ou

Model Builder中Table2Table中字段映射的问题

ArcGIS10中使用过程中,Bug不少.尽管有了SP3,但模型耦合的深层次的应用中还是错误不少.目前只是遇到一个,利用躲避的方法解决一个.例如,从NetCDF中抽出的数据表,必须在内存和数据库中都存在的条件下,Python程序才能运行成功,花了许多时间才得出这样的躲避方法.如下图的抽取计算数据为例,抽出NetCDF的数据表为内存视图,将该内存视图转存为Geodatabase的存储数据表,在没有表映射的条件下总是无法输出字段. 这里实际上可能是ArcGIS10的Bug.如果在制作过程中有具体数据

调查管理系统 -(6)自定义Struts2的拦截器&amp;自定义UserAware接口&amp;Action中模型赋值问题&amp;Hibernate懒加载问题

1.对于一些功能,如我的调查或新建调查等,只有用户登录后才能进行操作,因此必须对用户是否登录进行判断.当用户登录后才能使用相应的功能,如果没有登录则需为用户导航到登录页面让其进行登录.这个功能可以通过自定义Struts2的拦截器来完成. 2.当用户登录之后,由于是将用户的信息保存在session中的.这样当一些Action中需要用到当前登录的用户的信息时需要手动的从session中获取,不太方便,因此我们声明了一个UserAware接口(即用户关注,类似于Struts2中的SessionAwar