Remote sensing research

Spatial and temporal accuracy of tree species mapping with Satellite Image Time Series

After several years of work, we are proud with my advisors to publish our paper about the tree species mapping using nine one-year Satellite Image Time Series from the Formosat-2 sensor. 🥂

📖 Read the article directly on Remote Sensing journal.

📎 Our main contributions can be synthesized as follows

  • Spatial autocorrelation in the dataset highly overestimate the quality and so the extrapolation capabilites of the algorithm
  • 📅 Optimal dates to map tree species are highly instable from one year to another
  • Monospecific broadleaf plantations (Aspen, Red Oak and Eucalyptus) have high quality prediction, whereas conifer are difficult to map.
  • ⛅ The use of the full Satellite Image Time Series can seriously decrease the quality due to clouds, cloud shadows

🗺️ Explore the map of tree species from the south of Toulouse

A web map allow you to explore the tree species map from 9 one-year Satellite Image Time Series of Formosat-2.

♻️ Reproducible research

In order to reproduce this study or to have tree species ground references suitable for remote sensing, we decided to share our reference samples publicly on Zenodo, the Open Science platform at the CERN Data.

Moreover, my own python library Museo ToolBox, allows to reproduce the whole paper and much more. For now, the code used for the paper is kept private, but it will be published at the end of my thesis.

Remote sensing research

Who uses the dzetsaka QGIS plugin ? A brief inventory

I identified about 24 works, including 8 in peer-reviewed journals, that use the dzetsaka classification plugin. When I made this plugin, it was only to reproduce my work at the Guiana Amazonian Park. I didn’t expect it would be so much used and have so many downloads (about 55k today !).

I think must thank the Brazilian community because I found the majority of the people using dzetsaka is from there (Olá !). I don’t know why there are so much users in the Brazil then in the rest of the world, maybe because some researchers or teachers teach this plugin to their students. I notice that there also have been some great tutorials about dzetsaka published in youtube (Andre Q. Almeida UFS in 2017, Geoaplicada in 2018 and Anderson Medeiros of ClickGeo in 2019).

Algorithms used and dzetsaka evolution

The number of works per year is surprising. As we can see, 2019 is a great year with 15 works published online. The other years (2016,2017 and 2018) had about 3 to 4 works per year, so that’s quite a huge increase !

Number of published works per year (peer-reviewed, seminar, or report)

What algorithm is used in dzetsaka ? The wide majority performs the classification with the Gaussian Mixture Model implemented by the great Mathieu Fauvel. It is a efficient algorithm, with amazing speed capacities. However, Random-Forest often has better results, but takes longer to perform the fit and the predict process. GMM is provided by default in dzetsaka, you don’t need to install scikit-lit python library. I think that is the main reason for this gap.

Number of times an algorithm is used according to number of works.

Detailed of this work is available in Google docs.

Detailed list of the works (not limited), ordered by year

Mapping Remote sensing

🏆 3 rewards including a first prize for my participation in Sentinel-Hub contest !

Sentinel-hub Playground is a wonderful tool to explore Sentinel images. I really appreciate its capability to deal with the temporal information, but custom scripts using temporal information are rare. Getting an image every 5 days allow to do wonderful things, such as having computed cloud free images in places where there is too much clouds for people like me who love optical remote sensing.

My participation at the Sentinel-Hub custom scripts contest have so only been with multi-temporal script. With my three different scripts, most of the clouds have been dismissed by taking only pixels where the blue is below 0.18. When the pixel was never below 0.18 (which is the case for snow or most of urban land-cover for example) some workarounds have been coded.

I am so happy because it was a pleasure to code these scripts (although I really prefer python above javascript) and besides I won the first prize for the snow category and 2 second prizes !

Monthly snow report : First prize in Snow and Glaciers

Persistent snow cover in Corsica, february 2019. (Click on the image to see in Sentinel-Hub Playground)

The idea is to map the persistent snow cover within the last 31 days of the selected date. The script uses the NDSI (Normalized Difference Snow Index) with a threshold at 0.2, a bit different from what Simon Gascoin used for the Theia snow product.

Pixels which are systematically detected as snow are shown like the beautiful visualisation by Simon Gascoin, the other are saturated in green to ease the visual separation. If the pixel is never or occasionally snowy, the script will plot the median of the dates where no snow has been detected.

Chamonix, monthly snow report from 24th april. (Click on the image to see in Sentinel-Hub Playground)

Forest cut temporal detection : 2nd prize in Agriculture and Forestry

Deforestation is the main reason of global biodiversity loss, and stopping eating animal products is certainly the best thing you can do to avoid it :).

To map the loss of forests in the past year, I used the 90 previous days of the selected image, and I compared the NDVI with the same 3 months from the previous year.

In order to avoid the maximum as possible confusion with crops, the script will keep pixels only if the mean NDVI of each of the 3 months the previous year is above 0.7.

The more the difference is high, the more the pixels will be saturated in red :

    if ((NDWI(samples[0]) < 0.5) &amp; (difference >= thresold) &amp;(avgPreviousYearNDVI > minimunNDVI) &amp; (mean(lastYearMonth0) > minimunNDVI) &amp; (mean(lastYearMonth1) > minimunNDVI) &amp;(mean(lastYearMonth2) > minimunNDVI)) {
        // the more the difference is high, the more it is red
        colorMap = [stretch((2.8 * (2 / 3) * 10 * difference * samples[0].B04 + 0.1 * samples[0].B05), stretchMin, stretchMax), stretch((2.8 * samples[0].B03 + 0.15 * samples[0].B08), stretchMin, stretchMax), stretch((2.8 * samples[0].B02), stretchMin, stretchMax)];
    // else show current image
    else {
        colorMap = [stretch((2.8 * samples[0].B04 + 0.1 * samples[0].B05), stretchMin, stretchMax), stretch((2.8 * samples[0].B03 + 0.15 * samples[0].B08), stretchMin, stretchMax), stretch((2.8 * samples[0].B02), stretchMin, stretchMax)];
Deforestation in Madagascar between october 2017 and october 2018. (Click on the image to see in Sentinel-Hub Playground)

Monthly synthesis : 2nd prize in other scripts category

The idea of this script was to develop an simple and efficient way to have a cloud-free images with images from the previous 30 days.

As Sentinel-hub cloud mask is in development, I had to find a way to avoid clouds in the composition of the image. It was quite difficult to find a efficient solution (I’ve been testing several parameters using the blue band, and by using the median value in the blue). Sadly, these methods were affected by huge artefacts, especially in the urban landscapes and a some clouds and shadows were still present.

The best and simplest solution to code I found is to select the pixel where the ratio between two bands is the highest.

A little explanation of the script :

If the value in the blue bland (B02) is at one date less than 0.12 :

  • Date is selected where the ratio between near infrared (B08) and green (B03) is the highest.

Else if the value in blue is at one date less than 0.45 :

  • Date is selected where the ratio between green (B03) and blue (B02) is the highest.

The natural colors are from Pierre Markuse’ script. The overall result is satisfying, especially if you’re not looking pixel one by one, so do not zoom too much 🙂

Pyrénées, February 2019 with Sentinel-2 month synthesis. (Click on the image to see in Sentinel-Hub Playground)

These scripts are of course improvable, so feel free to contribute !

A special thanks to Pierre Markuse, Harel Dan and Simon Gascoin for their nice codes and awesome work. I really appreciate the way you work, especially by sharing your nice stuffs all the time !

I hope you enjoyed this post and above all found these scripts useful.

qgis Remote sensing

Dzetsaka, classification plugin, is now available on Qgis 3

Thanks to the amazing work of Qgis 3 contributors, Qgis 3 is now here and it’s awesome !

I manage to have a few days free to migrate dzetsaka to python 3 and to PyQt5, so dzetsaka is now available on the plugin repository.

qgis Remote sensing

Chapter in QGIS and Applications in Agriculture and Forest book

I’m glad to share with you my first publication of a chapter with Pauline Perbet.

According to Nicolas Bagdhadi who edited with Clément Mallet and Mehrez Zribi theses new series of books  “QGIS in remote sensing”, these 4 volumes “aim to facilitate the appropriation and operational use of the Quantum Geographic Information System (QGIS) software in the field of remote sensing”.

Remote sensing

Compiling OTB SuperBuild with Monteverdi and Remote Modules (Ubuntu 16.04)

Orfeo ToolBox (OTB) is an amazing tool for remote sensing. Some modules are not included in the distribution because they are produced by external users, but some of them are really interesting.

Remote sensing

Get ROI values from raster and combine all CSV (remote sensing statistics with R)

EDIT in 2018 : More than two years later after this post, I just discover it back and realize how crazy I was to use R for Remote Sensing and for extracting ROI. I really suggest you to use Python or Orfeo Tool Box (Sample Extraction) to do this thing, and really not R !

R is a great tool for statistics, even if it may be slow in calculing raster’stats, it is really a good way for batching all of your work and presenting your data using MarkDown language. This example is one of my first autonomous script in R, and it is very exciting for further.

Report and scripts made during my last year placement at the Guiana Amazonian Park are on github.

Before showing you the different steps of the code, I need to present you the way I structured my data, because the script is going to parse them and to compile all tables in one file.

Python qgis Remote sensing

dzetsaka : how to make your first classification in Qgis ?

I just published the plugin dzetsaka : classification tool (github/qgis) on Qgis plugin server. This is a very simple plugin to make a fast but powerful classification. I used it for making numerous classifications of SPOT 5 scenes in the French Guiana Amazon forest.

A project with samples (an old map (map.tif) and ROI (train.shp)) is available on the docs branch. You can download these files directly here.