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++;
}
以及下面的代码。
谁能解释一下这是怎么回事?
#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
(默认值)和 dynamic
。 Check 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);
我一直在看 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++;
}
以及下面的代码。
谁能解释一下这是怎么回事?
#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
(默认值)和 dynamic
。 Check 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);