Маркировка данных для Bag Of Words

Я смотрел на этот урок и часть маркировки смущает меня. Не саму маркировку, а то, как процесс показан в учебнике.

Более конкретно #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++;
}

А также следующий код ниже.

Кто-нибудь может объяснить, что здесь происходит?

1

Решение

Прагмы из OpenMP, спецификация для набора директив компилятора, библиотечных подпрограмм и переменных среды, которые могут использоваться для указания высокоуровневого параллелизма в программах на языках Fortran и C / C ++.

#pragma omp parallel for schedule(dynamic,3) это сокращение, которое сочетает в себе несколько других прагм. Давайте посмотрим на них:

#pragma omp parallel запускает блок parellel с набором потоков, которые будут выполнять следующую стадию параллельно.

Вы также можете указать «параллельные циклы», например for loop: #pragma omp parallel for, Эта прагма разделит цикл for между всеми потоками внутри параллельного блока, и каждый поток выполнит свою часть цикла.

Например:

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

Это создаст параллельный блок, который будет выполнять цикл for. Нити будут печататься на стандартный вывод Hello пять раз, в не указанном порядке (я имею в виду, что поток № 3 может напечатать свой «Hello» перед потоком № 1 и т. д.).

Теперь вы также можете запланировать, какой кусок работы получит каждый поток. Есть несколько политик: static (по умолчанию) и dynamic, Проверьте этот удивительный ответ в отношении политики планирования.

Теперь все эти прагмы можно сократить до одной:

#pragma omp parallel for schedule(dynamic,3)

который создаст параллельный блок, который будет выполнять цикл for, с динамическим планированием, и каждый поток в блоке выполнит 3 итерации цикла, прежде чем запрашивать у планировщика дополнительные порции.

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

Вот у вас есть введение в 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);
3

Другие решения


По вопросам рекламы [email protected]