|
@@ -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 )
|