gpt4 book ai didi

c++ - Bag Of Words 的标签数据

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:13 26 4
gpt4 key购买 nike

我一直在看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++;
}

以及下面的代码。

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

最佳答案

编译指示来自 OpenMP,一个 specification 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) 是结合了其他几个编译指示的速记。让我们看看他们:

#pragma omp parallel 使用一组线程启动一个 parellel block ,这些线程将并行执行下一个 stament。

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

例如:

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

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

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

现在,所有这些编译指示都可以缩短为一个:

#pragma omp parallel for schedule(dynamic,3)

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

critical pragma 将下一个 block 的执行限制为一次单个线程。在您的示例中,一次只有一个线程会执行此操作:

   {
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);

关于c++ - Bag Of Words 的标签数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com