Linie lądowe

Podsumowanie

Land Lines to eksperyment, który pozwala przeglądać zdjęcia satelitarne w Google Earth za pomocą gestów. Wykorzystując połączenie systemów uczących się, optymalizacji danych i mocy karty graficznej, eksperyment może działać sprawnie w przeglądarce w telefonie bez konieczności korzystania z serwerów backendu. Przedstawiamy nasz proces projektowania i różne podejścia, które doprowadziły do ostatecznego wyniku.

https://g.co/LandLines

Gdy zespół Data Arts zwrócił się do mnie z prośbą o zbadanie zbioru obrazów Ziemi, byłem podekscytowany: obrazy były piękne, odkryły różne rodzaje struktur i tekstur, zarówno stworzone przez ludzi, jak i naturalne. Zaintrygowała mnie sposób łączenia tego zbioru danych. Przeprowadziłam kilka początkowych eksperymentów, by sprawdzić podobieństwo obrazów oraz różne sposoby ich filtrowania i porządkowania.

Układ podobieństwa T-Sne
układ podobieństwa t-sne, wysoka rozdzielczość 50 MB

Jako grupa wracaliśmy do pięknych, dominujących linii na obrazach. Linie te były łatwe do zauważenia – autostrady, rzeki, krańce gór i działki. Przygotowaliśmy kilka projektów, które mają na celu ich zbadanie. Jako artystka zainspirowała mnie piękne rzeczy, które można zrobić za pomocą kolekcji linii, na przykład pracę Cassandry C Jones z błyskawiczną pracą.

Wykrywanie linii

Jednym z problemów technicznych było wykrywanie linii na obrazach. Łatwo wyjmiesz kawałek papieru śledzącego, umieścisz go na wydrukowanym zdjęciu i narysujesz linie widoczne dla Twojego oka, ale ogólnie algorytmy komputerowego wykrywania linii nie sprawdzają się w przypadku bardzo zróżnicowanych obrazów.

Napisałem poprzednią wersję wyszukiwania, rysując algorytm w projekcie obejmującym projekty lokalne, i w tym celu przypisaliśmy do szukanych wierszy odpowiednie adnotacje. Rysowanie na obrazach było przyjemne, ale żmudne, gdy przechodzisz od dziesiątek do tysięcy zdjęć. Chciałam spróbować zautomatyzować proces wyszukiwania linii.

Wypróbowałam w przypadku tych zdjęć lotniczych tradycyjne algorytmy wykrywania linii, takie jak algorytm openCv do wykrywania krawędzi, ale odkryłam, że generują one albo bardzo nieciągłe segmenty linii, albo jeśli próg jest zbyt rozluźniony – mnóstwo nieuzasadnionych linii. Poza tym progi osiągania dobrych wyników różniły się w zależności od zbioru obrazów. Chodziło mi o algorytm umożliwiający znalezienie spójnego zestawu dobrych linii bez nadzoru.

Poeksperymentować z różnymi algorytmami wykrywania linii, w tym z najnowszymi, takimi jak gPb (PDF), które chociaż dają zachwycające wyniki, wymagały kilku minut pracy dla każdego zdjęcia. Ostatecznie zdecydowałem się na wykrywanie uporządkowanych skrajnych lasów – algorytm wysyłany z parametrem openCV.

Po uzyskaniu dobrego „obrazu liniowego” wciąż miałem problem z pobieraniem linii i identyfikacją poszczególnych wierszy od siebie, tj. jak uzyskać dane rastrowe i zmienić je w wektorowe. Często, gdy przyglądam się problemom z obrazem komputerowym, badam imageJ, oparte na Javie środowisko do przetwarzania obrazów typu open source, używane przez naukowców i badaczy oraz zawierające zdrowy ekosystem wtyczek. Udało mi się znaleźć wtyczkę o nazwie wykrywanie grzbietów, która pomaga przechwytywać obraz o intensywności i przekształcać go w zestaw segmentów liniowych. Przydatny był też kod do wykrywania i oznaczania etykietami z Matlab.

Obraz z wykrytymi segmentami linii
Obraz z wykrytymi segmentami linii

Technologia bezserwerowa

Chciałam też sprawdzić, czy można stworzyć aplikację do wizualizacji danych, która jest zasadniczo bezserwerowa, a ciężka praca w dopasowywaniu i łączeniu odbywa się po stronie klienta. Zwykle pracuję w openFrameworks, czyli platformie C++ do kodowania kreacji. Poza tym czasami pracuję w projektach z węzłami, ale nie zajmuję się kodowaniem po stronie serwera. Zastanawiałem się, czy można przeprowadzić wszystkie obliczenia po stronie klienta i używać serwera tylko do udostępniania danych json i danych obrazów.

W przypadku aplikacji rysunkowej dopasowywanie wymaga skomplikowanej operacji. Kiedy rysujesz linię, musimy znaleźć najbliższe dopasowanie spośród dziesiątek tysięcy segmentów. Aby obliczyć odległość między rysunkiem a innym, używamy danych z modułu rozpoznawania gestów dolara, który samo w sobie wymaga obliczania odległości. Kiedyś wykorzystywałem wątki i inne sztuczki, ale aby działać w czasie rzeczywistym na urządzeniu klienckim (w tym na telefonach komórkowych), potrzebowałem czegoś lepszego. Zajrzałem do drzew metrycznych pod kątem znalezienia najbliższych i najbliższych sąsiadów i zajęłam się punktami obserwacyjnymi (implementacja JavaScript). Drzewo punktów obserwacyjnych powstaje w zasadzie na podstawie zbioru danych i wskaźnika odległości. Po wprowadzeniu nowych danych dość szybko otrzymujemy listę najbliższych wartości. Gdy po raz pierwszy zobaczyłam tę pracę na komórce, przepadłam. Jedną z największych zalet tego konkretnego drzewa punktów obserwacyjnych jest to, że po jego obliczeniu możesz zapisać je, co pozwoli Ci zaoszczędzić na kosztach jego przetwarzania.

Najbliższe wyniki Uzyskane wyniki
Przykłady wyników z drzewa punktów obserwacyjnych. Rysowane dane wejściowe są po prawej stronie, a najbliższe po lewej.

Innym wyzwaniem w działaniu bez serwera jest wczytywanie danych na urządzenie mobilne. W przypadku rysowania dane w postaci drzewa i segmentu linii przekraczały 12 MB, a obrazy były dość duże. Chcieliśmy, aby wszystko działało szybko i elastycznie, a celem było ograniczenie wielkości pobierania. Nasze rozwiązanie polegało na stopniowym wczytywaniu danych. W aplikacji do rysowania dzielimy zestaw danych drzewa punktów obserwacyjnych na 5 części. Gdy aplikacja wczytuje tylko pierwszy fragment, a następnie co 10 sekund, wczytuje kolejny fragment danych w tle, więc zasadniczo aplikacja staje się lepsza i lepsza przez pierwszą minutę używania. W aplikacji do przeciągania ciężko było też zapisywać obrazy w pamięci podręcznej, by nowe obrazy wczytywały się podczas przeciągania w tle.

I wreszcie jedna z rzeczy, która była dla mnie trudniejsza niż oczekiwano, to utworzenie modułu wstępnego ładowania dla obu aplikacji, więc początkowe opóźnienie wczytywania danych będzie zrozumiałe. Wykorzystałem wywołanie zwrotne postępu w żądaniach ajax, a po stronie pixi.js – sprawdzone obrazy, które były wczytywane asynchronicznie, zostały wczytane i wykorzystały je do wstępnego wczytywania wiadomości.

Połączona linia

Chcieliśmy utworzyć nieskończoną linię z linii na wykrywaniu krawędzi. Pierwszym krokiem było odfiltrowanie linii z algorytmu wykrywania linii i zidentyfikowanie długich linii, które zaczynają się od jednej krawędzi i kończą na jednej z 3 pozostałych krawędzi.

Dobre linie dla połączeń zaznaczone na czerwono Dobre linie dla połączeń zaznaczone na czerwono
Dobre linie dla połączeń oznaczone na czerwono

Kiedy miałem zestaw długich linii (lub, w większym stopniu dokładny termin), linie łamane (zbiór połączonych punktów) były ze sobą połączone, a linie zostały przekształcone w zestaw zmian kątów. Linię łamaną zwykle wyobrażamy sobie jako zestaw punktów a – punkt a jest połączony z punktem b, który jest połączony z punktem c. Linię możesz potraktować jako zestaw zmian kąta: przesuwaj się do przodu i do tyłu, obróć o określoną wartość, przesuń do przodu lub do tyłu. Dobrym sposobem na pokazanie tego jest zastanowienie się nad zginaczami drutu, które wykonują obrotowy przewód w trakcie wyciskania drutu. Kształt rysunku pochodzi z obracania się.

Jeśli weźmiesz pod uwagę, że linia jest zmianą kąta, a nie punktami, łatwiej jest połączyć linie w jedną z mniejszą nieciągłością – zamiast dodawać punkty złączania dodajesz względne zmiany kątów. Aby dodać linię, należy zastosować bieżący kąt jej głównej i dodać do niej względne zmiany linii, którą chcesz dodać.

Na marginesie skorzystałem z tej techniki, która polega na przekształcaniu linii w zestaw zmian kąta w celu eksploatacji artystycznej – możesz np. „rozwinąć” rysunki w sposób podobny do tego, jak zwija się i rozwija się kable. Przykłady: jeden, dwa, trzy.

To obliczenie kąta umożliwia nam sterowanie linią podczas przeciągania – obliczamy, na ile odchylimy kąt główny, z którego widzimy, i szukamy zdjęcia, które najlepiej pozwoli na kierowanie linii we właściwym kierunku. Trzeba myśleć rozsądnie.

Na koniec chcę wspomnieć, że udział w tym projekcie był bardzo fajny. To ekscytujące, że artysta chce posługiwać się tak atrakcyjnym zbiorem danych, jak te zdjęcia. Mam nadzieję, że z eksperymentem dobrze się bawisz.