Automatyczny import budynków z BDOT10k + ORTO Geoportalu

Testowy import około 400 budynków.

Jeśli znajdziecie jakieś ewidentnie nieuzasadnione budynki to dajcie znać. Proszę też abyście nie oczekiwali perfekcyjnego wyniku, podczas testowania natknąłem się na 1 przypadek, który był perfidnym false-positivem, i nie byłem go w stanie wyeliminować - po prostu otoczenie pasowało idealnie geometrią - tylko budynku brak :slight_smile:. Więc może być tego więcej od czasu do czasu. Raz usunięty budynek nie zostanie zimportowany ponownie. Program sprawdza również stan budynku na rok, oraz dwa lata przed, czy nie został już wcześniej usunięty.

Aktualne ustawienie jest nieco agresywne (60%) i chciałbym aby na tej poprzeczce operowała aplikacja - aby zgarnąć sporą pulę niezimportowanych budynków. Jeśli jakość będzie niedostateczna, to można na spokojnie podnieść poprzeczkę do 70% lub wyżej.

Kod opublicznię na https://github.com/Zaczero/osm-budynki-orto-import kiedy wszystko zostanie ostatecznie przyklepane. Mogę jeszcze odpalić inne testowe importy w kolejnych rejonach, jeśli z tym konkretnym nie będzie większego problemu.

Nie podoba mi się “testowy” import na produkcję.
Wyobrażałbym sobie, że najpierw przygotujesz dane, aby społeczność mogła ocenić czy ta metoda jest skuteczna.
Jak zaczniesz dalej importować to po prostu nie będziemy mieli zasobów na sprawdzenie tego dokładnie (QA).
Próbowałem przejrzeć ten changeset, ale orto mi się tam nie wczytuje na dużych zoomach.
Jedną opcją byłoby podzielenie się changesetem przed uploadem.

Proponowałbym, abyś przygotował raport z programu np. HTML.
Moim zdaniem powinien on zawierać dużą liczbę budynków (1000+).
Powinien zawierać różne przypadki:

  • budynki o różnych wielkościach
  • budynki tagowane na różny sposób
  • budynki z różnych obszarów kraju
  • obszary gęsto zabudowane jak i dosyć puste
  • budynki importowane z orto o różnej jakości
    Dobór przypadków powinien być losowy przy założeniu powyższych kryteriów.

Mógłby on zawierać kolejne przypadki z:

  • kafelek z orto
  • kafelek z orto z obrysem budynku np. na czerwono
  • kafelek z orto po przekszałceniach obrazu
  • score algorytmu
  • decyzja czy ten budynek powinien być importowany

Program sprawdza również stan budynku na rok, oraz dwa lata przed, czy nie został już wcześniej usunięty.

W jaki sposób to sprawdzasz?

Kod opublicznię na https://github.com/Zaczero/osm-budynki-orto-import kiedy wszystko zostanie ostatecznie przyklepane

Nie wyobrażam sobie “przyklepania” przed opublikowaniem kodu.

Dodatkowym problemem jest też źródło wysokiej jakości. Tzn. program, który akceptowałby każdy budynek pewnie miałby skuteczność rzędu 99%. Proszę przekonaj nas, że ta walidacja rzeczywiście coś zmienia vs. import wszystkiego.

3 Likes

Okej, przygotuję archiwum ze zdjęciami z programu (bo mam takie) - w folderach zaakceptowane/odrzucone, i postaram się aby były one w miarę rozrzucone po kraju. A kod w takim razie opublikuję dzisiaj, po prostu nie chciałem pokazywać czegoś co ewentualnie wymagało by zmiany :stuck_out_tongue:. Do godziny i będzie :+1:.

1 Like

https://files.monicz.pl/budynki-orto.zip

Teraz doszedłem też do wniosku że aby od wersji 1.0 do wersji 2.0 tej apki przejść byłoby bardzo prosto. Chodzi mi tutaj o klasyfikację na podstawie machine learning. Są już zrobione części wyciągające features, jedynie trzebaby to ręcznie sklasyfikować (co nie zajmie dużo czasu), a potem połączyć to z jakimś xgb albo lgbm.

Jeśli chodzi o podział pracy w tym pliku, to najprościej byłoby weryfikować zakres score np. 0.6-0.7 (jest to pierwsza wartość w nazwie), a potem po prostu zapostować, które części zostały sprawdzone i ile było w nich błędów.

Kod został już opubliczniony.

Sprawdziłem wszystkie pod względem pokrycia z ortofotomapą i powiem, że jest dobrze. Znalazłem tylko 4 błędne, i 8 budynków które mogą być dyskusyjne - porzucone fundamenty, chociaz tutaj nie mam pewności, czy to w ogóle jest błąd. Jeśli tak, to widze tutaj proste rozwiązanie, jeśli budynek ma tag construction, program patrzy na ortofotomape sprzed kilku lat - jeśli fundament jest w takim samym stanie - oznacza, ze jest porzucony.

Way: 1189753544 | OpenStreetMap - za duży obrys
Way: 1189753511 | OpenStreetMap - nie istnieje
Way: 1189753452 | OpenStreetMap - nie istnieje
Way: 1189753462 | OpenStreetMap - porzucony fundament
Way: 1189753414 | OpenStreetMap - porzucony fundament
Way: 1189753378 | OpenStreetMap - porzucony fundament
Way: 1189753365 | OpenStreetMap - porzucony fundament
Way: 1189753673 | OpenStreetMap - za duzy obrys
Way: 1189753677 | OpenStreetMap - porzucony fundament
Way: 1189753682 | OpenStreetMap - porzucony fundament
Way: 1189753684 | OpenStreetMap - porzucony fundament
Way: 1189753685 | OpenStreetMap - porzucony fundament

1 Like

Jakoś specjalnie oznaczyć “porzucone” budynki? Czy po prostu ich nie dodawać?

użyłem kiedyś man_made=foundation

Ale nie wiem czy inny tag nie jest lepszy

1 Like

Kombinacja:
building=construction
abandoned=yes

1 Like

Jeśli tylko fundament jest wylany to chętnie bym zaznaczył inaczej niz budynek.

1 Like

Przygotowałem wersję 1.1, która pewniej dodaje większą ilość budynków i posiada dodatkowe analizy. Teraz całość jest automatyzowana i optymalizowana przez algorytm machine learning.

Aktualny model posiada następującą celność:
True Negatives: 110
[:exclamation:] False Positives: 4
False Negatives: 323
[:white_check_mark:] True Positives: 339

Gdzie True Positives to faktycznie dodane budynki (których chcemy jak najwięcej), a False Positives to budynki dodane tam gdzie ich nie ma. Oczywiście są to statystyki z danych walidacyjnych - nie treningowych.

Do wyliczenia i optymalizacji tego przygotowałem ręczny dataset (~3.5k budynków) z różnych miejsc w kraju.

Można zauważyć że poprawność tego algorytmu to około 98.8% (339/343) i dodaje on prawię połowę całego zbioru. Oczywiście próg pewności można dostosować ale na 0.8 wydaje się być najbardziej odpowiedni.

Nowa wersja również nie bawi się w dodawanie budynków construction bo wydaje się być to dosyć trudny, a mało owocny przypadek.

Przesyłam również nowy zestaw decyzji do przejrzenia, jest to już zapis z pełnego działania programu, jedynie różnica jest taka, że zmiany nie zostały wysłane na serwer. Wartość w nazwie to ocena algorytmu na istnienie budynku w podanej lokalizacji.
https://files.monicz.pl/budynki-orto-2.zip

Jeśli nie będzie większych zastrzeżeń to za kilka dni można startować z powolnym wdrożeniem tego projektu w życie :slight_smile: .

2 Likes

Jestem za :+1: Błąd około 1% jest moim zdaniem akceptowalny, maper dodający ręcznie prawdopodobnie mógłby się mylić częściej. Dodam, że realny błąd jest niższy, bo większość z tych budynków których nie ma na ortofotomapie, albo już powstała po zrobieniu zdjęcia lotniczego, albo niedługo powstanie.

Kolejnym etapem importu mogłyby być adresy.

może się mylę ale 1% wydaje mi się jednak nadal wysoki i człowiek raczej myli się rzadziej

ile tych budynków byłoby dodawanych?

1 Like

Mogę jeszcze popracować nad redukcją tego błędu. Co do ilości, od 40% do około 50% wszystkich aktualnie nie dodanych budynków.

Zmodyfikowałem lekko dataset aby traktował teraz także wyłącznie fundamenty jako nie-budynki. Inaczej, aby budynek został dodany do OSM, musi on zawierać widoczny dach.

Statystyki na modelu 1.0 z nowymi danymi:
True Negatives: 107
[:exclamation:] False Positives: 8
False Negatives: 230
[:white_check_mark:] True Positives: 320

Błędnie zostały sklasyfikowane te przypadki:
#1:
4GkuZwWs_overlay3
#2:
H8NHUc3i_overlay3
#3:
IsgBipN4_overlay3
#4:
MiES6lLQ_overlay3
#5:
NiBSQtSA_overlay3
#6:
oTelG9Lg_overlay3
#7:
SrK7uJDL_overlay3
#8:
ywm6-w0z_overlay3

Czyli w skrócie:
Tylko fundamenty: #3, #5, #6, #7 - błąd 1.2%
Brak budynku: #1, #2, #4 - błąd 0.9%
Znaczne przesunięcie: #8 - błąd 0.3%


Stworzyłem także model 1.1 który przetwarza również informacje o kolorze oraz kilka innych.

Dla tego samego zbioru danych przy ocenie 80%:
True Negatives: 114
[:exclamation:] False Positives: 1
False Negatives: 228
[:white_check_mark:] True Positives: 322

Nie radzi sobie z tym zdjęciem:
MiES6lLQ_overlay3

Czyli: brak budynku - błąd 0.3% przy imporcie ok. 48% budynków.

Plik z klasyfikacją 1 losowego (wcześniej niewidzianego) regionu: https://files.monicz.pl/budynki-orto-3.zip Nie znalazłem tutaj żadnego false-positive (185 dodanych budynków) co pokrywa się ze statystyką podczas modelowania.


Teraz, jeśli byśmy chcieli importować jeszcze większy % budynków, przygotowałem poziomy błędów dla różnych thresholdów:

75%: import 55% budynków, 1 fundament (błąd 0.3%), 2 brak budynku (błąd 0.6%)
70%: import 60% budynków, 1 fundament (błąd 0.3%), 3 brak budynku (błąd 0.9%)

Osobiście uważam, że ustawienie 80% przyniesie najlepsze rezultaty co do ilości zaimportowanych budynków. 50% całego zbioru to około 25 tysięcy nowych budynków. Można liczyć się, że około 75 budynków zostanie dodanych bezpodstawnie/błędnie.


@Mateusz_Konieczny @starsep @mikmach proszę o feedback :pray:.

Dla mnie błąd poniżej 1% jest akceptowalny. @Mateusz_Konieczny - przeceniasz ludzi :slight_smile:
Więcej jest pewnie baboli przy ręcznym imporcie z budynki - BTDT. Czasami się wyłapie i samemu cofnie, częściej inni cofną, ale ile nie jest zauważone to…
Właśnie - czy ten program dałoby się zmodyfikować do weryfikacji istniejących budynków?

3 Likes

A, bo za mało tego było: chcę wyrazić zachwyt że testujesz takie rozwiązanie.

Wygląda na interesujący pomysł (połączenie automatycznego przetwarzania obrazu i danych oficjalnych). I to takie co działa.

Może dałoby się z tego magisterkę napisać czy artykuł naukowy. Albo chociaż blog posta na HN. Zwłaszcza jak zadziała na dużą skalę.

3 Likes

Dziwne, że nikt nie poruszył tematu aktualności ortofotomapy. Ja robiłbym taki import w miejscach, gdzie orto ma co najwyżej 1-2 lata. W praktyce nie jest to duże ograniczenie, bo cały kraj ma robione orto co 2-3 lata.

Tak, ale z poziomu zwykłej nie-lokalnej osoby mapującej: jeśli ewidencja gruntów wskazuje na budynek, i jest on widoczny na orto, to większość osób po prostu doda go. Ja może raz w życiu sprawdzałem aktualność orto w rejonie mapowania. Z ogóły jest ono dosyć aktualne, a błędy jakie taki import popełni nie będą różne od zwykłego mapującego.

Uruchomiłem import i ustawiłem ograniczenie dla maksymalnie 400 budynków dziennie. Czyli cały import potrwa lekko ponad 2 miesiące.

Import jest grupowany na zmiany o wysokiej pewności: Changeset: 138727741 | OpenStreetMap, oraz średniej pewności: Changeset: 138727742 | OpenStreetMap. Ewentualną moderację najlepiej jest zaczynać od zmian o średniej pewności (80%-90%).