Przejdź do treści

Po wieżowcach obstawiałem Chicago, ale film nagrano w Bangkoku

Devlog Kliposkop #02

Kiedy pierwszy raz zobaczyłem wynik mojego narzędzia dla jednego z filmów, napis „Bangkok, Tajlandia” stał nad szklanymi wieżowcami, które wyglądały mi na Chicago. Pomyślałem, że to błąd, ale... dane się zgadzały: film nagrano nad jeziorem w parku w Bangkoku, tylko zaczyna się od wieżowców, a tajskie tabliczki widać dopiero po kilku sekundach.

Klatka z filmu: szklane wieżowce i drzewa. Na klatce napis „Miejsce: Bangkok, Tajlandia”.

Tak wyglądał pierwszy wynik, który zobaczyłem: napis „Bangkok, Tajlandia” nad wieżowcami z pierwszych sekund filmu (tu odtworzony).

Kliposkop to narzędzie, które buduję od zera razem z agentem AI i które ma odczytywać z pliku wideo to, czego nie widać na samym obrazie, a w tym wpisie biorę się za pierwszą z tych rzeczy, czyli miejsce, w którym nagrano film. Na tym etapie narzędzie nie korzysta z żadnego modelu AI (wystarcza zwykły program) i nie potrzebuje internetu.

Co telefon zapisuje w pliku wideo

Telefon (u mnie iPhone) zapisuje w pliku razem z filmem współrzędne miejsca w formacie ISO 6709 (to międzynarodowa norma zapisu szerokości i długości geograficznej oraz wysokości), a obok nich to, jak dokładny był pomiar, i w moich 23 filmach testowych ta dokładność wynosi od około 3 do 219 metrów. Dla filmu z wieżowcami telefon zapisał 13,7327° N i 100,5592° E (te liczby widać na obrazku poniżej), z dokładnością do około 34 metrów.

Klatka z tego samego filmu: jezioro i wieżowce w oddali. Na klatce napis „W pliku: 13,7327 N 100,5592 E”.

Chwilę dalej widać już całe jezioro, a na klatce są współrzędne, które telefon zapisał w pliku.

Nazwa miejsca bez wysyłania współrzędnych

Zamiana współrzędnych na nazwę miejsca to tak zwane odwrotne geokodowanie (czyli z pary liczb robi się nazwa w rodzaju „Bangkok, Tajlandia”) i zwykle używa się do tego usług online, zarówno płatnych (np. Google), jak i otwartych (np. Nominatim, który korzysta z danych OpenStreetMap). Brałem je pod uwagę (żadnej nie testowałem), ale miałem wątpliwości, bo nie chciałem nigdzie wysyłać współrzędnych ze swoich filmów. Podczas jednej z rozmów z agentem AI wspomniałem o tych wątpliwościach, a ten zaproponował bazę miejsc, którą pobiera się raz na komputer i przeszukuje bez połączenia z internetem.

Wybrałem GeoNames, darmową bazę nazw geograficznych udostępnioną na licencji CC BY 4.0. Narzędzie korzysta z jej pliku z miejscowościami, które mają ponad 500 mieszkańców albo są siedzibami jednostek administracyjnych, i szuka w nim miejsca położonego najbliżej współrzędnych z filmu. Internet jest potrzebny tylko raz, przy pobieraniu bazy, i nie trafia wtedy do sieci nic o żadnym filmie.

Najbliżej jest zwykle dzielnica, a nie miasto

Tu pojawił się mały problem: najbliższe miejsce w bazie to zwykle dzielnica (w Chicago np. Near North Side, w Bangkoku Makkasan albo Wat Arun), a mało kto powie, że nagrał film w Makkasan.

Klatka z filmu nad jeziorem w Bangkoku: woda i wieżowce w oddali. Na klatce napis „Najbliżej w bazie: Makkasan”.

Najbliższe miejsce w bazie to dzielnica Makkasan.

Narzędzie podaje więc największe miasto w promieniu 50 km, które ma co najmniej 100 tysięcy mieszkańców. W plikach, z których korzysta, nie ma granic miast (każda miejscowość to w nich jeden punkt), a taka reguła pozwala nazwać miasto tak, jak nazwałby je człowiek, bez rysowania jego granic.

Klatka z tego samego filmu: ścieżka nad jeziorem, drzewo i tabliczki z zakazem palenia po tajsku i angielsku, a nad nimi napis „Miejsce: Bangkok, Tajlandia”.

Narzędzie podaje Bangkok, a na tej klatce (5,8 sekundy od początku filmu) widać już tajskie tabliczki z zakazem palenia.

Stan i kraj narzędzie bierze z najbliższego miejsca, żeby film nagrany tuż za granicą stanu nie trafił do sąsiedniego. Polskie nazwy krajów pochodzą z Unicode CLDR, czyli zbioru danych o językach i krajach, z którego korzystają systemy operacyjne i programy, i stamtąd wzięła się też krótka forma „USA” zamiast „Stany Zjednoczone”.

Tak wygląda wynik dla wszystkich 23 filmów testowych:

WyjazdFilmyCo podaje narzędzieDokładność pomiaru w telefonie
Chicago10Chicago, Illinois, USAod 3 do 219 m
Chicago2Minneapolis, Minnesota, USAod 3 do 32 m
Bangkok11Bangkok, Tajlandiaod 6 do 35 m

Dwa filmy z Chicago nagrane w Minnesocie

Jest jeszcze jedna ciekawostka: do testów wybrałem 12 filmów z wyjazdu do Chicago, ale według współrzędnych zapisanych w plikach dwa z nich nagrano w okolicach Minneapolis w Minnesocie, około 560-570 km od Chicago w linii prostej, a na samym obrazie tego nie widać. Wyszło to zresztą jeszcze przed napisaniem tego etapu, przy pierwszym odczycie współrzędnych z plików, i nie trzeba było do tego niczego budować. Narzędzie podaje teraz dla obu „Minneapolis, Minnesota, USA”: najbliższe miejsca w bazie to Richfield i Edina, miasta tuż obok Minneapolis, ale największym miastem w promieniu 50 km jest Minneapolis. Nazwę stanu i kraju narzędzie zna, bo prawie każde miejsce w GeoNames ma je przypisane (zamiast stanu bywa inna jednostka, np. prowincja).

Klatka z filmu: ścieżka między drzewami i mokradło w tle, a nad nimi napis „Miejsce: Minneapolis, Minnesota, USA”.

Jeden z dwóch filmów z wyjazdu do Chicago, które według plików nagrano w okolicach Minneapolis.

Agent AI napisał ten etap w siedem minut

Ten etap i jego zakres opisałem agentowi AI, który w ciągu około siedmiu minut napisał moduł (czyli tę część narzędzia) razem z testami i sam sprawdził wynik: wszystkie 23 filmy dostały właściwe nazwy, szybkie wyszukiwanie dało dla 300 losowych punktów na świecie (także na oceanie) te same wyniki co sprawdzanie po kolei każdego miejsca w bazie, a nazwanie wszystkich filmów zajęło około sekundy. Wiem już jednak, że agent nie zawsze zrobi sam wszystko tak, jak to sobie wyobrażam, i tak było też tutaj, przy pokazywaniu wyników.

Wynik dla filmu z wieżowcami był dobry, ale pod napisem „Bangkok, Tajlandia” film odtwarzał się od początku, a przez pierwsze dwie i pół sekundy widać na nim tylko szklane wieżowce (podgląd sprawdzono pod kątem układu, ale nie tego, co jest pod napisem). Teraz każdy wynik pokazuję na klatce z konkretnej sekundy filmu (przy Bangkoku to 5,8 sekundy, kiedy widać już tabliczkę z zakazem palenia), a wieżowce zostały na początku tego wpisu, bo naprawdę wziąłem je za Chicago.

Na tym etapie Kliposkop odczytuje z filmu jedną rzecz (miejsce) i robi to bez modelu AI i bez internetu, ale... najciekawszy był dla mnie ten moment z wieżowcami: dane były dobre, a mimo to obraz pod odpowiedzią sugerował co innego.

Nazwy miejsc w tym wpisie pochodzą z bazy GeoNames, udostępnionej na licencji CC BY 4.0.

W skrócie

  • Telefon zapisuje w pliku wideo współrzędne razem z dokładnością pomiaru, która w moich 23 filmach testowych wynosi od około 3 do 219 metrów.
  • Kliposkop zamienia współrzędne na nazwę miejsca bez internetu, z pobraną raz bazą GeoNames, bo nie chciałem wysyłać ich do żadnej usługi online, a pracę bez sieci zaproponował agent AI.
  • Najbliższe miejsce w bazie to zwykle dzielnica, dlatego narzędzie podaje największe miasto w promieniu 50 km, które ma co najmniej 100 tysięcy mieszkańców.
  • Według współrzędnych zapisanych w plikach dwa z 12 filmów z wyjazdu do Chicago, które wybrałem do testów, nagrano w okolicach Minneapolis w Minnesocie, czego na samym obrazie nie widać.
  • Agent AI napisał ten etap razem z testami w około siedem minut i sam sprawdził wynik, ale klatkę pod napisem „Bangkok” trzeba było wybrać inaczej, bo w pierwszej sekundzie filmu widać tylko wieżowce, które wyglądały mi na Chicago.

Źródła

  1. Readme for GeoNames Gazetteer extract files (otwiera się w nowej karcie), GeoNames
  2. About GeoNames (otwiera się w nowej karcie), GeoNames
  3. Attribution 4.0 International (CC BY 4.0) (otwiera się w nowej karcie), Creative Commons
  4. Reverse - Nominatim 5.3.3 Manual (otwiera się w nowej karcie), Nominatim
  5. Nominatim: Open-source geocoding with OpenStreetMap data (otwiera się w nowej karcie), Nominatim
  6. SKU details and pricing for the Geocoding API (otwiera się w nowej karcie), Google Maps Platform
  7. Locale Data Summary for Polish [pl] (otwiera się w nowej karcie), Unicode CLDR
  8. Unicode CLDR Project (otwiera się w nowej karcie), Unicode Consortium
  9. ISO 6709 (otwiera się w nowej karcie), Wikipedia

Masz proces, który chcesz uporządkować i zautomatyzować?

Napisz mi kilka zdań o nim, a resztę omówimy na rozmowie.

Napisz do mnie