Различные результаты с каскадом Хаара в режиме выпуска/отладки

Я использую каскадный классификатор Хаара, обученный на основе набора данных автомобилей MIT для обнаружения транспортных средств. в OpenCV (обучался с помощью утилит, поставляемых с OpenCV). Это работает достаточно хорошо при компиляции в режиме отладки, но при компиляции в режиме выпуска каскад вообще не выполняет никаких обнаружений. Выполнение следующего кода на тестовом изображении ниже дает обнаружение в режиме отладки, но ничего в режиме выпуска (это поведение сохраняется для всех изображений в моей последовательности данных).

Можете ли вы предположить, почему это происходит и, что более важно, что я могу сделать, чтобы получить обнаружение при работе в режиме выпуска?

Каскадный файл

Код

cv::Mat testImage = cv::imread("testImage.png",0);
cv::equalizeHist(testImage, testImage);

cv::CascadeClassifier vehicleCascade;
vehicleCascade.load("cars3.xml");

// Detect vehicles
std::vector<cv::Rect> cars;
vehicleCascade.detectMultiScale(
    testImage,                  // Input image
    cars,                   // Output bounding boxes
    1.1,                    // scale factor - how much image size is reduced at each scale
    5,                      // min neighbours - how many neighbours required to maintain rect
    0|CV_HAAR_SCALE_IMAGE,  // Not used
    cv::Size(30,30),        // Min poss object size
    cv::Size()              // Max poss object size
    );

std::cout << "Found " << cars.size() << " objects.\n";

for (int i=0; i<cars.size(); ++i)
    cv::rectangle(testImage, cars.at(i), CV_RGB(255,0,0), 3);

cv::namedWindow("Haar cascade");
cv::imshow("Haar cascade", testImage);
cv::waitKey(0);
cv::imwrite("output.png", testImage);

Тестовое изображение

testImage


person Chris    schedule 20.12.2012    source источник
comment
Файлы изображений и каскадов загружаются нормально, в моем реальном коде я использую полные пути к каталогам. Насколько я могу судить, ни в одном из режимов нет ошибок, единственное различие заключается в количестве объектов, которые возвращает методDetectMultiScale.   -  person Chris    schedule 20.12.2012
comment
Хорошо: / Я удалил свой первый комментарий, так как часть о png не имела отношения к делу.   -  person Étienne    schedule 20.12.2012
comment
Это часто является признаком наличия UB и зависимости от определенного поведения (либо в вашем коде, либо в библиотеке) или зависимости от специально сгенерированного кода, который отличается (например, точность с плавающей запятой из-за того, что вещи остаются в регистрах в режиме выпуска). Лучшее, что вы можете здесь сделать, это сравнить все задействованные вычисления шаг за шагом в обоих режимах и выяснить, где они начинают отклоняться.   -  person PlasmaHH    schedule 08.01.2013
comment
Согласен с PlasmaHH: скорее всего виноват UB. У вас может быть, например. ошибка ограждения, которая часто приводит к определенному поведению в отладочной версии, а затем к другому поведению в версии выпуска, потому что распределения в конечном итоге находятся в другом порядке. В качестве быстрого и дешевого теста вы пробовали запустить программу в valgrind?   -  person smocking    schedule 09.01.2013


Ответы (2)


  1. Странно, но у меня ваш код работает нормально в обоих режимах. Я использую Visual Studio 2010 на Windows 7 32bit. Вот мой проект — https://www.dropbox.com/s/5kubn5tlu7k6ziy/opencvhw.rar, так что вы можете проверить исполняемые файлы (каталоги Release и Debug). Если вы используете визуальную студию и хотите создать ее самостоятельно, вам придется изменить пути к библиотеке и включить каталоги для обоих режимов (путь к каталогам для включения одинаков, путь к каталогам библиотеки отличается). (проект ->... свойства -> свойства конфигурации -> каталоги vc++)

  2. Как правило, я бы рекомендовал очень тщательно проверить конфигурацию проекта. Очень легко сделать небольшую ошибку, которая может привести к очень странному поведению. Иногда лучший вариант — настроить все с нуля еще раз.

  3. В OpenCV есть очень странные баги - в этом нет ничего нового :) Например, я не могу использовать некоторые кодеки при отладке - если я запускаю программу в режиме отладки, но без отладки все нормально, но если я пытаюсь отладить - каждый кадр читается из файла пуст (но его размер правильный). Возможно, вы только что столкнулись с чем-то похожим. Попробуйте преобразовать изображение в другой формат (я думаю, что bmp - лучший выбор для теста - он всегда должен работать без каких-либо дополнительных библиотек).

  4. Также обратите внимание, что вы загрузили файл jpg, поэтому мне пришлось переименовать и преобразовать его самостоятельно - возможно, во время преобразования что-то в этом файле изменилось, поэтому мы не тестируем ваш код на точно таких же файлах - загрузите файл png в Dropbox, чтобы я можете протестировать.

person cyriel    schedule 12.01.2013
comment
Спасибо, что изучили это для меня. К сожалению, в данный момент у меня нет доступа к Dropbox, поэтому я не могу протестировать ваш проект или загрузить больше файлов, но я могу подтвердить, что у меня все еще есть та же проблема. Я использую CMake для создания проекта, поэтому, возможно, там есть опция, которую мне не хватает. На данный момент я исключил каскад Хаара из своего проекта и вернусь, чтобы изучить его позже. - person Chris; 15.01.2013

См. этот пост: этот тип ошибки могут быть вызваны привязкой к библиотеке отладки opencv в режиме выпуска.

person Étienne    schedule 20.12.2012
comment
Я читал это, но у меня нет проблем с загрузкой файла xml или запуском кода, просто результат отличается. Кроме того, загружаются правильные DLL OpenCV - отладка за отладкой, выпуск за выпуском. - person Chris; 20.12.2012