Bjoern Froehlich 13 lat temu
rodzic
commit
ff0a98c923

+ 11 - 3
progs/testSemanticSegmentation.cpp

@@ -89,12 +89,20 @@ int main(int argc, char **argv)
 	MultiDataset md(&conf);
 
 	const ClassNames & classNames = md.getClassNames("train");
+	
+	string method = conf.gS("main","method","SSCsurka");
 
+	SemanticSegmentation *semseg = NULL;
+	if(method == "SSCsurka")
+	{
+		semseg = new SemSegCsurka ( &conf, &md);
+	}
+	else if(method == "SSContext")
+	{
+		semseg = new SemSegContextTree ( &conf, &md);
+	}
 	//SemanticSegmentation *semseg = new SemSegLocal ( &conf, &md );
 	//SemanticSegmentation *semseg = new SemSegSTF ( &conf, &md );
-	//SemanticSegmentation *semseg = new SemSegCsurka ( &conf, &md);
-	SemanticSegmentation *semseg = new SemSegContextTree ( &conf, &md);
-
 	//SemanticSegmentation *semseg = new SemSegRegionBased(&conf, &md);
 
 	const LabeledSet *testFiles = md["test"];

+ 33 - 15
semseg/SemSegContextTree.cpp

@@ -109,7 +109,7 @@ SemSegContextTree::SemSegContextTree( const Config *conf, const MultiDataset *md
 	
 	featsPerSplit = conf->gI(section, "feats_per_split", 200);
 	
-	useShannonEntropy = conf->gB(section, "use_shannon_entropy", true);
+	useShannonEntropy = conf->gB(section, "use_shannon_entropy", false);
 	
 	ops.push_back(new Minus());
 	ops.push_back(new MinusAbs());
@@ -164,6 +164,12 @@ void SemSegContextTree::getBestSplit(const vector<vector<vector<vector<double> >
 		}
 	}
 	
+	if(featcounter < minFeats)
+	{
+		cout << "only " << featcounter << " feats in current node -> it's a leaf" << endl;
+		return;
+	}
+	
 	vector<double> fraction(a.size(),0.0);
 	for(uint i = 0; i < fraction.size(); i++)
 	{
@@ -204,7 +210,7 @@ void SemSegContextTree::getBestSplit(const vector<vector<vector<vector<double> >
 		}
 	}
 	
-	cout << "size: " << selFeats.size() << endl;
+	//cout << "size: " << selFeats.size() << endl;
 	//getchar();
 	
 	map<int,int>::iterator mapit;
@@ -223,12 +229,6 @@ void SemSegContextTree::getBestSplit(const vector<vector<vector<vector<double> >
 		return;
 	}
 	
-	if(featcounter < minFeats)
-	{
-		cout << "only " << featcounter << " feats in current node -> it's a leaf" << endl;
-		return;
-	}
-	
 	featsel.clear();
 	for(int i = 0; i < featsPerSplit; i++)
 	{
@@ -304,8 +304,9 @@ void SemSegContextTree::getBestSplit(const vector<vector<vector<vector<double> >
 			}
 			//cout << "rightent: " << rightent << " leftent: " << leftent << endl;
 			
-			double pl = counterL/(counterL+counterR);
+			double pl = (double)counterL/(double)(counterL+counterR);
 			double ig = globent - (1.0-pl) * rightent - pl*leftent;
+			//double ig = globent - rightent - leftent;
 			
 			if(useShannonEntropy)
 			{
@@ -339,7 +340,9 @@ void SemSegContextTree::getBestSplit(const vector<vector<vector<vector<double> >
 		if(featsel[i] != splitop)
 			delete featsel[i];
 	}*/
+#ifdef debug
 	cout << "globent: " << globent <<  " bestig " << bestig << " splitval: " << splitval << endl;
+#endif
 }
 
 void SemSegContextTree::train ( const MultiDataset *md )
@@ -495,14 +498,20 @@ void SemSegContextTree::train ( const MultiDataset *md )
 	for(int i = 0; i < (int)a.size(); i++)
 	{
 		a[i] /= (double)featcounter;
+	}
+	
+#ifdef DEBUG
+	for(int i = 0; i < (int)a.size(); i++)
+	{
 		cout << "a["<<i<<"]: " << a[i] << endl;
 	}
+#endif
 	
 	tree.push_back(Node());
 	tree[0].dist = vector<double>(classes,0.0);
 	int depth = 0;
 	tree[0].depth = depth;
-	
+	int startnode = 0;
 	bool allleaf = false;
 	while(!allleaf && depth < maxDepth)
 	{
@@ -510,8 +519,10 @@ void SemSegContextTree::train ( const MultiDataset *md )
 		//TODO vielleicht parallel wenn nächste schleife trotzdem noch parallelsiert würde, die hat mehr gewicht
 
 		int t = (int) tree.size();
+		int s = startnode;
+		startnode = t;
 //#pragma omp parallel for
-		for(int i = 0; i < t; i++)
+		for(int i = s; i < t; i++)
 		{
 			if(!tree[i].isleaf && tree[i].left < 0)
 			{  
@@ -571,7 +582,12 @@ void SemSegContextTree::train ( const MultiDataset *md )
 						//tree[right].dist[d]/=a[d];
 						rcounter +=tree[right].dist[d];
 					}
-					assert(lcounter > 0 && rcounter > 0);
+					if(lcounter <= 0 || rcounter <= 0)
+					{
+						cout << "lcounter : " << lcounter << " rcounter: " << rcounter << endl;
+						cout << "splitval: " << splitval << endl;
+						assert(lcounter > 0 && rcounter > 0);
+					}
 					for(uint d = 0; d < tree[left].dist.size(); d++)
 					{
 						tree[left].dist[d]/=lcounter;
@@ -587,11 +603,13 @@ void SemSegContextTree::train ( const MultiDataset *md )
 		
 		//TODO: features neu berechnen!
 		depth++;
-		cout << "d: " << depth << endl;
+#ifdef DEBUG
+		cout << "depth: " << depth << endl;
+#endif
 	}
 	
 	
-	
+#ifdef DEBUG
 	int t = (int) tree.size();
 	for(int i = 0; i < t; i++)
 	{
@@ -602,7 +620,7 @@ void SemSegContextTree::train ( const MultiDataset *md )
 		}
 		cout << endl;
 	}
-
+#endif
 }
 
 void SemSegContextTree::semanticseg ( CachedExample *ce, NICE::Image & segresult,GenericImage<double> & probabilities )

+ 2 - 1
semseg/SemSegCsurka.cpp

@@ -1745,7 +1745,8 @@ getchar();*/
 				segresult.setPixel(x,y,Regionen[pos].first);
 			}
 		}
-		#define WRITEREGIONS
+
+#define WRITEREGIONS
 #ifdef WRITEREGIONS
 		RegionGraph rg;
 		seg->getGraphRepresentation(img, mask, rg);