From eec6698581e75f533325c9f4a144aa2b1b130ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20Buenaposada?= Date: Tue, 20 Feb 2018 16:17:09 +0100 Subject: [PATCH 1/2] Modifications for BAdaCost multi-view detection. --- README.md | 19 +- channels/chnsCompute.m | 2 +- channels/chnsPyramid.m | 5 +- channels/private/convConst.cpp | 5 +- channels/private/gradientMex.cpp | 33 +- channels/private/imPadMex.cpp | 19 +- channels/private/imResampleMex.cpp | 17 +- channels/private/rgbConvertMex.cpp | 5 +- channels/private/sse.hpp | 2 + classify/badacostApply.m | 37 ++ classify/badacostCalibrateCascade.m | 108 +++++ classify/badacostTrain.m | 311 ++++++++++++ classify/badacostWithTreesApply.m | 46 ++ classify/badacostWithTreesTrain.m | 132 ++++++ ...ssify_costs_classtree_multiclass_learner.m | 28 ++ .../classify_costs_pdollar_multiclasstree.m | 25 + classify/multiclassQuantizedTreeTrain.m | 209 ++++++++ classify/multiclassTreeApply.m | 33 ++ classify/multiclassTreeTrain.m | 185 ++++++++ .../private/multiclassQuantizedTreeTrain1.cpp | 138 ++++++ classify/private/multiclassTreeTrain1.cpp | 98 ++++ classify/train_costs_pdollar_multiclasstree.m | 184 +++++++ ...n_costs_pdollar_quantized_multiclasstree.m | 92 ++++ detector/acfDetect.m | 37 +- detector/acfDetectBadacost.m | 119 +++++ detector/acfTestBadacost.m | 68 +++ detector/acfTrain.m | 10 +- detector/acfTrainBadacostTrees.m | 448 ++++++++++++++++++ detector/bbApply.m | 59 ++- detector/bbGt.m | 202 ++++++-- detector/computePerClassAspectRatios.m | 77 +++ detector/computeSelectedFeaturesMap.m | 58 +++ detector/correctToClassSpecificBbs.m | 54 +++ detector/plotSelectedFeaturesMap.m | 70 +++ detector/private/acfDetect1.cpp | 16 + detector/private/acfDetectBadacostTrees1.cpp | 347 ++++++++++++++ external/toolboxCompile.m | 29 +- images/private/histc2c.c | 12 +- images/private/imtransform2_c.c | 3 +- videos/private/ktComputeW_c.c | 3 +- videos/private/ktHistcRgb_c.c | 4 +- 41 files changed, 3266 insertions(+), 83 deletions(-) create mode 100755 classify/badacostApply.m create mode 100755 classify/badacostCalibrateCascade.m create mode 100755 classify/badacostTrain.m create mode 100755 classify/badacostWithTreesApply.m create mode 100755 classify/badacostWithTreesTrain.m create mode 100755 classify/classify_costs_classtree_multiclass_learner.m create mode 100755 classify/classify_costs_pdollar_multiclasstree.m create mode 100755 classify/multiclassQuantizedTreeTrain.m create mode 100755 classify/multiclassTreeApply.m create mode 100755 classify/multiclassTreeTrain.m create mode 100755 classify/private/multiclassQuantizedTreeTrain1.cpp create mode 100755 classify/private/multiclassTreeTrain1.cpp create mode 100755 classify/train_costs_pdollar_multiclasstree.m create mode 100755 classify/train_costs_pdollar_quantized_multiclasstree.m create mode 100755 detector/acfDetectBadacost.m create mode 100755 detector/acfTestBadacost.m create mode 100755 detector/acfTrainBadacostTrees.m create mode 100755 detector/computePerClassAspectRatios.m create mode 100755 detector/computeSelectedFeaturesMap.m create mode 100755 detector/correctToClassSpecificBbs.m create mode 100644 detector/plotSelectedFeaturesMap.m create mode 100755 detector/private/acfDetectBadacostTrees1.cpp diff --git a/README.md b/README.md index ceabaf41..6b5850d6 100644 --- a/README.md +++ b/README.md @@ -1 +1,18 @@ -http://vision.ucsd.edu/~pdollar/toolbox/doc/ +# Multi-class object detection with BAdaCost. + +This repo has a modified version of [Piotr Dollar toolbox](http://vision.ucsd.edu/~pdollar/toolbox/doc/) (Matlab and C++ code) to replicate the experiments we made for our Cost-Sensitive Multiclass algorithm paper. If you use this code for your own researh, **you must reference our journal paper**: + + **BAdaCost: Multi-class Boosting with Costs.** + Antonio Fernández-Baldera, José M. Buenaposada, and Luis Baumela. + Pattern Recognition, Elsevier. In press, 2018. + [DOI:10.1016/j.patcog.2018.02.022](https://doi.org/10.1016/j.patcog.2018.02.022) + + +# Replicate paper experiments or simply use our trained classifiers. + +Our modifications to P.Dollar toolbox have only been tested on GNU/Linux Matlab. To replicate paper experiments you have to: + +* Clone this repo + * Execute toolboxCompile +* Clone the [multi-view car detection scripts repo](https://github.com/jmbuena/toolbox.badacost.kitti.public) and follow instructions there. +* Clone the [multi-view face detection scripts repo](https://github.com/jmbuena/toolbox.badacost.faces.public) and follow instructions there. diff --git a/channels/chnsCompute.m b/channels/chnsCompute.m index 6864da02..3ed7a60c 100644 --- a/channels/chnsCompute.m +++ b/channels/chnsCompute.m @@ -2,7 +2,7 @@ % Compute channel features at a single scale given an input image. % % Compute the channel features as described in: -% P. Dollár, Z. Tu, P. Perona and S. Belongie +% P. Doll�r, Z. Tu, P. Perona and S. Belongie % "Integral Channel Features", BMVC 2009. % Channel features have proven very effective in sliding window object % detection, both in terms of *accuracy* and *speed*. Numerous feature diff --git a/channels/chnsPyramid.m b/channels/chnsPyramid.m index 2c83bf79..3aa861ad 100644 --- a/channels/chnsPyramid.m +++ b/channels/chnsPyramid.m @@ -22,7 +22,7 @@ % can be used to approximate feature responses at nearby scales. The % approximation is accurate at least within an entire scale octave. For % details and to understand why this unexpected result holds, please see: -% P. Dollár, R. Appel, S. Belongie and P. Perona +% P. Doll�r, R. Appel, S. Belongie and P. Perona % "Fast Feature Pyramids for Object Detection", PAMI 2014. % % The parameter "nApprox" determines how many intermediate scales are @@ -123,7 +123,8 @@ if(p.nApprox<0), p.nApprox=p.nPerOct-1; end end if(nargin==0), pyramid=p; return; end; pPyramid=p; -vs=struct2cell(p); [pChns,nPerOct,nOctUp,nApprox,lambdas,... +vs=struct2cell(p); +[pChns,nPerOct,nOctUp,nApprox,lambdas,... pad,minDs,smooth,concat,~]=deal(vs{:}); shrink=pChns.shrink; % convert I to appropriate color space (or simply normalize) diff --git a/channels/private/convConst.cpp b/channels/private/convConst.cpp index fe5ba4ba..9c5c80e4 100644 --- a/channels/private/convConst.cpp +++ b/channels/private/convConst.cpp @@ -197,7 +197,8 @@ void convMax( float *I, float *O, int h, int w, int d, int r ) { // B=convConst(type,A,r,s); fast 2D convolutions (see convTri.m and convBox.m) #ifdef MATLAB_MEX_FILE void mexFunction( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] ) { - int *ns, ms[3], nDims, d, m, r, s; float *A, *B, p; + int nDims; float *A, *B, p; + mwSize ms[3]; mwSize *ns, d, m, r, s;; mxClassID id; char type[1024]; // error checking on arguments @@ -205,7 +206,7 @@ void mexFunction( int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[] ) { if(nlhs > 1) mexErrMsgTxt("One output expected."); nDims = mxGetNumberOfDimensions(prhs[1]); id = mxGetClassID(prhs[1]); - ns = (int*) mxGetDimensions(prhs[1]); + ns = (mwSize*) mxGetDimensions(prhs[1]); d = (nDims == 3) ? ns[2] : 1; m = (ns[0] < ns[1]) ? ns[0] : ns[1]; if( (nDims!=2 && nDims!=3) || id!=mxSINGLE_CLASS || m<4 ) diff --git a/channels/private/gradientMex.cpp b/channels/private/gradientMex.cpp index fc1349cb..40a94044 100644 --- a/channels/private/gradientMex.cpp +++ b/channels/private/gradientMex.cpp @@ -7,6 +7,7 @@ #include #include "string.h" #include "sse.hpp" +#include #define PI 3.14159265f @@ -152,11 +153,11 @@ void gradHist( float *M, float *O, float *H, int h, int w, float *H0, *H1, *M0, *M1; int x, y; int *O0, *O1; float xb, init; O0=(int*)alMalloc(h*sizeof(int),16); M0=(float*) alMalloc(h*sizeof(float),16); O1=(int*)alMalloc(h*sizeof(int),16); M1=(float*) alMalloc(h*sizeof(float),16); + // main loop for( x=0; x=0); - if( softBin<0 && softBin%2==0 ) { // no interpolation w.r.t. either orienation or spatial bin H1=H+(x/bin)*hb; @@ -167,7 +168,6 @@ void gradHist( float *M, float *O, float *H, int h, int w, else if( bin==4 ) for(y=0; ynl1 ) mexErrMsgTxt("Incorrect number of outputs."); if( nrnr1 ) mexErrMsgTxt("Incorrect number of inputs."); nDims = mxGetNumberOfDimensions(pr[0]); dims = mxGetDimensions(pr[0]); @@ -344,7 +347,8 @@ void checkArgs( int nl, mxArray *pl[], int nr, const mxArray *pr[], int nl0, // [Gx,Gy] = grad2(I) - see gradient2.m void mGrad2( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { - int h, w, d; float *I, *Gx, *Gy; + //int h, w, d; float *I, *Gx, *Gy; + mwSize h, w, d; float *I, *Gx, *Gy; checkArgs(nl,pl,nr,pr,1,2,1,1,&h,&w,&d,mxSINGLE_CLASS,(void**)&I); if(h<2 || w<2) mexErrMsgTxt("I must be at least 2x2."); pl[0]= mxCreateMatrix3( h, w, d, mxSINGLE_CLASS, 0, (void**) &Gx ); @@ -354,7 +358,9 @@ void mGrad2( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { // [M,O] = gradMag( I, channel, full ) - see gradientMag.m void mGradMag( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { - int h, w, d, c, full; float *I, *M, *O=0; +// int h, w, d, c, full; float *I, *M, *O=0; + mwSize h, w, d; + int c, full; float *I, *M, *O=0; checkArgs(nl,pl,nr,pr,1,2,3,3,&h,&w,&d,mxSINGLE_CLASS,(void**)&I); if(h<2 || w<2) mexErrMsgTxt("I must be at least 2x2."); c = (int) mxGetScalar(pr[1]); full = (int) mxGetScalar(pr[2]); @@ -366,7 +372,8 @@ void mGradMag( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { // gradMagNorm( M, S, norm ) - operates on M - see gradientMag.m void mGradMagNorm( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { - int h, w, d; float *M, *S, norm; + //int h, w, d; float *M, *S, norm; + mwSize h, w, d; float *M, *S, norm; checkArgs(nl,pl,nr,pr,0,0,3,3,&h,&w,&d,mxSINGLE_CLASS,(void**)&M); if( mxGetM(pr[1])!=h || mxGetN(pr[1])!=w || d!=1 || mxGetClassID(pr[1])!=mxSINGLE_CLASS ) mexErrMsgTxt("M or S is bad."); @@ -376,7 +383,9 @@ void mGradMagNorm( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { // H=gradHist(M,O,[...]) - see gradientHist.m void mGradHist( int nl, mxArray *pl[], int nr, const mxArray *pr[] ) { - int h, w, d, hb, wb, nChns, binSize, nOrients, softBin, useHog; + //int h, w, d, hb, wb, nChns, binSize, nOrients, softBin, useHog; + mwSize h, w, d, hb, wb; + int nChns, binSize, nOrients, softBin, useHog; bool full; float *M, *O, *H, clipHog; checkArgs(nl,pl,nr,pr,1,3,2,8,&h,&w,&d,mxSINGLE_CLASS,(void**)&M); O = (float*) mxGetPr(pr[1]); diff --git a/channels/private/imPadMex.cpp b/channels/private/imPadMex.cpp index a8363e3e..a3824e70 100644 --- a/channels/private/imPadMex.cpp +++ b/channels/private/imPadMex.cpp @@ -5,6 +5,7 @@ *******************************************************************************/ #include "wrappers.hpp" #include "string.h" +#include typedef unsigned char uchar; // pad A by [pt,pb,pl,pr] and store result in B @@ -69,14 +70,16 @@ template void imPad( T *A, T *B, int h, int w, int d, int pt, int pb, // B = imPadMex(A,pad,type); see imPad.m for usage details #ifdef MATLAB_MEX_FILE void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { - int *ns, ms[3], nCh, nDims, pt, pb, pl, pr, flag, k; double *p; + int nCh, nDims, pt, pb, pl, pr, flag, k; double *p; + mwSize *ns, ms[3], *ns_out; void *A, *B; mxClassID id; double val=0; char type[1024]; // Error checking on arguments if( nrhs!=3 ) mexErrMsgTxt("Three inputs expected."); if( nlhs>1 ) mexErrMsgTxt("One output expected."); nDims=mxGetNumberOfDimensions(prhs[0]); id=mxGetClassID(prhs[0]); - ns = (int*) mxGetDimensions(prhs[0]); nCh=(nDims==2) ? 1 : ns[2]; + ns = (mwSize*) mxGetDimensions(prhs[0]); nCh=(nDims==2) ? 1 : ns[2]; + if( (nDims!=2 && nDims!=3) || (id!=mxSINGLE_CLASS && id!=mxDOUBLE_CLASS && id!=mxUINT8_CLASS) ) mexErrMsgTxt("A should be 2D or 3D single, double or uint8 array."); @@ -102,10 +105,14 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if( ns[0]==0 || ns[1]==0 ) flag=0; // create output array - ms[0]=ns[0]+pt+pb; ms[1]=ns[1]+pl+pr; ms[2]=nCh; - if( ms[0]<0 || ns[0]<=-pt || ns[0]<=-pb ) ms[0]=0; - if( ms[1]<0 || ns[1]<=-pl || ns[1]<=-pr ) ms[1]=0; - plhs[0] = mxCreateNumericArray(3, (const mwSize*) ms, id, mxREAL); + ms[0]=ns[0]+mwSize(pt)+mwSize(pb); + ms[1]=ns[1]+mwSize(pl)+mwSize(pr); + ms[2]=mwSize(nCh); + + if( ms[0]<0 || int(ns[0])<=-int(pt) || int(ns[0])<=-int(pb) ) ms[0]=0; + if( ms[1]<0 || int(ns[1])<=-int(pl) || int(ns[1])<=-int(pr) ) ms[1]=0; + plhs[0] = mxCreateNumericArray(3, ms, id, mxREAL); + if( ms[0]==0 || ms[1]==0 ) return; // pad array diff --git a/channels/private/imResampleMex.cpp b/channels/private/imResampleMex.cpp index 8d23eebb..370102b6 100644 --- a/channels/private/imResampleMex.cpp +++ b/channels/private/imResampleMex.cpp @@ -8,6 +8,8 @@ #include #include #include "sse.hpp" +#include + typedef unsigned char uchar; // compute interpolation values for single column for resapling @@ -117,7 +119,12 @@ void resample( T *A, T *B, int ha, int hb, int wa, int wb, int d, T r ) { if(ybd[0]==2) for(; y4) for(; y4) for(; y4) { + for(int i=0; i1 ) mexErrMsgTxt("One output expected."); nDims=mxGetNumberOfDimensions(prhs[0]); id=mxGetClassID(prhs[0]); - ns = (int*) mxGetDimensions(prhs[0]); nCh=(nDims==2) ? 1 : ns[2]; + ns = (mwSize*) mxGetDimensions(prhs[0]); nCh=(nDims==2) ? 1 : ns[2]; if( (nDims!=2 && nDims!=3) || (id!=mxSINGLE_CLASS && id!=mxDOUBLE_CLASS && id!=mxUINT8_CLASS) ) mexErrMsgTxt("A should be 2D or 3D single, double or uint8 array."); ms[0]=(int)mxGetScalar(prhs[1]); ms[1]=(int)mxGetScalar(prhs[2]); ms[2]=nCh; if( ms[0]<=0 || ms[1]<=0 ) mexErrMsgTxt("downsampling factor too small."); nrm=(double)mxGetScalar(prhs[3]); - + // create output array plhs[0] = mxCreateNumericArray(3, (const mwSize*) ms, id, mxREAL); n=ns[0]*ns[1]*nCh; m=ms[0]*ms[1]*nCh; diff --git a/channels/private/rgbConvertMex.cpp b/channels/private/rgbConvertMex.cpp index bb616da4..6786ed80 100644 --- a/channels/private/rgbConvertMex.cpp +++ b/channels/private/rgbConvertMex.cpp @@ -168,13 +168,14 @@ oT* rgbConvert( iT *I, int n, int d, int flag, oT nrm ) { // J = rgbConvertMex(I,flag,single); see rgbConvert.m for usage details #ifdef MATLAB_MEX_FILE void mexFunction(int nl, mxArray *pl[], int nr, const mxArray *pr[]) { - const int *dims; int nDims, n, d, dims1[3]; void *I; void *J; int flag; + const mwSize *dims; int nDims, n, d; void *I; void *J; int flag; + mwSize dims1[3]; bool single; mxClassID idIn, idOut; // Error checking if( nr!=3 ) mexErrMsgTxt("Three inputs expected."); if( nl>1 ) mexErrMsgTxt("One output expected."); - dims = (const int*) mxGetDimensions(pr[0]); n=dims[0]*dims[1]; + dims = (const mwSize*) mxGetDimensions(pr[0]); n=dims[0]*dims[1]; nDims = mxGetNumberOfDimensions(pr[0]); d = 1; for( int i=2; i 0); +[~, index] = min(traces1(nWeaks, indices)); +index = indices(index); + +figure(h1); +hold on; +plot(traces1(:,index), 'b-', 'LineWidth', 2); + +min_last_traces1_pos = min(traces1(:,index)); +thr = min_last_traces1_pos; + +hold on; +plot([1 nWeaks], [min_last_traces1_pos min_last_traces1_pos], 'k-', 'LineWidth', 2); +plot([1 nWeaks], [thr thr], 'm-', 'LineWidth', 2); +hold off; + diff --git a/classify/badacostTrain.m b/classify/badacostTrain.m new file mode 100755 index 00000000..c6c0cb40 --- /dev/null +++ b/classify/badacostTrain.m @@ -0,0 +1,311 @@ +function [classfr, cost_curve] = badacostTrain( x, y, C, opt ) +%-------------------------------------------------------------------------- +% function [classfr, cost_curve] = badacostTrain( x, y, C, opt) +% +% This function performs Multiclass Bosting ADApted for Costs (badacost) +% algorithm. The weak learner has to be provided in the train_weak_learner +% function. +% +% Input: +% x, Pxn matrix (P is the number of features per observation and n +% is the number of observations). +% y, 1xn the corresponding class label of each of the n observations. +% C, cost matrix of the problem. C(i,j) is the cost of estimate class +% label j whereas the ground thruth class is i. +% opt, a structure that controls the behavior of the classifier +% opt.num_iterations is the number of weak classifiers to use. +% opt.train_weak_learner is the function to call for the weak classifier. +% opt.classify_weak_learner is the function to call to classify with +% a trained weak classifier. +% opt.learning_rate should be between 0 and 1, but better to be <= +% 0.1. It is a factor that multiplies alpha (the +% weight of the weak learner) +% opt.stop_with_negative_wl_weight If 1 stop at first negative WL +% weight. +% +% Output: +% classfr, a structure that is used in classify_adaboost.m +% classfr.WEAK_LEARNERS -- A cell array with the trained weak classifiers +% classfr.WEIGHTS -- A column vector with the per weak classifier weight +% classfr.classify_weak_learner -- a function to be used in +% badacostApply +% +% model - learned boosted tree classifier w the following fields +% .fids - [K x nWeak] feature ids for each node +% .thrs - [K x nWeak] threshold corresponding to each fid +% .child - [K x nWeak] index of child for each node (1-indexed) +% .hs - [K x nWeak] log ratio (.5*log(p/(1-p)) at each node +% .weights - [K x nWeak] total sample weight at each node +% .depth - [K x nWeak] depth of each node +% .errs - [1 x nWeak] error for each tree (for debugging) +% .losses - [1 x nWeak] loss after every iteration (for debugging) +% .treeDepth - depth of all leaf nodes (or 0 if leaf depth varies) +% +% Author: Antonio Baldera, modified by Jose M. Buenaposada + +if length(y) ~= size(x,2) + error('Number of observations for x_train should be the same than for y_train'); +end + +if ~isfield(opt, 'learning_rate') + opt.learning_rate = 0.1; % Shrinkage +end + +if ~isfield(opt, 'stop_with_negative_wl_weight') + opt.stop_with_negative_wl_weight = 1; % Stop with negative weight always +end + +y= y(:)'; + +%MIN_COST_INC = 10^(-10); +n = size(x,2); % Number of samples +num_classes = length(unique(y)); +num_features = size(x,1); +opt.num_classes = num_classes; +classfr.num_classes = num_classes; +classfr.classify_weak_learner = opt.classify_weak_learner; + +if (nargout > 1) + cost_curve = zeros(opt.num_iterations, 1); + margin_vec = zeros(classfr.num_classes, n); +end + +% Initialise sample weights +SAMPLE_WEIGHTS = (1/n).*ones(n, 1); + +% Margin vectors in matrix form. +Y = (-1/(num_classes-1))*ones(num_classes,num_classes) + ... + (num_classes/(num_classes-1))*eye(num_classes); + +% Reduce the numeric range of the cost matrix in order to avoid numerical +% problems with the exp funcions. This transformation does not change the +% estimated class boundaries. +if max(max(C)) > 1 + C =C./max(max(C)); +end + +% Cprime is an special matrix used in the BAdaCost loss function. +Cprime = C - diag(sum(C, 2)); +classfr.Cprime = Cprime; +C2 = Cprime * Y; + +% Preparing boosting loop +msg='Training BadaCost: nWeak=%3i nFtrs=%i\n'; +if(opt.verbose), fprintf(msg,opt.num_iterations,num_features); start=clock; end + +classfr.SAMPLE_WEIGHTS = cell(1, opt.num_iterations); +classfr.WEIGHTS = zeros(opt.num_iterations,1); +classfr.WEAK_LEARNERS = cell(1, opt.num_iterations); +classfr.Cprime = Cprime; +classfr.Y = Y; +if isfield(opt, 'use_variable_depth') % We have tree WL + if opt.use_variable_depth + depth = opt.minDepth; + end +end +for i=1:opt.num_iterations % opt.num_iterations is the number of weak classifiers to retain + + alpha = 1.0; + Cexp = translate_to_cost_matrix(C2, alpha); + + % Quantize data before badacost ... + if isfield(opt, 'use_variable_depth') % We have tree WL + if opt.use_variable_depth + % depth = opt.minDepth-1; + train_wl = 1; + while (train_wl) + % depth = depth + 1; + opt2 = opt; + opt2.maxDepth = depth; + if opt.USE_QUANTIZED + [WL, pred_wl, data] = opt.train_weak_learner(x, y, SAMPLE_WEIGHTS, Cexp, opt2); + opt.data = data; % The weak learner trainin quantize data first time. + else + [WL, pred_wl] = opt.train_weak_learner(x, y, SAMPLE_WEIGHTS, Cexp, opt2); + end + alpha = compute_weak_learner_weight(C2, ... + SAMPLE_WEIGHTS(:), ... + pred_wl, y); + train_wl = (alpha < 0) && (depth < opt.maxDepth); + if train_wl + depth = depth + 1; + end + end + else + depth = opt.maxDepth; + if opt.USE_QUANTIZED + [WL, pred_wl, data] = opt.train_weak_learner(x, y, SAMPLE_WEIGHTS, Cexp, opt); + opt.data = data; + else + [WL, pred_wl] = opt.train_weak_learner(x, y, SAMPLE_WEIGHTS, Cexp, opt); + end + alpha = compute_weak_learner_weight(C2, ... + SAMPLE_WEIGHTS(:), ... + pred_wl, y); + end + else % Any other weak learner. + [WL, pred_wl] = opt.train_weak_learner(x, y, SAMPLE_WEIGHTS, Cexp, opt); + alpha = compute_weak_learner_weight(C2, ... + SAMPLE_WEIGHTS(:), ... + pred_wl, y); + end + + if (alpha <= 0) + fprintf(1, 'Best weak learner has a non-positive weight: %8.3e\n', alpha); + if opt.stop_with_negative_wl_weight + break; + end; + end + classfr.WEAK_LEARNERS{i} = WL; + + % Smoothing the learning (Shrinkage) + alpha = opt.learning_rate * alpha; + + % update sample weights: only the right classified samples changes the + % weight. + for j=1:size(x, 2) + exp_j = C2(y(j), pred_wl(j)); + SAMPLE_WEIGHTS(j) = SAMPLE_WEIGHTS(j) * exp(alpha*exp_j); + end + + % sum to 1 weights normalisation + SAMPLE_WEIGHTS = SAMPLE_WEIGHTS./sum(SAMPLE_WEIGHTS(:)); + + classfr.WEIGHTS(i) = alpha; + classfr.SAMPLE_WEIGHTS{i} = SAMPLE_WEIGHTS(:); + + % Average cost for the strong classifier so far. + if (nargout > 1) + for j=1:n + margin_vec(:,j) = margin_vec(:,j) + ... + (classfr.WEIGHTS(i).*Y(:, pred_wl(j))); + end + + % WARNING: Change to accomodate with theory (2016/11) +% [~, predicted] = min(Cprime' * margin_vec); + [~, predicted] = min(Cprime * margin_vec); + cost_curve(i) = compute_strong_learner_cost(predicted, y, C2); + end + wl_cost = compute_strong_learner_cost(pred_wl, y, C2); + if isfield(opt, 'use_variable_depth') % We have tree WL + msg=' i=%4i alpha=%.3f depth=%d w.l.cost=%.3f s.l.cost=%.2e\n'; + if(mod(i,opt.verbose)==0), fprintf(msg,i,alpha,depth,wl_cost,cost_curve(i)); end + else + msg=' i=%4i alpha=%.3f w.l.cost=%.3f s.l.cost=%.2e\n'; + if(mod(i,opt.verbose)==0), fprintf(msg,i,alpha,wl_cost,cost_curve(i)); end + end +end + +% Remove un-trained weak learners (if stopped earlier because of alpha<0). +if opt.stop_with_negative_wl_weight && (alpha <= 0) + % If stopped because of alpha being negative + classfr.WEIGHTS = classfr.WEIGHTS(1:i-1); + classfr.SAMPLE_WEIGHTS = classfr.SAMPLE_WEIGHTS(1:i-1); + classfr.WEAK_LEARNERS = classfr.WEAK_LEARNERS(1:i-1); + if (nargout > 2) + cost_curve = cost_curve(1:i-1); + end +end + +msg='Done training s.l.cost=%.4f (t=%.1fs).\n'; +if(opt.verbose), + fprintf(msg,cost_curve(end),etime(clock,start)); end + +end + +% ------------------------------------------------------------------------ +function cost = compute_strong_learner_cost(prediction, y, C2) + cost = 0.0; + for i=1:length(prediction) + cost = cost + exp(C2(y(i), prediction(i))); + end + cost = cost / length(prediction); +end + +% ------------------------------------------------------------------------ +%function cost = compute_weak_learner_cost(prediction, y, alpha, C2, SAMPLE_WEIGHTS) +% cost = 0; +% for i=1:length(prediction) +% cost = cost + SAMPLE_WEIGHTS(i) * exp(alpha*C2(y(i), prediction(i))); +% end +%end + +%% ------------------------------------------------------------------------ +function Cexp = translate_to_cost_matrix(C2, alpha) + K = size(C2,1); + Cexp = exp(alpha * C2); + for j = 1:K + Cexp(j,:) = Cexp(j,:) - Cexp(j,j)*ones(1, K); + end +end + +%% ------------------------------------------------------------------------ +function alpha = compute_weak_learner_weight(Cprime, W, pred, y) +% Computes Weak Learner weight (\alpha) in order to minimize the +% cost sensitive loss function. +% +% Input: +% - Cprime : Problem cost function with diagonals elements being minus sum of row costs. +% - W : Sample weights to iteration t-1 in CostSAMME. +% - pred : column vector with the per-sample label prediction. Values in {1,2,...,K}. +% - y : column vector with the per-sample ground thruth labels. Values in {1,2,...,K}. + +K = size(Cprime,1); +WeightsSum = zeros(K,K); +for i = 1:K + for j = 1:K + predicted_as_j_being_i = ((y == i) & (pred == j)); + WeightsSum(i,j) = W(:)'*double(predicted_as_j_being_i(:)); + end +end + +alpha0 = 1.0; +options = optimset('GradObj','on'); +alpha = fminsearch( @(x) cost_sensitive_loss_function(x, Cprime, WeightsSum), alpha0, options); + +end + +%% ------------------------------------------------------------------------ +function [func_value, deriv_value] = cost_sensitive_loss_function(alpha, Cprime, WeightsSum) +% Loss function and derivative of the loss function computation for a given +% alpha (weak learner weight in the CostSAMME algorithm). +% +% alpha : is the weight computed for the weak learner. +% Cprime : is the problem cost matrix with diagonal elements being minus sum of +% row costs +% WeightsSum : WeightsSum(i,j) is the sum of the sample weights when prediction is +% class j and real label is i +% + +K = size(Cprime,1); + +% Compute cost sensitive loss function value for a given \alpha. +func_value = 0; +for i = 1:K + for j = 1:K + func_value = func_value + (WeightsSum(i,j)*exp(alpha*Cprime(i,j))); + end +end + +% Compute derivative value of cost sensitive loss function for a given \alpha. +deriv_value = 0; +for i = 1:K + for j = 1:K + deriv_value = deriv_value + (WeightsSum(i,j)*Cprime(i,j)*exp(alpha*Cprime(i,j))); + end +end +end + + + + + + + + + + + + + + diff --git a/classify/badacostWithTreesApply.m b/classify/badacostWithTreesApply.m new file mode 100755 index 00000000..3cadbbe4 --- /dev/null +++ b/classify/badacostWithTreesApply.m @@ -0,0 +1,46 @@ +function hs = badacostWithTreesApply(X, model, maxDepth, minWeight, nThreads) +% Apply learned boosted decision tree classifier. +% +% USAGE +% hs = adaBoostApply( X, model, [maxDepth], [minWeight], [nThreads] ) +% +% INPUTS +% X - [NxF] N length F feature vectors +% model - learned boosted tree classifier +% maxDepth - [] maximum depth of tree +% minWeight - [] minimum sample weigth to allow split +% nThreads - [inf] max number of computational threads to use +% +% OUTPUTS +% hs - [Nx1] predicted output log ratios +% +% EXAMPLE +% +% See also badaCostWithTreesTrain +% +% Piotr's Image&Video Toolbox Version 3.21 +% Copyright 2013 Piotr Dollar. [pdollar-at-caltech.edu] +% Please email me if you find bugs, or have suggestions or questions! +% Licensed under the Simplified BSD License [see external/bsd.txt] + +if(nargin<3 || isempty(maxDepth)), maxDepth=0; end +if(nargin<4 || isempty(minWeight)), minWeight=0; end +if(nargin<5 || isempty(nThreads)), nThreads=1e5; end +if(maxDepth>0), model.child(model.depth>=maxDepth) = 0; end +if(minWeight>0), model.child(model.weights<=minWeight) = 0; end +nWeak=size(model.fids,2); +N=size(X,1); +nt=nThreads; + +margin_vec = zeros(model.num_classes, N); +for i=1:nWeak + ids = forestInds(X,model.thrs(:,i),model.fids(:,i),model.child(:,i),nt); + for j=1:N + z = model.hs(ids(j),i); + margin_vec(:,j) = margin_vec(:,j) + (model.wl_weights(i).*model.Y(:, z)); + end +end +% WARNING: Change to accomodate with theory (2016/11) +%[~, hs] = min(model.Cprime' * margin_vec); +[~, hs] = min(model.Cprime * margin_vec); +hs = hs(:); diff --git a/classify/badacostWithTreesTrain.m b/classify/badacostWithTreesTrain.m new file mode 100755 index 00000000..22764953 --- /dev/null +++ b/classify/badacostWithTreesTrain.m @@ -0,0 +1,132 @@ +function [model, cost_curve] = badacostWithTreesTrain( X0, X1, L1, varargin ) +%-------------------------------------------------------------------------- +% function [model, cost_curve] = badacostWithTreesTrain( X0, X1, L1, varargin) +% +% This function performs Multiclass Bosting ADApted for Costs (badacost) +% algorithm with trees as weak learner. +% +% INPUTS +% X0 - [N0xF] negative feature vectors +% X1 - [N1xF] positive feature vectors +% L1 - [N1x1] positive subclasses labels (in [1, H] where H is the #subclasses) +% pBoost - additional params (struct or name/value pairs) +% .nWeak - [128] number of trees to learn +% .shrinkage - [0.1] learning rate (multiplicative factor for weak learner weights). +% .resampling - [0.1] sampling proportion of data for weak learner training. +% .Cost - [onesH+1,H+1)-eye(H+1))] C(i, j) is the cost of classifing in j whereas the +% real label is i. +% .stopAtNegWeight [1] Stop iterating badacost when a Weak Learner gets a negative weight +% .maxDepth - [] Max depth levels of the decision trees. +% .quantized - [0] +% .use_rus - [0] Use Random Under Sampling. +% .verbose - [0] if true print status information +% +% OUTPUTS +% model - learned boosted tree classifier w the following fields +% .fids - [K x nWeak] feature ids for each node +% .thrs - [K x nWeak] threshold corresponding to each fid +% .child - [K x nWeak] index of child for each node (1-indexed) +% .hs - [K x nWeak] log ratio (.5*log(p/(1-p)) at each node +% .weights - [K x nWeak] total sample weight at each node +% .depth - [K x nWeak] depth of each node +% .errs - [1 x nWeak] error for each tree (for debugging) +% .losses - [1 x nWeak] loss after every iteration (for debugging) +% .treeDepth - depth of all leaf nodes (or 0 if leaf depth varies) +% + +% +% Author: Jose M. Buenaposada + +x = [X0; X1]; + +% We make 1 the negative class label and add 1 to the rest of labels +y = [ones(size(X0,1), 1); L1(:) + 1]; +num_classes = length(unique(y)); + +% get additional parameters +Cost = ones(num_classes, num_classes) - diag(ones(num_classes, 1)); +dfs={ 'nWeak',128, 'shrinkage', 0.1, 'resampling', 0.5, 'Cost', Cost, 'stopAtNegWeight', 1, ... + 'fracFtrs', 1, 'minDepth', [], 'maxDepth', [], 'quantized', 0, 'variable_depth', 0, ... + 'use_rus', 0, ... + 'verbose', 0}; +[nWeak,shrinkage,resampling,Cost,stopAtNegWeight,fracFtrs,minDepth,maxDepth,quantized,variable_depth,use_rus,verbose]=getPrmDflt(varargin,dfs,1); + +opt.SET_MINPARENT_TREE_WL = 1; +opt.learning_rate = shrinkage; +opt.frac_features = fracFtrs; +opt.num_iterations = nWeak; +opt.scalar_class_labels = 1; +opt.stop_with_negative_wl_weight = stopAtNegWeight; +opt.maxDepth = maxDepth; +opt.minDepth = minDepth; +opt.USE_QUANTIZED = quantized; +opt.use_variable_depth = variable_depth; +opt.USE_RUS_BALANCED_WL = use_rus; % Use Random Under Sampling Balancing . +opt.verbose = verbose; +if opt.USE_QUANTIZED + opt.train_weak_learner = @train_costs_pdollar_quantized_multiclasstree; +else + opt.train_weak_learner = @train_costs_pdollar_multiclasstree; +end +opt.classify_weak_learner = @classify_costs_pdollar_multiclasstree; +if ((resampling >= 1.0) || (resampling < 0)) + opt.USE_SAMPLED_WL = 0; + opt.USE_RUS_BALANCED_WL = 0; + opt.SAMPLE_PROPORTION_WL = resampling; +elseif ~opt.USE_RUS_BALANCED_WL + opt.USE_SAMPLED_WL = 1; + opt.SAMPLE_PROPORTION_WL = resampling; +else + opt.USE_SAMPLED_WL = 0; + opt.SAMPLE_PROPORTION_WL = resampling; +end + +msg='Training BAdaCost: nWeak=%3i shrinkage=%f resampling=%f fracFtrs=%f\n'; +if(verbose), fprintf(msg,nWeak,shrinkage,resampling,fracFtrs); start=clock; end + +[classfr, cost_curve] = badacostTrain( x', y, Cost, opt ); +%figure; +%plot(cost_curve); +%xlabel('#weak learners'); +%ylabel('cost'); + +% Now we adapt the output of the badacost to the P.Dollar toolbox. +% create output model struct +k=0; +nWeak = length(classfr.WEAK_LEARNERS); +for i=1:nWeak + k=max(k,size(classfr.WEAK_LEARNERS{i}.TREE.fids,1)); +end +Z = @(type) zeros(k,nWeak,type); +model=struct( 'fids',Z('uint32'), 'thrs',Z('single'), ... + 'child',Z('uint32'), 'hs',Z('single'), 'weights',Z('single'), ... + 'depth',Z('uint32')); %, 'errs',errs, 'losses',losses ); +for i=1:nWeak + T=classfr.WEAK_LEARNERS{i}.TREE; + k=size(T.fids,1); + model.fids(1:k,i)=T.fids; + model.thrs(1:k,i)=T.thrs; + model.child(1:k,i)=T.child; + model.hs(1:k,i)=T.hs; +% model.weights(1:k,i)=T.weights; + model.depth(1:k,i)=T.depth; +end +depth = max(model.depth(:)); +model.treeDepth = depth * uint32(all(model.depth(~model.child)==depth)); +model.num_classes = classfr.num_classes; +model.Cprime = classfr.Cprime; +model.Y = classfr.Y; +model.wl_weights = classfr.WEIGHTS; +model.weak_learner_type = 'trees'; + +% output info to log +predicted = badacostWithTreesApply(x, model); +error = sum(predicted(:) ~= y(:))/length(predicted); +fp = sum((predicted(:) ~= 1) & (y == 1))./length(predicted); +fn = sum((predicted(:) == 1) & (y ~= 1))./length(predicted); +msg='Done training err=%.4f fp=%.4f fn=%.4f (t=%.1fs).\n'; +if(verbose) + fprintf(msg,error,fp,fn,etime(clock,start)); +end + +end diff --git a/classify/classify_costs_classtree_multiclass_learner.m b/classify/classify_costs_classtree_multiclass_learner.m new file mode 100755 index 00000000..5b8581d9 --- /dev/null +++ b/classify/classify_costs_classtree_multiclass_learner.m @@ -0,0 +1,28 @@ +function predicted = classify_costs_classtree_multiclass_learner( CLASSIFIER, x ) +% function predicted = classify_costs_classtree_multiclass_learner( CLASSIFIER, x ) +% Classify a set of projected using pixel-wise grey level difference. +% +% Input: +% CLASSIFIER, a structure returned by train_classtree_multiclass_learner.m +% x, Pxn matrix (P is the number of pixels per image n is the number +% of images). +% +% Output: +% predicted -- 1 x n matrix with the lower cost weak +% classifier output for the input data in x. +% +% See also: +% train_COST_SAMME.m + +% Author: Jose M. Buenaposada +n = size(x,2); + +% Evaluate the classification tree on the training data. +z = CLASSIFIER.TREE.eval( x' ); +predicted = cellfun(@(x) str2double(x), z); + + + + + + diff --git a/classify/classify_costs_pdollar_multiclasstree.m b/classify/classify_costs_pdollar_multiclasstree.m new file mode 100755 index 00000000..a24c4e99 --- /dev/null +++ b/classify/classify_costs_pdollar_multiclasstree.m @@ -0,0 +1,25 @@ +function predicted = classify_costs_pdollar_multiclasstree( CLASSIFIER, x ) +% function predicted = cclassify_costs_pdollar_multiclasstree( CLASSIFIER, x ) +% Classify a set of projected using pixel-wise grey level difference. +% +% Input: +% CLASSIFIER, a structure returned by train_classtree_multiclass_learner.m +% x, Pxn matrix (P is the number of pixels per image n is the number +% of images). +% +% Output: +% predicted -- 1 x n matrix with the lower cost weak +% classifier output for the input data in x. +% +% See also: +% train_COST_SAMME.m + +% Author: Jose M. Buenaposada + +% Evaluate the classification tree on the training data. +predicted = multiclassTreeApply(x', CLASSIFIER.TREE); + + + + + diff --git a/classify/multiclassQuantizedTreeTrain.m b/classify/multiclassQuantizedTreeTrain.m new file mode 100755 index 00000000..be74f364 --- /dev/null +++ b/classify/multiclassQuantizedTreeTrain.m @@ -0,0 +1,209 @@ +function [tree, data] = multiclassQuantizedTreeTrain( data, varargin ) +% Train a multiclass tree with costs. Optimized code for training +% decision trees over binary variables. +% +% During training each feature is quantized to lie between [0,nBins-1], +% where nBins<=256. Quantization is expensive and should be performed just +% once if training multiple trees. Note that the second output of the +% algorithm is the quantized data, this can be reused in future training. +% +% Dimensions: +% F - number features +% N - number input vectors +% H - number classes +% +% USAGE +% tree = multiclassTreeTrain( data, hs, [varargin] ) +% +% INPUTS +% data - Data for training tree +% .X - [NxF] N length F feature vectors +% .hs - [Nx1] target output labels in [1,H] +% .H - [max(hs)] number of classes +% .wts - [] weights used for sampling and weighing each data point +% .xMin - [1xF] optional vals defining feature quantization +% .xStep - [1xF] optional vals defining feature quantization +% .xType - [] optional original data type for features +% pTree - additional params (struct or name/value pairs) +% .costs - [] HxH cost matrix, H is the number of classes and C(i,j) is +% the cost of estimate class label as j whereas the +% ground thruth class is i. +% .split - ['gini'] options include 'gini', 'entropy' and 'twoing' +% .nBins - [256] maximum number of quanizaton bins (<=256) +% .maxDepth - [1] maximum depth of tree +% .minCount - [10] minimum number of data in a node to allow split +% .fracData - [1] fraction of data to sample for each node split +% .fracFtrs - [1] fraction of features to sample for each node split +% .nThreads - [inf] max number of computational threads to use +% +% OUTPUTS +% tree - learned tree model struct array w the following fields +% .fids - [Kx1] feature ids for each node +% .thrs - [Kx1] threshold corresponding to each fid +% .child - [Kx1] index of child for each node +% .hs - [Kx1] lowest cost label at each node +% .distr - [KxH] prob distribution at each node +% .count - [Kx1] number of data points at each node +% .depth - [Kx1] depth of each node +% data - data used for training tree (quantized version of input) +% +% +% See also multiclassTreeApply +% +% José M. Buenaposada - Mixed version between binaryTreeTrain and +% forestTrain. There is a fundamental change, the addition of a cost matrix +% to allow BAdaCost training. +% +% Piotr's Image&Video Toolbox Version 3.24 +% Copyright 2013 Psiotr Dollar. [pdollar-at-caltech.edu] +% Please email me if you find bugs, or have suggestions or questions! +% Licensed under the Simplified BSD License [see external/bsd.txt] + +% get additional parameters and fill in remaining parameters +dfs={'costs', [], ... + 'split','gini',... + 'nBins',256, ... + 'maxDepth',1, ... + 'minCount',10,... + 'fracData',1, ... + 'fracFtrs',1, ... + 'nThreads',1e5}; %,... +% 'dWts',[], 'fWts',[] }; +[costs, splitStr, nBins, maxDepth, minCount, fracData, fracFtrs, nThreads] = ... + getPrmDflt(varargin,dfs,1); +assert(nBins<=256); + +% get data and normalize weights +dfs={'X','REQ', 'hs', 'REQ', 'H', [], 'wts',[], ... + 'xMin',[], 'xStep',[], 'xType',[] }; +[X,hs,H,wts,xMin,xStep,xType]=getPrmDflt(data,dfs,1); +[N,F]=size(X); assert(length(hs)==N); + +if(isempty(xType)), xMin=zeros(1,F); xStep=ones(1,F); xType=class(X); end +if(isempty(H)), H=max(hs); end; assert(all(hs>0 & hs<=H)); +if(isempty(wts)), wts=ones(1,N,'single'); end; wts=wts/sum(wts); +%split=find(strcmpi(splitStr,{'gini','entropy','twoing'}))-1; +split=find(strcmpi(splitStr,{'gini'}))-1; +if(isempty(split)), error('unknown splitting criteria: %s',splitStr); end + +if(isempty(costs)) + costs = ones(H,H); + % Make the costs matrix diagonal zeros. + costs = costs - diag(diag(data.costs)); +end +assert(size(costs, 1) == H); +assert(size(costs, 2) == H); + +% Compute multiplicative factor for probabilities of class in each node. +% This factors, that accounts for the cost, will take care of somewhat +% cost sensitive impurity computation at each node. +costs_factor = sum(costs, 2)'; +costs_factor = H*costs_factor / sum(costs_factor); + +% quantize data to be between [0,nBins-1] if not already quantized +if( ~isa(data.X,'uint8') ) + xMin = min(X)-.01; + xMax = max(X)+.01; + xStep = (xMax-xMin) / (nBins-1); + X = uint8(bsxfun(@times,bsxfun(@minus,data.X,xMin),1./xStep)); +else + X = data.X; +end +data=struct( 'X',X, 'hs', hs, 'H', H, 'wts',wts, ... + 'xMin',xMin, 'xStep',xStep, 'xType',xType ); + +% make sure data has correct types +if(~isa(X,'uint8')), X=single(X); end +if(~isa(hs,'uint32')), hs=uint32(hs); end +if(~isa(wts,'single')), wts=single(wts); end + +% train M random trees on different subsets of data +prmTree = {nBins,xMin,xStep,H,fracFtrs,minCount,maxDepth,split,nThreads}; +if(fracData==1) + X1=X; hs1=hs; wts1=wts; +else + d=wswor(wts,round(N*fracData),4); X1=X(d,:); hs1=hs(d); + wts1=wts(d); wts1=wts1/sum(wts1); +end +tree = treeTrain(X1,hs1,wts1,costs,costs_factor,prmTree); +end + +function tree = treeTrain( X, hs, wts, costs, costs_factor, prmTree ) +% Train single random tree. +[nBins,xMin,xStep,H,fracFtrs,minCount,maxDepth,split,nThreads]=deal(prmTree{:}); +N=size(X,1); K=2*N-1; + +thrs=zeros(K,1,'single'); +distr=zeros(K,H,'single'); +fids=zeros(K,1,'uint32'); child=fids; count=fids; depth=fids; +hsn=cell(K,1); dids=cell(K,1); dids{1}=uint32(1:N); k=1; K=2; +while( k < K ) + % get node data and store distribution + dids1=dids{k}; dids{k}=[]; hs1=hs(dids1); n1=length(hs1); count(k)=n1; + wts1=wts(dids1); + pure=all(hs1(1)==hs1); + if(pure) + distr(k,hs1(1))=1; + hsn{k}=hs1(1); + else + % We use the data weights to compute the probability of each class in + % the node. + for i=1:H, distr(k,i)=sum(wts1(hs1==i)); end; + distr(k,:)=distr(k,:)/sum(wts1); + % In this case we use the minimum costs rule to assign the label + class_cost = distr(k,:)*costs; + [~, hsn{k}] = min(class_cost); + end; + + % if pure node or insufficient data don't train split + if( pure || n1<=minCount || depth(k)>maxDepth ), k=k+1; continue; end + + % train split and continue + F=size(X,2); + fids1=1:F; + if (fracFtrs<1), fids1=randperm(F,floor(F*fracFtrs)); end; % Random election features. + fids1=uint32(fids1); + + %---------------------------------- + [splitSt,thrsSt,gains]=multiclassQuantizedTreeTrain1(X,hs,... + wts,... + nBins, ... + dids1-1, ... + fids1-1, ... + H, ... + split,... + costs_factor,... + nThreads); + [~,fid]=min(splitSt); + thr=single(thrsSt(fid))+0.5; + gain=gains(fid); + %---------------------------------- + fid=fids1(fid); + left=X(dids1,fid)1e-10 && count0>=minChild && (n1-count0)>=minChild ) + if( gain>1e-10 && (any(left) && any(~left)) ) + thrs(k) = xMin(fid)+xStep(fid)*thr; + child(k)=K; fids(k)=fid-1; %thrs(k)=thr; + dids{K}=dids1(left); dids{K+1}=dids1(~left); + depth(K:K+1)=depth(k)+1; K=K+2; + end; k=k+1; +end +% create output model struct +K=1:K-1; +hsn=[hsn{K}]'; +tree=struct('fids',fids(K),'thrs',thrs(K),'child',child(K),... + 'distr',distr(K,:),'hs',hsn,'count',count(K),'depth',depth(K)); +end + +function ids = wswor( prob, N, trials ) +% Fast weighted sample without replacement. Alternative to: +% ids=datasample(1:length(prob),N,'weights',prob,'replace',false); +M=length(prob); assert(N<=M); if(N==M), ids=1:N; return; end +if(all(prob(1)==prob)), ids=randperm(M,N); return; end +cumprob=min([0 cumsum(prob)],1); assert(abs(cumprob(end)-1)<.01); +cumprob(end)=1; [~,ids]=histc(rand(N*trials,1),cumprob); +[s,ord]=sort(ids); K(ord)=[1; diff(s)]~=0; ids=ids(K); +if(length(ids)0), tree.child(tree.depth>=maxDepth) = 0; end +if(minWeight>0), tree.child(tree.weights<=minWeight) = 0; end +hs = tree.hs(forestInds(single(X),tree.thrs,tree.fids,tree.child,nThreads)); + +end diff --git a/classify/multiclassTreeTrain.m b/classify/multiclassTreeTrain.m new file mode 100755 index 00000000..94edfb9f --- /dev/null +++ b/classify/multiclassTreeTrain.m @@ -0,0 +1,185 @@ +function tree = multiclassTreeTrain( data, hs, varargin ) +% Train a multiclass tree with costs +% +% Dimensions: +% F - number features +% N - number input vectors +% H - number classes +% +% USAGE +% tree = multiclassTreeTrain( data, hs, [varargin] ) +% +% INPUTS +% data - [NxF] N length F feature vectors +% hs - [Nx1] or {Nx1} target output labels in [1,H] +% varargin - additional params (struct or name/value pairs) +% .H - [max(hs)] number of classes +% .costs - [HxH] H is the number of classes and C(i,j) is +% the cost of estimate class label as j whereas the +% ground thruth class is i. +% .N1 - [N] number of data points for training each tree +% .F1 - [sqrt(F)] number features to sample for each node split +% .split - ['gini'] optionss include 'gini', 'entropy' and 'twoing' +% .minCount - [1] minimum number of data points to allow split +% .minChild - [1] minimum number of data points allowed at child nodes +% .maxDepth - [64] maximum depth of tree +% .dWts - [] weights used for sampling and weighing each data point +% .fWts - [] weights used for sampling features +% .discretize - [] optional function mapping structured to class labels +% format: [hsClass,hBest] = discretize(hsStructured,H); +% +% OUTPUTS +% tree - learned tree model struct array w the following fields +% .fids - [Kx1] feature ids for each node +% .thrs - [Kx1] threshold corresponding to each fid +% .child - [Kx1] index of child for each node +% .distr - [KxH] prob distribution at each node +% .hs - [Kx1] or {Kx1} most likely label at each node +% .count - [Kx1] number of data points at each node +% .depth - [Kx1] depth of each node +% +% EXAMPLE +% N=10000; H=5; d=2; [xs0,hs0,xs1,hs1]=demoGenData(N,N,H,d,1,1); +% xs0=single(xs0); xs1=single(xs1); +% pTrain={'maxDepth',50,'F1',2,'M',150,'minChild',5}; +% tic, forest=forestTrain(xs0,hs0,pTrain{:}); toc +% hsPr0 = forestApply(xs0,forest); +% hsPr1 = forestApply(xs1,forest); +% e0=mean(hsPr0~=hs0); e1=mean(hsPr1~=hs1); +% fprintf('errors trn=%f tst=%f\n',e0,e1); figure(1); +% subplot(2,2,1); visualizeData(xs0,2,hs0); +% subplot(2,2,2); visualizeData(xs0,2,hsPr0); +% subplot(2,2,3); visualizeData(xs1,2,hs1); +% subplot(2,2,4); visualizeData(xs1,2,hsPr1); +% +% See also multiclassTreeApply +% +% Piotr's Image&Video Toolbox Version 3.24 +% Copyright 2013 Piotr Dollar. [pdollar-at-caltech.edu] +% Please email me if you find bugs, or have suggestions or questions! +% Licensed under the Simplified BSD License [see external/bsd.txt] + +% get additional parameters and fill in remaining parameters +dfs={ 'H',[], 'costs', [], 'N1',[], 'fracFtrs',[], 'split','gini', 'minCount',1, ... + 'minChild',1, 'maxDepth',[], 'dWts',[], 'fWts',[], 'discretize','' }; +[H,costs,N1,fracFtrs,splitStr,minCount,minChild,maxDepth,dWts,fWts,discretize] = ... + getPrmDflt(varargin,dfs,1); +[N,F]=size(data); assert(length(hs)==N); discr=~isempty(discretize); +minChild=max(1,minChild); minCount=max([1 minCount minChild]); +if(isempty(H)), H=max(hs); end; assert(discr || all(hs>0 & hs<=H)); +if(isempty(N1)), N1=round(N); end; N1=min(N,N1); +F1=F; if(~isempty(fracFtrs)), F1=min(F, round(fracFtrs*F)); end; +if(isempty(dWts)), dWts=ones(1,N,'single'); end; dWts=dWts/sum(dWts); +if(isempty(fWts)), fWts=ones(1,F,'single'); end; fWts=fWts/sum(fWts); +%split=find(strcmpi(splitStr,{'gini','entropy','twoing'}))-1; +split=find(strcmpi(splitStr,{'gini'}))-1; +if(isempty(split)), error('unknown splitting criteria: %s',splitStr); end + +if(isempty(costs)) + costs = ones(H,H); + % Make the costs matrix diagonal zeros. + costs = costs - diag(diag(data.costs)); +end +assert(size(costs, 1) == H); +assert(size(costs, 2) == H); + +% Compute multiplicative factor for probabilities of class in each node. +% This factors, that accounts for the cost, will take care of somewhat +% cost sensitive impurity computation at each node. +costs_factor = sum(costs, 2)'; +costs_factor = H*costs_factor / sum(costs_factor); + +% make sure data has correct types +if(~isa(data,'single')), data=single(data); end +if(~isa(hs,'uint32') && ~discr), hs=uint32(hs); end +if(~isa(fWts,'single')), fWts=single(fWts); end +if(~isa(dWts,'single')), dWts=single(dWts); end + +% train M random trees on different subsets of data +prmTree = {H,F1,minCount,minChild,maxDepth,fWts,split,discretize}; +if(N==N1) + data1=data; hs1=hs; dWts1=dWts; +else + d=wswor(dWts,N1,4); data1=data(d,:); hs1=hs(d); + dWts1=dWts(d); dWts1=dWts1/sum(dWts1); +end +tree = treeTrain(data1,hs1,dWts1,costs,costs_factor,prmTree); +end + +function tree = treeTrain( data, hs, dWts, costs, costs_factor, prmTree ) +% Train single random tree. +[H,F1,minCount,minChild,maxDepth,fWts,split,discretize]=deal(prmTree{:}); +N=size(data,1); K=2*N-1; + +thrs=zeros(K,1,'single'); +distr=zeros(K,H,'single'); +fids=zeros(K,1,'uint32'); child=fids; count=fids; depth=fids; +hsn=cell(K,1); dids=cell(K,1); dids{1}=uint32(1:N); k=1; K=2; +while( k < K ) + % get node data and store distribution + dids1=dids{k}; dids{k}=[]; hs1=hs(dids1); n1=length(hs1); count(k)=n1; + dWts1=dWts(dids1); + pure=all(hs1(1)==hs1); + if(pure) + distr(k,hs1(1))=1; + hsn{k}=hs1(1); + else + % We use the data weights to compute the probability of each class in + % the node. + for i=1:H, distr(k,i)=sum(dWts1(hs1==i)); end; + distr(k,:)=distr(k,:)/sum(dWts1); + % In this case we use the minimum costs rule to assign the label + class_cost = distr(k,:)*costs; + [~, hsn{k}] = min(class_cost); + end; + + % if pure node or insufficient data don't train split + if( pure || n1<=minCount || depth(k)>maxDepth ), k=k+1; continue; end + + % train split and continue + fids1=1:size(data,2); + if (F11e-10 && count0>=minChild && (n1-count0)>=minChild ) + child(k)=K; fids(k)=fid-1; thrs(k)=thr; + dids{K}=dids1(left); dids{K+1}=dids1(~left); + depth(K:K+1)=depth(k)+1; K=K+2; + end; k=k+1; +end +% create output model struct +K=1:K-1; +%if(discr) +% hsn={hsn(K)}; +%else + hsn=[hsn{K}]'; +%end +tree=struct('fids',fids(K),'thrs',thrs(K),'child',child(K),... + 'distr',distr(K,:),'hs',hsn,'count',count(K),'depth',depth(K)); +end + +function ids = wswor( prob, N, trials ) +% Fast weighted sample without replacement. Alternative to: +% ids=datasample(1:length(prob),N,'weights',prob,'replace',false); +M=length(prob); assert(N<=M); if(N==M), ids=1:N; return; end +if(all(prob(1)==prob)), ids=randperm(M,N); return; end +cumprob=min([0 cumsum(prob)],1); assert(abs(cumprob(end)-1)<.01); +cumprob(end)=1; [~,ids]=histc(rand(N*trials,1),cumprob); +[s,ord]=sort(ids); K(ord)=[1; diff(s)]~=0; ids=ids(K); +if(length(ids) +#include +#include +#include +#include +#include + +#ifdef USEOMP +#include +#endif + +typedef unsigned char uint8; +typedef unsigned int uint32; +#define gini(p) p*p + +// construct cdf given data vector and wts +// - Data is indexed between [0, 255] +// - Class labels are ints. +// - cdfs is a vector of H (number of classes) vectors +// of 256 components each (possible values for each indexed data). +void constructCdfPerClass( uint8* data, uint32 *hs, float *wts, + int nBins, int N, uint32 *dids, + std::vector >& cdfs ) +{ + for(int i=0; i& cdf ) +{ + for(int i=0; ibbLoad). 'nPos' controls the +% total number of positives to sample for training (if nPos=inf the number +% of positives is limited by the training set). 'nNeg' controls the total +% number of negatives to sample and 'nPerNeg' limits the number of +% negatives to sample per image. 'nAccNeg' controls the maximum number of +% negatives that can accumulate over multiple stages of bootstrapping. +% Define 'pJitter' to jitter the positives (see jitterImage.m) and thus +% artificially increase the number of positive training windows. Finally if +% 'winsSave' is true cropped windows are saved to disk as a mat file. +% +% USAGE +% detector = acfTrainBadacostTrees.m ( opts ) +% opts = acfTrainTrainBadacostTrees.m () +% +% INPUTS +% opts - parameters (struct or name/value pairs) +% (1) features and model: +% .aRatioType - ['mean'] per class computation bb aspect ratio +% computation (see computePerClassAspectRatios) +% .aRatioFixedWidth [0] +% .pPyramid - [{}] params for creating pyramid (see chnsPyramid) +% .filters - [] [wxwxnChnsxnFilter] filters or [wFilter,nFilter] +% .modelDs - [] model height+width without padding (eg [100 41]) +% .modelDsPad - [] model height+width with padding (eg [128 64]) +% .pNms - [..] params for non-maximal suppression (see bbNms.m) +% .stride - [4] spatial stride between detection windows +% .cascCal - [.1] cascade calibration (affects speed/accuracy) +% .nWeak - [128] vector defining number weak clfs per stage +% .pBoost - [..] parameters for boosting (see badacostTrain.m) +% .seed - [0] seed for random stream (for reproducibility) +% .name - [''] name to prepend to clf and log filenames +% (2) training data location and amount: +% .posGtDir - [''] dir containing ground truth +% .posImgDir - [''] dir containing full positive images +% .negImgDir - [''] dir containing full negative images +% .posWinDir - [''] dir containing cropped positive windows +% .negWinDir - [''] dir containing cropped negative windows +% .imreadf - [@imread] optional custom function for reading images +% .imreadp - [{}] optional custom parameters for imreadf +% .pLoad - [..] params for bbGt>bbLoad (see bbGt) +% .nPos - [inf] max number of pos windows to sample +% .nNeg - [5000] max number of neg windows to sample +% .nPerNeg - [25] max number of neg windows to sample per image +% .nAccNeg - [10000] max number of neg windows to accumulate +% .pJitter - [{}] params for jittering pos windows (see jitterImage) +% (3) save training results: +% .winsSave - [0] if true save cropped windows at each stage to disk +% .savePath - ['.'] path to save results in. +% +% OUTPUTS +% detector - trained object detector +% .opts - input parameters used for model training +% .clf - learned boosted tree classifier (see badacostTrain) +% .info - info about channels (see chnsCompute.m) +% +% EXAMPLE +% +% See also acfDetectBadacostTrees, acfTestBadacostTrees, chnsCompute, +% chnsPyramid, badacostTrain, bbGt, bbNms, jitterImage +% +% Piotr's Computer Vision Matlab Toolbox Version NEW +% Copyright 2014 Piotr Dollar. [pdollar-at-gmail.com] +% Licensed under the Simplified BSD License [see external/bsd.txt] + +% initialize opts struct +opts = initializeOpts( varargin{:} ); +if(nargin==0), detector=opts; return; end + +% load or initialize detector and begin logging +nm=fullfile(opts.savePath, [opts.name 'Detector.mat']); t=exist(nm,'file'); +if(t), if(nargout), t=load(nm); detector=t.detector; end; return; end +t=fileparts(nm); if(~isempty(t) && ~exist(t,'dir')), mkdir(t); end +detector = struct( 'opts',opts, 'clf',[], 'info',[] ); +startTrain=clock; nm=fullfile(opts.savePath, [opts.name 'Log.txt']); +if(exist(nm,'file')), diary(nm); diary('off'); delete(nm); end; diary(nm); +RandStream.setGlobalStream(RandStream('mrg32k3a','Seed',opts.seed)); + +% iterate bootstraping and training +for stage = 0:numel(opts.nWeak)-1 + diary('on'); fprintf([repmat('-',[1 75]) '\n']); + fprintf('Training stage %i\n',stage); startStage=clock; + + % sample positives and compute info about channels + if( stage==0 ) + [Is1,Ls1,IsOrig1] = sampleWins( detector, stage, 1 ); + t=ndims(Is1); if(t==3), t=Is1(:,:,1); else t=Is1(:,:,:,1); end + t=chnsCompute(t,opts.pPyramid.pChns); detector.info=t.info; + end + + % compute local decorrelation filters + if( stage==0 && length(opts.filters)==2 ) + fs = opts.filters; opts.filters = []; + X1 = chnsCompute1( IsOrig1, opts ); + fs = chnsCorrelation( X1, fs(1), fs(2) ); + opts.filters = fs; detector.opts.filters = fs; + end + + % compute lambdas + if( stage==0 && isempty(opts.pPyramid.lambdas) ) + fprintf('Computing lambdas... '); start=clock; + ds=size(IsOrig1); ds(1:end-1)=1; IsOrig1=mat2cell2(IsOrig1,ds); + ls=chnsScaling(opts.pPyramid.pChns,IsOrig1,0); + ls=round(ls*10^5)/10^5; detector.opts.pPyramid.lambdas=ls; + fprintf('done (time=%.0fs).\n',etime(clock,start)); + end + + % compute features for positives + if( stage==0 ) + X1 = chnsCompute1( Is1, opts ); + X1 = reshape(X1,[],size(X1,4))'; + clear Is1 IsOrig1 ls fs ds t; + end + + % sample negatives and compute features + [Is0, ~] = sampleWins( detector, stage, 0 ); + X0 = chnsCompute1( Is0, opts ); clear Is0; + X0 = reshape(X0,[],size(X0,4))'; + + % accumulate negatives from previous stages + if( stage>0 ) + n0=size(X0p,1); n1=max(opts.nNeg,opts.nAccNeg)-size(X0,1); + if(n0>n1 && n1>0), X0p=X0p(randSample(n0,n1),:); end + if(n0>0 && n1>0), X0=[X0p; X0]; end %#ok + end; X0p=X0; + +% save_file = fullfile(opts.savePath, sprintf('%s_STAGE_%d_NEGATIVE_DATA.mat', opts.name, stage)); +% if ~exist(save_file, 'file') +% save(save_file, 'X0p'); +% else +% load(save_file); +% end + + % train boosted BAdaCost clf and calibrate the cascade threshold. + save_file_detector = fullfile(opts.savePath, sprintf('%s_STAGE_%d_Detector.mat', opts.name, stage)); + if ~exist(save_file_detector, 'file') + detector.opts.pBoost = opts.pBoost; + detector.opts.pBoost.nWeak = opts.nWeak(stage+1); + [detector.clf, cost_curve] = badacostWithTreesTrain(X0, X1, Ls1, detector.opts.pBoost); + + % Plot and save cost curve figure + h = figure; + plot(cost_curve); + xlabel('#weak learners'); + ylabel('cost'); + cost_curve_file = fullfile(opts.savePath, sprintf('%s_STAGE_%d_COST_CURVE', opts.name, stage)); + save([cost_curve_file '.txt'], '-ascii', 'cost_curve'); + figure(h); + saveas(h, [cost_curve_file '.eps'], 'epsc'); +% saveas(h, [cost_curve_file '.fig'], 'fig'); + +% [detector.opts.cascThr, h_calCascFig] = badacostCalibrateCascade(X0, X1, detector.clf, opts.cascCal); + [detector.opts.cascThr, h_calCascFig] = badacostCalibrateCascade(X0, X1, detector.clf); + % Watch out!!! This is faster but you can miss detections!! +% detector.opts.cascThr=-2; + + % Compute the Training Confusion Matrix: + xx = [X0; X1]; + yy = [ones(1,size(X0,1)), Ls1+1]; + yy_predicted = badacostWithTreesApply(xx, detector.clf); + + ConfMatrix = confusionmat(yy, yy_predicted); + disp('Confusion Matrix:'); + disp(ConfMatrix); + conf_mat_file = fullfile(opts.savePath, sprintf('%s_STAGE_%d_CONFUSION_MATRIX', opts.name, stage)); + save([conf_mat_file '.mat'], 'ConfMatrix'); + save([conf_mat_file '.txt'], '-ascii', 'ConfMatrix'); + + % Plot cascade calibration figure + casc_calib_file = fullfile(opts.savePath, sprintf('%s_STAGE_%d_CASCADE_CALIBRATION', opts.name, stage)); + figure(h_calCascFig); + saveas(h_calCascFig,[casc_calib_file '.eps'], 'epsc'); +% saveas(h_calCascFig,[casc_calib_file '.fig'], 'fig'); + + % Save trained detector + save(save_file_detector, 'detector'); + else + load(save_file_detector); + + %% Uncomment if you want to recompute the training confusion matrix. + % Compute the Training Confusion Matrix: + xx = [X0; X1]; + yy = [ones(1,size(X0,1)), Ls1+1]; + yy_predicted = badacostWithTreesApply(xx, detector.clf); + + ConfMatrix = confusionmat(yy, yy_predicted); + disp('Confusion Matrix:'); + disp(ConfMatrix); + conf_mat_file = fullfile(opts.savePath, sprintf('%s_STAGE_%d_CONFUSION_MATRIX', opts.name, stage)); + save([conf_mat_file '.mat'], 'ConfMatrix'); + save([conf_mat_file '.txt'], '-ascii', 'ConfMatrix'); + end + + % update log + fprintf('Done training stage %i (time=%.0fs).\n',... + stage,etime(clock,startStage)); diary('off'); +end + +% JMBUENA: Compute the window size for every subclass of the +% positive metaclass. We are going to keep this window size +% within the detector classifier. We will train the detector with +% fixed big window (selecting the features in this window) but we +% finally return the "per class" best fit window. +detector.clf.aRatio = computePerClassAspectRatios(detector.opts.posImgDir, ... + detector.opts.posGtDir, detector.opts.pLoad, opts.aRatioType); +detector.clf.aRatioFixedWidth = opts.aRatioFixedWidth; + +% save detector +save(fullfile(opts.savePath, [opts.name 'Detector.mat']),'detector'); + +% finalize logging +diary('on'); fprintf([repmat('-',[1 75]) '\n']); +fprintf('Done training (time=%.0fs).\n',... + etime(clock,startTrain)); diary('off'); +end + +function opts = initializeOpts( varargin ) +% Initialize opts struct. +dfs= {'aRatioType', 'mean', ... + 'pPyramid',{}, 'filters', [], ... + 'modelDs',[100 41], 'modelDsPad',[128 64], ... + 'pNms',struct(), 'stride',4, 'cascCal',.1, ... + 'nWeak',128, 'pBoost', {}, 'seed',0, 'name','', ..., + 'aRatioFixedWidth', 0, ... + 'posGtDir','', ... + 'posImgDir','', 'negImgDir','', 'posWinDir','', 'negWinDir','', ... + 'imreadf',@imread, 'imreadp',{}, 'pLoad',{}, 'nPos',inf, 'nNeg',5000, ... + 'nPerNeg',25, 'nAccNeg',10000, 'pJitter',{}, 'winsSave', 0, 'savePath', '.'}; +opts = getPrmDflt(varargin,dfs,1); +% fill in remaining parameters +p=chnsPyramid([],opts.pPyramid); p=p.pPyramid; +p.minDs=opts.modelDs; shrink=p.pChns.shrink; +opts.modelDsPad=ceil(opts.modelDsPad/shrink)*shrink; +p.pad=ceil((opts.modelDsPad-opts.modelDs)/shrink/2)*shrink; +p=chnsPyramid([],p); p=p.pPyramid; p.complete=1; +p.pChns.complete=1; opts.pPyramid=p; +% initialize pNms, pBoost, pBoost.pTree, and pLoad +dfs={ 'type','maxg', 'overlap',.65, 'ovrDnm','min' }; +opts.pNms=getPrmDflt(opts.pNms,dfs,-1); +dfs={ 'Cost',{}, 'stopAtNegWeight', 1, 'shrinkage', {}, 'resampling', {}, 'nWeak',0, ... + 'minDepth', 1, 'maxDepth', 4, 'verbose', 16, 'quantized', 0, ... + 'use_rus', 0, 'fracFtrs', 1, ... + 'variable_depth', 0}; +opts.pBoost=getPrmDflt(opts.pBoost,dfs,1); +%dfs={'nBins',256,'maxDepth',2,'minWeight',.01,'fracFtrs',1,'nThreads',1e5}; +%opts.pBoost.pTree=getPrmDflt(opts.pBoost.pTree,dfs,1); +opts.pLoad=getPrmDflt(opts.pLoad,{'squarify',{0,1}},-1); +opts.pLoad.squarify{2}=opts.modelDs(2)/opts.modelDs(1); +end + +function [Is,Ls,IsOrig] = sampleWins( detector, stage, positive ) +% Load or sample windows for training detector. +opts=detector.opts; start=clock; +if( positive ), n=opts.nPos; else n=opts.nNeg; end +% JMBUENA FIXME! How to deal with positive subclass labels from cropped images? +if( positive ), crDir=opts.posWinDir; else crDir=opts.negWinDir; end +if( exist(crDir,'dir') && stage==0 ) + % if window directory is specified simply load windows + fs=bbGt('getFiles',{crDir}); nImg=length(fs); assert(nImg>0); + if(nImg>n), fs=fs(:,randSample(nImg,n)); else n=nImg; end + for i=1:n, fs{i}=[{opts.imreadf},fs(i),opts.imreadp]; end + Is=cell(1,n); parfor i=1:n, Is{i}=feval(fs{i}{:}); end +else + % sample windows from full images using sampleWins1() + hasGt=positive||isempty(opts.negImgDir); fs={opts.negImgDir}; + if(hasGt), fs={opts.posImgDir,opts.posGtDir}; end + fs=bbGt('getFiles',fs); nImg=size(fs,2); assert(nImg>0); + if(~isinf(n)), fs=fs(:,randperm(nImg)); end; + Is=cell(nImg*1000,1); Ls=cell(nImg*1000,1); + diary('off'); tid=ticStatus('Sampling windows',1,30); k=0; i=0; batch=64; + while( i + gt=[]; objs=[]; if(hasGt), [objs,gt]=bbGt('bbLoad',fs{2,ij},opts.pLoad); end + [Is1{j}, lbls{j}] = sampleWins1( I, objs, gt, detector, stage, positive ); + end + Is1=[Is1{:}]; k1=length(Is1); Is(k+1:k+k1)=Is1; + lbls=[lbls{:}]; Ls(k+1:k+k1)=lbls; k=k+k1; + if(k>n), inds=randSample(k,n); Is=Is(inds); Ls=Ls(inds); k=n; end + i=i+batch; tocStatus(tid,max(i/nImg,k/n)); + end + Is=Is(1:k); Ls=Ls(1:k); diary('on'); + fprintf('Sampled %i windows from %i images.\n',k,i); +end +% optionally jitter positive windows +if(length(Is)<2), Is={}; return; end +nd=ndims(Is{1})+1; Is=cat(nd,Is{:}); Ls=cat(2,Ls{:}); IsOrig=Is; +if( positive && isstruct(opts.pJitter) ) + opts.pJitter.hasChn=(nd==4); Is=jitterImage(Is,opts.pJitter); + ds=size(Is); + Ls=repmat(Ls, [ds(nd),1]); + Ls=reshape(Ls,[1,ds(nd)*length(Ls)]); + ds(nd)=ds(nd)*ds(nd+1); Is=reshape(Is,ds(1:nd)); +end +% make sure dims are divisible by shrink and not smaller than modelDsPad +ds=size(Is); cr=rem(ds(1:2),opts.pPyramid.pChns.shrink); s=floor(cr/2)+1; +e=ceil(cr/2); Is=Is(s(1):end-e(1),s(2):end-e(2),:,:); ds=size(Is); +if(any(ds(1:2)1/50}),4)); + sig=reshape(full(convmtx2(sig,w,w)),wp+w-1,wp+w-1,[]); + sig=reshape(sig(w:wp,w:wp,:),w^2,w^2); sig=(sig+sig')/2; + % compute filters for each channel from sig (sorted by eigenvalue) + [fs,D]=eig(sig); fs=reshape(fs,w,w,[]); + [~,ord]=sort(diag(D),'descend'); + fs=flipdim(flipdim(fs,1),2); %#ok + filters(:,:,i,:)=fs(:,:,ord(1:nFilter)); +end +fprintf('done (time=%.0fs).\n',etime(clock,start)); +end diff --git a/detector/bbApply.m b/detector/bbApply.m index c24593a3..8167b8f0 100644 --- a/detector/bbApply.m +++ b/detector/bbApply.m @@ -253,11 +253,68 @@ if(nargin<3 || isempty(ar)), ar=1; end; bbr=bb; if(flag==4), bbr=resize(bb,0,0,ar); return; end for i=1:size(bb,1), p=bb(i,1:4); - usew = (flag==0 && p(3)>p(4)*ar) || (flag==1 && p(3)p(4)*ar)) || ((flag==1) && (p(3)p(4)*ar)); + usew = usew || ((flag==1) && (p(3)embed, rectangle +[n,m]=size(bb); if(n==0), hs=[]; return; end +if(nargin<2 || isempty(col)), col=[]; end +if(nargin<3 || isempty(lw)), lw=2; end +if(nargin<4 || isempty(ls)), ls='-'; end +if(nargin<5 || isempty(prop)), prop={}; end +if(nargin<6 || isempty(ids)), ids=ones(1,n); end +% prepare display properties +prop=['LineWidth' lw 'LineStyle' ls prop 'EdgeColor']; +tProp={'FontSize',12,'color','y','FontWeight','bold',... + 'VerticalAlignment','bottom'}; k=max(ids); +if(isempty(col)), if(k==1), col='g'; else col=hsv(k); end; end +if(size(col,1)=7 + hs(b+2*n)=text(bb(b,1),bb(b,2)+bb(b,4),num2str(bb(b,7)),tProp{:}); + elseif size(bb,2)==6 + hs(b+2*n)=text(bb(b,1),bb(b,2)+bb(b,4),num2str(bb(b,6)),tProp{:}); + end; +end; + +end + function hs = draw( bb, col, lw, ls, prop, ids ) % Draw single or multiple bbs to image (calls rectangle()). % diff --git a/detector/bbGt.m b/detector/bbGt.m index 0b2da2a1..3bb88002 100644 --- a/detector/bbGt.m +++ b/detector/bbGt.m @@ -126,7 +126,7 @@ % EXAMPLE % % See also bbGt, bbGt>bbLoad -vers=3; fid=fopen(fName,'w'); assert(fid>0); +vers=4; fid=fopen(fName,'w'); assert(fid>0); fprintf(fid,'%% bbGt version=%i\n',vers); objs=set(objs,'bb',round(get(objs,'bb'))); objs=set(objs,'bbv',round(get(objs,'bbv'))); @@ -134,7 +134,7 @@ for i=1:length(objs) o=objs(i); bb=o.bb; bbv=o.bbv; fprintf(fid,['%s' repmat(' %i',1,11) '\n'],o.lbl,... - bb,o.occ,bbv,o.ign,o.ang); + bb,o.occ,bbv,o.ign,o.ang,o.subclass); end fclose(fid); end @@ -187,6 +187,10 @@ % fName - name of text file % pLoad - parameters (struct or name/value pairs) % .format - [0] gt format 0:default, 1:PASCAL, 2:ImageNet +% .nOrient - [20] Number of object orientations with KITTI format (38) +% .hMin - [0] For KITTI format (38) +% .occlMax - [1] For KITTI format (38) +% .truncMax - [.3] For KITTI format (38) % .ellipse - [1] controls how oriented bb is converted to regular bb % .squarify - [] controls optional reshaping of bbs to fixed aspect ratio % .lbls - [] return objs with these labels (or [] to return all) @@ -209,11 +213,17 @@ % See also bbGt, bbGt>bbSave % get parameters -df={'format',0,'ellipse',1,'squarify',[],'lbls',[],'ilbls',[],'hRng',[],... +df={'format',0,'nOrient',20,'hMin',0,'occlMax',1,'truncMax',3e-1,... + 'ellipse',1,'squarify',[],'lbls',[],'ilbls',[],'hRng',[],... 'wRng',[],'aRng',[],'arRng',[],'oRng',[],'xRng',[],'yRng',[],'vRng',[]}; -[format,ellipse,sqr,lbls,ilbls,hRng,wRng,aRng,arRng,oRng,xRng,yRng,vRng]... +[format,nOrient,hMin,occlMax,truncMax,ellipse,sqr,lbls,ilbls,hRng,wRng,aRng,arRng,oRng,xRng,yRng,vRng]... = getPrmDflt(varargin,df,1); +% if (~isempty(sqr)) +% varargin{1} +% disp(sqr); +% end + % load objs if( format==0 ) % load objs stored in default format @@ -222,9 +232,11 @@ try v=textscan(fId,'%% bbGt version=%d'); v=v{1}; catch, end %#ok if(isempty(v)), v=0; end % read in annotation (m is number of fields for given version v) - if(all(v~=[0 1 2 3])), error('Unknown version %i.',v); end - frmt='%s %d %d %d %d %d %d %d %d %d %d %d'; - ms=[10 10 11 12]; m=ms(v+1); frmt=frmt(1:2+(m-1)*3); + if(all(v~=[0 1 2 3 4])), error('Unknown version %i.',v); end + frmt='%s %d %d %d %d %d %d %d %d %d %d %d %d'; + ms=[10 10 11 12 13]; + m=ms(v+1); + frmt=frmt(1:2+(m-1)*3); in=textscan(fId,frmt); for i=2:m, in{i}=double(in{i}); end; fclose(fId); % create objs struct from read in fields n=length(in{1}); objs=create(n); @@ -233,8 +245,11 @@ for i=1:n, objs(i).bb=bb(i,:); objs(i).bbv=bbv(i,:); end if(m>=11), for i=1:n, objs(i).ign=in{11}(i); end; end if(m>=12), for i=1:n, objs(i).ang=in{12}(i); end; end + for i=1:n, objs(i).subclass = 1; end; + if(m>=13), for i=1:n, objs(i).subclass=in{13}(i); end; end elseif( format==1 ) % load objs stored in PASCAL VOC format + if(exist('PASreadrecord.m','file')~=2) error('bbLoad() requires the PASCAL VOC code.'); end os=PASreadrecord(fName); os=os.objects; @@ -246,6 +261,7 @@ objs(i).occ=os(i).occluded || os(i).truncated; if(objs(i).occ), objs(i).bbv=bb; end end + objs(i).subclass = 1; elseif( format==2 ) if(exist('VOCreadxml.m','file')~=2) error('bbLoad() requires the ImageNet dev code.'); end @@ -257,6 +273,55 @@ bb(3)=bb(3)-bb(1); bb(4)=bb(4)-bb(2); objs(i).bb=bb; objs(i).lbl=os(i).name; end + objs(i).subclass = 1; +elseif( format==38 ) % KITTI database. + % KITTI database, quantized orientation, for cars/pedestrian/bycicles + if(exist('readKITTILabels.m','file')~=2) + error('bbLoad() requires the jmbuena''s KITTI scripts.'); end + os = readKITTILabels(fName); + if(exist('quantize_KITTI_alpha_angle.m','file')~=2) + error('bbLoad() requires the jmbuena''s KITTI scripts.'); end + + DEBUG = 0; + if DEBUG + SAVE_PATH = 'SUBCLASSES'; + % DEBUG: Save image files to the especific class folder: + parts = strsplit(fName, '/'); + [path, name, ext] = fileparts(fName); + image_path = fullfile(path(1:end-length(parts{end-1})), 'image_2', [name '.png']); + Idebug = imread(image_path); + end; + + n=length(os); objs=create(n); + for i=1:n + objs(i).lbl=os(i).type; + bb=[os(i).x1 os(i).y1 (os(i).x2-os(i).x1+1) (os(i).y2-os(i).y1+1)]; + objs(i).bb=bb; + objs(i).lbl=os(i).type; + % FIXME!!! Add truncMax ... it is not working :-(. + objs(i).ign=strcmp(os(i).type, 'DontCare') || (os(i).occlusion>occlMax) ... + || (os(i).truncation>truncMax) ... + || ((os(i).y2-os(i).y1+1) < hMin); + objs(i).occ=(os(i).truncation>0.3) || (os(i).occlusion > occlMax); + if(objs(i).occ), objs(i).bbv=bb; end + objs(i).subclass = quantize_KITTI_alpha_angle(os(i).alpha, nOrient); + + if DEBUG && ~objs(i).ign + full_path = fullfile(SAVE_PATH, sprintf('%d', objs(i).subclass)); + if ~exist(full_path, 'dir') + mkdir(full_path); + end + y1_ = max(0, round(os(i).y1)+1); + y2_ = min(round(os(i).y2)+1, size(Idebug,1)); + x1_ = max(0, round(os(i).x1)+1); + x2_ = min(round(os(i).x2)+1, size(Idebug,2)); + %if strcmp(os(i).type,'Car') | strcmp(os(i).type,'Van') | strcmp(os(i).type,'Truck') | strcmp(os(i).type,'Tram') + I2 = Idebug(y1_:y2_, x1_:x2_, :); + if ~isempty(I2) + imwrite(I2, fullfile(full_path, sprintf('%s_%d_t_%3.3f_o_%d.png',name,i, os(i).truncation, os(i).occlusion))); + end + end + end else error('bbLoad() unknown format: %i',format); end @@ -499,7 +564,7 @@ end end -function [gt0,dt0] = loadAll( gtDir, dtDir, pLoad ) +function [gt0,dt0] = loadAll( gtDir, dtDir, pLoad, isMulticlass ) % Load all ground truth and detection bbs in given directories. % % Loads each ground truth (gt) annotation in gtDir and the corresponding @@ -516,12 +581,13 @@ % The output of this function can be used in bbGt>evalRes(). % % USAGE -% [gt0,dt0] = bbGt( 'loadAll', gtDir, [dtDir], [pLoad] ) +% [gt0,dt0] = bbGt( 'loadAll', gtDir, [dtDir], [pLoad], [isMulticlass]) % % INPUTS % gtDir - location of ground truth % dtDir - [] optional location of detections % pLoad - {} params for bbGt>bbLoad() (determine format/filtering) +% isMulticlass - [0] % % OUTPUTS % gt0 - {1xn} loaded ground truth bbs (each is a mx5 array of bbs) @@ -534,6 +600,7 @@ % get list of files if(nargin<2), dtDir=[]; end if(nargin<3), pLoad={}; end +if(nargin<4), isMulticlass=0; end if(isempty(dtDir)), fs=getFiles({gtDir}); gtFs=fs(1,:); else dtFile=length(dtDir)>4 && strcmp(dtDir(end-3:end),'.txt'); if(dtFile), dirs={gtDir}; else dirs={gtDir,dtDir}; end @@ -544,24 +611,34 @@ % load ground truth persistent keyPrv gtPrv; key={gtDir,pLoad}; n=length(gtFs); if(isequal(key,keyPrv)), gt0=gtPrv; else gt0=cell(1,n); - for i=1:n, [~,gt0{i}]=bbLoad(gtFs{i},pLoad); end + for i=1:n + [objs,gt0{i}]=bbLoad(gtFs{i},pLoad); + if isMulticlass && (length(objs)>0) + gt0{i}(:,size(gt0{i},2)+1) =[objs(:).subclass]'; + end + end gtPrv=gt0; keyPrv=key; end % load detections if(isempty(dtDir) || nargout<=1), dt0=cell(0); return; end +if isMulticlass + dimMax = 6; +else + dimMax = 5; +end; if(iscell(dtFs)), dt0=cell(1,n); for i=1:n, dt1=load(dtFs{i},'-ascii'); - if(numel(dt1)==0), dt1=zeros(0,5); end; dt0{i}=dt1(:,1:5); end + if(numel(dt1)==0), dt1=zeros(0,5); end; dt0{i}=dt1(:,1:dimMax); end else - dt1=load(dtFs,'-ascii'); if(numel(dt1)==0), dt1=zeros(0,6); end + dt1=load(dtFs,'-ascii'); if(numel(dt1)==0), dt1=zeros(0,dimMax+1); end ids=dt1(:,1); assert(max(ids)<=n); - dt0=cell(1,n); for i=1:n, dt0{i}=dt1(ids==i,2:6); end + dt0=cell(1,n); for i=1:n, dt0{i}=dt1(ids==i,2:dimMax+1); end end end -function [gt,dt] = evalRes( gt0, dt0, thr, mul ) +function [gt,dt] = evalRes( gt0, dt0, thr, mul, isMulticlass) % Evaluates detections against ground truth data. % % Uses modified Pascal criteria that allows for "ignore" regions. The @@ -598,10 +675,19 @@ % dt0 - [nx5] detection results array with rows [x y w h score] % thr - [.5] the threshold on oa for comparing two bbs % mul - [0] if true allow multiple matches to each gt +% isMulticlass - [0] % % OUTPUTS +% if isMulticlass=0 % gt - [mx5] ground truth results [x y w h match] % dt - [nx6] detection results [x y w h score match] +% if isMulticlass=1 +% gt - [mx7] ground truth results [x y w h match gt_subclass dt_subclass] +% dt - [nx7] detection results [x y w h score match dt_subclass] +% +% Note: Every subclass label only takes into account the positive +% subclasses (the background is not the label=1, subclass label=1 refers +% to the first positive meta-class label. % % EXAMPLE % @@ -610,28 +696,49 @@ % get parameters if(nargin<3 || isempty(thr)), thr=.5; end if(nargin<4 || isempty(mul)), mul=0; end +if(nargin<5 || isempty(isMulticlass)), isMulticlass=0; end % if gt0 and dt0 are cell arrays run on each element in turn if( iscell(gt0) && iscell(dt0) ), n=length(gt0); assert(length(dt0)==n); gt=cell(1,n); dt=gt; - for i=1:n, [gt{i},dt{i}] = evalRes(gt0{i},dt0{i},thr,mul); end; return; + for i=1:n, [gt{i},dt{i}] = evalRes(gt0{i},dt0{i},thr,mul,isMulticlass); end; return; end % check inputs -if(isempty(gt0)), gt0=zeros(0,5); end -if(isempty(dt0)), dt0=zeros(0,5); end -assert( size(dt0,2)==5 ); nd=size(dt0,1); -assert( size(gt0,2)==5 ); ng=size(gt0,1); +if ~isMulticlass + if(isempty(gt0)), gt0=zeros(0,5); end + if(isempty(dt0)), dt0=zeros(0,5); end + assert( size(dt0,2)==5 ); + assert( size(gt0,2)==5 ); +else + if(isempty(gt0)), gt0=zeros(0,6); end + if(isempty(dt0)), dt0=zeros(0,6); end + assert( size(dt0,2)==6 ); + assert( size(gt0,2)==6 ); +end +nd=size(dt0,1); +ng=size(gt0,1); % sort dt highest score first, sort gt ignore last [~,ord]=sort(dt0(:,5),'descend'); dt0=dt0(ord,:); [~,ord]=sort(gt0(:,5),'ascend'); gt0=gt0(ord,:); -gt=gt0; gt(:,5)=-gt(:,5); dt=dt0; dt=[dt zeros(nd,1)]; - +gt=gt0; gt(:,5)=-gt(:,5); dt=dt0; +if isMulticlass + dt=[dt zeros(nd,1)]; + dt(:,7) = dt0(:,6); + dt(:,6) = zeros(nd,1); + gt=[gt zeros(ng,1)]; +else + dt=[dt zeros(nd,1)]; +end + % Attempt to match each (sorted) dt to each (sorted) gt oa = compOas( dt(:,1:4), gt(:,1:4), gt(:,5)==-1 ); for d=1:nd bstOa=thr; bstg=0; bstm=0; % info about best match so far + if isMulticlass + bstSubclass=0; + end; for g=1:ng % if this gt already matched, continue to next gt m=gt(g,5); if( m==1 && ~mul ), continue; end @@ -640,10 +747,21 @@ % compute overlap area, continue to next gt unless better match made if(oa(d,g)evalRes dfs={'evShow',1,'gtShow',1,'dtShow',1,'cols','krg',... - 'gtLs','-','dtLs','--','lw',3}; -[evShow,gtShow,dtShow,cols,gtLs,dtLs,lw]=getPrmDflt(varargin,dfs,1); + 'gtLs','-','dtLs','--','lw',3, 'isMulticlass', 0}; +[evShow,gtShow,dtShow,cols,gtLs,dtLs,lw,isMulticlass]=getPrmDflt(varargin,dfs,1); % optionally display image if(ischar(I)), I=imread(I); end if(~isempty(I)), hImg=im(I,[],0); title(''); end +%if(~isempty(I)), hImg=imshow(I,'Border','tight'); title(''); end % display bbs with or w/o color coding based on output of evalRes hold on; hs=cell(1,1000); k=0; if( evShow ) - if(gtShow), for i=1:size(gt,1), k=k+1; - hs{k}=bbApply('draw',gt(i,1:4),cols(gt(i,5)+2),lw,gtLs); end; end - if(dtShow), for i=1:size(dt,1), k=k+1; - hs{k}=bbApply('draw',dt(i,1:5),cols(dt(i,6)+2),lw,dtLs); end; end + if(gtShow) + for i=1:size(gt,1) + k=k+1; + if isMulticlass + hs{k}=bbApply('drawMulticlass',gt(i,1:4),cols(gt(i,5)+2),lw,gtLs); + else + hs{k}=bbApply('draw',gt(i,1:4),cols(gt(i,5)+2),lw,gtLs); + end; + end; + end + if(dtShow) + for i=1:size(dt,1) + k=k+1; + if isMulticlass + hs{k}=bbApply('drawMulticlass',dt(i,:),cols(dt(i,6)+2),lw,dtLs); + else + hs{k}=bbApply('draw',dt(i,1:5),cols(dt(i,6)+2),lw,dtLs); + end; + end; + end; else - if(gtShow), k=k+1; hs{k}=bbApply('draw',gt(:,1:4),cols(3),lw,gtLs); end - if(dtShow), k=k+1; hs{k}=bbApply('draw',dt(:,1:5),cols(3),lw,dtLs); end + if isMulticlass + if(gtShow), k=k+1; hs{k}=bbApply('drawMulticlass',gt(:,1:4),cols(3),lw,gtLs); end +% if(dtShow), k=k+1; hs{k}=bbApply('drawMulticlass',dt(:,1:6),cols(3),lw,dtLs); end + if(dtShow), k=k+1; hs{k}=bbApply('drawMulticlass',dt,cols(3),lw,dtLs); end + else + if(gtShow), k=k+1; hs{k}=bbApply('draw',gt(:,1:4),cols(3),lw,gtLs); end + if(dtShow), k=k+1; hs{k}=bbApply('draw',dt,cols(3),lw,dtLs); end + end end hs=[hs{:}]; hold off; end diff --git a/detector/computePerClassAspectRatios.m b/detector/computePerClassAspectRatios.m new file mode 100755 index 00000000..a0700e8a --- /dev/null +++ b/detector/computePerClassAspectRatios.m @@ -0,0 +1,77 @@ +function aRatio = computePerClassAspectRatios(posImgDir, posGtDir, pLoad, aRatioType, plot_orientation_dist) + +if nargin<5 + plot_orientation_dist = 0; +end + +% JMBUENA!! +% Compute the average window size for every subclass of the +% positive metaclass. We are going to keep this average window size +% within the detector classifier. We will train the detector with +% fixed big window (selecting the features in this window) but we +% finally return the "per class" best fit window. +tid = ticStatus('Per class aspect ratio',1,30); +fs={posImgDir,posGtDir}; +fs=bbGt('getFiles',fs); nImg=size(fs,2); assert(nImg>0); +gt = cell(nImg,1); +lbls = cell(nImg,1); +pLoad2=pLoad; +%if iscell(pLoad) +% pLoad2 = pLoad{:}; +%end + +use_mean_aratio = 0; +if iscell(pLoad) + index = find(strcmp(pLoad2, 'squarify')); + if ~isempty(index) + pLoad2{index+1} = {}; + end +elseif isstruct(pLoad2) + if isfield(pLoad2, 'squarify') + pLoad2.squarify = {}; + end +end + +for i=1:nImg + [objs_,gt_] = bbGt('bbLoad',fs{2,i},pLoad2); + indices = gt_(:,5)==0; + if (sum(indices)>0) + lbls{i} = [objs_(indices).subclass]'; + gt{i} = gt_(indices,:); + end + tocStatus(tid,i/nImg); +end +gt = cell2mat(gt); +lbls = cell2mat(lbls); +num_pos_classes = length(unique(lbls)); +ratios = gt(:,3)./gt(:,4); +aRatio = zeros(num_pos_classes, 1); +for i=1:num_pos_classes + if (strcmp(aRatioType, 'mean') == 1) + aRatio(i) = mean(ratios(lbls==i)); + else %(strcmp(aRatioType, 'median') == 1) + aRatio(i) = median(ratios(lbls==i)); + end +% aRatio(i) = prctile(ratios(lbls==i),60); +% a_ratio_class_std(i) = std(ratios(lbls==i)); +end + +if plot_orientation_dist + % Plot orientation distributios + for i=1:num_pos_classes + figure; + haxes = axes; + data_i = ratios(lbls == i); + [h, x] = hist(data_i,50); + % hf = h ./ length(data_i); + stairs(x, h, 'g-'); + axis([0 4 0 max(h)]); + mean_i = mean(data_i); + median_i = median(data_i); + hold on; + line([mean_i, mean_i], get(haxes, 'YLim'), 'Color', [1 0 0]); + line([median_i, median_i], get(haxes, 'YLim'), 'Color', [1 0 1]); + hold off; + title(sprintf('orientation %d', i)); + end; +end; \ No newline at end of file diff --git a/detector/computeSelectedFeaturesMap.m b/detector/computeSelectedFeaturesMap.m new file mode 100755 index 00000000..b1366b38 --- /dev/null +++ b/detector/computeSelectedFeaturesMap.m @@ -0,0 +1,58 @@ + +function [featMap, featChnMaps, nFilters] = computeSelectedFeaturesMap(detector) + +%chnnSizes = opts.modelDs / opts.pPyramid.pChns.shrink; +%chnnLength = chnnSizes(1)*chnnSizes(2); +%nChns = size(X1,2)/chnnLength; +% +%for i=1:nChns +% chnnImg = reshape(X1(1, (i-1)*chnnLength+1:(i*chnnLength)), ... +% chnnSizes); +% figure; imshow(chnnImg); +%end + +wl_weights = detector.clf.wl_weights; +wl_weights = wl_weights ./ sum(wl_weights); +wl_weights = repmat(wl_weights(:)', size(detector.clf.fids,1), 1); + +chnSizes = detector.opts.modelDsPad / detector.opts.pPyramid.pChns.shrink; +nFilters = 1; +if (isfield(detector.opts, 'filters')) + if (~isempty(detector.opts.filters)) + nFilters = size(detector.opts.filters,4); + chnSizes = floor(chnSizes / 2); + end +end +chnLength = chnSizes(1)*chnSizes(2); +nChns = 0; +for i=1:length(detector.info) + nChns = nChns + detector.info(i).nChns; +end + + +fids = detector.clf.fids(detector.clf.fids > 0); +wl_weights = wl_weights(detector.clf.fids > 0); + +% Global selected feature map +featMap = zeros(chnSizes); +for i=1:length(fids) + id = mod(double(fids(i)-1),chnLength)+1; + featMap(id) = featMap(id) + wl_weights(i); +end + +% Selected feature map per channel +featChnMaps = cell(nChns*nFilters, 1); +thOld = 1; +for c=1:nChns*nFilters + th = c*chnLength; + chnFids = fids((fids>thOld) & (fids<=th)); + chnWeights = wl_weights((fids>thOld) & (fids<=th)); + chnWeights = chnWeights ./ sum(chnWeights); + featMapAux = zeros(chnSizes); + for i=1:length(chnFids) + id = mod(double(chnFids(i)-1),chnLength)+1; + featMapAux(id) = featMapAux(id) + chnWeights(i); + end + featChnMaps{c} = featMapAux; + thOld = th; +end \ No newline at end of file diff --git a/detector/correctToClassSpecificBbs.m b/detector/correctToClassSpecificBbs.m new file mode 100755 index 00000000..d9cc6d22 --- /dev/null +++ b/detector/correctToClassSpecificBbs.m @@ -0,0 +1,54 @@ +function dt1 = correctToClassSpecificBbs(dt, aRatio, fixedWidth, keepAll) +% +% We assume that the background class has index 1. So we have to +% remove 1 to the positive class index to get the correct median +% aspect ratio. Therefore, if the positive class label is i, we get +% its aspect ratio for its BBoxes as aRatio(i-1). +% + +if isempty(dt) + dt1 = dt; + return; +end; + +if nargin < 4 + keepAll = 0; +end + +if nargin == 2 + fixedWidth = 0; % In this case we keep the h fixed and modify w +end + +if fixedWidth + squarify_param = 2; % use original w, alter h +else + squarify_param = 3; % use original h, alter w +end + +maxIndex = 5; + +if iscell(dt) + if keepAll + maxIndex = size(dt{1},2); + end + dt1 = cell(length(dt),1); + for i=1:length(dt) + if isempty(dt{i}) + continue; + end + for j=1:length(aRatio) + indices = (dt{i}(:,6) == (j+1)); + dt{i}(indices,:)=bbApply('squarify', dt{i}(indices,:), squarify_param, aRatio(j)); + end + dt1{i} = dt{i}(:,1:maxIndex); + end +else + if keepAll + maxIndex = size(dt,2); + end + for i=1:length(aRatio) + indices = (dt(:,6) == (i+1)); + dt(indices,:)=bbApply('squarify', dt(indices,:), squarify_param, aRatio(i)); + end + dt1 = dt(:,1:maxIndex); +end diff --git a/detector/plotSelectedFeaturesMap.m b/detector/plotSelectedFeaturesMap.m new file mode 100644 index 00000000..eaa10118 --- /dev/null +++ b/detector/plotSelectedFeaturesMap.m @@ -0,0 +1,70 @@ +function plotSelectedFeaturesMap(exp_name, dataOutputDir, featMap, featChnMaps, nFilters) + +% figure; +% imagesc(featMap); +% title('Full Feature Map'); +% saveas(gcf, [exp_name '_FeatMap.eps'], 'epsc'); +% saveas(gcf, [exp_name '_FeatMap.png'], 'png'); +% +% for f=1:nFilters +% figure; +% for i=1:length(featChnMaps)/nFilters +% subplot(4,3,i); +% imagesc(featChnMaps{i*f}); +% title(sprintf('Feature %d', i)); +% end +% saveas(gcf,sprintf([exp_name '_PerFeatMap_%d.eps'], f), 'epsc'); +% saveas(gcf,sprintf([exp_name '_PerFeatMap_%d.png'], f), 'png'); +% end + +figure; +imagesc(featMap); +colormap('jet'); +title('Full Feature Map'); +saveas(gcf, fullfile(dataOutputDir, [exp_name '_FeatMap.eps']), 'epsc'); +saveas(gcf, fullfile(dataOutputDir,[exp_name '_FeatMap.png']), 'png'); +img = featMap; +img = (img - min(min(img))) ./ (max(max(img)) - min(min(img))); +ime = imresize(img, 100., 'nearest'); +img = ind2rgb(gray2ind(img, 255), jet(255)); +imwrite(img, fullfile(dataOutputDir, [exp_name '_FeatMap_FULL_IMG.png']), 'png'); + +figure; +NUM_CHANNELS = 10; +NUM_FILTERS = length(featChnMaps)/NUM_CHANNELS; +images = zeros(size(featMap,1), size(featMap,2)*NUM_CHANNELS); +for i=1:NUM_CHANNELS + index = 1+(i-1)*size(featMap,2); + for j=1:NUM_FILTERS + images(:, index:index+size(featMap,2)-1) = images(:, index:index+size(featMap,2)-1) + featChnMaps{i+(j-1)*NUM_CHANNELS}; + end +end +images = (images - min(min(images))) ./ (max(max(images)) - min(min(images))); +images2 = imresize(images, 20., 'nearest'); +images2 = ind2rgb(gray2ind(images2, 255), jet(255)); +imshow(images2, 'Border', 'tight'); +saveas(gcf, fullfile(dataOutputDir, [exp_name '_PerFeatMap.eps']), 'epsc'); +saveas(gcf, fullfile(dataOutputDir, [exp_name '_PerFeatMap.png']), 'png'); + +for i=1:NUM_CHANNELS + index = 1+(i-1)*size(featMap,2); + img = images(:, index:index+size(featMap,2)-1); + img = imresize(img, 10., 'nearest'); + img = ind2rgb(gray2ind(img, 255), jet(255)); + imwrite(img, fullfile(dataOutputDir, sprintf([exp_name '_PerFeatMap_%d.png'], i)), 'png'); +end + +figure; +c = 1; +for i=1:NUM_CHANNELS + for j=1:NUM_FILTERS + img = featChnMaps{c}; + img = (img - min(min(img))) ./ (max(max(img)) - min(min(img))); + img = imresize(img, 10., 'nearest'); + img = ind2rgb(gray2ind(img, 255), jet(255)); + imwrite(img, fullfile(dataOutputDir, sprintf([exp_name '_PerFeatMap_filter_%d_channel_%d.png'], i, j)), 'png'); + imshow(img); + %pause; + c = c + 1; + end +end diff --git a/detector/private/acfDetect1.cpp b/detector/private/acfDetect1.cpp index df577a77..ac936011 100644 --- a/detector/private/acfDetect1.cpp +++ b/detector/private/acfDetect1.cpp @@ -6,6 +6,7 @@ #include "mex.h" #include #include +#include using namespace std; typedef unsigned int uint32; @@ -20,6 +21,7 @@ inline void getChild( float *chns1, uint32 *cids, uint32 *fids, void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { + //cout << "acfDetect1.cpp: 1=============================" << endl; // get inputs float *chns = (float*) mxGetData(prhs[0]); mxArray *trees = (mxArray*) prhs[1]; @@ -29,6 +31,8 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) const int stride = (int) mxGetScalar(prhs[5]); const float cascThr = (float) mxGetScalar(prhs[6]); + //cout << "acfDetect1.cpp: 2=============================" << endl; + // extract relevant fields from trees float *thrs = (float*) mxGetData(mxGetField(trees,0,"thrs")); float *hs = (float*) mxGetData(mxGetField(trees,0,"hs")); @@ -36,6 +40,8 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) uint32 *child = (uint32*) mxGetData(mxGetField(trees,0,"child")); const int treeDepth = mxGetField(trees,0,"treeDepth")==NULL ? 0 : (int) mxGetScalar(mxGetField(trees,0,"treeDepth")); + + //cout << "acfDetect1.cpp: 3=============================" << endl; // get dimensions and constants const mwSize *chnsSize = mxGetDimensions(prhs[0]); @@ -48,6 +54,8 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) const int height1 = (int) ceil(float(height*shrink-modelHt+1)/stride); const int width1 = (int) ceil(float(width*shrink-modelWd+1)/stride); + //cout << "acfDetect1.cpp: 4=============================" << endl; + // construct cids array int nFtrs = modelHt/shrink*modelWd/shrink*nChns; uint32 *cids = new uint32[nFtrs]; int m=0; @@ -56,6 +64,8 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) for( int r=0; r rs, cs; vector hs1; for( int c=0; ccascThr) { cs.push_back(c); rs.push_back(r); hs1.push_back(h); } } + // cout << "acfDetect1.cpp: 6=============================" << endl; + delete [] cids; m=cs.size(); + // cout << "acfDetect1.cpp: 7=============================" << endl; + // convert to bbs plhs[0] = mxCreateNumericMatrix(m,5,mxDOUBLE_CLASS,mxREAL); double *bbs = (double*) mxGetData(plhs[0]); @@ -107,4 +121,6 @@ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) bbs[i+1*m]=rs[i]*stride; bbs[i+3*m]=modelHt; bbs[i+4*m]=hs1[i]; } + + // cout << "acfDetect1.cpp: 8=============================" << endl; } diff --git a/detector/private/acfDetectBadacostTrees1.cpp b/detector/private/acfDetectBadacostTrees1.cpp new file mode 100755 index 00000000..e736bb94 --- /dev/null +++ b/detector/private/acfDetectBadacostTrees1.cpp @@ -0,0 +1,347 @@ +/******************************************************************************* +* Added by Jose M. Buenaposada (josemiguel.buenaposada@urjc.es) +* Copyright 2016 +* Please email me if you find bugs, or have suggestions or questions! +* Licensed under the Simplified BSD License [see external/bsd.txt] +*******************************************************************************/ +#include "mex.h" +#include +#include +#include +#include +#include +using namespace std; + +typedef unsigned int uint32; + +#ifdef USEOMP +#include +#endif + +// Here we asume that first label (h=1 at index 0) is the negative class +// (the background in detection). +inline void getMinPositiveCost(int num_classes, + double *Cprime, + std::vector& margin_vector, + double& min_value, + int& h) +{ + min_value = std::numeric_limits::max(); + for(int j=1; j < num_classes; j++) + { + double cost = 0.0; + double* cprime_column = Cprime + static_cast(j*num_classes); + for(int i=0; i < num_classes; i++) + { + cost += cprime_column[i] * margin_vector[i]; + } + + if (cost < min_value) + { + min_value = cost; + h = j+1; + } + } +} + +inline void getNegativeCost(int num_classes, double *Cprime, + std::vector& margin_vector, double& neg_cost) +{ + // The index of the negative class is assumed 1. Therefore, its + // column in Cprime is the first one (no need to move to its column). + neg_cost = 0.0; + double* cprime_column = Cprime; + for(int i=0; i < num_classes; i++) + { + neg_cost += cprime_column[i] * margin_vector[i]; + } +} + +inline void getChild( float *chns1, uint32 *cids, uint32 *fids, + float *thrs, uint32 offset, uint32 &k0, uint32 &k ) +{ + float ftr = chns1[cids[fids[k]]]; + k = (ftr margin_vector(num_classes); + std::vector costs_vector(num_classes); + + // construct cids array + int nFtrs = modelHt/shrink*modelWd/shrink*nChns; + uint32 *cids = new uint32[nFtrs]; + // 64 bits change + //int m=0; + mwSize m=0; + for( int z=0; z rs(num_windows), cs(num_windows); + vector hs1(num_windows), scores(num_windows); +// cout << "Process n= " << width1*height1 << " windows." << endl; + + #ifdef USEOMP + int nThreads = omp_get_max_threads(); + #pragma omp parallel for num_threads(nThreads) + #endif +// for( int c=0; c margin_vector(num_classes); + double trace; + int h; + float *chns1=chns+(r*stride/shrink) + (c*stride/shrink)*height; + + // Initialise the margin_vector memory to 0.0 + for(int i=0; i(hs[k]); +// double* codified = Y + static_cast(num_classes*(h-1)); + double* codified = Y + static_cast(num_classes*(h-1)); + for(int i=0; i(hs[k]); + // double* codified = Y + static_cast(num_classes*(h-1)); + double* codified = Y + static_cast(num_classes*(h-1)); + for(int i=0; i2) + { + // specialized case for treeDepth>2 + for(int t = 0; t < nTrees; t++ ) { + uint32 offset=t*nTreeNodes, k=offset, k0=0; + for( int i=0; i(hs[k]); +// double* codified = Y + static_cast(num_classes*(h-1)); + double* codified = Y + static_cast(num_classes*(h-1)); + for(int i=0; i(hs[k]); + double* codified = Y + static_cast(num_classes*(h-1)); + for(int i=0; i 1) + { + size_output++; + } + } + + plhs[0] = mxCreateNumericMatrix(size_output,5,mxDOUBLE_CLASS,mxREAL); + double *bbs = (double*) mxGetData(plhs[0]); + plhs[1] = mxCreateNumericMatrix(size_output,1,mxDOUBLE_CLASS,mxREAL); + double *labels = (double*) mxGetData(plhs[1]); + m = 0; + for( int i=0; i1) { + bbs[m+0*size_output]=cs[i]*stride; + bbs[m+2*size_output]=modelWd; + bbs[m+1*size_output]=rs[i]*stride; + bbs[m+3*size_output]=modelHt; + // IMPORTANT! We make the score of BAdacost the minus the diference + // between the min positive class cost and the negative class cost + bbs[m+4*size_output]=scores[i]; + labels[m]=hs1[i]; + m++; + } + } +} diff --git a/external/toolboxCompile.m b/external/toolboxCompile.m index 69172683..928aceae 100644 --- a/external/toolboxCompile.m +++ b/external/toolboxCompile.m @@ -32,16 +32,22 @@ % list of files (missing /private/ part of directory) fs={'channels/convConst.cpp', 'channels/gradientMex.cpp',... - 'channels/imPadMex.cpp', 'channels/imResampleMex.cpp',... - 'channels/rgbConvertMex.cpp', 'classify/binaryTreeTrain1.cpp', ... - 'classify/fernsInds1.c', 'classify/forestFindThr.cpp',... - 'classify/forestInds.cpp', 'classify/meanShift1.c',... - 'detector/acfDetect1.cpp', 'images/assignToBins1.c',... - 'images/histc2c.c', 'images/imtransform2_c.c', ... - 'images/nlfiltersep_max.c', 'images/nlfiltersep_sum.c', ... - 'videos/ktComputeW_c.c', 'videos/ktHistcRgb_c.c', ... - 'videos/opticalFlowHsMex.cpp' }; -n=length(fs); useOmp=zeros(1,n); if(~ismac), useOmp([6 9])=1; end + 'channels/imPadMex.cpp', 'channels/imResampleMex.cpp',... + 'channels/rgbConvertMex.cpp', 'classify/binaryTreeTrain1.cpp', ... + 'classify/fernsInds1.c', 'classify/forestFindThr.cpp',... + 'classify/forestInds.cpp', 'classify/meanShift1.c',... + 'detector/acfDetect1.cpp', 'images/assignToBins1.c',... + 'images/histc2c.c', 'images/imtransform2_c.c', ... + 'images/nlfiltersep_max.c', 'images/nlfiltersep_sum.c', ... + 'videos/ktComputeW_c.c', 'videos/ktHistcRgb_c.c', ... + 'videos/opticalFlowHsMex.cpp', ... + 'classify/multiclassTreeTrain1.cpp', ... + 'classify/multiclassQuantizedTreeTrain1.cpp', ... + 'detector/acfDetectBadacostTrees1.cpp' +}; +n=length(fs); +useOmp=zeros(1,n); +useOmp([6 9 20 21 22])=1; % compile every funciton in turn (special case for dijkstra) disp('Compiling Piotr''s Toolbox.......................'); @@ -51,6 +57,9 @@ try %#ok [d,f1,e]=fileparts(fs{i}); f=[rd '/' d '/private/' f1]; if(useOmp(i)), optsi=[optsOmp opts]; else optsi=opts; end +% [f e] +% optsi{:} +% [f '.' mexext] fprintf(' -> %s\n',[f e]); mex([f e],optsi{:},[f '.' mexext]); catch err, fprintf(errmsg,[f1 e],err.message); end end diff --git a/images/private/histc2c.c b/images/private/histc2c.c index 65688ae0..82e96881 100644 --- a/images/private/histc2c.c +++ b/images/private/histc2c.c @@ -34,13 +34,13 @@ int findBin( double x, double *edges, int nBins ) { /******************************************************************************* * Fast indexing into multidimensional arrays. * Call sub2ind_init once and store the result (siz contains the nd sizes): -* subMul = sub2ind_init( siz, nd ); +* subMul = _init( siz, nd ); * Then, to index into an array A of size siz, given a subscript sub * (where sub is an nd int array of subscripts), you can get the index using: * sub2ind(ind,sub,subMul,nd) *******************************************************************************/ #define sub2ind(ind, sub, subMul, nd) ind=sub[0]; for(k=1;k Date: Thu, 29 Mar 2018 13:30:12 +0700 Subject: [PATCH 2/2] revert bad comment --- detector/models/AcfInriaDetector.mat | Bin 130162 -> 129517 bytes images/private/histc2c.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/detector/models/AcfInriaDetector.mat b/detector/models/AcfInriaDetector.mat index c0ff31b3c64277c02cdb3627b825b8ce2d2731e0..ea3ed4f82294004b3d276d5369759c7217aa1ece 100644 GIT binary patch delta 127190 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

GVwG&+ILvwfxf;1 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ν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