Bag Of Words 的标签数据

Labeling data for Bag Of Words

我一直在看 this tutorial,标签部分让我很困惑。不是标记本身的行为,而是教程中显示过程的方式。

更具体地说 #pragma omp 部分:

#pragma omp parallel for schedule(dynamic,3)
for(..loop a directory?..) {

   ...

   #pragma omp critical
   {
      if(classes_training_data.count(class_) == 0) { //not yet created...
         classes_training_data[class_].create(0,response_hist.cols,response_hist.type());
         classes_names.push_back(class_);
      }
      classes_training_data[class_].push_back(response_hist);
   }
   total_samples++;
}

以及下面的代码。

谁能解释一下这是怎么回事?

编译指示来自 OpenMPspecification for a set of compiler directives, library routines, and environment variables that can be used to specify high-level parallelism in Fortran and C/C++ programs.

#pragma omp parallel for schedule(dynamic,3) 是一个 shorthand,它结合了其他几个 pragma。让我们看看他们:

#pragma omp parallel 启动一个带有一组线程的并行块,这些线程将并行执行下一个 stament。

您还可以指定 "parallel loops",如 for loop: #pragma omp parallel for。此 pragma 将在并行块内的所有线程之间拆分 for 循环,每个线程将执行其循环部分。

例如:

 #pragma omp parallel
 {
  #pragma omp for
  for(int n(0); n < 5; ++n) {
     std::cout << "Hello\n";
 }

这将创建一个将执行 for 循环的并行块。线程将打印到标准输出 Hello 五次,没有指定的顺序(我的意思是,线程 #3 可以在线程 #1 之前打印它的 "Hello" 等等)。

现在,您还可以安排每个线程接收的工作块。有几个策略:static(默认值)和 dynamicCheck this awesome answer in regards to scheduling policies.

现在,所有这些 pragma 都可以缩短为一个:

#pragma omp parallel for schedule(dynamic,3)

这将创建一个执行 for 循环的并行块,具有动态调度,块中的每个线程将执行循环的 3 次迭代,然后再向调度程序请求更多块。

critical pragma 将下一个块的执行限制为一次单线程。在你的例子中,一次只有一个线程会执行这个:

   {
      if(classes_training_data.count(class_) == 0) { //not yet created...
         classes_training_data[class_].create(0,response_hist.cols,response_hist.type());
         classes_names.push_back(class_);
      }
      classes_training_data[class_].push_back(response_hist);
   }

Here你有介绍OpenMP 3.0.

最后,你说的变量在教程中已经指定了,看看你贴出的代码:

vector<KeyPoint> keypoints;
Mat response_hist;
Mat img;
string filepath;
map<string,Mat> classes_training_data;

Ptr<FeatureDetector > detector(new SurfFeatureDetector());
Ptr<DescriptorMatcher > matcher(new BruteForceMatcher<L2<float> >());
Ptr<DescriptorExtractor > extractor(new OpponentColorDescriptorExtractor(Ptr<DescriptorExtractor>(new SurfDescriptorExtractor())));
Ptr<BOWImgDescriptorExtractor> bowide(new BOWImgDescriptorExtractor(extractor,matcher));
bowide->setVocabulary(vocabulary);