|
@@ -601,9 +601,10 @@ double SemSegContextTree::getBestSplit(std::vector<NICE::MultiChannelImageT<doub
|
|
}
|
|
}
|
|
else if(ft == 1)
|
|
else if(ft == 1)
|
|
{
|
|
{
|
|
|
|
+ int chans = integralImgs[0].channels;
|
|
int opssize = (int)ops.size();
|
|
int opssize = (int)ops.size();
|
|
- int f1 = (int)((double)rand()/(double)RAND_MAX*(double)classes);
|
|
|
|
- int f2 = (int)((double)rand()/(double)RAND_MAX*(double)classes);
|
|
|
|
|
|
+ int f1 = (int)((double)rand()/(double)RAND_MAX*(double)chans);
|
|
|
|
+ int f2 = (int)((double)rand()/(double)RAND_MAX*(double)chans);
|
|
int o = (int)((double)rand()/(double)RAND_MAX*((double)cops.size())+(double)opssize);
|
|
int o = (int)((double)rand()/(double)RAND_MAX*((double)cops.size())+(double)opssize);
|
|
Operation *op;
|
|
Operation *op;
|
|
if(o < opssize)
|
|
if(o < opssize)
|
|
@@ -737,7 +738,7 @@ inline double SemSegContextTree::getMeanProb(const int &x,const int &y,const int
|
|
return val / (double)nbTrees;
|
|
return val / (double)nbTrees;
|
|
}
|
|
}
|
|
|
|
|
|
-void SemSegContextTree::computeIntegralImage(const NICE::MultiChannelImageT<int> ¤tfeats, NICE::MultiChannelImageT<double> &integralImage)
|
|
|
|
|
|
+void SemSegContextTree::computeIntegralImage(const NICE::MultiChannelImageT<int> ¤tfeats, const NICE::MultiChannelImageT<int> &lfeats, NICE::MultiChannelImageT<double> &integralImage)
|
|
{
|
|
{
|
|
int xsize = currentfeats.width();
|
|
int xsize = currentfeats.width();
|
|
int ysize = currentfeats.height();
|
|
int ysize = currentfeats.height();
|
|
@@ -770,6 +771,38 @@ void SemSegContextTree::computeIntegralImage(const NICE::MultiChannelImageT<int>
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ int channels2 = (int)lfeats.size();
|
|
|
|
+ if(lfeats.get(xsize-1,ysize-1,0) == 0)
|
|
|
|
+ {
|
|
|
|
+#pragma omp parallel for
|
|
|
|
+ for(int c = channels, int c1 = 0; c1 < channels2; c++, c1++)
|
|
|
|
+ {
|
|
|
|
+ integralImage.set(0,0,lfeats.get(0,0,c1), c);
|
|
|
|
+
|
|
|
|
+ //first column
|
|
|
|
+ for(int y = 1; y < ysize; y++)
|
|
|
|
+ {
|
|
|
|
+ integralImage.set(0,y,lfeats.get(0,y,c1)+integralImage.get(0,y,c), c);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //first row
|
|
|
|
+ for(int x = 1; x < xsize; x++)
|
|
|
|
+ {
|
|
|
|
+ integralImage.set(x,0,lfeats.get(x,0,c1)+integralImage.get(x,0,c), c);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //rest
|
|
|
|
+ for(int y = 1; y < ysize; y++)
|
|
|
|
+ {
|
|
|
|
+ for(int x = 1; x < xsize; x++)
|
|
|
|
+ {
|
|
|
|
+ double val = lfeats.get(x,y,c1)+integralImage.get(x,y-1,c)+integralImage.get(x-1,y,c)-integralImage.get(x-1,y-1,c);
|
|
|
|
+ integralImage.set(x, y, val, c);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void SemSegContextTree::train ( const MultiDataset *md )
|
|
void SemSegContextTree::train ( const MultiDataset *md )
|
|
@@ -1043,7 +1076,7 @@ void SemSegContextTree::train ( const MultiDataset *md )
|
|
//TODO: features neu berechnen!
|
|
//TODO: features neu berechnen!
|
|
|
|
|
|
//compute integral image
|
|
//compute integral image
|
|
- int channels = classes;
|
|
|
|
|
|
+ int channels = classes+allfeats.size();
|
|
|
|
|
|
if(integralImgs[0].width() == 0)
|
|
if(integralImgs[0].width() == 0)
|
|
{
|
|
{
|
|
@@ -1057,7 +1090,7 @@ void SemSegContextTree::train ( const MultiDataset *md )
|
|
|
|
|
|
for(int i = 0; i < imgcounter; i++)
|
|
for(int i = 0; i < imgcounter; i++)
|
|
{
|
|
{
|
|
- computeIntegralImage(currentfeats[i],integralImgs[i]);
|
|
|
|
|
|
+ computeIntegralImage(currentfeats[i],allfeats[i], integralImgs[i]);
|
|
}
|
|
}
|
|
#if 1
|
|
#if 1
|
|
timer.stop();
|
|
timer.stop();
|
|
@@ -1177,7 +1210,7 @@ void SemSegContextTree::semanticseg ( CachedExample *ce, NICE::Image & segresult
|
|
}
|
|
}
|
|
|
|
|
|
//compute integral image
|
|
//compute integral image
|
|
- int channels = (int)labelmap.size();
|
|
|
|
|
|
+ int channels = (int)labelmap.size()+feats.size();
|
|
|
|
|
|
if(integralImg.width() == 0)
|
|
if(integralImg.width() == 0)
|
|
{
|
|
{
|
|
@@ -1187,7 +1220,7 @@ void SemSegContextTree::semanticseg ( CachedExample *ce, NICE::Image & segresult
|
|
integralImg.reInit(xsize, ysize, channels);
|
|
integralImg.reInit(xsize, ysize, channels);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- computeIntegralImage(currentfeats,integralImg);
|
|
|
|
|
|
+ computeIntegralImage(currentfeats,feats, integralImg);
|
|
|
|
|
|
depth++;
|
|
depth++;
|
|
}
|
|
}
|