- Temat projektu
- Realizacja
- Interfejs użytkownika (instrukcja obsługi)
- Użyte technologie
- Zestaw danych i przykładowe wyniki
- Jak uruchomić projekt?
- Wnioski
- Autorzy
Celem projektu było stworzenie prostej aplikacji umożliwiającej predykcję lokalizacji na podstawie filmu wideo (preferowany format: mp4).
Aktualna wersja aplikacji radzi sobie dobrze tylko dla filmów z krajów europejskich.
Algorytm przewidywania lokalizacji składa się z kilku modułów. W celu przyspieszenia zdecydowano się na analizowanie co kilku klatek (liczba ta uzależniona jest od stałej EVERY_N_FRAME; wszystkie stałe znajdują się w pliku app/constants.py).
W celu wykrycia tekstu skorzystano z narzędzia do optycznego rozpoznawania znaków (OCR) - Pytesseract. Potrafi on czytać i rozpoznawać tekst na obrazach i jest powszechnie używany w obrazach do wykrywania tekstu. Obsługuje szeroką gamę języków. Dla zwiększenia efektywności obrazy powinny być wstępnie przetworzone. Klatki zostały przekonwertowane do skali szarości, a następnie zmodyfikowane za pomocą filtru Gaussa.
Minimalna wymagana długość słowa jest określona przez MIN_WORD_LENGTH.
Do modułu odpowiedzialnego za wykrywania języka wykorzystano biblioteki fastText oraz PyCountry. FastText jest biblioteką opracowaną przez zespół firmy Facebook. Pozwala na klasyfikację tekstu wykorzystując hierachiczne klasyfikatory. Główną zaletą tej biblioteki jest liczba obsługiwanych języków - obecnie 176.
FastText udostępnia 2 modele do predykcji języka - skompresowany z mniejszą dokładnością oraz pełny. Oba został wytrenowane z wykorzystaniem danych z serwisów takich jak Wikipedia czy Tatoeba.
Importując pretrenowany model jesteśmy w stanie (z pewnym błędem) mapować wybraną sekwencję znaków na kod ISO wykrytego języka.
Język angielski występuje powszechnie, dlatego zdecydowano się na osłabienie jego wagi (stała WEAKEN_ENGLISH_CONTANT). Dodatkowo prawdopodobieństwo wykrytego języka nie może być mniejsze niż określone przez LANGUAGE_ACCURACY_THRESHOLD, a całkowita liczba wykryć danego języka powinna być równa co najmniej MINIMAL_NUMBER_OF_LANGUAGE_ENTRIES razy.
Wykorzystano funkcje biblioteki OpenCV w połączeniu z klasyfikatorem Haara. W pierwszej fazie na obrazie/klatce wyszukiwana jest tablica rejestracyjna. Jeśli zostanie znaleziona, to następuje ekstracja tekstu za pomocą modułu omówionego wcześniej. Wówczas numer z tablicy pobrany w ten sposób jest przetwarzany w poszukiwaniu kraju z jakiego może pochodzić. W tym celu posłużono się hiszpańską stroną https://www.ofesauto.es/en/know-the-nationality-of-a-vehicle-through-its-plate-number/, która pomaga w identyfikacji kraju, zwracając dane prawdopodobieństwo (przyjęty minimalny próg dokładności jest ustalony przez PLATE_CODE_ACCURACY_THRESHOLD). Wyniki są scrapowane i przesyłane dalej do funkcji zwracającej ostateczne wyniki.
Wyniki trzymane są w słownikach jako pary/tuple: (nazwa kraju, zsumowane prawdopodobieństwo). Kody ISO krajów są wcześniej konwertowane na pełne nazwy z wyjątkiem języków na podstawie, których nie da się jednoznacznie określich kraju, np. angielski - en. Słowniki są łączone w jeden względem kluczy w taki sposób, że dodawane są do siebie zsumowane prawdopodobieństwa. Wówczas powstaje jeden słownik wynikowy, na podstawie którego wyliczane jest (po uprzedniej normalizacji) końcowe prawdopodobieństwo.
- Uruchom aplikację (zobacz Jak uruchomić projekt?)
- Wczytaj film za pomocą przycisku
Load file - Po załadowaniu naciśnij
Precict.
Uwaga! Proces predykcji może zająć kilka(naście) minut. - Wynik końcowy pojawi się na dole ekranu aplikacji.
- Aby zamknąć aplikację, użyj przycisku
Quit.
![]() |
|---|
| Ekran startowy aplikacji |
![]() |
|---|
| Ekran aplikacji po załadowaniu filmu |
![]() |
|---|
| Ekran aplikacji w czasie przetwarzania (na dole pasek postępu widoczny w konsoli) |
Dane zostały zebrane w katalogu dataset z filmów udostępnionych na platformie YouTube i wycięto z nich najbardziej znaczące momenty.
- Rotterdam - https://www.youtube.com/watch?v=P_WmMAL9OoU
- Warszawa - https://www.youtube.com/watch?v=2TerKs9YwoM
- Praga - https://www.youtube.com/watch?v=FIltxaXz9Ng
- Frankfurt - https://www.youtube.com/watch?v=vnqkraiSiTI
![]() |
|---|
| Wyniki dla pliku Warsaw.mp4 |
![]() |
|---|
| Wyniki dla pliku Rotterdam.mp4 |
![]() |
|---|
| Wyniki dla pliku Prague.mp4 |
- Sklonuj repozytorium:
git clone - Wejdź do katalogu app:
cd app - Stwórz wirtualne środowisko (preferowana nazwa to
venvtak, by gitingore mógł je pominąć):py -m venv venv(lubpython -m venv venv) - Aktywuj stworzone środowisko (dla Windows:
venv\Scripts\activate) - Zaintaluj odpowiednie moduły:
pip install -r requirements.txt
Użyj odpowiedniej wersjifasttextwheel dla (zobacz tu; domyślnie ustawione na Windows 64-bitowy) - Uruchom aplikację:
py main.py(lubpython main.py)
- wykrywanie tekstu, języka jak i numeru rejestracyjnego na obrazie jest kłopotliwym zadaniem i nie zawsze daje pożądane rezultaty
- nawet pomimo poprawnego wykrycia tekstu, języka czy numeru rejestracyjnego, często nie można jednoznacznie ustalić kraju pochodzenia filmu, np. w przypadku wykrycia języka angielskiego nie można wskazać jednego kraju, w którym obowiązuje ten język albo gdy na filmie zostanie wykrytych dużo rejestracji kojarzonych z innym niż docelowym krajem (czego dowodzi działanie aplikacji na przykładzie filmu z Czech - Pragi)
- aplikacja działa dosyć wolno, nawet pomimo analizowania co piątej klatki, dlatego ten aspekt należałoby zdecydowanie poprawić w przyszłości, stosując wielowątkowość, którą trudno było wprowadzić w obecnej strukturze projektu
- uzyskane wyniki zależą również w dużym stopniu od zastosowanych rozwiązań, a należy podkreślić, że wykorzystano darmowe biblioteki i strony internetowe, które same w sobie bywają zawodne
- potencjalny dalszy rozwój aplikacji wymagałby dopracowania m. in.:
- wspomnianej już szybkości (dzięki zaimplementowaniu wielowątkowości)
- interfejsu graficznego
- kolejnych metod pomagających rozszerzyć zastosowanie aplikacji (np. o wykrywanie krajów z kolejnych kontynentów)





