Výukové materiály
Níže najdete pokyny pro některé běžné případy použití.
Vytváření vysoce kvalitních ortofotomap
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 na300000-600000
a--mesh-octree-depth
by měla být zvýšena na10-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.
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.
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.
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.
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ňů.
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.
Pozadí
Pozadí prohlížeče Potree 3D lze upravit. Dostupné možnosti jsou Skybox / Gradient / Černá / Bílá / Žádná.
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.
Ú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.
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.
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
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í“.
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.
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ů.
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.
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“.
pak klikněte na „Vytvořit nové měření“.
Začněte umísťovat body, abyste definovali základní rovinu zásoby.
Kliknutím na „Dokončit měření“ proces dokončíte.
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.
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říkazemssh 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énoodm
; 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
asudo 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/
.
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;
acd ../
,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žijtea 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í.
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°.
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í.
Vertikálně oddělené letové linie také zlepšují přesnost, ale méně než kamera, která je natočena dopředu o 5°.
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.
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:
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.
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.
Fork and clone repository
Set up local NodeODM docker instance
Modify code
Connect to NodeODM instance
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
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!