00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #if !defined(ALIZE_TopGauss_cpp)
00056 #define ALIZE_TopGauss_cpp
00057
00058 #define myTINY 0.0000001
00059
00060 #include <iostream>
00061 #include <fstream>
00062 #include <cstdio>
00063 #include <cassert>
00064 #include <cmath>
00065 #include "liatools.h"
00066 #include "TopGauss.h"
00067 #define EPS_LK 1e-200
00068 unsigned long TopGauss::frameToIdx(unsigned long & f) {
00069 unsigned long cnt=0;
00070 unsigned long*_pnbg=_nbg.getArray();
00071 for (unsigned long t=0;t<f;t++)
00072 cnt+=_pnbg[t];
00073 return cnt;
00074 }
00075
00076 void TopGauss::read(String & featureFilename,Config &config) {
00077 if (verbose) cout << "(TopGauss::read) File ["<<featureFilename<<"] ... ";
00078 String nbGaussPerFrameFilename=config.getParam("nbGaussianFilesDir")+featureFilename;
00079 if (verboseLevel > 2) cout << "(TopGauss) Reading indexes in file ["<<nbGaussPerFrameFilename<<"]"<<endl;
00080 ifstream nbGaussFile(nbGaussPerFrameFilename.c_str(),ios::in|ios::binary);
00081 if(!nbGaussFile){throw Exception("Cannot find nbGaussian file", __FILE__, __LINE__);}
00082
00083 nbGaussFile.read((char *)&_nt,sizeof(unsigned long));
00084 nbGaussFile.read((char *)&_nbgcnt,sizeof(unsigned long));
00085 _idx.setAllValues(0);_idx.setSize(_nbgcnt);
00086 _nbg.setAllValues(0);_nbg.setSize(_nt);
00087 _snsl.setAllValues(0);_snsl.setSize(_nt);
00088 _snsw.setAllValues(0);_snsw.setSize(_nt);
00089 nbGaussFile.read((char *)_nbg.getArray(),sizeof(unsigned long)*_nt);
00090 nbGaussFile.read((char *)_idx.getArray(),sizeof(unsigned long)*_nbgcnt);
00091 nbGaussFile.read((char *)_snsw.getArray(),sizeof(double)*_nt);
00092 nbGaussFile.read((char *)_snsl.getArray(),sizeof(double)*_nt);
00093 nbGaussFile.close();
00094 }
00095
00096 void TopGauss::write(String & featureFilename,Config & config) {
00097 if (verbose) cout << "(TopGauss::write) File ["<<featureFilename<<"] "<<endl;
00098 String nbGaussFilename=config.getParam("nbGaussianFilesDir")+featureFilename;
00099 ofstream nbGaussFile (nbGaussFilename.c_str(),ios::out|ios::binary);
00100 if(!nbGaussFile){throw Exception("Cannot find nbGaussian file", __FILE__, __LINE__);}
00101 nbGaussFile.write((char *)&_nt,sizeof(unsigned long));
00102 nbGaussFile.write((char *)&_nbgcnt,sizeof(unsigned long));
00103
00104 nbGaussFile.write((char *)_nbg.getArray(),sizeof(unsigned long)*_nbg.size());
00105 nbGaussFile.write((char *)_idx.getArray(),sizeof(unsigned long)*_idx.size());
00106 nbGaussFile.write((char *)_snsw.getArray(),sizeof(double)*_snsw.size());
00107 nbGaussFile.write((char *)_snsl.getArray(),sizeof(double)*_snsl.size());
00108 nbGaussFile.close();
00109 }
00110
00111
00112 double TopGauss::compute(MixtureGD & UBM,String & featureFilename, Config & config) {
00113 if (verbose) cout << "(TopGauss::compute on a single file) File ["<<featureFilename<<"] ... ";
00114 FeatureServer fs(config,featureFilename);
00115 double llk=compute(UBM,fs,featureFilename,config);
00116 if (verbose) cout <<_nbgcnt/_nt <<" per frames LLK="<<llk<<endl;
00117 return llk;
00118 }
00119
00120
00121 RealVector <double> TopGauss::compute(MixtureGD & UBM,FeatureServer &fs,Config & config) {
00122 RealVector <double> llkv;
00123 for (unsigned long i=0;i<fs.getSourceCount();i++) {
00124 String filename=fs.getNameOfASource(i);
00125 if (verbose) cout << "(TopGauss::compute on FeatureServer) File ["<<filename<<"] ... ";
00126 llkv.addValue(compute(UBM,fs,filename,config));
00127 cout << "_nt"<<_nt<<" idx"<<_idx.size()<<" _snsw"<<_snsw.size()<<endl;
00128 this->write(filename,config);
00129 if (verbose) cout <<_nbgcnt/_nt <<" per frames LLK="<<llkv[i]<<endl;
00130 }
00131 return llkv;
00132 }
00133
00134
00135
00136 double TopGauss::compute(MixtureGD & UBM,FeatureServer &fs,String & featureFilename,Config & config){
00137 StatServer ss(config);
00138 MixtureGDStat &acc=ss.createAndStoreMixtureStat(UBM);
00139 unsigned long _mixsize=UBM.getDistribCount();
00140 String labelSelectedFrames =config.getParam("labelSelectedFrames");
00141 unsigned long begin=fs.getFirstFeatureIndexOfASource(featureFilename);
00142 fs.seekFeature(begin);
00143 SegServer segmentsServer;
00144 LabelServer labelServer;
00145 initializeClusters(featureFilename,segmentsServer,labelServer,config);
00146 verifyClusterFile(segmentsServer,fs,config);
00147 unsigned long codeSelectedFrame=labelServer.getLabelIndexByString(labelSelectedFrames);
00148 SegCluster& selectedSegments=segmentsServer.getCluster(codeSelectedFrame);
00149 acc.resetLLK();
00150 double topD=config.getParam("topGauss").toDouble();
00151 if (verbose) {if(topD<1.0) cout << "LLK %="<< topD << "% ";else cout << "Top-"<<topD<<" ";}
00152
00153
00154 _nt=totalFrame(selectedSegments);
00155 _nbg.setSize(_nt); _idx.setSize(0);_snsw.setSize(0); _snsl.setSize(0);
00156 _nbg.setAllValues(0); _idx.setAllValues(0);_snsw.setAllValues(0.0);_snsl.setAllValues(0.0);
00157 _nbgcnt=0;
00158 Seg *seg;
00159 selectedSegments.rewind();
00160 unsigned long t=0;
00161 while((seg=selectedSegments.getSeg())!=NULL){
00162 unsigned long begin=seg->begin()+fs.getFirstFeatureIndexOfASource(seg->sourceName());
00163 fs.seekFeature(begin);
00164 Feature f;
00165 for (unsigned long idxFrame=0;idxFrame<seg->length();idxFrame++){
00166 fs.readFeature(f);
00167 double llk=acc.computeAndAccumulateLLK(f,1.0,DETERMINE_TOP_DISTRIBS);
00168 const LKVector &topV=ss.getTopDistribIndexVector();
00169 double lk_tot=exp(llk);
00170
00171 double val=0.0;
00172 if (topD<1.0) {
00173 for(unsigned long j=0;j<_mixsize;j++){
00174 if (val > topD*lk_tot) break;
00175 val+=(topV[j].lk);
00176 _nbg[t]++;
00177 }
00178 } else _nbg[t]=(unsigned long)topD;
00179 _nbgcnt+=_nbg[t];
00180
00181 double snsw=1.0;
00182 double snsl=lk_tot;
00183 for(unsigned long j=0;j<_nbg[t];j++) {
00184 _idx.addValue(topV[j].idx);
00185 snsw -=UBM.weight(topV[j].idx);
00186 snsl -=topV[j].lk;
00187 }
00188
00189 _snsw.addValue(snsw);
00190 if (snsl < EPS_LK)
00191 _snsl.addValue(EPS_LK);
00192 else _snsl.addValue(snsl);
00193 t++;
00194 }
00195 }
00196 if (t!=_nt) cout << "W: t("<<t<<") != _nt(" <<_nt<<")"<<endl;
00197 return acc.getMeanLLK();
00198 }
00199
00200
00201
00202 RealVector <double> TopGauss::get(MixtureGD & UBM,FeatureServer &fs,Config & config){
00203 RealVector <double> llkv;
00204 for (unsigned long i=0;i<fs.getSourceCount();i++) {
00205 String filename=fs.getNameOfASource(i);
00206 if (verbose) cout << "(TopGauss::get on FeatureServer) File ["<<filename<<"] ... ";
00207 this->read(filename,config);
00208 llkv.addValue(get(UBM,fs,filename,config));
00209 if (verbose) cout <<_nbgcnt/_nt <<" per frames LLK="<<llkv[i]<<endl;
00210 }
00211 return llkv;
00212 }
00213
00214
00215 double TopGauss::get(MixtureGD & UBM,String & featureFilename,Config & config){
00216 FeatureServer fs(config,featureFilename);
00217 if (verbose) cout << "(TopGauss::get on a single file) File ["<<featureFilename<<"] ... ";
00218 double llk=get(UBM,fs,featureFilename,config);
00219 if (verbose) cout <<_nbgcnt/_nt <<" per frames LLK="<<llk<<endl;
00220 return llk;
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 double TopGauss::get(MixtureGD & UBM,FeatureServer &fs,String & featureFilename,Config & config){
00271 StatServer ss(config);
00272 String labelSelectedFrames =config.getParam("labelSelectedFrames");
00273 unsigned long begin=fs.getFirstFeatureIndexOfASource(featureFilename);
00274 fs.seekFeature(begin);
00275 SegServer segmentsServer;
00276 LabelServer labelServer;
00277 initializeClusters(featureFilename,segmentsServer,labelServer,config);
00278 verifyClusterFile(segmentsServer,fs,config);
00279 unsigned long codeSelectedFrame=labelServer.getLabelIndexByString(labelSelectedFrames);
00280 SegCluster& selectedSegments=segmentsServer.getCluster(codeSelectedFrame);
00281 MixtureGDStat &acc=ss.createAndStoreMixtureStat(UBM);
00282
00283 Seg *seg;
00284 selectedSegments.rewind();
00285 unsigned long t=0;
00286 acc.resetLLK();
00287 unsigned long idxBegin=0;
00288 while((seg=selectedSegments.getSeg())!=NULL){
00289 unsigned long begin=seg->begin()+fs.getFirstFeatureIndexOfASource(seg->sourceName());
00290 fs.seekFeature(begin);
00291 Feature f;
00292 idxBegin=this->frameToIdx(t);
00293 for (unsigned long idxFrame=0;idxFrame<seg->length();idxFrame++){
00294 fs.readFeature(f);
00295
00296 unsigned long nbg=_nbg[t];
00297 ULongVector index;
00298 double sumNonSelectedWeights=_snsw[t];
00299 double sumNonSelectedLLK=_snsl[t];
00300 for (unsigned long i=0;i<nbg;i++) {
00301 index.addValue(_idx[idxBegin+i]);
00302 }
00303 char c[100];
00304 sprintf(c,"%d",(int)index.size());
00305 config.setParam("topDistribsCount",c);
00306 if (t==0) {acc.computeAndAccumulateLLK(f,1.0,DETERMINE_TOP_DISTRIBS);acc.resetLLK();}
00307 ss.setTopDistribIndexVector(index, sumNonSelectedWeights, sumNonSelectedLLK);
00308 acc.computeAndAccumulateLLK(f,1.0,USE_TOP_DISTRIBS);
00309 idxBegin+=nbg;
00310 t++;
00311 }
00312 }
00313
00314 if (t!=_nt || idxBegin !=_nbgcnt) cout << "W: t("<<t<<") != _nt(" <<_nt<<")"<<"W: idxBegin("<<idxBegin<<") != _nbgcnt(" <<_nbgcnt<<")"<<endl;
00315 return acc.getMeanLLK();
00316 }
00317
00318 #endif