Výukové materiály

Níže najdete pokyny pro některé běžné případy použití.

Vytváření vysoce kvalitních ortofotomap

snímek ortofota OpenDroneMap

Bez jakýchkoli úprav parametrů volí ODM dobrý kompromis mezi kvalitou, rychlostí a spotřebou paměti. Pokud chcete získat kvalitnější výsledky, musíte některé parametry upravit:

  • --orthophoto-resolution je rozlišení ortofota v cm/pixel. Snižte tuto hodnotu pro výsledek s vyšším rozlišením.

  • --texturing-data-term by měl být v lesních oblastech nastaven na area.

  • --mesh-size by měla být zvýšena na 300000-600000 a --mesh-octree-depth by měla být zvýšena na 10-11 v městských oblastech, aby bylo možné vytvořit lepší budovy/střechy.

Vytváření digitálních výškových modelů

By default ODM does not create digital elevation models (DEMs). To create a digital terrain model, make sure to pass the --dtm flag. To create a digital surface model, be sure to pass the --dsm flag.

obrázek digitálního modelu povrchu odvozeného z OpenDroneMap

Pro generování DTM se používá jednoduchý morfologický filtr (smrf), který klasifikuje body na pozemní a nepozemní a používají se pouze pozemní body. Filtr smrf lze ovládat pomocí několika parametrů:

  • --smrf-scalar škálovací hodnota. Tento parametr zvyšte u terénů s velkými výškovými rozdíly.

  • --smrf-slope parametr sklonu, který je mírou „tolerance sklonu“. Tento parametr zvyšte u terénů s velkými výškovými rozdíly. Měl by být nastaven na hodnotu vyšší než 0,1 a ne vyšší než 1,2.

  • --smrf-threshold výškový práh. Nastavte tento parametr na minimální výšku (v metrech), kterou očekáváte u objektů, které nejsou na zemi.

  • --smrf-window parametr poloměru okna (v metrech), který odpovídá velikosti největšího prvku (budovy, stromů atd.), který má být odstraněn. Měl by být nastaven na hodnotu vyšší než 10.

Změna těchto možností může výrazně ovlivnit výsledek DTM. Nejlepším zdrojem pro pochopení vlivu parametrů na výstup je přečíst si původní článek An improved simple morphological filter for the terrain classification of airborne LIDAR data (PDF volně k dispozici).

Celkově má na výsledky největší vliv možnost --smrf-threshold.

SMRF se dobře vyhýbá chybám typu I (malý počet zemních bodů chybně klasifikovaných jako nezemní), ale jen „přijatelně“ se vyhýbá chybám typu II (velký počet nezemních bodů chybně klasifikovaných jako zemní). To je třeba vzít v úvahu při generování DTM, které mají být použity vizuálně, protože objekty mylně považované za zem vypadají ve výsledném DTM jako artefakty.

obraz vlivu zkreslení objektivu na bowling dat

Generování DEM ovlivňují dva další důležité parametry:

  • --dem-resolution, který nastavuje výstupní rozlišení rastru DEM (cm/pixel).

  • --dem-gapfill-steps, který určuje počet postupných vrstev DEM, které se mají použít. U městských scén může zvýšení této hodnoty na 4-5 pomoci dosáhnout lepších výsledků interpolace v oblastech, které filtr SMRF ponechává prázdné.

Příklad generování DTM:

docker run -ti --rm -v /my/project:/datasets/code <my_odm_image> --project-path /datasets --dtm --dem-resolution 2 --smrf-threshold 0.4 --smrf-window 24

Použití modulu Potree 3D viewer na WebODM

Kamery

Aktivací této funkce zobrazíte polohu kamery.

Kliknutím na ikonu fotoaparátu můžete také zobrazit jednotlivé snímky v rámečku v pravém horním rohu. Kliknutím na rámeček snímku se přepnete do režimu celé obrazovky.

V rámci snímku jsou odkazy na stažení snímku a souboru kamery GeoJSON.

Umístění kamery

Texturovaný model

Aktivací této funkce zobrazíte načtení texturovaného modelu. V závislosti na velikosti souboru a rychlosti připojení může načtení trvat několik sekund.

Texturovaný model

Vzhled

Point budget

Pro účely vzhledu i výkonu lze spravovat rozpočet bodů na scéně. Některým starým a méně výkonným strojům by prospěl rozpočet 500 000 bodů, zatímco většina strojů střední třídy je schopna zvládnout rozpočet 1 až 2 miliony bodů.

Rozpočet 5 až 7 milionů bodů vytváří hladký 3d model mračna bodů, ale může být náročný na zdroje.

Výchozí hodnota bodového rozpočtu je nastavena na 1 000 000.

Zorné pole

Za účelem kontroly prvků modelu, které mají být zahrnuty do scény, lze upravit zorné pole. Výchozí hodnota je nastavena na 60 stupňů.

Nastavení zorného pole

Osvětlení očního obzoru

Modul prohlížeče Potree Point Cloud 3d dokáže implementovat eye dome-lighting, model osvětlení, který zvýrazňuje tvary objektů.

Eye Dome-lighting seskupuje objekty, stínuje jejich obrysy a zlepšuje vnímání hloubky ve vědeckých vizualizacích. Je užitečné pro rozpoznávání a měření struktur v modelu. Lze jej upravit nastavením poloměru, síly a krytí.

Ve výchozím nastavení je funkce Eye Dome-Lighting v prohlížeči Potree 3D povolena, ale lze ji vypnout kliknutím na možnost povolit.

Nastavení osvětlení oční kopule

Pozadí

Pozadí prohlížeče Potree 3D lze upravit. Dostupné možnosti jsou Skybox / Gradient / Černá / Bílá / Žádná.

Volba pozadí

Ostatní

Kvalita rozstřiku = Kvalitu rozstřiku lze nastavit na standardní nebo vysokou kvalitu a zlepšit tak vzhled modelu.

Minimální velikost uzlu = volba Minimální velikost uzlu ovlivní hustotu bodů reprezentovaných uzlů.

Box = Zobrazení boxů uzlů.

Zamknout zobrazení = uzamkne zobrazení mračna bodů a zabrání načtení nebo vyjmutí bodů do modelu.

Nástroje

Měření

Modul Potree 3D viewer poskytuje několik nástrojů pro měření. Tato sada nástrojů se skládá z 12 prvků. Obsahuje také ovládací prvky pro zobrazení nebo skrytí výsledných popisek měření.

Měření se provádí kliknutím levým tlačítkem myši na požadované body a u některých nástrojů je pro ukončení procesu nutné kliknutí pravým tlačítkem myši.

Nástroje - Měřící nástroje

Úhel

Tento nástroj měří trojrozměrný úhel tvořený přímkami spojujícími 3 body. Chcete-li zahájit měření, klikněte na ikonu úhlu, poté klikněte levým tlačítkem myši na 3 body a proces se automaticky ukončí. Další informace získáte také výběrem tohoto prvku v sekci scéna.

Bod

Tento nástroj zvýrazní vybraný bod a zobrazí jeho souřadnici XYZ. Chcete-li zahájit měření, klikněte na ikonu bodu, poté klikněte na požadovaný bod a proces se automaticky ukončí. Další informace lze získat také výběrem tohoto prvku v sekci scény.

Vzdálenost

Tento nástroj měří trojrozměrnou vzdálenost přímek spojujících řadu bodů. Chcete-li zahájit měření, klikněte na ikonu vzdálenosti a začněte klikat na požadované body (dva nebo více). Měření ukončíte kliknutím pravým tlačítkem myši. Další informace, jako je například Celková délka, lze získat také výběrem tohoto prvku v sekci Scéna.

Výška

Tento nástroj měří výšku nebo svislou vzdálenost mezi dvěma body. Chcete-li zahájit měření, klikněte na ikonu výšky a poté klikněte na požadované dva body. Proces se automaticky ukončí. Další informace získáte také výběrem tohoto prvku v sekci Scéna.

Height measurement

Kruh

Tento nástroj měří poloměr kružnice tvořené třemi body. Chcete-li zahájit měření, klikněte na ikonu kružnice a poté klikněte na požadované dva body. Proces se automaticky ukončí. Další informace, jako je Obvod, lze získat také výběrem tohoto prvku v sekci Scéna.

Azimut

Tento nástroj měří azimutální úhel přímky. Tato přímka je tvořena dvěma body vybranými uživatelem, úhel se měří ve stupních ve směru hodinových ručiček od 0 do 360 a začíná od zeměpisného severu. Chcete-li zahájit měření, klikněte na ikonu azimutu a poté klikněte na požadované dva body. Proces se automaticky ukončí. Další informace lze získat také výběrem tohoto prvku v sekci scény.

Oblast

Tento nástroj měří vodorovnou plochu tvořenou polygonem. Chcete-li zahájit měření, klikněte na ikonu plochy a začněte klikat na body tvořící požadovaný polygon (tři nebo více). Měření ukončíte kliknutím pravým tlačítkem myši. Další informace získáte také výběrem tohoto prvku v sekci scéna.

Objem (krychle)

Tento nástroj měří objem tvořený krychlí. Chcete-li zahájit měření, klikněte na ikonu objemu (krychle) a kliknutím na model umístěte krychli. Pomocí zobrazených obslužných programů je možné krychli přemístit, změnit její rozměr a otočit ji. Měření ukončíte kliknutím pravým tlačítkem myši. Další informace lze získat také výběrem tohoto prvku v sekci scény.

Objem (koule)

Tento nástroj měří objem tvořený koulí. Chcete-li zahájit měření, klikněte na ikonu objemu (koule) a kliknutím na model umístěte kouli. Pomocí zobrazených obslužných programů je možné kouli přemístit, změnit její rozměr a otočit ji. Měření ukončíte kliknutím pravým tlačítkem myši. Další informace lze získat také výběrem tohoto prvku v sekci scény.

Výškový profil

Tento nástroj vytvoří na modelu výškový profil tvořený čarou. Chcete-li zahájit měření, klikněte na ikonu Výškový profil a poté vytvořte na modelu čáru kliknutím na požadované body (dva nebo více). Měření ukončíte kliknutím pravým tlačítkem myši. Další informace a možnosti, například „Zobrazit 2d profil“, lze získat také výběrem tohoto prvku v sekci scény.

Height profile

Poznámka

Tento nástroj vytvoří na zvýrazněném bodě modelu anotační štítek. Chcete-li zahájit měření, klikněte na ikonu anotace a poté klikněte na požadovaný bod. Proces se automaticky ukončí. Chcete-li anotaci upravit, vyberte tento prvek v sekci scény a poté upravte Nadpis a Popis.

Odstranit měření

Tento nástroj odstraní všechna měření na modelu. Chcete-li odstranit všechna měření, klikněte na ikonu „Odstranit měření“.

Ořez

Tools - Clipping tools

Mračno bodů lze oříznout výběrem oblasti. Mezi možnosti oříznutí patří žádné / zvýraznění / vnitřní / vnější.

Chcete-li mračno bodů oříznout, klikněte na ikonu oříznutí svazku, umístěte krychli na model a přemístěte ji, změňte její rozměry a otočte ji tak, aby obsahovala požadovanou oblast. Jako metoda oříznutí je ve výchozím nastavení nastaveno zvýraznění. Pokud chcete zobrazit pouze body obsažené v krychli, klikněte na „Inside“ (Uvnitř), v opačném případě klikněte na „Outside“ (Vně).

Chcete-li odstranit ořezový objem nebo polygony, klikněte na ikonu „Odstranit všechna měření“.

Nástroje - Ořezávání

Scéna

V části Scéna se zobrazí strom souborů obsahující všechny prvky scény. Prvky jsou uspořádány do šesti skupin, kterými jsou Mračna bodů / Měření / Anotace / Ostatní / Vektor / Obrázky.

Každý prvek v těchto skupinách lze vybrat a získat další informace nebo ovládat jeho vlastnosti.

Například vlastnosti mračen bodů lze upravit tak, aby zobrazovaly nadmořskou výšku, a také lze přizpůsobit barevnou rampu.

Nástroje - Ovládací prvky navigace

Measuring stockpile volume

Plánování terénních prací

Povětrnostní podmínky mění osvětlení, a tím ovlivňují výsledky fotografování. Nejlepších výsledků dosáhnete při rovnoměrně zatažené nebo jasné obloze. Dbejte také na nízkou rychlost větru, která umožňuje, aby fotoaparát zůstal během sběru dat stabilní. Abyste se vyhnuli stínům, které na jedné straně zásoby mohou bránit detekci prvků a snižovat počet výsledných bodů, preferujte vždy lety v poledne, kdy je slunce v nadhlavníku, aby bylo vše důsledně osvětleno. Dbejte také na to, aby vzdálenost horizontální viditelnosti pouhým okem odpovídala plánovaným letovým vzdálenostem pro konkrétní projekt, aby kvalitu snímků negativně neovlivňoval prach, mlha, kouř, sopečný popel nebo znečištění.

Letový model

Most stockpile measurement jobs does not require a crosshatch pattern or angled gimbal as the resting angle of stockpile materials allows the camera to capture the entire stockpile sides. Only some special cases where erosion or machinery operations causes steep angles on the faces of the stockpile would benefit of the crosshatch flight pattern and angled camera gimbal but consider that these additional recognized features come at a cost, (in field labor and processing time) and the resulting improvements are sometimes negligible.

Ve většině případů je letový model sekačky na trávu schopen vytvořit velmi přesné modely shromážěných snímků.

jednoduchý vzor letu sekačky na trávu může poskytnout přesné výsledky.

Doporučené překrytí by se mělo pohybovat mezi 75 a 80 % s bočním překrytím v rozmezí 65 až 70 %. S rostoucí výškou letu se rovněž doporučuje mírně zvyšovat překrytí a boční odstup.

Výška letu

Výška letu může být ovlivněna různými modely kamer, ale obecně a pro zajištění rovnováhy mezi kvalitou obrazu a optimalizací letu se doporučuje, aby byl proveden ve výšce 3 až 4násobku nejvyšší výšky shromážděných snímků. Takže pro shromážděné snímky o výšce 10 metrů lze snímky pořizovat ve výšce 40 metrů. S rostoucí výškou letu se doporučuje také zvyšovat překrytí, takže pro let ve výšce 40 metrů lze nastavit 65% boční překrytí a 75% překrytí, ale pro plánovanou výšku 80 metrů 70% boční překrytí a 80% překrytí umožňující rozpoznání a správné zpracování prvků.

GCPs

Pro dosažení přesnosti vyšší než 3 % se doporučuje používat GCP. K zajištění přesných výsledků obvykle stačí 5 distribuovaných GCP. Při umisťování nebo měření GCP by měla být přesnost zařízení větší než GSD. GNSS a totální stanice geodetické třídy jsou určeny k zajištění požadované milimetrové přesnosti.

For further information on the use of GCPs, please refer to the Ground Control Points section.

Parametry zpracování

Vysoce přesného modelu lze dosáhnout pomocí předdefinovaných nastavení WebODM s vysokým rozlišením. Některé parametry pak můžete dále upravit podle potřeby.

Pokud používáte ODM, mohou vám tyto referenční hodnoty pomoci při konfiguraci nastavení procesu.

–dsm: true

–dem-resolution 2.0

–orthophoto-resolution 1.0

–feature-quality high

–pc-quality high

Měření

Vzhledem k tomu, že téměř 50 % materiálu se nachází v prvních 20 % výšky zásoby, je třeba věnovat zvláštní pozornost vhodnému vymezení základní roviny.

téměř 50 % materiálu se nachází v prvních 20 % výšky zásoby.

V ovládacím panelu WebODM Dashboard klikněte na „zobrazit mapu“ a spusťte 2D zobrazení projektu.

V zobrazení 2D mapy klikněte na tlačítko „Změřit objem, plochu a délku“.

klikněte na tlačítko "Změřit objem, plochu a délku".

pak klikněte na „Vytvořit nové měření“.

klikněte na "Vytvořit nové měření"

Začněte umísťovat body, abyste definovali základní rovinu zásoby.

Definice základní roviny zásob

Kliknutím na „Dokončit měření“ proces dokončíte.

Proces dokončíte kliknutím na "Dokončit měření".

V dialogovém okně se na několik sekund zobrazí zpráva “ Výpočet …“ a po dokončení výpočtu se zobrazí naměřená hodnota objemu.

Proces dokončíte kliknutím na "Dokončit měření".

Pokud používáte příkazový řádek OpenDroneMap, můžete soubory dsm použít k měření objemů zásob pomocí jiných programů.

Uvažte také, že jakmile jsou limity shromážděných snímků nastaveny v softwaru, jako je QGis, zjistíte, že existují některé způsoby, jak určit základní rovinu. Takže pro izolované shromážděné snímky, jejichž hranice jsou většinou viditelné, lze použít lineární přístup. Zatímco u shromážděných snímcích nastavených ve svazích nebo v zásobnících je lepší určit základní rovinu pomocí nejnižšího bodu. Pro velké množstcví shromážděných snímků se doporučuje vytvořit trojúhelníkovou 3D plochu pro určení základní roviny. To platí i pro shromážděné snímky vytvořené na nepravidelných plochách.

Očekávaná přesnost

U pečlivě naplánovaných a provedených projektů, zejména pokud je GSD menší než 1 cm, by se očekávaná přesnost měla pohybovat v rozmezí 1 % až 2 %. Výsledná přesnost je srovnatelná s komerčně dostupným fotogrammetrickým softwarem a s přesností získanou pomocí zařízení GNSS geodetické třídy.

Použití aplikace Docker

Vzhledem k tomu, že mnoho uživatelů používá k nasazení OpenDroneMap docker, může být užitečné porozumět některým základním příkazům, abychom mohli instance dockeru prozkoumat, když se něco pokazí nebo nás zajímá, co se děje. Docker je kontejnerové prostředí, jehož účelem je mimo jiné usnadnit nasazení softwaru nezávisle na místním prostředí. V tomto směru se podobá virtuálním strojům.

Několik jednoduchých příkazů nám může výrazně zlepšit práci s dockerem.

Výpis strojů Docker

Můžeme začít výpisem dostupných strojů docker na aktuálním počítači, který používáme, následujícím způsobem:

> docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
2518817537ce        opendronemap/odm       "bash"                   36 hours ago        Up 36 hours                                  zen_wright
1cdc7fadf688        opendronemap/nodeodm   "/usr/bin/nodejs /va…"   37 hours ago        Up 37 hours         0.0.0.0:3000->3000/tcp   flamboyant_dhawan

Pokud chceme zobrazit stroje, které sice neběží, ale stále existují, můžeme přidat příznak -a:

> docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                    PORTS                    NAMES
2518817537ce        opendronemap/odm       "bash"                   36 hours ago        Up 36 hours                                        zen_wright
1cdc7fadf688        opendronemap/nodeodm   "/usr/bin/nodejs /va…"   37 hours ago        Up 37 hours               0.0.0.0:3000->3000/tcp   flamboyant_dhawan
cd7b9585b8f6        opendronemap/odm       "bash"                   3 days ago          Exited (1) 37 hours ago                            nostalgic_lederberg
e31010c00b9a        opendronemap/odm       "python /code/run.py…"   3 days ago          Exited (2) 3 days ago                              suspicious_kepler
c44e0d0b8448        opendronemap/nodeodm   "/usr/bin/nodejs /va…"   3 days ago          Exited (0) 37 hours ago                            wonderful_burnell

Přístup k protokolům instance

Pomocí ID CONTAINER nebo názvu můžeme přistupovat ke všem protokolům dostupným v počítači následujícím způsobem:

> docker logs 2518817537ce

Je pravděpodobné, že bude nepřehledně velký, ale můžeme použít znak pipe | a další nástroje, abychom z protokolů získali jen to, co potřebujeme. Například můžeme pomalu procházet protokoly pomocí příkazu more:

> docker logs 2518817537ce | more
[INFO]    DTM is turned on, automatically turning on point cloud classification
[INFO]    Initializing OpenDroneMap app - Mon Sep 23 01:30:33  2019
[INFO]    ==============
[INFO]    build_overviews: False
[INFO]    camera_lens: auto
[INFO]    crop: 3
[INFO]    debug: False
[INFO]    dem_decimation: 1
[INFO]    dem_euclidean_map: False
...

Stisknutím klávesy Enter nebo Mezerník, kláves se šipkami nebo kláves Stránka nahoru či Stránka dolů se nyní můžeme pohybovat v protokolech. Malé písmeno Q nám umožní uniknout zpět do příkazového řádku.

We can also extract just the end of the logs using the tail command as follows:

> docker logs 2518817537ce | tail -5
[INFO]    Cropping /datasets/code/odm_orthophoto/odm_orthophoto.tif
[INFO]    running gdalwarp -cutline /datasets/code/odm_georeferencing/odm_georeferenced_model.bounds.gpkg -crop_to_cutline -co NUM_THREADS=8 -co BIGTIFF=IF_SAFER -co BLOCKYSIZE=512 -co COMPRESS=DEFLATE -co BLOCKXSIZE=512 -co TILED=YES -co PREDICTOR=2 /datasets/code/odm_orthophoto/odm_orthophoto.original.tif /datasets/code/odm_orthophoto/odm_orthophoto.tif --config GDAL_CACHEMAX 48.95%
Using band 4 of source image as alpha.
Creating output file that is 111567P x 137473L.
Processing input file /datasets/code/odm_orthophoto/odm_orthophoto.original.tif.

Hodnota -5 říká příkazu tail, aby nám poskytl pouze posledních 5 řádků protokolů.

Přístup k instancím z příkazového řádku

Někdy musíme jít při zkoumání procesu pro OpenDroneMap trochu hlouběji. Za tímto účelem můžeme získat přímý přístup do strojů z příkazového řádku. Za tímto účelem můžeme použít docker exec ke spuštění příkazového řádku bash v počítači, který nás zajímá, následujícím způsobem:

> docker exec -ti 2518817537ce bash
root@2518817537ce:/code#

Nyní jsme přihlášeni do naší instance dockeru a můžeme prozkoumat počítač.

Úklid po Dockeru

Docker má žalostnou spotřebu místa a ve výchozím nastavení neuklízí přebytečná data a stroje po dokončení procesů. To může být výhodné, pokud potřebujeme přistupovat k procesu, který byl mezitím ukončen, ale nese to s sebou břemeno, že v průběhu času využívá stále větší množství úložiště. Maciej Łebkowski má výborný přehled o tom, jak spravovat nadbytečné využití disku v nástroji docker.

Použití ODM z místa s nízkou šířkou pásma

Co to je a pro koho je to určeno?

Prostřednictvím Ivan Gayton’s repo.

OpenDroneMap nelze vždy efektivně nastavit lokálně - ke zpracování velkých datových souborů je zapotřebí poměrně výkonný stroj, takže pro lidi v terénu může být někdy řešením cloudový stroj. V mnoha nízkopříjmových prostředích je však problémem šířka pásma. Toto omezení nelze zcela vyřešit, ale následující metoda rozumně snižuje šířku pásma potřebnou ke zpracování datových sad snímků z dronů v cloudu z afrických lokalit.

Představíme vám složitý, ale proveditelný postup pro vytvoření cloudového počítače OpenDroneMap (ne CloudODM, jen cloudové instance ODM, kterou spustíte z příkazového řádku) a jeho použití ke vzdálenému zpracování velkých sad fotografií. Vyžaduje to znalost používání příkazového řádku Unix, ssh, účet Digital Ocean (Amazon AWS by fungoval také, možná s mírnými rozdíly v nastavení) a mírnou úroveň obecné počítačové gramotnosti. Pokud nejste dostatečně počítačově zdatní a jste ochotni se potýkat s poněkud složitějším nastavením, měli byste se zaměřit na CloudODM.

Celý proces je většinou zaměřen na někoho, kdo létá na rozsáhlé mise v Africe nebo podobné lokalitě a chce zpracovat data co nejdříve ještě v terénu. Proto klade důraz na pracovní postup, jehož cílem je snížit šířku pásma/přenos dat, spíše než jen na nejjednodušší způsob spuštění ODM.

Kroky

Instalace

  • Vytvořte si droplet Digital Ocean s alespoň 4 GB paměti RAM. To bude stát asi 20 dolarů měsíčně. Pokud máte méně než 4 GB RAM, instalace se pravděpodobně nezdaří. Při skutečném spuštění procesu ODM změníme velikost na mnohem větší - a dražší - cloudový stroj, ale mezi jednotlivými spuštěními jej můžete zmenšit na druhý nejlevnější droplet, který stojí jen 10 USD/měsíc (nejlevnější droplet za 5 USD/měsíc je vybaven tak malým diskem, že na něj nelze zmenšit velikost zpět).

    • Mělo by se jednat o instanci Ubuntu 18.04, aby byla zajištěna kompatibilita závislostí.

    • Vytvořte uživatele s právy sudo. S tím vám pomůže neuvěřitelně dobrá dokumentace společnosti Digital Ocean. V našem případě jsme nastavili uživatele s názvem odm, takže se k němu připojíte příkazem ssh odm@xxx.xxx.xxx.xxx (kde x znamená adresu IPv4 vašeho serveru). Pokud se chcete přesně držet tohoto příkladu, používejte uživatelské jméno odm; pak bude vaše instalační cesta /home/odm/ODM/` a bude odpovídat všem příkladům v tomto dokumentu.

    • Proveďte sudo apt update a sudo apt upgrade, abyste se ujistili, že váš server není nebezpečně bez aktualizací. Ujistěte se, že jste zůstali u Ubuntu 18.04.

  • Stáhněte a nainstalujte na něj ODM ze stránky ODM Github (běžný, ne WebODM) pomocí následujících příkazů:

git pull https://github.com/OpenDroneMap/ODM.git
cd ODM
bash configure.sh install
  • Pokud tak učiníte z výchozí domovské složky svého uživatele (tj. odm), bude cesta k instalaci /home/odm/ODM (zkráceně ~/ODM/).

  • Je třeba nastavit některé proměnné prostředí. Otevřete soubor ~/.bashrc na svém počítači a přidejte na konec následující 3 řádky (Z ODM github). Soubor můžete otevřít pomocí nano ~/.bashrc (nebo jakéhokoli textového editoru, který používáte místo nano). Nezapomeňte nahradit /home/odm/` správnou cestou k umístění, kam jste rozbalili OpenDroneMap, pokud jste neprovedli vše přesně jako v našem příkladu (například pokud jste v nastavení serveru použili jiné uživatelské jméno):

export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/SuperBuild/install/lib/python2.7/dist-packages
export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/SuperBuild/src/opensfm
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/odm/ODM/SuperBuild/install/lib
  • Všimněte si, že readme ODM na githubu obsahuje drobnou chybu, název instalačního adresáře bude ODM, nikoli OpenDroneMap (uvidíte to, když porovnáte výše uvedené pokyny s pokyny na ODM GitHubu).

  • Abychom zabránili pádu, kdy proces split-merge nenajde svůj vlastní spustitelný soubor, přidáme do ~/.bashrc následující řádky (pokud jste nastavili věci jinak než v našem příkladu, upravte cesty):

export PYTHONPATH=$PYTHONPATH:/home/odm/ODM/
export PATH=$PATH:/home/odm/ODM/
  • Nyní budete potřebovat druhý cloudový pevný disk (v žargonu Digital Ocean „svazek“), který bude dostatečně velký pro správu vašeho projektu. Zdá se, že pravidlem je desetinásobek velikosti vaší surové sady bitových kopií; my máme 100GB sadu bitových kopií a nastavili jsme 1000GB svazek (po dokončení běhu byste se měli moci zbavit většiny této drahé kapacity disku, ale je potřeba k dokončení procesu). Nastavte svazek, připojte jej ke svému dropletu a konfigurujte jeho přípojný bod (v tomto příkladu jej nastavíme na /mnt/odmdata/).

Příprava dat a projektu

  • Obrázky nyní odešlete na server. Můžete použít Zabezpečené kopírování (scp) takto: scp -r /cesta/do/moje/složkasobrázky odm@xxx.xxx.xxx.xxx:/mnt/odmdata/.

    • Tím se celá složka plná obrazů přesune (to je to, co dělá volba -r, „rekurzivní“) do vzdáleného umístění (v našem příkladu do svazku, který jsme připojili ke cloudovému počítači na /mnt/odmdata/`.

    • To zabere určitou šířku pásma. Velikost souborů nelze obejít.1, 2

Struktura adresáře

ODM vyžaduje, aby byly adresáře v počítači nastaveny přesně tak, jak mají být. Rozhodující je instalační složka (pokud jste instalovali výše uvedeným způsobem, je to /home/odm/ODM/) a složka projektu (tj. /mnt/odmdata/myproject/).

  • Soubor settings.yaml ODM určuje jediný nadřazený adresář obsahující všechny projekty. To je to, co je uvedeno v řádku cesty k projektu v souboru settings.yaml (poněkud matoucí je, že se ve skutečnosti jedná o rodičovský adresář jednotlivých adresářů projektů, které jsou při volání ODM určeny parametrem názvu projektu). Upravte soubor settings.yaml a nastavte parametr project_path na (podle našeho příkladu nastavení) /mnt/odmdata/, což v tomto případě ukazuje na námi vytvořený svazek. V jeho rámci se vytvoří jednotlivé adresáře projektu.

  • Individual project directories, i.e. /mnt/odmdata/myproject/ contain the gcp_list.txt file, the image_groups.txt file, and the images folder for each project.

  • Složka images, tj. /mnt/odmdata/myproject/images/, obsahuje všechny obrázky. Pokud to takto nastavíte, obrázky se nebudou znovu kopírovat, protože už jsou v adresáři, ve kterém je ODM chce mít.

  • Upravte soubor settings.yaml tak, aby určoval nadřazený adresář složky projektu (v tomto případě námi vytvořený svazek, /mnt/odmdata/). Ujistěte se, že obrázky jsou na správném místě, tj. /mnt/odmdata/myproject/images, a ostatní pomocné soubory (gcp_list.txt a image_groups.txt) jsou v kořenové složce /mnt/odmdata/myproject/.

  • pokud máte obrázky v samostatných složkách pro jednotlivé bloky AOI nebo lety (což budete mít, pokud byla správa letů organizována), můžete vytvořit image_groups. txt se zaklínadly for i in *; do cd $i; for j in *; do echo "$j $i" >> ../$i.txt; done; cd ../; done; a cd ../, for i in myproject/*.txt; do cat $i >> image_groups.txt; done;. To by mělo vytvořit soubor se správnou strukturou: seznam všech souborů obrázků a „název skupiny“ za každým z nich (což v tomto případě bude jednoduše název složky, ze které pochází). Poté přesuňte všechny soubory obrázků do jediného adresáře s názvem images v kořenovém adresáři projektu (tedy /mnt/odmdata/myproject/images/). Soubor image_groups.txt umožní ODM sledovat, které obrázky patří do stejné dávky, i když jsou všechny v jednom adresáři.

Resize droplet, pull pin, run away

  • Vypněte a změňte velikost počítače na přiměřeně monstrózní počet procesorů a množství paměti. Používám paměťově optimalizovaný stroj s 24 dedikovanými vCPU a 192 GB RAM (což stojí asi 1,60 USD/hod - což se rychle sčítá, je to přes 1000 USD/měsíc). Restartujte a rychle se pusťte do práce, abyste neztráceli drahý čas na velké kapky.

  • Spusťte proces ODM přes ssh pomocí nohup (takže v případě přerušení bude zpracování pokračovat).

    • Alternativně můžete použít GNU screen pro spuštění procesu z relace obrazovky, která se nezastaví, pokud je vaše připojení přerušeno; spusťte screen a použijte a d pro odpojení, screen -r pro opětovné připojení. Použitím screen však nezískáte logovací soubor se všemi konzolovými výstupy, pokud neuděláte něco specifického pro jejich zachycení, zatímco nohup vám poskytne soubor se všemi konzolovými výstupy, včetně chybových hlášení, zdarma.

    • Poznámka: od roku 2020-03 se zdá, že normální zaklínadlo python run.py -i /path/to/image/folder project_name nefunguje; parametr -i nebo --image způsobuje podivnou chybu. Proto parametr -i vypustíme a budeme se spoléhat na řádek adresáře projektu v souboru settings.yaml, který nasměruje ODM na správné místo. Nyní používáme (včetně split-merge):

nohup python run.py myproject --split 1 --split-overlap 0 --depthmap-resolution 1000 --orthophoto-resolution 5 --dem-resolution 15 --pc-las --dsm
  • Tím se ODM přesměruje na složku (v tomto příkladu) /mnt/odmdata/myproject/. Pokud jsou soubory image_groups.txt a gcp_list.txt v této složce, obrázky jsou ve složce /mnt/odmdata/myproject/images/ a cesta k projektu v souboru settings.yaml je /mnt/odmdata/, nebude se plýtvat časem a místem při kopírování obrázků.

  • Všimněte si, že to předpokládá, že máte soubor image_groups.txt. Pokud ne, pak -split-overlap 0 pravděpodobně všechno pokazí a --split 1 je doslova náhodné číslo, které bude po načtení souboru image_groups.txt ignorováno (myslím, že normálně kontroluje, do kolika skupin rozdělí sadu obrázků, ale v našem případě předpokládáme, že obrázky jsou již rozumně seskupeny). Pokud nemáte velkou sadu dat (>1000 obrázků), vynechejte volby --split a --split-overlap.

  • Sledujte postup pomocí Tail (abyste věděli, kdy je hotovo).

tail -f nohup.out
  • Možná budete chtít sledovat htop (abyste měli přehled o využití prostředků a v budoucnu mohli roztočit jen tak velký stroj, jak je potřeba).

Po jeho skončení (za předpokladu, že přežijete tak dlouho)

  • Jakmile zpracování skončí, vypněte stroj a změňte jeho velikost zpět na levnou minimální kapacitu.

  • Spusťte zálohování počítače a přihlaste se pomocí ssh.

  • Pokud chcete ušetřit šířku pásma pro stahování, můžete ortofoto komprimovat pomocí GDAL. Nepřidávejte přehledy, to udělejte na svém lokálním počítači, abyste soubor před stažením nezvětšovali.

gdal_translate -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -co TILED=YES -b 1 -b 2 -b 3 -mask 4 --config GDAL_TIFF_INTERNAL_MASK YES /path/to/original/filename.extension /path/to/output.tif
  • Stáhněte pomocí scp: scp odm@xxx.xxx.xxx.xxx:/mnt/odmdata/myproject/odm_orthophoto/odm_orthophoto.tif (nebo si stáhněte komprimovanou verzi, kterou jste vytvořili v posledním kroku).

  • Jakmile soubor získáte v místním počítači, můžete pomocí QGIS přidat přehledy („pyramidy“) nebo použít příkaz GDAL gdaladdo -r average /path/to/image.tif 2 4 8 16 32 64 128 256 512 1024.

  • Složky odm_texturing, odm_georeferencing a odm-dem můžete archivovat pomocí tar, abyste je mohli stáhnout vcelku (a možná i menší).

tar -zcvf archivename /path/to/folder

Advanced

Kalibrace kamery

Kalibrace fotoaparátů je u komoditních fotoaparátů zvláštní výzvou. Změny teploty, vibrace, zaostření a další faktory mohou ovlivnit odvozené parametry, což má zásadní vliv na výsledná data. Automatická nebo vlastní kalibrace je u letů dronů možná a žádoucí, ale v závislosti na průběhu letu nemusí automatická kalibrace odstranit z výsledných produktů všechna zkreslení. James a Robson (2014) se ve svém článku Mitigating systematic error in topographic models derived from UAV and ground-based image networks zabývají tím, jak minimalizovat zkreslení způsobené autokalibrací.

obraz vlivu zkreslení objektivu na bowling dat

Efekt bowlingu na mračnu bodů nad sadou více než 13 000 snímků shromážděných Světovou bankou v Tanzanii nad povodím Msimbasi v Dar es Salaamu v Tanzanii, které je náchylné k povodním.

Pro zmírnění tohoto efektu existuje několik možností, ale nejjednodušší jsou následující: letět se dvěma obrazci oddělenými od sebe o 20° a namísto nadiru (přímého směru dolů) použít kameru, která se naklání dopředu o 5°.

animace zobrazující optimum

As this approach takes longer than traditional imaging, pilots and teams may apply this technique to a smaller area and use the collected data to optimize future flights. OpenDroneMap can generate a calibration file called cameras.json from a small sample flight. The calibration file can be used for future flights, mitigating the bowling effect without sacrificing efficiency.

Alternativně lze použít následující experimentální metodu: letět s mnohem menším překrytím, ale se dvěma lety crossgrid (někdy nazývanými crosshatch) oddělenými od sebe 20° s kamerou směřující 5° dopředu.

  • Procento překrytí napříč sítí může být nižší než u paralelních letů. Pro dosažení dobrých výsledků ve 3D budete potřebovat 68% překrytí a sidelap pro ekvivalentní 83% překrytí a sidelap.

  • Chcete-li získat dobré výsledky 2D a 2,5D (digitální model reliéfu), budete potřebovat 42% překrytí a boční překrytí pro ekvivalentní 70% překrytí a boční překrytí.

animace zobrazující experimentální optimum

Vertikálně oddělené letové linie také zlepšují přesnost, ale méně než kamera, která je natočena dopředu o 5°.

obrázek znázorňující vliv vertikálně oddělených letových linií a dopředu namířených kamer na zlepšení vlastní kalibrace.

Z James a Robson (2014), CC BY 4.0

Using Image Masks

Starting from ODM 2.0 people can supply image masks to inform the software to skip reconstruction over certain areas. This is useful for cases where the sky was accidentally included in the input photos from oblique shots, or simply to limit the reconstruction of a single subject.

To add a mask, simply create a new black and white image of the same dimension as the target image you want to mask (you can use a program such as GIMP to do this). Color in black the areas to exclude from the reconstruction.

Target image
Image mask
3D result (building is masked)

Name your file:

<filename>_mask.JPG

For example, DJI_0018.JPG can have a mask by creating a DJI_0018_mask.JPG file and include that in the list of images. You can use .JPG, .PNG, .BMP and .TIF formats for image masks.

Using Singularity

Singularity is another container platform able to run Docker images. Singularity can be run both on local machins and in instances where the user does not have root access. Instances where a user may not have root privlidges include HPC clusters and cloud cluster resources. A container is a single file without anything else to install.

Build Singularity image from Docker image

Singularity can use Docker image to build SIF image.

For latest ODM Docker image (Recommended) :

singularity build --disable-cache -f odm_latest.sif docker://opendronemap/odm:latest

For latest ODM GPU Docker image :

singularity build --disable-cache -f odm_gpu.sif docker://opendronemap/odm:gpu

Using Singularity SIF image

Once you have used one of the above commands to download and create the odm_latest.sif image, it can be ran using singularity. Place your images in a directory named “images” (for example /my/project/images) , then simply run :

singularity run --bind /my/project:/datasets/code odm_latest.sif --project-path /datasets

Like with docker, additional Options and Flags can be added to the command :

singularity run --bind /my/project:/datasets/code \
--writable-tmpfs odm_latest.sif \
--orthophoto-png --mesh-octree-depth 12 --dtm \
--smrf-threshold 0.4 --smrf-window 24 --dsm --pc-csv --pc-las --orthophoto-kmz \
--matcher-type flann --feature-quality ultra --max-concurrency 16 \
--use-hybrid-bundle-adjustment --build-overviews --time --min-num-features 10000 \
--project-path /datasets

ClusterODM, NodeODM, SLURM, with Singularity on HPC

You can write a SLURM script to schedule and set up available nodes with NodeODM for the ClusterODM to be wired to if you are on the HPC. Using SLURM will decrease the amount of time and processes needed to set up nodes for ClusterODM each time. This provides an easier way for user to use ODM on the HPC.

To setup HPC with SLURM, you must make sure SLURM is installed.

SLURM script will be different from cluster to cluster, depending on which nodes in the cluster that you have. However, the main idea is we want to run NodeODM on each node once, and by default, each NodeODM will be running on port 3000. Apptainer will be taking available ports starting from port 3000, so if your node’s port 3000 is open, by default NodeODM will be run on that node. After that, we want to run ClusterODM on the head node and connect the running NodeODMs to the ClusterODM. With that, we will have a functional ClusterODM running on HPC.

Here is an example of SLURM script assigning nodes 48, 50, 51 to run NodeODM. You can freely change and use it depending on your system:

#!/usr/bin/bash
#source. bashrc
#SBATCH --partition=8core
#SBATCH --nodelist-node [48,50, 51]
#SBATCH --time 20:00:00

cd SHOME
cd ODM/NodeODM/

#Launch on Node 48
srun --nodes-1 apptainer run --writable node/ &

#Launch on node 50
srun --nodes-1 apptainer run --writable node/ &

#Launch on node 51
srun --nodes=1 apptainer run --writable node/ &
wait

You can check for available nodes using sinfo:

sinfo

Run the following command to schedule using the SLURM script:

sbatch sample.slurm

You can also check for currently running jobs using squeue:

squeue -u $USER

Unfortunately, SLURM does not handle assigning jobs to the head node. Hence, if we want to run ClusterODM on the head node, we have to run it locally. After that, you can connect to the CLI and wire the NodeODMs to the ClusterODMs. Here is an example following the sample SLURM script:

telnet localhost 8080
> NODE ADD node48 3000
> NODE ADD node50 3000
> NODE ADD node51 3000
> NODE LIST

You should always check to make sure which ports are being used to run NodeODM if ClusterODM is not wired correctly.

It is also possible to pre-populate nodes using JSON. If starting ClusterODM from apptainer or docker, the relevant JSON is available at docker/data/nodes.json. Contents might look similar to the following:

[
        {"hostname":"node48","port":"3000","token":""},
        {"hostname":"node50","port":"3000","token":""},
        {"hostname":"node51","port":"3000","token":""}
]

After finish hosting ClusterODM on the head node and finish wiring it to the NodeODM, you can try tunneling to see if ClusterODM works as expected. Open another shell window in your local machine and tunnel them to the HPC using the following command:

ssh -L localhost:10000:localhost:10000 user@hostname

Replace user and hostname with your appropriate username and the hpc address. Basically, this command will tunnel the port of the hpc to your local port. After this, open a browser in your local machine and connect to http://localhost:10000. Port 10000 is where ClusterODM’s administrative web interface is hosted at. This is what it looks like:

Screenshot of ClusterODM's administrative web interface

Here you can check the NodeODMs status and even add or delete working nodes.

After that, do tunneling for port 3000 of the HPC to your local machine:

ssh -L localhost:3000:localhost:3000 user@hostname

Port 3000 is ClusterODM’s proxy. This is the place we assign tasks to ClusterODM. Once again, connect to http://localhost:3000 with your browser after tunneling. Here, you can Assign Tasks and observe the tasks‘ processes.

Screenshot of ClusterODM's jobs interface

After adding images in this browser, you can press Start Task and see ClusterODM assigning tasks to the nodes you have wired to. Go for a walk and check the progress.

Development and testing of ODM

Development and testing of code changes can be difficult. The simplest way to do so is modify the code and rebuild docker images from source, much as documented in the README for the ODM repository.

However, having to do a full docker rebuild for each change is time consuming and wasteful. What might be better is to have a dedicated, long running node that allows us to test out changes in near real time.

  1. Fork and clone repository

  2. Set up local NodeODM docker instance

  3. Modify code

  4. Connect to NodeODM instance

  5. Install and use changes

Fork and clone repository

First, let’s fork the ODM repo, and checkout a new branch locally that will function as our development branch.

git checkout -b my_clever_new_change
# Switched to a new branch 'my_clever_new_change'

Set up local NodeODM docker instance

Next, we will set up a NodeODM instance with a locally mounted volume that points to our development branch of ODM

docker run -d --restart unless-stopped -p 3000:3000 -v /path/to/cloned/ODM/repository/data:/code opendronemap/nodeodm

Modify code

For our test today, we will attempt to upgrade Ceres Solver to version 2.2.0. Most external libraries like Ceres can be found in the Superbuild directory. In this case we edit SuperBuild/cmake/External-Ceres.cmake, and set it to use version 2.2.0

../_images/vimdiff_ceres_change.png

Now that we’ve made that small, but substantive change, we need to rebuild Ceres on the docker image for testing.

Connect to NodeODM instance

Let us find out our container name, in case we forgot:

docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS         PORTS                                       NAMES
c997a4c5611b   opendronemap/nodeodm         "/usr/bin/node /var/…"   2 minutes ago   Up 2 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   affectionate_yalow

Now that we know the container name, we will connect to that instance using docker exec as follows:

docker exec -it affectionate_yalow bash

Install and use changes

Let us get the environment prepared for our testing:

root@c997a4c5611b:/var/www# cd /code
./configure.sh install
mkdir /code/SuperBuild/build
cd /code/SuperBuild/build

Next we can rebuild Ceres.

cmake ../.
make -j$(nproc) ceres
        ...
-- Up-to-date: /code/SuperBuild/install/include/ceres
-- Up-to-date: /code/SuperBuild/install/include/ceres/internal
-- Installing: /code/SuperBuild/install/include/ceres/internal/config.h
-- Installing: /code/SuperBuild/install/include/ceres/internal/export.h
-- Installing: /code/SuperBuild/install/include/ceres/internal/miniglog/glog/logging.h
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets-release.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfig.cmake
-- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfigVersion.cmake
[100%] Completed 'ceres'
[100%] Built target ceres

Success! Now we can either run ODM directly inside this container, use the NodeODM interface to process data, or connect in with WebODM for additional testing.

Naučte se upravovat a pomozte zlepšit tuto stránku!