2012-12-20 43 views
13

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?

Cascade File

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

testImage

+0

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

+0

Ok:/Usunąłem mój pierwszy komentarz, ponieważ część dotycząca png nie była trafna. –

+0

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

Odpowiedz

3
  1. To dziwne, ale dla mnie kod działa dobrze w obu trybach. Używam Visual Studio 2010 na Windows 7 32bit. Oto mój projekt - https://www.dropbox.com/s/5kubn5tlu7k6ziy/opencvhw.rar, dzięki czemu można sprawdzić pliki wykonywalne (katalogi wydania i debugowania). Jeśli korzystasz z wizualnego studio i chcesz zbudować go samodzielnie, będziesz musiał zmienić ścieżki do biblioteki i uwzględnić katalogi dla obu trybów (np. Ścieżka do katalogów jest taka sama, ścieżka do katalogów biblioteki jest inna). (projekt -> ... właściwości -> właściwości konfiguracyjne -> katalogi vC++)

  2. Ogólnie polecam sprawdzić naprawdę starannie konfigurację projektu. Bardzo łatwo popełnić mały błąd, który może powodować bardzo dziwne zachowanie. Czasami najlepszą opcją jest ponowne skonfigurowanie wszystkiego od zera.

  3. OpenCV ma bardzo dziwne błędy - to nic nowego :) Na przykład nie mogę używać niektórych kodeków podczas debugowania - jeśli uruchomię program w trybie debugowania, ale bez debugowania wszystko jest w porządku, ale jeśli próbuję debugować - każda ramka odczytana z pliku jest pusta (ale jej rozmiar jest poprawny). Możliwe, że właśnie spotkałeś coś podobnego. Spróbuj przekonwertować obraz do innego formatu (uważam, że bmp jest najlepszym wyborem do testu - powinien zawsze działać bez żadnych dodatkowych bibliotek).

  4. Pamiętaj również, że przesłałeś plik jpg, więc musiałem zmienić nazwę i przekonwertować go na własną rękę - może podczas konwersji coś w tym pliku uległo zmianie, więc nie testujemy kodu na dokładnie tych samych plikach - prześlij ci png Plik w Dropbox, więc mogę go przetestować.

+0

Dzięki za rozpatrzenie tego dla mnie. Niestety nie mam obecnie dostępu do Dropbox, więc nie mogę przetestować twojego projektu ani przesłać więcej plików, ale mogę potwierdzić, że na pewno wciąż mam ten sam problem. Używam CMake do generowania projektu, więc może jest tam opcja, której mi brakuje. W chwili obecnej pominąłem kaskadę Haar z mojego projektu i powrócę do zbadania tego bardziej w późniejszym terminie. – Chris

2

Zobacz ten post: Ten typ błędu może być spowodowany przez połączenie z biblioteką debugowania opencv w trybie zwolnienia.

+0

Przeczytałem, że, ale nie mam żadnych problemów z ładowaniem pliku xml lub uruchomieniem kodu, to tylko wynik, który jest inny. Ponadto ładowane są poprawne biblioteki DLL OpenCV - debugowanie w celu debugowania, wydanie do wydania. – Chris