Prosta aplikacja, która dała mi sporo wiedzy w kwestiach budowania modeli ML oraz korzystania ze swift. Trochę o tym jak zbierać dane z jakich narzędzi korzystałem i co mi pomogło napisać tą prostą aplikację, która wykrywa znaki drogowe i czyta wartości w oparciu o OCR. Ogólna informacja na temat budowy takiej aplikacji.

Aplikacja mobilna to miał być dodatek, do aplikacji pythonowej. Chodziło też o sprawdzenie jak zrobić taką aplikację, jak to będzie działać i jakie ewentualnie problemy wystąpią przy jego budowie. Projekt zakładał stworzenie głównej aplikacji przy użyciu Pythona. Początkowo aplikacja miała korzystać z modelu zbudowanego w TensorFlow, z racji tego, że konwersja modelu TensorFlow do formatu MLmodel nie poszła zbyt dobrze, trzeba było zbudować nowy model w oparciu o narzędzia Xcode.

Założenia

  • Aplikacja rozpoznaje 8 klas znaków drogowych
  • Aplikacja korzysta z Optical Character Recognition (OCR) do odczytwania wartości ze znaków

Dataset – zbiór danych

Dane zebrałem robiąc zdjęcia i filmy w drodze na uczelnie, czy gdzieś się wybierając. Użyto ponad 500 zdjęć, następnie znaki zostały oznaczone przy użyciu IBM Cloud Annotations. Następnie rozszerzyłem zbiór danych (dodająć rozmazania i szumy) przy użyciu Roboflow do ponad 1300 zdjęć.

Statystyki datasetu

Ciekawostka

Znak skrótu oznaczony jest turkusowym obramowaniem. Znak mówi o skrócie na ulice Ratburana

Jeden ze znaków jaki został użyty do tego datasetu to znak skrótu. Znak jest jedyny w swoim rodzaju. Nie spotkałem się z takim znakiem chyba nigdzie indziej.

Training modelu

Z gotowym datasetem czas na trenowanie modelu. Jak już wcześniej opisałem, część zespołu zajęła się trenowaniem pod TensorFlow i próbą konwersji do mlmodel, a kiedy to nie przyniosło oczekiwanych rezultatów, to zacząłem trening modelu z wykorzystaniem narzędzi z Xcode – Create ML.

Pierwszy model pokazał, że potrzeba wprowadzić pewne zmiany. Jeśli w zbiorze jest przeważająca ilość danego znaku, to może znacząco zakłócić rozpoznawanie pozostałych. Tak jak naprzykład ograniczenie prędkości a ograniczenie wysokości – bardzo podobne do siebie znaki. Należy zbalansować klasy, aby uniknąć tego problemu. Mam na myśli to, żeby dodać więcej danych do miejszej klasy, a nie pomniejszać większe klasy. Dodatkowym problemem jest rozpoznawalność danego obiektu w zależności od natężenia światła czy kąta pod którym jest dany obiekt. Można, to trochę naprawić poprzez augmentacje (rozszerzenie bazy np. za pomocą roboflow) lub zwyczajnie należy powiększyć zbiór danych, aby to działało lepiej (zdjęcia pod różnym kątem, z różnej odległości, w różne pory dnia).

Confusion Matrix na testowaniu

Wykorzystano model darknet-yolo przy 11k iteracji. Model do pobrania tutaj. Dodam, nie wiem jak może działać ów model ze znakami innymi niż tajskie.

Aplikacja iOS

Swift jest dosyć łatwy jeśli chodzi o pewne gotowe rozwiązania. Założenie było proste. Wykrycie obiektu, wycięcie znaku i puszczenie owego znaku na OCR, w celu rozczytania tekstu. Implementacje wykrycia obiektu na zdjęciu można w prosty sposób nauczyć się od polskiego youtubera (wideo w języku angielskim), czy też z dokumentacji.

Wykrywając objekt, to metoda zwraca jego położenie na zdjęciu oraz wymiar – nazwjimy je parametry. Następnie parametry wykrytego obiektu pomogą nam w wycięciu tego obszaru(wykrytego znaku), który chcemy wrzucić w OCR. Prosta metoda i gotowe!

    func cropImage(image: UIImage, rect: CGRect) -> CGImage {
        let croppedCGImage: CGImage = image.cgImage!.cropping(to: rect)!
        return croppedCGImage
    }

Następnie gotowe nowe wycięte zdjęcie zostanie poddane podobnemu procesowi, mianowicie będziemy poszukiwać na znaku znaków (cyfr lub liter). W skrócie OCR.

Vision Framework na razie nie obsługuję tajskiego. Jednak z rozczytaniem się łacińskich znaków nie ma problemu. Można by było, to naprawić, trenując własny model. Są też i gotowe biblioteki pod język tajski, ale są napisane na stare wersje SWIFT i ich konwersja na nową wersje nie jest tego warta. Można by było jeszcze poprawić UI, jednak szkoda było na to czasu. W niedalekiej przyszłości Vision Framework będzie obsługiwał język tajski.

screenshot z aplikacji

Myślę, że takie mini projekty, to dosyć dobre pole do nauki wielu dziedzin i można się sporo nauczyć (nawet programowania równoległego, aby przyśpieszyć wydajność aplikacji).

Aplikacja do pobrania tutaj.

Mały test modelu 🙂

Zachęcam do wsparcia bloga – link na dole strony. Jeśli ktokolwiek by chciał nauczyć się jak zrobić taką aplikację krok po kroku zapraszam do komentowania i zostawienia mi takiej informacji.