Update on Overleaf.

This commit is contained in:
Alex Drożdż 2022-09-05 20:15:36 +00:00 committed by node
parent 919b319b8a
commit 4577a174f0
3 changed files with 22 additions and 22 deletions

View File

@ -40,14 +40,14 @@ Najczęściej stosowane funkcje aktywacji to:
\bottomrule
\end{tabular}
\end{table}
\\
Po nałożeniu funkcji aktywacji na ważoną sumę cały proces powtarza się dla kolejnych warstw. Ostatnim krokiem jest przekazanie wartości do warstwy wyjściowej sieci, gdzie liczony jest finalny błąd predykcji. Cały taki proces nazywamy propagacją w przód (z ang. forward propagation) \cite{Jain2021Dec_activatio}. Na poniższej rycinie możemy zauważyć proces opisany powyżej w wersji wizualnej. W tym przypadku dla uproszczenia sieć neuronowa składa się z trzech warstw: 1 wejściowej, 1 ukrytej i 1 wyjściowej. Warstwy wejściowa i ukryta zawierają trzy neurony, a warstwa wyjściowa zaś tylko jeden. Poszczególne wartości w sieci na każdym z etapów przykładu algorytmu propagacji w przód prezentują się następująco:
\begin{figure}[h!]
\centering
\includegraphics[width=1\textwidth]{images/for_prop.png}
\caption{Wizualizacja algorytmu propagacji w przód \cite{BibEntry2020Aug_nn_guide}}
\end{figure}
\\
Przykładowe wyliczenia sumy ważonej dla neurona 'h1':
\begin{equation}
w1*x1 + w2*x2 + w3*x3 = 1*0.9 + 0*0.8 + 1*0.1 = 1
@ -84,7 +84,7 @@ Skoro pojęcie funkcji straty zostało już omówione możliwe jest przejście d
\includegraphics[width=0.5\textwidth]{images/nn_part_for_backprop.png}
\caption{Wizualizacja wycinka sieci neuronowej \cite{BibEntry2020Aug_nn_guide}}
\end{figure}
\\
Z algorytmu propagacji w przód wiadome jest, że:
\begin{equation}
\sigma(z) = \dfrac{1}{1+e^{-z}}
@ -106,7 +106,7 @@ Powyższy proces nosi nazwę metody gradientu prostego (z ang. gradient descent)
\includegraphics[width=1\textwidth]{images/lr.png}
\caption{Wizualizacja procesu minimalizacji funkcji kosztu w zależności od długości kroku \cite{JeremyJordan2020Aug_lr}}
\end{figure}
\\
Cały proces opisany powyżej wykonywany jest dla każdej wagi jaka znajduje się w sieci, idąc po kolei warstwa po warstwie, a zaczynając od warstwy wyjściowej sieci \cite{BibEntry2020Aug_nn_guide}. Podejście do procesu optymalizacji wag przy dzisiejszych architekturach sieci neuronowych zależne jest od wybranego optymalizatora. Do najpopularniejszych aktualnie optymalizatorów należą optymalizatory adaptacyjne, które dostosowują długość kroku automatycznie w trakcie procesu uczenia się sieci, takie jak: ADAM, RMSprop, czy AdaDelta. Po wykonaniu się ostatniej epoki, aktualne wartości wag stają się finalnymi wagami w sieci i będą wykorzystywane przy predykcji na zbiorze testowym.
\newline
@ -133,7 +133,7 @@ Pozwala to lepiej klasyfikować obraz, gdyż jego cechy są dla sieci, w cudzys
\includegraphics[width=1\textwidth]{images/kernel_cnn_vis.png}
\caption{Wizualizacja procesu zachodzącego w warstwie konwolucyjnej \cite{Galante2022Mar}}
\end{figure}
\\
Wobec tego konwolucja tworzy nam nowy, mniejszy obraz zawierający już wyekstrahowane cechy obrazu pierwotnego, który posłuży jako wejście kolejnej warstwy sieci. Taki obraz nazywany jest mapą cech (z ang. feature map). Wyekstrahowane cechy w postaci mapy są o tyle znaczące, że dzięki temu ich lokalizacja na obrazie przestaje mieć znaczenie, a liczy się jedynie fakt ich występowania. Przy późniejszej predykcji zmiana położenia danej cechy nie będzie zatem znacząca w kontekście wyniku. Oczywiście jak każda architektura sieci neuronowych może być ona wielowarstwowa, wówczas wszystko wygląda identycznie, a proces powtarzany jest kilkukrotnie powodując wykrywanie subcech poszczególnych cech. Oprócz wspomnianych wcześniej dwóch hiperparametrów, tj. kroku (z ang. stride) oraz wielkości (z ang. size), dysponujemy także wypełnieniem (z ang. padding). Wypełnienie odpowiada za poszerzenie granic obrazu, dzięki czemu możliwa jest ekstrakcja większej ilości cech, a co za tym idzie większa ilość informacji jest przetwarzana wewnątrz sieci. Takie działanie odbywa się kosztem wydajności. Następnym krokiem jest nałożenie na otrzymaną mapę cech nieliniowości, poprzez zastosowanie funkcji aktywacji, podobnie jak miało to miejsce w przypadku w pełni połączonych sieci. W przypadku CNN praktycznie zawsze jest to funkcja ReLU. Nieliniowość jest przyczyną tak dobrej skuteczności sieci neuronowych, ponieważ pozwala znajdować skomplikowane zależności w danych, których nie sposób zapisać jako kombinacje liniową. Funkcja aktywacji w tym wypadku pozwala zadecydować, czy dany neuron będzie miał znaczący udział w późniejszej predykcji, czy też nie. W przypadku konwolucyjnych sieci neuronowych przetwarzane wartości piksele interpretować możemy jako neurony, zaś parametry macierzy filtrów jako wagi \cite{albawi2017understanding}.
\newline
@ -148,7 +148,7 @@ Dzięki zastosowania warstwy pooling'u sieci łatwiej jest identyfikować te cec
\includegraphics[width=0.6\textwidth]{images/pool.png}
\caption{Wizualizacja procesu zachodzącego w warstwie pooling'u \cite{Yani2019May}}
\end{figure}
\\
Ostatnią warstwą CNN jest, znana już z opisywanej w poprzednim podrozdziale klasycznej architektury sieci neuronowych, warstwa w pełni połączona (z ang. fully connected layer). Warstwa ta odpowiedzialna jest za klasyfikacje. Używając funkcji aktywacji softmax (lub wcześniej scharakteryzowana funkcja sigmoid), opisanej poniższym wzorem, otrzymaną predykcją będzie prawdopodobieństwo przynależności obrazu do danej klasy.
\begin{eqnarray}
\sigma(y_{i}) = \left(\frac{e^{y_{i}}}{ \sum\limits_{j} e^{y_{j}}}\right)\:

View File

@ -185,7 +185,7 @@ Zbiór na którym został przeprowadzony eksperyment Newspaper Navigator składa
\bottomrule
\end{tabular}
\end{table}
\\
Do stworzenia modelu ekstrakcji treści wizualnych i ich klasyfikacji użyto architektury sieci neuronowych o nazwie Faster-RCNN. Dokładniej mówiąc jest to implementacja tej architektury w bibliotece Detectron2 stworzonej dla języka programowania Python, w którym powstał opisywany model, a także przeprowadzone zostało moje podejście opisywane w następnym rozdziale. Użyta sieć została uprzednio przetrenowana na popularnym zbiorze danych COCO i jedynie dotrenowana na zbiorze danych Newspaper Navigator \cite{Lee2020May_paper}. Detectron2 to platforma badawcza i biblioteka produkcyjna operująca w języku programowania Python, służąca do wykrywania obiektów, zbudowana przez zespół Facebook AI Research (FAIR). Pozwala ona na bardzo szybką implementacje przetrenowanych już sieci neuronowych służących do pracy z obrazem i dostosowanie ich do posiadanego własnego zbioru danych \cite{BibEntry2021Aug_fb_d2}. Zbiór COCO na którym wytrenowana została użyta sieć neuronowa pochodzi od firmy Microsoft, zebrano w nim 328 tysięcy zdjęć, zawierających ponad 2,5 miliona oznaczonych obiektów, podzielonych na 91 kategorii \cite{Lin2014May}. Użycie uprzednio przetrenowanych model na innym zbiorze danych jest bardzo często spotykaną praktyką. Takie podejście znacząco skraca czas treningu oraz niezbędne do tego zasoby, a ponadto często pozwala również osiągnąć lepsze wyniki. Wówczas sieć neuronowa zamiast inicjalizować wagi losowo na samym początku korzysta z ich wyjściowych wartości osiągniętych na wcześniej użytym zestawie treningowym. W takim przypadku zamiast trenować model od zera, jedynie dostosowuje się jego parametry do konkretnego przypadku, często trenując jedynie ostatnią warstwę, która odpowiada wyłącznie za klasyfikacje. Sama architektura Faster-RCNN oraz wykorzystywanie już częściowo przetrenowanych modeli zostanie szerzej opisane przy okazji opisu mojego podejścia do opisywanego zbioru danych, w kolejnym rozdziale. Ostateczne wyniki jakie zostały osiągnięte przez badaczy z Biblioteki Kongresu opisuje poniższa tabela:
\begin{table}[h!]
\centering
@ -211,7 +211,7 @@ Do stworzenia modelu ekstrakcji treści wizualnych i ich klasyfikacji użyto arc
\bottomrule
\end{tabular}
\end{table}
\\
Metryka za pomocą której przedstawione zostały powyższe wyniki to średnia predykcja (z ang. average precision - AP). Metryka ta jest najpopularniejszym sposobem prezentowania wyników w przypadku zagadnień z zakresu detekcji obrazu (z ang. object detection). AP bazuje na następujących sub-formułach:

View File

@ -7,7 +7,7 @@ W niniejszym rozdziale opisane zostało autorskie podejście do uprzednio opisyw
\includegraphics[width=1\textwidth]{images/schemat_aplikacji.png}
\caption{Schemat działania aplikacji}
\end{figure}
\\
Budowanie rozwiązania składało się z kilku kluczowych element, które zostały wylistowane w sposób chronologiczny poniżej:
\begin{enumerate}
\item Pozyskiwanie obrazów o wysokiej rozdzielczości przy użyciu web scraper'a.
@ -21,7 +21,7 @@ Budowanie rozwiązania składało się z kilku kluczowych element, które zosta
\section{Architektura techniczna rozwiązania}
Całość prac związanych z przygotowaniem rozwiązania wykonana została przy użyciu języka programowania Python oraz korzystając z dostępnych rozszerzeń jego funkcjonalności w postaci różnorodnych bibliotek programistycznych. Repozytorium kodu jest ogólnodostępne i znajduje się pod następującym adresem internetowym: \url{https://github.com/yngalxx/Master_degree}. Cały kod jaki został napisany na potrzeby opisywanego rozwiązania liczy 23 skrypty co w przybliżeniu daje około 2.8 tysiąca linijek kodu. Najważniejsze foldery wchodzących w skład repozytorium przedstawione zostały poniżej:
\\
\dirtree{%
.1 \textbf{Master\_degree}.
.2 cropped\_visual\_content.
@ -93,8 +93,8 @@ Z kolei rozkład odpowiadającym im adnotacją prezentuje się w ten sposób:
\bottomrule
\end{tabular}
\end{table}
\\
Porównując tabele przedstawione powyżej z tabelami odnoszącymi się do klas występujących w projekcie Newspaper Navigator, które przedstawione zostały w poprzednim rozdziale, zauważyć można brak jednej klasy, a mianowicie klasy "Karykatura". W rzeczywistości treści wizualne należące do tej klasy były bardzo podobne do tych należących do klasy "Komiksy", dlatego też podjęta została decyzja o połączeniu tych dwóch klas. Obserwacje, które wcześniej były dość kłopotliwe dla modelu, po tej zamianie, przestały sprawiać trudności na etapie klasyfikacji. Decyzja ta pozytywnie wpłynęła na ogólną wydajność modelu. Praktycznie wszystkie obserwacje dla etykiety "Karykatura" przedstawione były i tak w formie komiksu, o czym też informuje nas dość dobitnie angielska nazwa tej etykiety: "editorial cartoon". Rozbijanie klasy "Komiks" na podkategorię miało by zdecydowanie więcej sensu, gdyby stworzony model miał zajmować się jedynie klasyfikacją różnych rodzajów komiksów, w tym jednak wypadku powodowało to jedynie zaniżenie wyników klasyfikacji zarówno dla etykiet "Komiks" jak i "Karykatura" ze względu na zbyt duże podobieństwo tych klas. Jeśli chodzi o samą liczebność adnotacji zbiór Newspaper Navigator oraz ten użyty na potrzeby tego eksperymentu jest identyczny, co warto podkreślić, ponieważ pozwoli to swobodnie porównywać jego wyniki z wynikami pierwowzoru. Adnotacje, które zostały pobrane z repozytorium Newspaper Navigator odpowiadały przeskalowanym już na potrzeby projektu zdjęciom, dlatego też pojawiła się potrzeba dostosowania ich do wysokiej rozdzielczości zdjęć które zostały pozyskane przez web scraper. Oryginalne adnotacje zawierały również rozmiar zdjęcia któremu odpowiadają, dlatego też nie było większych problemów ze stworzeniem algorytmu do skalowania. W przeciwnym razie były by one niemal nieużyteczne. Niektóre adnotacje znajdowały się poza granicami pozyskanych obrazów, co musiało być efektem błędów wolontariuszy, którzy zajmowali się adnotacją danych w projekcie Newspaper Navigator. Wszystkie tego rodzaju obserwacje zostały poprawione w taki sposób, że zostały nałożone na nie odpowiednie ograniczenia. Statystyki tego procederu przedstawia poniższa tabela:
Porównując tabele przedstawione powyżej z tabelami odnoszącymi się do klas występujących w projekcie Newspaper Navigator, które przedstawione zostały w poprzednim rozdziale, zauważyć można brak jednej klasy, a mianowicie klasy "Karykatura". W rzeczywistości treści wizualne należące do tej klasy były bardzo podobne do tych należących do klasy "Komiksy", dlatego też podjęta została decyzja o połączeniu tych dwóch klas. Obserwacje, które wcześniej były dość kłopotliwe dla modelu, po tej zamianie, przestały sprawiać trudności na etapie klasyfikacji. Decyzja ta pozytywnie wpłynęła na ogólną wydajność modelu. Praktycznie wszystkie obserwacje dla etykiety "Karykatura" przedstawione były i tak w formie komiksu, o czym też informuje nas dość dobitnie angielska nazwa tej etykiety: "editorial cartoon". Rozbijanie klasy "Komiks" na podkategorię miało by zdecydowanie więcej sensu, gdyby stworzony model miał zajmować się jedynie klasyfikacją różnych rodzajów komiksów, w tym jednak wypadku powodowało to jedynie zaniżenie wyników klasyfikacji zarówno dla etykiet "Komiks" jak i "Karykatura" ze względu na zbyt duże podobieństwo tych klas. Jeśli chodzi o samą liczebność adnotacji zbiór Newspaper Navigator oraz ten użyty na potrzeby tego eksperymentu jest identyczny, co warto podkreślić, ponieważ pozwoli to swobodnie porównywać jego wyniki z wynikami pierwowzoru. Adnotacje, które zostały pobrane z repozytorium Newspaper Navigator odpowiadały przeskalowanym już na potrzeby projektu zdjęciom, dlatego też pojawiła się potrzeba dostosowania ich do wysokiej rozdzielczości zdjęć które zostały pozyskane przez web scraper. Oryginalne adnotacje zawierały również rozmiar zdjęcia któremu odpowiadają, dlatego też nie było większych problemów ze stworzeniem algorytmu do skalowania. W przeciwnym razie były by one niemal nieużyteczne. Niektóre adnotacje znajdowały się poza granicami pozyskanych obrazów, co musiało być efektem błędów powstałych w trakcie tworzenia adnotacji. Wszystkie tego rodzaju obserwacje zostały poprawione w taki sposób, że zostały nałożone na nie odpowiednie ograniczenia. Statystyki tego procederu przedstawia poniższa tabela:
\begin{table}[h!]
\centering
\begin{tabular}{c c c c c}
@ -112,8 +112,8 @@ Porównując tabele przedstawione powyżej z tabelami odnoszącymi się do klas
\bottomrule
\end{tabular}
\end{table}
\\
Liczebności powyższych błędów w porównaniu do całości zbioru jasno wskazują, że odsetek błędów jest znikomy. Na poniższych rycinach przedstawione zostały przykładowe zdjęcia wraz z adnotacjami już po etapie przetwarzania danych:
Pomimo, że odsetek błędów jest znikomy lepiej było takowe obserwacje poprawić. Na poniższych rycinach przedstawione zostały przykładowe zdjęcia wraz z adnotacjami już po etapie przetwarzania danych:
\begin{figure}[h!]
\label{ fig7}
@ -156,7 +156,7 @@ Model detekcji treści wizualnych stworzony na potrzeby tej pracy dyplomowej zos
\includegraphics[width=0.5\textwidth]{images/fasterrcnnn.png}
\caption{Architektura Faster R-CNN \cite{Ren2015Jun}}
\end{figure}
\\
Architektura Faster R-CNN zaczyna się od konwolucyjnej sieci neuronowej używanej do proponowania regionów (z ang. Region Proposal Network - RPN), które następnie poddawane są klasyfikacji. W przypadku tego podejścia, jak już zostało to wcześniej wspomniane, użyta została w tym celu ResNet-50. Sposób w jaki został stworzony ResNet pozwala na trenowanie bardzo głębokich sieci neuronowych (w tym wypadku jest to, jak wskazuje już sama nazwa, 50 warstw) z pominięciem towarzyszących zazwyczaj temu problemów jakimi są zjawiska zanikającego gradientu (z ang. vanishing gradient) oraz eksplodującego gradientu (z ang. exploding gradient). Pierwsze z nich dotyczy niewielkich zmian wag sieci podczas procesu uczenia, co w najgorszym przypadku praktycznie stopuje trening całej sieci, drugi zaś jest zjawiskiem przeciwnym, co z kolei powoduje ogromne zmiany wag przez co osiągany poziom błędu drastycznie wzrasta. Jak nie trudno zauważyć oba te zjawiska są wysoce niepożądane. ResNet pozwolił na rozwiązywanie jeszcze bardziej skomplikowanych problemów z dziedziny komputerowej wizji (z ang. computer vision) niż było to możliwe wcześniej. W teorii im głębsza jest sieć (im więcej warstw posiada) tym lepiej i łatwiej uczy się ona trudniejszych, bardziej zaawansowanych wzorców, a gdy do tego wyeliminujemy towarzyszące temu problemy takie jak eksplodujący i zanikający gradient, wówczas otrzymamy niezwykle potężne narzędzie, jakim właśnie jest ResNet. Główna koncepcja tego podejścia skupia się w okół tego, że każda warstwa jest podawana nie tylko do warstwy następnej sieci, ale także bezpośrednio do kolejnych warstw pomijając kilka warstw pomiędzy nimi \cite{He2015Dec}. Mechanizm ten został zaprezentowany na poniższym obrazku:
\clearpage
@ -165,14 +165,14 @@ Architektura Faster R-CNN zaczyna się od konwolucyjnej sieci neuronowej używan
\includegraphics[width=0.8\textwidth]{images/resnt.png}
\caption{Koncepcja sieci ResNet \cite{He2015Dec}}
\end{figure}
\\
RPN wyposażona jest zarówno w klasyfikator jak i regresor. Klasyfikator ma za zadanie określić prawdopodobieństwo czy w zaproponowanym regionie znajduje się szukany obiekt docelowy, zaś regresor określa współrzędne tego regionu. Po mapie cech przesuwa się prostokątne okno o rozmiarze n x n. Dla każdego okna generowanych jest K propozycji regionów o różnych kształtach tzw. kotwic (z ang. anchors). W celu wytrenowania RPN każdej propozycji regionu przypisywana jest przez binarny klasyfikator etykieta, czy na danym obszarze znajduje się obiekt, czy tło. Ta etykieta przypisywana jest na podstawie, wcześniej omawianej już, metryki IoU. Etykietę obiektu otrzymują propozycje regionów, dla których wartość tej metryki jest większa niż 0.7 albo między 0.5 i 0.7 włącznie, ale jedynie w tedy kiedy dla danego okna nie ma kotwicy z wynikiem większym niż 0.7. Następnie na finalnych propozycjach regionów przeprowadzany jest pooling, którego cel jest dokładnie taki sam jak zostało to omówione w rozdziale drugim przy okazji opisu konwolucyjnych sieci neuronowych \cite{Ren2015Jun}.
\begin{figure}[h!]
\centering
\includegraphics[width=0.6\textwidth]{images/rpn.png}
\caption{Koncepcja przesuwającego się okna i kotwic \cite{Ren2015Jun}}
\end{figure}
\\
Ostatnim etapem architektury Faster R-CNN jest detektor, którego zadaniem jest predykcja klasy dla danego regionu.
Tak jak zostało wspomniane to już wcześniej użyta architektura składa się z wstępnie przetrenowanej sieci ResNet-50, co oznacza że początkowe wagi nie zostały wybrane losowo, a były wagami wyjściowymi tego modelu wytrenowanego na konkretnych danych. W tym przypadku był to sławny zbiór danych ImageNet \cite{deng2009imagenet}. Jednakże Wszystkie warstwy tej sieci zostały dodatkowo przetrenowane również na posiadanym zbiorze danych. Detektor Faster R-CNN został całkowicie wymieniony i również wytrenowany specjalnie dla omawianego zbioru danych. Cały trening finalnej wersji modelu składający się z 35 epok zajmuje w przybliżeniu 3.5 godziny. Wejściem modelu są zdjęcia gazet w kolorze czarno białym przeskalowane do rozmiaru 1024 x 1024 podzielone na 20-elementowe partie (z ang. batches). Rozmiar zdjęć do którego były one skalowane, podobnie zresztą jak pozostałe parametry, wybrany został metodą prób i błędów. Długość kroku, wytłumaczona podczas drugiego rozdziału wynosiła 0.00035, dodatkowo była ona dwukrotnie zmniejszana co każde 7 epok wykorzystując do tego planistę tempa uczenia (z ang. learning rate scheduler), aby uniknąć zbyt dużego kroku w późniejszych etapach uczenia powodującego pomijanie minimów optymalizowanej funkcji straty. Podane wartości parametrów zapewniły najlepsze wyniki podczas przeprowadzania eksperymentów treningowych. Do optymalizacji parametrów procesu uczenia się użyty został jeden z najpopularniejszych i najwydajniejszych aktualnie dostępnych optymalizatorów, Adam. Swoją popularność zawdzięcza on przede wszystkim szybkości i małej złożoności obliczeniowej, ponadto jest to algorytm adaptacyjny co oznacza, że oblicza on indywidualne tempo uczenia dla różnych parametrów.
@ -382,7 +382,7 @@ Zanim jednak tekst znajdujący się na wykadrowanych treściach wizualnych zosta
\includegraphics[width=0.5\textwidth]{images/o1.png}
\caption{Oryginalny obraz}
\end{figure}
\\
Następnie obraz zostaje poddany operacji matematycznej zwanej dylatacją (z ang. dilatation), w przypadku obrazów polega ona na tym, że wartość piksela wyjściowego jest maksymalną wartością wszystkich pikseli w jego sąsiedztwie. Na obrazie binarnym piksel ustawiony jest na 1, wówczas gdy którykolwiek z sąsiednich pikseli ma wartość 1 \cite{BibEntry2022Sep}. jest to pierwszy krok, aby pozbyć się tekstu, a pozostawić tylko tło.
\clearpage
\begin{figure}[h!]
@ -390,7 +390,7 @@ Następnie obraz zostaje poddany operacji matematycznej zwanej dylatacją (z ang
\includegraphics[width=0.5\textwidth]{images/o2.png}
\caption{Obraz po dylatacji}
\end{figure}
\\
Drugi krok to zastosowanie filtra o nazwie rozmycie medianą (z ang. median blur). Filtr ten oblicza medianę z wartości sąsiadujących ze sobą pikseli, bardzo mocno wygładzając obraz, praktycznie pozbywając się z niego pierwotnego tekstu \cite{BibEntry2022Sep2}.
\begin{figure}[h!]
\centering
@ -412,7 +412,7 @@ Ostatnim krokiem jest normalizacja, służy ona do zwiększenia kontrastu, co po
\includegraphics[width=0.5\textwidth]{images/o5.png}
\caption{Znormalizowany obraz}
\end{figure}
\\
Tak przygotowane obrazy przepuszczane są przez system OCR. Na potrzeby przygotowywanej pracy magisterskiej do tego zadania użyty został Tesseract OCR. Jest to narzędzie typu Open Source, które posiada swoją implementacje w postaci biblioteki języka programowania Python. Narzędzie to zostało opracowane przez firmę Google \cite{10.5555/1288165.1288167}. Tekst będący wynikiem działania OCR jest następnie czyszczony i umieszczany w bazie danych SQLite, a z jego treści ekstrahowane są słowa kluczowe. Do pozyskania słów kluczowych wykorzystany został przetrenowany oparty na sztucznych sieciach neuronowych model KeyBERT \cite{grootendorst2020keybert}.
\newline
@ -439,14 +439,14 @@ Na pierwszym zdjęciu znajduje się ekran startowy, użytkownik otrzymuje powita
\includegraphics[width=0.72\textwidth]{images/gui3.png}
\caption{Widok ekranu wyników wyszukiwania}
\end{figure}
\\
Po wpisaniu dowolnej frazy lub też kilku fraz zostaną zwrócone nam ikony treści wizualnych pasujące do danego zapytania. Na powyższym zrzucie ekranu zwrócone zostały wyniki dla przykładowego zapytania 'sausage', co w języku polskim oznacza wyrób wędliniarski, a konkretniej kiełbasę. Dzięki zaimplementowanemu w rozwiązaniu narzędziu do logowania wiadome jest, że zostało wyświetlone 10 treści wizualnych dla tego zapytania, jego obsługa z perspektywy znalezienia odpowiednich indeksów trwała jedynie 0.0005 sekundy. Czas zaś żeby wyświetlić wszystkie 10 obrazków to około 0.5 sekundy. Na samej górze, na pasku aplikacji, pokazuje się treść aktualnie obsługiwanego zapytania. Aby kontynuować przeszukiwanie bazy danych, można od razu zacząć wpisywać kolejne frazy zatwierdzając je przyciskiem 'Search' lub też najpierw nacisnąć przycisk 'Clear results', aby wymazać prezentowane rezultaty i powrócić do widoku głównego aplikacji. Treść aktualnego zapytania będzie pokazywała się na pasku, aż do momentu wybrania jednej z tych dwóch opcji. Jeżeli istnieje potrzeba, aby dowiedzieć się więcej szczegółów na temat jednego z prezentowanych wyników wystarczy w niego kliknąć, wówczas oczom użytkownika, pokaże się następujący widok:
\begin{figure}[h!]
\centering
\includegraphics[width=0.72\textwidth]{images/gui4.png}
\caption{Widok ekranu szczegółowego dla wybranego wyniku wyszukiwania}
\end{figure}
\\
Szczegółowy widok przedstawia nam powiększoną wersje danej treści wizualnej, a także pola: słowa kluczowe (Keywords), etykieta przekazana przez model (Label), tekst pochodzący z OCR (OCR text) oraz nazwę oryginalnego zdjęcia gazety z której pochodzi dany wynik (Origin file). Dodatkowo na górnym pasku aplikacji znajduje się poza treścią zapytania, również nazwa pliku przedstawiającego zaznaczoną treść wizualną.