|
@@ -22,6 +22,8 @@ SemSegNovelty::SemSegNovelty ( const Config *conf,
|
|
{
|
|
{
|
|
this->conf = conf;
|
|
this->conf = conf;
|
|
|
|
|
|
|
|
+ globalMaxUncert = -numeric_limits<double>::max();
|
|
|
|
+
|
|
string section = "SemSegNovelty";
|
|
string section = "SemSegNovelty";
|
|
|
|
|
|
featExtract = new LFColorWeijer ( conf );
|
|
featExtract = new LFColorWeijer ( conf );
|
|
@@ -33,6 +35,7 @@ SemSegNovelty::SemSegNovelty ( const Config *conf,
|
|
|
|
|
|
classifier = new GPHIKClassifierNICE ( conf, "ClassiferGPHIK" );;
|
|
classifier = new GPHIKClassifierNICE ( conf, "ClassiferGPHIK" );;
|
|
|
|
|
|
|
|
+ findMaximumUncert = conf->gB(section, "findMaximumUncert", true);
|
|
whs = conf->gI ( section, "window_size", 10 );
|
|
whs = conf->gI ( section, "window_size", 10 );
|
|
featdist = conf->gI ( section, "grid", 10 );
|
|
featdist = conf->gI ( section, "grid", 10 );
|
|
testWSize = conf->gI (section, "test_window_size", 10);
|
|
testWSize = conf->gI (section, "test_window_size", 10);
|
|
@@ -44,11 +47,11 @@ SemSegNovelty::SemSegNovelty ( const Config *conf,
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- RegionSegmentationMethod * tmpRegionSeg = GenericRegionSegmentationMethodSelection::selectRegionSegmentationMethod(&conf, rsMethode);
|
|
|
|
|
|
+ RegionSegmentationMethod *tmpRegionSeg = GenericRegionSegmentationMethodSelection::selectRegionSegmentationMethod(conf, rsMethode);
|
|
if ( save_cache )
|
|
if ( save_cache )
|
|
regionSeg = new RSCache ( conf, tmpRegionSeg );
|
|
regionSeg = new RSCache ( conf, tmpRegionSeg );
|
|
else
|
|
else
|
|
- regionSeg = tmpseg;
|
|
|
|
|
|
+ regionSeg = tmpRegionSeg;
|
|
}
|
|
}
|
|
|
|
|
|
cn = md->getClassNames ( "train" );
|
|
cn = md->getClassNames ( "train" );
|
|
@@ -80,6 +83,14 @@ SemSegNovelty::SemSegNovelty ( const Config *conf,
|
|
|
|
|
|
SemSegNovelty::~SemSegNovelty()
|
|
SemSegNovelty::~SemSegNovelty()
|
|
{
|
|
{
|
|
|
|
+ if(newTrainExamples.size() > 0)
|
|
|
|
+ {
|
|
|
|
+ // most uncertain region
|
|
|
|
+ showImage(maskedImg);
|
|
|
|
+ //classifier->add(newTrainExamples)
|
|
|
|
+ classifier->save ( cache + "/classifier.data" );
|
|
|
|
+ }
|
|
|
|
+
|
|
// clean-up
|
|
// clean-up
|
|
if ( classifier != NULL )
|
|
if ( classifier != NULL )
|
|
delete classifier;
|
|
delete classifier;
|
|
@@ -87,6 +98,40 @@ SemSegNovelty::~SemSegNovelty()
|
|
delete featExtract;
|
|
delete featExtract;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void SemSegNovelty::visualizeRegion(const NICE::ColorImage &img, const NICE::Matrix ®ions, int region, NICE::ColorImage &outimage)
|
|
|
|
+{
|
|
|
|
+ vector<uchar> color;
|
|
|
|
+ color.push_back(255);
|
|
|
|
+ color.push_back(0);
|
|
|
|
+ color.push_back(0);
|
|
|
|
+
|
|
|
|
+ int width = img.width();
|
|
|
|
+ int height = img.height();
|
|
|
|
+
|
|
|
|
+ outimage.resize(width,height);
|
|
|
|
+
|
|
|
|
+ for(int y = 0; y < height; y++)
|
|
|
|
+ {
|
|
|
|
+ for(int x = 0; x < width; x++)
|
|
|
|
+ {
|
|
|
|
+ if(regions(x,y) == region)
|
|
|
|
+ {
|
|
|
|
+ for(int c = 0; c < 3; c++)
|
|
|
|
+ {
|
|
|
|
+ outimage(x,y,c) = color[c];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ for(int c = 0; c < 3; c++)
|
|
|
|
+ {
|
|
|
|
+ outimage(x,y,c) = img(x,y,c);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void SemSegNovelty::train ( const MultiDataset *md )
|
|
void SemSegNovelty::train ( const MultiDataset *md )
|
|
{
|
|
{
|
|
const LabeledSet train = * ( *md ) ["train"];
|
|
const LabeledSet train = * ( *md ) ["train"];
|
|
@@ -274,11 +319,9 @@ void SemSegNovelty::semanticseg ( CachedExample *ce, NICE::Image & segresult, NI
|
|
{
|
|
{
|
|
Timer timer;
|
|
Timer timer;
|
|
timer.start();
|
|
timer.start();
|
|
-
|
|
|
|
- Examples examples;
|
|
|
|
- examples.filename = "testing";
|
|
|
|
-
|
|
|
|
- segresult.set ( 0 );
|
|
|
|
|
|
+
|
|
|
|
+ Image labels = segresult;
|
|
|
|
+ segresult.set(0);
|
|
|
|
|
|
int featdim = -1;
|
|
int featdim = -1;
|
|
|
|
|
|
@@ -289,8 +332,8 @@ void SemSegNovelty::semanticseg ( CachedExample *ce, NICE::Image & segresult, NI
|
|
ce->getImageSize ( xsize, ysize );
|
|
ce->getImageSize ( xsize, ysize );
|
|
|
|
|
|
probabilities.reInit( xsize, ysize, cn.getMaxClassno() + 1);
|
|
probabilities.reInit( xsize, ysize, cn.getMaxClassno() + 1);
|
|
- probabilities.set ( 0.0 );
|
|
|
|
-
|
|
|
|
|
|
+ probabilities.setAll ( 0.0 );
|
|
|
|
+
|
|
NICE::ColorImage img;
|
|
NICE::ColorImage img;
|
|
try {
|
|
try {
|
|
img = ColorImage ( currentFile );
|
|
img = ColorImage ( currentFile );
|
|
@@ -559,7 +602,8 @@ void SemSegNovelty::semanticseg ( CachedExample *ce, NICE::Image & segresult, NI
|
|
int amountRegions = regionSeg->segRegions ( img, mask );
|
|
int amountRegions = regionSeg->segRegions ( img, mask );
|
|
|
|
|
|
//compute probs per region
|
|
//compute probs per region
|
|
- vector<vector<double> > regionProb(amountRegions,vector<double>(probabilities.channels(),0.0);
|
|
|
|
|
|
+ vector<vector<double> > regionProb(amountRegions,vector<double>(probabilities.channels(),0.0));
|
|
|
|
+ vector<double> regionNoveltyMeasure (amountRegions, 0.0);
|
|
vector<int> regionCounter(amountRegions, 0);
|
|
vector<int> regionCounter(amountRegions, 0);
|
|
for ( int y = 0; y < ysize; y++)
|
|
for ( int y = 0; y < ysize; y++)
|
|
{
|
|
{
|
|
@@ -569,28 +613,76 @@ void SemSegNovelty::semanticseg ( CachedExample *ce, NICE::Image & segresult, NI
|
|
regionCounter[r]++;
|
|
regionCounter[r]++;
|
|
for(int j = 0; j < probabilities.channels(); j++)
|
|
for(int j = 0; j < probabilities.channels(); j++)
|
|
{
|
|
{
|
|
- regionProb[r][j] = probabilities ( x, y, j );
|
|
|
|
|
|
+ regionProb[r][j] += probabilities ( x, y, j );
|
|
}
|
|
}
|
|
|
|
+ regionNoveltyMeasure[r] += uncert(x,y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
//find best class per region
|
|
//find best class per region
|
|
vector<int> bestClassPerRegion(amountRegions,0);
|
|
vector<int> bestClassPerRegion(amountRegions,0);
|
|
|
|
|
|
|
|
+ double maxuncert = -numeric_limits<double>::max();
|
|
|
|
+ int maxUncertRegion = -1;
|
|
|
|
+
|
|
for(int r = 0; r < amountRegions; r++)
|
|
for(int r = 0; r < amountRegions; r++)
|
|
{
|
|
{
|
|
- double maxval = -numeric_limit<double>::max();
|
|
|
|
|
|
+ double maxval = -numeric_limits<double>::max();
|
|
for(int c = 0; c < probabilities.channels(); c++)
|
|
for(int c = 0; c < probabilities.channels(); c++)
|
|
{
|
|
{
|
|
regionProb[r][c] /= regionCounter[r];
|
|
regionProb[r][c] /= regionCounter[r];
|
|
- if(maxval < regionProb[r][c])
|
|
|
|
|
|
+ if(maxval < regionProb[r][c] && regionProb[r][c] != 0.0)
|
|
{
|
|
{
|
|
maxval = regionProb[r][c];
|
|
maxval = regionProb[r][c];
|
|
bestClassPerRegion[r] = c;
|
|
bestClassPerRegion[r] = c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ regionNoveltyMeasure[r] /= regionCounter[r];
|
|
|
|
+ if(maxuncert < regionNoveltyMeasure[r])
|
|
|
|
+ {
|
|
|
|
+ maxuncert = regionNoveltyMeasure[r];
|
|
|
|
+ maxUncertRegion = r;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if(findMaximumUncert)
|
|
|
|
+ {
|
|
|
|
+ if(maxuncert > globalMaxUncert)
|
|
|
|
+ {
|
|
|
|
+ //save new important features
|
|
|
|
+ Examples examples;
|
|
|
|
+ for ( int y = 0; y < ysize; y += testWSize )
|
|
|
|
+ {
|
|
|
|
+ for ( int x = 0; x < xsize; x += testWSize)
|
|
|
|
+ {
|
|
|
|
+ if(mask(x,y) == maxUncertRegion)
|
|
|
|
+ {
|
|
|
|
+ Example example;
|
|
|
|
+ example.vec = NULL;
|
|
|
|
+ example.svec = new SparseVector ( featdim );
|
|
|
|
+ int classnoTmp = labels(x,y);
|
|
|
|
+ for ( int f = 0; f < featdim; f++ )
|
|
|
|
+ {
|
|
|
|
+ double val = feats.getIntegralValue ( x - whs, y - whs, x + whs, y + whs, f );
|
|
|
|
+ if ( val > 1e-10 )
|
|
|
|
+ ( *example.svec ) [f] = val;
|
|
|
|
+ }
|
|
|
|
+ example.svec->normalize();
|
|
|
|
+ examples.push_back ( pair<int, Example> ( classnoTmp, example ) );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(examples.size() > 0)
|
|
|
|
+ {
|
|
|
|
+ newTrainExamples.clear();
|
|
|
|
+ newTrainExamples = examples;
|
|
|
|
+ globalMaxUncert = maxuncert;
|
|
|
|
+ visualizeRegion(img,mask,maxUncertRegion,maskedImg);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
//write back best results per region
|
|
//write back best results per region
|
|
for ( int y = 0; y < ysize; y++)
|
|
for ( int y = 0; y < ysize; y++)
|
|
{
|
|
{
|