Jelajahi Sumber

implementing OperationPool in SemSegContextTree3D

Sven Sickert 9 tahun lalu
induk
melakukan
933b64c302
2 mengubah file dengan 20 tambahan dan 154 penghapusan
  1. 15 151
      semseg/SemSegContextTree3D.cpp
  2. 5 3
      semseg/SemSegContextTree3D.h

+ 15 - 151
semseg/SemSegContextTree3D.cpp

@@ -180,143 +180,14 @@ SemSegContextTree3D::~SemSegContextTree3D()
 
 
 void SemSegContextTree3D::initOperations()
 void SemSegContextTree3D::initOperations()
 {
 {
-    string featsec = "Features";
-
-    // operation prototypes
-    vector<Operation3D*> tops0, tops1, tops2, tops3, tops4;
-
-    if ( conf->gB ( featsec, "int", true ) )
-    {
-        tops2.push_back ( new IntegralOps3D() );
-        Operation3D* o = new IntegralOps3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "bi_int", true ) )
-    {
-        tops2.push_back ( new BiIntegralOps3D() );
-        Operation3D* o = new BiIntegralOps3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "bi_int_cent", true ) )
-    {
-        tops2.push_back ( new BiIntegralCenteredOps3D() );
-        Operation3D* o = new BiIntegralCenteredOps3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "int_cent", true ) )
-    {
-        tops2.push_back ( new IntegralCenteredOps3D() );
-        Operation3D* o = new IntegralCenteredOps3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_horz", true ) )
-    {
-        tops2.push_back ( new HaarHorizontal3D() );
-        Operation3D* o = new HaarHorizontal3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_vert", true ) )
-    {
-        tops2.push_back ( new HaarVertical3D() );
-        Operation3D* o = new HaarVertical3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_stack", true ) )
-    {
-        tops2.push_back ( new HaarStacked3D() );
-        Operation3D* o = new HaarStacked3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_diagxy", true ) )
-    {
-        tops2.push_back ( new HaarDiagXY3D() );
-        Operation3D* o = new HaarDiagXY3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_diagxz", true ) )
-    {
-        tops2.push_back ( new HaarDiagXZ3D() );
-        Operation3D* o = new HaarDiagXZ3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar_diagyz", true ) )
-    {
-        tops2.push_back ( new HaarDiagYZ3D() );
-        Operation3D* o = new HaarDiagYZ3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar3_horz", true ) )
-    {
-        tops2.push_back ( new Haar3Horiz3D() );
-        Operation3D* o = new Haar3Horiz3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar3_vert", true ) )
-    {
-        tops2.push_back ( new Haar3Vert3D() );
-        Operation3D* o = new Haar3Vert3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "haar3_stack", true ) )
-    {
-        tops2.push_back ( new Haar3Stack3D() );
-        Operation3D* o = new Haar3Stack3D();
-        o->setContext(true);
-        tops3.push_back ( o );
-    }
-
-    if ( conf->gB ( featsec, "minus", true ) )
-    {
-        tops0.push_back ( new Minus3D() );
-        Operation3D* o = new Minus3D();
-        o->setContext(true);
-        tops4.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "minus_abs", true ) )
-    {
-        tops0.push_back ( new MinusAbs3D() );
-        Operation3D* o = new MinusAbs3D();
-        o->setContext(true);
-        tops4.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "addition", true ) )
-    {
-        tops0.push_back ( new Addition3D() );
-        Operation3D* o = new Addition3D();
-        o->setContext(true);
-        tops4.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "only1", true ) )
-    {
-        tops0.push_back ( new Only13D() );
-        Operation3D* o = new Only13D();
-        o->setContext(true);
-        tops4.push_back ( o );
-    }
-    if ( conf->gB ( featsec, "rel_x", true ) )
-        tops0.push_back ( new RelativeXPosition3D() );
-    if ( conf->gB ( featsec, "rel_y", true ) )
-        tops0.push_back ( new RelativeYPosition3D() );
-    if ( conf->gB ( featsec, "rel_z", true ) )
-        tops0.push_back ( new RelativeZPosition3D() );
-
-    this->ops.push_back ( tops0 );
-    this->ops.push_back ( tops1 );
-    this->ops.push_back ( tops2 );
-    this->ops.push_back ( tops3 );
-    this->ops.push_back ( tops4 );
+    this->ops.push_back ( new SimpleOperationPool ( conf ) );
+    this->ops.push_back ( new RegionOperationPool ( conf ) );
+    this->ops.push_back ( new RectangleOperationPool ( conf ) );
+    this->ops.push_back ( new RectangleOperationPool ( conf, true ) );
+    this->ops.push_back ( new SimpleOperationPool ( conf, true ) );
+
+    for ( unsigned short i = 0; i < ops.size(); i++ )
+        ops[i]->getOperations();
 }
 }
 
 
 double SemSegContextTree3D::getBestSplit (
 double SemSegContextTree3D::getBestSplit (
@@ -436,14 +307,8 @@ double SemSegContextTree3D::getBestSplit (
         f2 = ( int ) ( rand() % classNames->numClasses() );
         f2 = ( int ) ( rand() % classNames->numClasses() );
 
 
         /* random extraction method (operation) */
         /* random extraction method (operation) */
-        int o = ( int ) ( rand() % ops[ft].size() );
-
-        Operation3D *op = ops[ft][o]->clone();
-        if ( ft == 3 || ft == 4 )
-            op->setContext ( true );
-        else
-            op->setContext ( false );
-
+        int o = ( int ) ( rand() % ops[ft]->pool.size() );
+        Operation3D *op = ops[ft]->pool[o]->clone();
         op->set ( x1, y1, z1, x2, y2, z2, f1, f2, ft );
         op->set ( x1, y1, z1, x2, y2, z2, f1, f2, ft );
         op->setWSize( windowSize );
         op->setWSize( windowSize );
 
 
@@ -1890,9 +1755,8 @@ void SemSegContextTree3D::classify (
     // TODO: operations in "forest"
     // TODO: operations in "forest"
     while( !ops.empty() )
     while( !ops.empty() )
     {
     {
-        vector<Operation3D*> &tops = ops.back();
-        while ( !tops.empty() )
-            tops.pop_back();
+        OperationPool* op = ops.back();
+        op->clear();
 
 
         ops.pop_back();
         ops.pop_back();
     }
     }
@@ -2024,13 +1888,13 @@ void SemSegContextTree3D::restore ( std::istream & is, int format )
             {
             {
                 for ( uint o = 0; o < ops.size(); o++ )
                 for ( uint o = 0; o < ops.size(); o++ )
                 {
                 {
-                    for ( uint o2 = 0; o2 < ops[o].size(); o2++ )
+                    for ( uint o2 = 0; o2 < ops[o]->pool.size(); o2++ )
                     {
                     {
                         if ( forest[t][n].feat == NULL )
                         if ( forest[t][n].feat == NULL )
                         {
                         {
-                            if ( ops[o][o2]->getOps() == feattype )
+                            if ( ops[o]->pool[o2]->getOps() == feattype )
                             {
                             {
-                                forest[t][n].feat = ops[o][o2]->clone();
+                                forest[t][n].feat = ops[o]->pool[o2]->clone();
                                 break;
                                 break;
                             }
                             }
                         }
                         }

+ 5 - 3
semseg/SemSegContextTree3D.h

@@ -20,7 +20,9 @@
 
 
 // nice-semseg includes
 // nice-semseg includes
 #include "SemanticSegmentation.h"
 #include "SemanticSegmentation.h"
-#include "operations/Operations3D.h"
+#include "operations/SimpleOperationPool.h"
+#include "operations/RegionOperationPool.h"
+#include "operations/RectangleOperationPool.h"
 
 
 namespace OBJREC
 namespace OBJREC
 {
 {
@@ -86,8 +88,8 @@ private:
 
 
   int labelIncrement;
   int labelIncrement;
 
 
-  /** prototype operations for pairwise features */
-  std::vector<std::vector<Operation3D*> > ops;
+  /** prototype operations for features */
+  std::vector<OperationPool*> ops;
 
 
   /** use alternative calculation for information gain */
   /** use alternative calculation for information gain */
   bool useShannonEntropy;
   bool useShannonEntropy;