728 x 90

Jak maszynowo rozpoznać obraz?

Jak maszynowo rozpoznać obraz?

CV, czyli Computer Vision jest tematem, który pojawia się w kontekście autonomicznych samochodów, rzeczywistości rozszerzonej, smartfonów, wirtualnej rozrywki, narzędzi wspomagających pracę i wielu innych. Opowiem tu trochę o bibliotekach OpenCV i JavaCV, które, jako narzędzie Open Source, pozwolą na integrację tego typu rozwiązań we własnym oprogramowaniu.

OpenCV (Open Source Computer Vision library) to bezpłatna biblioteka open-source do użytku komercyjnego oraz edukacyjnego i nie jest wymagane udostępnianie projektów zawierających jej implementację. Wydana jest na licencji BSD, więc jest darmową biblioteką, która powstała w 1999 roku z inicjatywy Intela. Napisana w językach C oraz C++, oferuje cały szereg udogodnień związanych z dziedziną wizji komputerowej. Biblioteka ta została zaprojektowana z naciskiem na efektywność, dlatego najważniejsze komponenty zostały zakodowane w czystym C. Celem głównym biblioteki jest dostarczenie narzędzi dla ludzi o różnym poziomie umiejętności programistycznych. OpenCV pozwala tworzyć zarówno proste programy, jak i zaawansowane projekty. Oferuje ponad 500 funkcji, które obejmują wiele obszarów wizji komputerowej, dzięki czemu programista nie musi poświęcać czasu na pisanie funkcji bazowych. Posiada wbudowaną bibliotekę MLL (Machine Learning Library). Programiści innych języków programowania mogą się także cieszyć z możliwości, jakie daje OpenCV, ponieważ biblioteka posiada nakładki umożliwiające pisanie w językach C#, Python, Java. Biblioteka OpenCV korzysta z klasyfikatora Haar, który opiera się na wirtualnym oknie przesuwającym się po obrazie w celu znalezienia pasujących regionów. Biblioteka pozwala na stworzenie własnego klasyfikatora. Aby stworzyć tenże klasyfikator potrzebne są dwa zbiory uczące: pozytywny, który zawiera interesujące nas obiekty oraz negatywny, który jest zbiorem wszystkiego, co może być tłem obiektu.

Istniejące klasyfikatory OpenCV:
– haarcascade eye tree eyeglasses.xml – haarcascade eye.xml
– haarcascade frontalface alt2.xml
– haarcascade frontalface alt tree.xml – haarcascade frontalface alt.xml
– haarcascade mcs mouth.xml
– haarcascade mcs nose.xml

Są to klasyfikatory wytrenowane do wyszukiwania twarzy zarówno frontalnie, jak i z profilu oraz ich części składowych np. : uszy, oczy itp. Przykładowy kod wczytania klasyfikatora oraz zaznaczenie na obrazie wykrytych obiektów wygląda następująco

public class JavaCv {
    /*wczytanie klasyfikatora*/
    public static final String XML_FILE = "classfier.xml"; 

    public static void main(String[] args) {
        /*wczytanie zdjęcia*/
        IplImage img = cvLoadImage("test4.jpg");
        detect(img);
    }
    
    public static void detect(IplImage src) { 
        /*stworzenie obiektu klasyfikatora*/ 
        CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(cvLoad(XML_FILE));
        
        /*przydzielenie pamięci na dane*/
        CvMemStorage storage = CvMemStorage.create();
        
        /*metoda wykrywająca obiekty za pomocą klasyfikatora*/
        CvSeq sign = cvHaarDetectObjects(src, cascade, storage, 1.5, 3, CV_HAAR_DO_CANNY_PRUNING);
        
        /*liczba wykrytych obiektów*/
        int total_Faces = sign.total();
        
        /*pętla zaznaczająca wykryte obiekty*/
        for(int i = 0; i < total_Faces; i++) {
            CvRect r = new CvRect(cvGetSeqElem(sign, i));
            CvPoint pt1 = new CvPoint(r.x(), r.height()/2+r.y());
            CvPoint pt2 = new CvPoint(r.width()+r.x(), r.height()/2+r.y());
            cvRectangle(src, cvPoint(r.x(), r.y()), cvPoint(r.width()+r.x(), r.height()+r.y()), CvScalar.RED, 2, CV_AA, 0);
        }
        
        /*wyświetlenie obrazu*/
        cvShowImage("test",src);
        cvWaitKey(0);
    }
}

Architektura OpenCV

W skład OpenCV wchodzi:

1. CV oraz CVaux – zawierające funkcje transformacji, konwersji przestrzeni obrazów, filtracji, funkcje analizy obrazów np. operacje morfologiczne, detekcja krawędzi, selekcja, obsługa histogramów, detekcja obiektów.

2. MLL (Machine Learning Library) – funkcje odpowiadające za tworzenie klasyfikatorów uczenia maszynowego.

3. HighGUI – zawiera narzędzia tworzenia interfejsu okienkowego, sekwencje wideo etc.

4. CxCore – zawiera operacje na tablicach, algebrę macierzy, wsparcie dla plików XML, funkcje matematyczne i inne.

JavaCV

JavaCV jest wrapperem OpenCV dla Javy. JavaCV są to zintegrowane w jednej paczce biblioteki do obróbki obrazu.

Należą do nich :

  • OpenCV,
  • FFmpeg,
  • libdc1394,
  • PGR FlyCapture,
  • OpenKinect,
  • videoInput,
  • ARToolKitPlus.

Użyteczność klas ułatwia prace na platformie Java oraz systemie Android. Biblioteka JavaCV posiada:

  • CanvasFrame – sprzętowa akceleracja pełnoekranowego wyświetlania obrazu,
  • Parallel – metody umożliwiające wykonywanie kodu równolegle na kilku rdzeniach,
  • GeometricCalibrator,
  • ProCamGeometricCalibrator – kalibracja kolorów, geometrii obrazu kamer i projektorów,
  • ProCamColorCalibrator,
  • ObjectFinder – wykrywanie i dopasowywanie obiektów oraz klasy implementujące bezpośrednie wyrównanie obrazu: NGImageAligner, ProjectiveTransformer.

Podstawy detekcji obrazu

Do wykrycia obiektu na zdjęciu konieczne jest wstępne rozpoznanie tego zdjęcia. Aby stwierdzić, co znajduje się na zdjęciu trzeba na samym początku określić, jakie to są obiekty, oraz w którym miejscu na obrazie się znajdują. Kiedy obiekty są bardzo proste, dalszy proces obróbki danych nie jest konieczny.

Do wykrywania skomplikowanych obiektów wymaga się złożonych algorytmów. Na początku wykrywane są mniejsze fragmenty, których rodzaj i położenie pozwala na zidentyfikowanie obiektu. Bardzo często wykorzystuje się do tego algorytm linii, który przebiega na początku, wykrywa krótkie odcinki, po czym łączy je w dłuższe fragmenty. Istnieją obiekty, którym nie można przypisać kształtu lub dany kształt jest zbyt skomplikowany, np. twarz. Każdy człowiek ma inną twarz, a do tego widziana pod innym kątem wygląda inaczej. Utrudnić rozpoznanie może również założona czapka na głowie, bądź okulary. Wtedy z pomocą przychodzi nam inna cecha twarzy, dzięki której możemy ją rozpoznać – mianowicie kolor. Przy takim wykrywaniu obiektu, niezbędne jest określenie typu koloru, jaki ma być rozpoznany oraz jego zakres. Dokonuje się tego poprzez pobranie kilku próbek obiektów wzorcowych. Proces pobierania próbek koloru polega na oznaczeniu obszarów, gdzie znajdują się obiekty wzorcowe. Po takim oznaczeniu wyznacza się średni kolor oraz dopuszczalne jego odchyły. Daje to możliwość określenia zakresu. Wykrywanie za pomocą koloru nie jest tylko ograniczone do detekcji twarzy. Można stosować ten sposób wszędzie, gdzie kolor obiektu znacznie się różni od kolorów otaczających go innych obiektów. W praktyce w większości przypadków wykrywanie obiektów na podstawie koloru jest mało skuteczne, ponieważ duży wpływ ma zmienna charakterystyka oświetlenia obiektów. Jeżeli przyjęty został zbyt mały zakres kolorów, to przy zmianie oświetlenia obiekt może zostać niewykryty. Natomiast, gdy zostanie przyjęty zbyt duży zakres kolorów, to wykryty będzie obiekt docelowy i inne, które nie powinny zostać wykryte.

Można wykorzystać wykrywanie za pomocą tekstury. Większość obiektów charakteryzuje się lokalnymi, niewielkimi zmianami kolorystyki. Ten sposób wykrywania łączy się z wykrywaniem koloru, przez co można przyjąć większą tolerancję koloru. Jest to możliwe do zrealizowania pod warunkiem, że tekstura pokrywająca obiekt posiada elementy powtarzające się w wielu miejscach. Najkorzystniejsza jest sytuacja, w której elementy powtarzają się cyklicznie.

Podsumowanie

Technologie typu JavaCV mogą z powodzeniem zostać zastosowane w urządzeniach mobilnych, pomimo znacznej złożoności problemu rozpoznawania obrazów. Aktualny postęp w dziedzinie urządzeń mobilnych pozwala na wygodne korzystanie nawet z wymagających i złożonych algorytmów.

Zastosowanie tego typu technologii w urządzeniach mobilnych pozwala ułatwić życie zawodowym muzykom oraz osobom uczącym sie grania na instrumentach i czytania nut. JavaCV została do tego stworzona, ponieważ posiada wiele metod do przetwarzania  obrazu oraz wykrywania obiektów na nim, działa na platformie android, która jest na wielu urządzeniach mobilnych i może zostać wykorzystana do wielu profesjonalnych zastosowań ze stosunkowo małym nakładem kosztów.

Jednocześnie producenci urządzeń mobilnych wprowadzają podobne frameworki natywnie, pozwalając korzystać w większym stopniu z zasobów sprzętowych urządzeń (np. CoreML, z którym nie wszystko da się zrobić).

O tym jak używać OpenCV na macu poczytacie na stronach stamfordresearch.com.

Źródło obrazu z nagłówka: stamfordresearch.com

 

Leave a Comment

Your email address will not be published. Required fields are marked with *

Cancel reply

Inne artykuły