Měřit sníh je přece jednoduché, třeba jednou řeknete si. Vždyť stačí zapíchnout do sněhu pravítko na 3 místech a podívat se z boku, kolik to tam ukazuje. 3 hodnoty zprůměrujeme a máme hotovo. Nebo tyčku s čísly zapíchneme rovnou do země a můžeme odečítat dálkově třeba dalekohledem. Nojo, ale jak to udělat tak, aby to za nás dělal sám počítač? Nebo nějaká automatická meteostanice?
Poslední aktualizace: 24 listopadu
Jak to dělají profesionálové?
Český hydrometeorologický ústav to dělá poněkud jinak. Na rámu asi 2 metry vysokém má umístěné poměrně dost drahé ultrazvukové, řekneme dělo. Je to technicky vzato membrána produkující ultrazvuk, která ho zároveň přijímá. Ze specifického útlumu a s pomocí korekcí dle teploty a vlhkosti dokáže poměrně přesně vypočítat výšku sněhu. Je to ale strašně komplexní, protože sníh sám o sobě v závislosti (nejen) na teplotě, při které padá a dále při které leží na zemi, mění svoje vlastnosti. Například ledová krusta na sněhu při ledovce odráží větší množství zvuku než jemný prašan, či velké vlhké vločky s výraznou porézností. Je to prostě věda, kterou lze bez výzkumu a velkého množství financí jen těžko replikovat.
Ultrasonic Snow Depth Sensor (USH-9) provozovaný ČHMÚ; Zdroj: CHMI.CZ
Jak jsem postupoval já?
První pokus byl samozřejmě ultrazvuk. Nejběžnější ultrazvukový senzor na trhu je HC-SR04 se schopností detekce vzdálenosti mezi 2 cm až 4 metry. Je parádní, až na to, že jeho ultrazvuková vlna je natolik slabá, že ji sníh jednoduše pohltí nebo rozptýlí. Nelze s tím detekovat nic.
Druhý pokus byl laser. Vl53L0X je perfektní čidlo pro obdobnou aplikaci, jako to ultrazvukové. S jediným rozdílem. Vzdálenost měří pomocí zpoždění odrazu světla. Světlo se stejně jako zvuk šíří vzduchem specifickou rychlostí, dá se proto spočítat jednoduše vzdálenost. Sníh je přece bílý, bude to fungovat…
Jediným nepřítelem venku je vám vzdušná vlhkost a nedejbože mlha. Paprsek je tak drobný, že lze jednoduše roztříštit nebo se umí lehce vrátit zpět klidně 2 cm od čidla, protože aerosol. Tento pokus byl tedy také fiasko.
Třetí pokus byly kapacitní senzory. Ani já jsem tomu však nevěřil právě kvůli již dříve zmíněným různorodým vlastnostem sněhu při různých atmosférických a tepelných podmínkách. Měření proto nemohlo být konzistentní. Existuje samozřejmě *jedna školní zahraniční práce*, která pojednává o měření s větším množstvím kapacitních čidel. I když to třeba funguje, rozlišení nikdy nebude uspokojivé.
Sníh zároveň nelze měřit stejně jako hladinu vody právě kvůli poréznosti a různorodé vodivosti.
Tak jak to tedy udělat?
Pokud neřešíme typ sněhu, stačí nám především výška sněhu. Množství srážek navíc měřím vyhřívaným srážkoměrem, dá se tedy spočítat spousta dalších zajímavých údajů.
Zbývá nám tedy vizuální pozorování. V dnešní době je naprosto běžné a velmi populární využití automatické detekce různými nástroji pomocí kamer. Rozhodl jsem se proto pro jednoduchou strojovou detekci bílé vrstvy sněhu přes černé sněhoměrné tyče. Má to ale několik specifických problémů…
1. problém: detekce v noci
Poměrně jednoduché řešení je využití kamery s infračerveným přísvitem. Sníh je v noci tak proti černým tyčím velmi dobře kontrastní a přes den by neměl být problém.
2. problém: možný pohyb kamery a deformace obrazu
Tento problém je poměrně specifický. Konkrétní kamera je poměrně širokoúhlá, má pouze HD rozlišení a sem tam se může stát, že se trošku pohne vůči tyčím, nebo se hnou časem tyče samotné a může dojít chybné detekci. Určité zkreslení horní části obrazu navíc vzniká při přepínání IR filtru mezi dnem a nocí. Je to jen o kousek, ale úplně to stačí pro možnou chybu měření.
Jednoduchou detekcí specifických aruco* značek v obraze a jejich pozic, lze vypočítat tuto odchylku a vždy se trefit na správné měřené místo tak, aby byla přesnost pokud možno co nejvyšší. Značky ale nelze umístit z důvodu zasněžení na spodek tyčí. Budou tedy pouze na vršku každé z tyčí. Sněhoměrné tyče budou muset být proto k zemi připevněny nehybně a pevně, aby nedošlo k nechtěnému pohybu a dolní bod bude muset být také softwarově fixní.
3. problém: výpočetní výkon
Protože vše poběží na starém Raspberry Pi 2, na kterém běží navíc všechno ostatní, nechceme zbytečně bez sněhové nadílky zatěžovat počítač. Mohla by tomu pomoci detekce 3 černých ploch umístěných na zemi mezi tyčemi, které dokud se nezasněží (tedy nebudou všechna 3 místa bílá), celý proces se jednoduše přeskočí a změřeno bude 0 cm.
Další možností může být strojové učení, které sice nemusí nutně zefektivnit celý proces detekce, ale může zvýšit přesnost a náchylnost systému v případě vyššího šumu a různých jevů jako je ledovka, silný déšť, sněžení a nebo třeba v protisvětle. To momentálně neřeším a budu řešit třeba později.
Další jednoduchou kontrolou velikosti měřeného obrázku můžeme eliminovat problematický snímek (nekompletní nebo příliš tmavý) a při teplotách nad 5 stupňů jednoduše nemá smysl měření provádět. Tím se omezí zbytečná analýza.
4. problém: rozlišení detekce
Kamera má, jak jsem již výše zmínil, pouze HD rozlišení. Na tyče pohlíží přibližně z metrové vzdálenosti a jejich výška je 50 cm. Nepředpokládám, že by v nejbližší době v měřené lokalitě mohlo nasněžit více sněhu.
Podle posledních měření je rozlišení tedy něco přes 13 pixelů na 1 cm. Kvůli přeexponovaným hranám lze tedy bezpečně počítat s rozlišením 1 cm. Uvidíme časem, zda to bude udržitelné třeba po 0,5 cm.
5. problém: neočekávané chyby měření
Představte si, že měření probíhá během sněžení. V infračerveném přísvitu je vysoce pravděpodobné, že bude docházet k odchytu vloček před sněhoměrnými tyčemi. Algoritmus je může detekovat jako ležící sníh poměrně vysoko nad reálnou „hladinou“. Pomocí nastavení prahu se tak dá problém jednoduše vyřešit. Stačí nastavit správnou hodnotu a vločky výše již nebudou započítávány.
6. problém: validace
Protože se může stát, že před jednu z tyčí spadne list, který v infračerveném světle bude bílý, bude se měřit na 4 tyčích nezávisle. S pomocí normalizace lze podobné výkyvy oproti normálu ignorovat.
Praxe
Pro správné měření bylo nutné zafixovat spodní desku dostatečně tak, aby nedocházelo k pohybu dolních pozic tyčí. Bylo nutné zarazit do země 4 kolíky, na které je našroubována měřící deska. Dále je nutné zajistit, aby nedocházelo k nechtěnému pohybu kamery. Je nyní lépe krytá také proti sněhu, který kdyby se pod kamerou nahromadil, může nepříjemně odrážet IR světlo a tvořit tak světelný smog před optikou kamery.
Původní myšlenku, mít jeden aruco kód pro celé měření, jsem rychle opustil kvůli různým deformacím obrazu a možnému pohybu tyčí. Z každé dolní hrany kódu se spočítá délka tyče v pixelech na centimetr (cca 11-12 px/cm), z něhož se pak tvoří … žebřík 50 políček podél tyče samotné.
Nojo, ale aby to nebylo tak jednoduché, musel jsem na 1. levou a úplně pravou tyč aplikovat kvadratickou funkci v ose x (tedy doprava-doleva) kvůli částečnému zkreslení širokoúhlým objektivem (rybí oko). Vizualizovaná detekce proto nyní vypadá přibližně takhle:
Denní detekce
Noční detekce
Na obrázcích jsou dole vidět 3 tyrkysové čtverečky reagující na vrstvu sněhu. Dále růžové tečky na dolních a spodních hranách tyčí, samozřejmě aruco značky rámované zeleně a žluté obdélníky 5×4 px odpovídající horní polovině každého centimetru na tyči. Zaokrouhluje se tedy každý centimetr cca od 0,6 mm teprve nahoru. Vzhledem k možnému přeexponování hrany sněhu nebo možnému nafoukávání na tyč je to spíše žádoucí.
Zpětná validace měření bude pochopitelně časem důležitá pro přesnost výsledků.
A k čemu to všechno?
Projekt je součástí časosběrné kamery a meteostanice na mém webu. V současné chvíli měření již probíhá v experimentálním režimu. Protože bohužel nejvíce za listopad sněžilo asi v pátek a sobotu 22. a 23., opravdových výsledků se dočkám až později. Softwarově ale vše funguje jak má.