瀏覽代碼

some edits

Bjoern Froehlich 13 年之前
父節點
當前提交
bcca4373d1
共有 2 個文件被更改,包括 41 次插入8 次删除
  1. 40 7
      semseg/SemSegContextTree.cpp
  2. 1 1
      semseg/SemSegContextTree.h

+ 40 - 7
semseg/SemSegContextTree.cpp

@@ -601,9 +601,10 @@ double SemSegContextTree::getBestSplit(std::vector<NICE::MultiChannelImageT<doub
 		}
 		else if(ft == 1)
 		{
+			int chans = integralImgs[0].channels;
 			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);
 			Operation *op;
 			if(o < opssize)
@@ -737,7 +738,7 @@ inline double SemSegContextTree::getMeanProb(const int &x,const int &y,const int
 	return val / (double)nbTrees;
 }
 
-void SemSegContextTree::computeIntegralImage(const NICE::MultiChannelImageT<int> &currentfeats, NICE::MultiChannelImageT<double> &integralImage)
+void SemSegContextTree::computeIntegralImage(const NICE::MultiChannelImageT<int> &currentfeats, const NICE::MultiChannelImageT<int> &lfeats, NICE::MultiChannelImageT<double> &integralImage)
 {
 	int xsize = currentfeats.width();
 	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 )
@@ -1043,7 +1076,7 @@ void SemSegContextTree::train ( const MultiDataset *md )
 		//TODO: features neu berechnen!
 			
 		//compute integral image
-		int channels = classes;
+		int channels = classes+allfeats.size();
 			
 		if(integralImgs[0].width() == 0)
 		{
@@ -1057,7 +1090,7 @@ void SemSegContextTree::train ( const MultiDataset *md )
 			
 		for(int i = 0; i < imgcounter; i++)
 		{
-			computeIntegralImage(currentfeats[i],integralImgs[i]);
+			computeIntegralImage(currentfeats[i],allfeats[i], integralImgs[i]);
 		}
 #if 1
 		timer.stop();
@@ -1177,7 +1210,7 @@ void SemSegContextTree::semanticseg ( CachedExample *ce, NICE::Image & segresult
 			}
 			
 			//compute integral image
-			int channels = (int)labelmap.size();
+			int channels = (int)labelmap.size()+feats.size();
 			
 			if(integralImg.width() == 0)
 			{
@@ -1187,7 +1220,7 @@ void SemSegContextTree::semanticseg ( CachedExample *ce, NICE::Image & segresult
 				integralImg.reInit(xsize, ysize, channels);
 			}
 		}
-		computeIntegralImage(currentfeats,integralImg);
+		computeIntegralImage(currentfeats,feats, integralImg);
 				
 		depth++;
 	}

+ 1 - 1
semseg/SemSegContextTree.h

@@ -208,7 +208,7 @@ class SemSegContextTree : public SemanticSegmentation
 	 * @param integralImage output image (must be initilized)
 	 * @return void
 	 **/
-	void computeIntegralImage(const NICE::MultiChannelImageT<int> &currentfeats, NICE::MultiChannelImageT<double> &integralImage);
+	void computeIntegralImage(const NICE::MultiChannelImageT<int> &currentfeats, const NICE::MultiChannelImageT<int> &lfeats, NICE::MultiChannelImageT<double> &integralImage);
 	
 	/**
 	 * compute best split for current settings