如何在window下运行Discriminatively Trained Deformable Part Models代码

原创 2012年03月26日 21:10:54

Discriminatively Trained Deformable Part Models的官网:http://www.cs.brown.edu/~pff/latent/

目前做目标检测最好的一个算法。

搞不懂为什么外国人老喜欢在linux下编代码,也许是因为版权的问题吧。

装了虚拟机在ubuntu下跑通了程序,但........你懂得(虚拟机能让你机子卡死)。

于是着手移植到windows下。

参考了pozen同学的博客:http://blog.csdn.net/pozen/article/details/7023742

启发很大,下面说说自己的调试过程:

1、把用到的文件dt.cc resize.cc fconv.cc features.cc的后缀都修改为cpp

2、dt.cpp中加:#define int32_t int

3、features.cpp、resize.cpp、fconv.cpp中加入

#define bzero(a, b) memset(a, 0, b) 
int round(float a) { float tmp = a - (int)a; if( tmp >= 0.5 ) return (int)a + 1; else return (int)a; }

4、resize.cpp中的alphainfo ofs[len] 换成:alphainfo *ofs = new alphainfo[len] 当然要记得释放这个内存,但要注意放得位置。

之后就可以在matlab中运行compile进行编译了,这时会出现一些重定义的错误,应该是vc6.0对c++的一些不兼容,修改下就可以了。

5、输入demo()。查看结果。

调试过程中如何调试c程序参见前一篇文章。

说下自己的编译环境:vs2008&matlab2008b

贴出resize.cpp源代码(调试中因为内存错误折腾了很久)

#include <math.h>
#include <assert.h>
#include <string.h>
#include "mex.h"

#define bzero(a, b) memset(a, 0, b) 
int round(float a) { float tmp = a - (int)a; if( tmp >= 0.5 ) return (int)a + 1; else return (int)a; }

// struct used for caching interpolation values
struct alphainfo {
  int si, di;
  double alpha;
};

// copy src into dst using interpolation values
void alphacopy(double *src, double *dst, struct alphainfo *ofs, int n) {
  struct alphainfo *end = ofs + n;
  while (ofs != end) {
    dst[ofs->di] += ofs->alpha * src[ofs->si];
    ofs++;
  }
}

// resize along each column
// result is transposed, so we can apply it twice for a complete resize
void resize1dtran(double *src, int sheight, double *dst, int dheight, 
		  int width, int chan) {
  double scale = (double)dheight/(double)sheight;
  double invscale = (double)sheight/(double)dheight;
  
  // we cache the interpolation values since they can be 
  // shared among different columns
  int len = (int)ceil(dheight*invscale) + 2*dheight;
  //alphainfo ofs[len];
  alphainfo *ofs = new alphainfo[len];
  int k = 0;
  for (int dy = 0; dy < dheight; dy++) {
    double fsy1 = dy * invscale;
    double fsy2 = fsy1 + invscale;
    int sy1 = (int)ceil(fsy1);
    int sy2 = (int)floor(fsy2);       

    if (sy1 - fsy1 > 1e-3) {
      assert(k < len);
      assert(sy1-1 >= 0);
      ofs[k].di = dy*width;
      ofs[k].si = sy1-1;
      ofs[k++].alpha = (sy1 - fsy1) * scale;
    }

    for (int sy = sy1; sy < sy2; sy++) {
      assert(k < len);
      assert(sy < sheight);
      ofs[k].di = dy*width;
      ofs[k].si = sy;
      ofs[k++].alpha = scale;
    }

    if (fsy2 - sy2 > 1e-3) {
      assert(k < len);
      assert(sy2 < sheight);
      ofs[k].di = dy*width;
      ofs[k].si = sy2;
      ofs[k++].alpha = (fsy2 - sy2) * scale;
    }
  }

 // delete [] ofs;
  // resize each column of each color channel
  bzero(dst, chan*width*dheight*sizeof(double));
  for (int c = 0; c < chan; c++) {
    for (int x = 0; x < width; x++) {
      double *s = src + c*width*sheight + x*sheight;
      double *d = dst + c*width*dheight + x;
      alphacopy(s, d, ofs, k);
    }
  }
   delete [] ofs;
}

// main function
// takes a double color image and a scaling factor
// returns resized image
mxArray *resize(const mxArray *mxsrc, const mxArray *mxscale) {
  double *src = (double *)mxGetPr(mxsrc);
  const int *sdims = (int*)mxGetDimensions(mxsrc);
  if (mxGetNumberOfDimensions(mxsrc) != 3 || 
      mxGetClassID(mxsrc) != mxDOUBLE_CLASS)
    mexErrMsgTxt("Invalid input");  

  double scale = mxGetScalar(mxscale);
  if (scale > 1)
    mexErrMsgTxt("Invalid scaling factor");   

  int ddims[3];
  ddims[0] = (int)round(sdims[0]*scale);
  ddims[1] = (int)round(sdims[1]*scale);
  ddims[2] = sdims[2];
  mxArray *mxdst = mxCreateNumericArray(3, (mwSize*)ddims, mxDOUBLE_CLASS, mxREAL);
  double *dst = (double *)mxGetPr(mxdst);

  double *tmp = (double *)mxCalloc(ddims[0]*sdims[1]*sdims[2], sizeof(double));
  resize1dtran(src, sdims[0], tmp, ddims[0], sdims[1], sdims[2]);
  resize1dtran(tmp, sdims[1], dst, ddims[1], ddims[0], sdims[2]);
  mxFree(tmp);

  return mxdst;
}

// matlab entry point
// dst = resize(src, scale)
// image should be color with double values
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
  if (nrhs != 2)
    mexErrMsgTxt("Wrong number of inputs"); 
  if (nlhs != 1)
    mexErrMsgTxt("Wrong number of outputs");
  plhs[0] = resize(prhs[0], prhs[1]);
}

使用判别训练的部件模型进行目标检测 Object Detection with Discriminatively Trained Part Based Models

本文介绍了一个基于混合多尺度可变形部件模型(mixtures of multiscale deformable part model)的目标检测系统。此系统可以表示各种多变的目标并且在PASCAL目标...
  • masikkk
  • masikkk
  • 2014年01月21日 15:58
  • 26696

判别训练的多尺度可变形部件模型 A Discriminatively Trained, Multiscale, Deformable Part Model

本文介绍了一种用于目标检测的判别训练的多尺度可变形部件模型。我们的系统在平均精度上达到了2006 PASCAL 人体检测竞赛中最优结果的两倍,同样比2007 PASCAL目标检测比赛中20个类别中的1...
  • masikkk
  • masikkk
  • 2013年12月24日 18:02
  • 15430

win7+Matlab2011b+VS2005环境下运行Deformable Part Models(voc-release4.01)目标检测matlab源码

配置方法如下: 1.daka
  • jiyangsb
  • jiyangsb
  • 2014年08月20日 21:58
  • 2068

A Discriminatively Trained, Multiscale, Deformable Part Model

题目叫 A Discriminatively Trained, Multiscale, Deformable Part Model ,什么意思  中文对应翻译:一个 判别训练,多尺度,可变性的部件模型...
  • xp215774576
  • xp215774576
  • 2014年12月17日 14:38
  • 992

Win7+VS2010+Matlab2011b下运行 Deformable Part Models代码-运行demo()-详细步骤

在用matlab跑“Face Detection, Pose Estimation and Landmark Localization in the Wild”的代码 http://www.ic...
  • cesc_stone
  • cesc_stone
  • 2015年01月29日 15:29
  • 614

[论文笔记5]A Discriminatively Trained, Multiscale, Deformable Part Model

1.物体检测的模型组成:一个 global root filter 用来确定物体的位置(获取coarse features) 以及若干part model,包括spatial model 和 part...
  • lebula
  • lebula
  • 2015年11月16日 15:34
  • 463

Discriminatively Trained Partbased Models (DPM) 理解

Reference: Object detection with discriminatively trained partbased models. IEEE Trans. PAMI, 32(...
  • lanbing510
  • lanbing510
  • 2014年11月24日 16:31
  • 4907

在windows下运行Felzenszwalb的Discriminatively Trained Deformable Part Models matlab代码

Felzenszwalb的Discriminatively Trained Deformable Part Models  URL:http://www.cs.brown.edu/~pff/laten...
  • pozen
  • pozen
  • 2011年11月29日 15:59
  • 17339

Discriminatively Trained Deformable Part Models

To use Opencv latentSVM detect with the model trained by the matlab code "voc-release" from http://w...
  • u012154840
  • u012154840
  • 2017年05月24日 21:33
  • 104

Discriminatively Trained Deformable Part Models 在window下运行

转自http://blog.csdn.net/sjj312774064/article/details/8712836 总结以下三位的巨作。 主要参考网络上的: 1、pozen h...
  • wmonica121
  • wmonica121
  • 2014年03月24日 15:38
  • 477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在window下运行Discriminatively Trained Deformable Part Models代码
举报原因:
原因补充:

(最多只允许输入30个字)