Używam klasyfikatora kaskadowego Haar przeszkolonego z MIT cars dataset do wykrywania pojazdów w OpenCV (przeszkolony przy użyciu narzędzi dostarczanych z OpenCV). Działa to całkiem dobrze, gdy jest skompilowany w trybie debugowania, ale po skompilowaniu w trybie Release kaskada nie wykonuje żadnych detekcji. Uruchomienie następującego kodu na obrazie testowym poniżej daje wykrycie w trybie debugowania, ale nic w trybie zwolnienia (to zachowanie jest kontynuowane przez wszystkie obrazy w mojej sekwencji danych).Różne wyniki z kaskadą Haar w trybie zwolnienia/debugowania
Czy możesz zasugerować, dlaczego tak się dzieje i, co ważniejsze, co mogę zrobić, aby uzyskać wykrycia podczas uruchamiania w trybie Release?
Kod
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
Obraz i pliki kaskadowe ładują się dobrze, w moim rzeczywistym kodzie Używam pełnych ścieżek katalogów. O ile mogę powiedzieć, nie ma błędów w żadnym z tych trybów, a jedyną różnicą jest liczba obiektów wykrytych w MULTiScale. – Chris
Ok:/Usunąłem mój pierwszy komentarz, ponieważ część dotycząca png nie była trafna. –
Jest to często oznaką posiadania UB i polegania na określonym zachowaniu (w kodzie lub w bibliotece) lub poleganiu na specjalnie wygenerowanym kodzie, który jest inny (na przykład dokładność zmiennoprzecinkowa z powodu rzeczy pozostających w rejestrach w trybie zwolnienia).Najlepszą rzeczą, jaką można tu zrobić, jest porównanie wszystkich zaangażowanych obliczeń krok po kroku w obu trybach i ustalenie, gdzie zaczynają się odchylać. – PlasmaHH