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

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.

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.

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.

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.

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:
| Wyjazd | Filmy | Co podaje narzędzie | Dokładność pomiaru w telefonie |
|---|---|---|---|
| Chicago | 10 | Chicago, Illinois, USA | od 3 do 219 m |
| Chicago | 2 | Minneapolis, Minnesota, USA | od 3 do 32 m |
| Bangkok | 11 | Bangkok, Tajlandia | od 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).

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

