Umělá inteligence počítá stromy v poušti

29. 10. 2020

Sdílet

Autor: Depositphotos
Dánští vědci se jako první pustili do počítání stromů ve vyprahlých regionech. Jejich množství je překvapilo.

V západoafrické části Saharské poušti je mnohem více stromů, než by se mohlo zdát. Ukazuje to studie, která zkombinovala umělou inteligenci s detailními satelitními snímky. Vědci napočítali víc než 1,8 miliardy stromů či křovin na rozloze 1,3 čtverečních kilometrů nejzápadnější části Sahary.

„To množství nás překvapilo, protože dosud si většina lidí myslela, že tam prakticky žádné stromy nerostou,“ říká profesor Martin Brandt z Kodaňské Univerzity, pod jehož vedením studie vznikla. „Jen v samotné poušti jsme napočítali stovky milionů stromů. To by ale nebylo možné bez této technologie. Podle mě jde o začátek nové vědecké éry.“

Vědci při své práci využili detailní satelitní snímky poskytnuté národním úřadem pro letectví a vesmír NASA a také tzv. hluboké učení, tedy jednu z pokročilejších metod učení umělé inteligence. Na běžných satelitních snímcích nejsou jednotlivé stromy rozpoznatelné, navíc, zájem o počítání stromů v nezalesněných oblastech nebyl dosud valný, vznikl tak všeobecný dojem, že v regionu prakticky žádné stromy nerostou. Studie je vůbec prvním případem, kdy se někdo pustil do počítání stromů v rozlehlé krajině, pro kterou je charakteristické sucho.

Dle Brandta je však takový výzkum důležitý z několika důvodů. Objevené stromy například představují dosud neznámý faktor ve výpočtech týkajících se uhlíkové stopy.

„Se stromy nacházejícími se mimo zalesněné oblasti klimatické modely zpravidla nepočítají a o jejich uhlíkové zásobě víme jen velmi málo.“ Nová studie navíc přispívá lepšímu pochopení významu stromů pro biodiverzitu, ekosystémy a pro lidi, kteří v daných oblastech žijí. Hlubší znalosti o stromech jsou také zásadní pro rozvoj agrolesnických programů, které mají ve vyprahlých regionech důležitou environmentální a socioekonomickou roli.

„Rádi bychom proto využili satelity k tomu, abychom určili také jednotlivé druhy stromů,“ říká Rasmus Fensholt, další z autorů studie. „Stromy a jejich ovoce jsou konzumovány jak hospodářskými zvířaty, tak lidmi, a pokud jsou součástí polí, mají pozitivní vliv na sklizeň, jelikož přispívají rovnováze vody a živin v půdě.“

bitcoin_smenarna

Vědci svůj deeplearningový model naplnili tisícovkami fotek nejrůznějších stromů, aby jej naučili, jak strom vypadá. Model následně na základě rozpoznávání tvarů identifikoval a zmapoval stromy na tisícovkách satelitních snímků. Práce, která by tisícům lidí trvala několik let, stroji zabrala jen pár hodin.

„Tato technologie má obrovský potenciál, pokud jde o dokumentování globálních změn, a jako taková může přispět k dosahování našich klimatických cílů,“ uvedl další z autorů, Christian Igel, s tím, že ji hodlají dále zdokonalovat. V budoucnu chtějí s kolegy stejným způsobem zmapovat i další oblasti Afriky a v dlouhodobém horizontu vytvořit globální databázi všech stromů rostoucích mimo zalesněné oblasti.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »