This commit is contained in:
Florent Guiotte 2023-02-09 17:33:16 +02:00
parent 82ea6e9408
commit c0718c6a66
9 changed files with 263 additions and 11 deletions

View File

@ -1,6 +1,6 @@
---
layout: about
title: about
title: bio
permalink: /
subtitle: Researcher in computer vision, machine learning and remote sensing, Ph.D.
profile:
@ -28,10 +28,10 @@ learning** on a very large scale! Before that, I had the chance to work
as a postdoc on the [SIXP][sixp] project. I have worked on plant species
and very high resolution multispectral imagery with **semantic
segmentation** on a very a fine scale! Earlier, I did my [Ph.D.
thesis][thesis] in [LETG Rennes][letg] and [IRISA's OBELIX
team][obelix]. The topic was to propose new and efficient ways of
processing **3D point clouds** from **LiDAR data**, using
**morphological hierarchies** and deep learning.
thesis][thesis] in [LETG Rennes][letg], [IRISA's OBELIX team][obelix]
and [Tellus Environment][tellus]. The topic was to propose new and
efficient ways of processing **3D point clouds** from **LiDAR data**,
using **morphological hierarchies** and deep learning.
I am currently looking for new adventures!
@ -40,7 +40,7 @@ I am currently looking for new adventures!
[thesis]: assets/pdf/Guiotte - 2021 - 2D3D discretization of Lidar point clouds Proces.pdf
[obelix]: http://www-obelix.irisa.fr/
[tellus]: https://tellus-environment.com/
[letg]: https://letg.cnrs.fr/
[aj]: https://lavionjaune.com/
[sixp]: https://sixp.inria.fr/

View File

@ -2,7 +2,7 @@
layout: page
title: projects
permalink: /projects/
description: A growing collection of your cool projects.
description: Just a small list of the projects lying around in my folders. It may be updated at any time, with new or not so new content!
nav: true
nav_order: 2
display_categories: [thesis, other]

View File

@ -3,8 +3,8 @@ layout: page
title: project 1
description: a project with a background image
img: assets/img/12.jpg
importance: 1
category: thesis
importance: 9
category: demo
---
Every project has a beautiful feature showcase page.

145
_projects/sap.md Normal file
View File

@ -0,0 +1,145 @@
---
layout: page
title: SAP
description: Python package to compute morphological hierarchies of images and more.
img: /assets/img/sap.svg
importance: 1
category: thesis
---
SAP (for Simple Attribute Profiles) is a Python package to easily
compute attribute profiles of images. I have developed this package as
part of my PhD thesis.
The source code is available on [github][git]. I used this project to
experiments CI/CD with gitlab pipelines (the project was initially
hosted on the INRIA's gitlab) and lately with Github [actions].
[Testing][test], [code coverage][cover], release publishing on
[PyPI][pypi] and [online documentation][doc] are all automatically
updated.
[git]: https://github.com/fguiotte/sap
[doc]: https://python-sap.rtfd.io
[actions]: https://github.com/fguiotte/sap/actions
[pypi]: https://pypi.org/project/sap/
[test]: https://github.com/fguiotte/sap/tree/master/test
[cover]: https://app.codecov.io/gh/fguiotte/sap/tree/master/sap
## Installation
To start tinkering images with the package, you just have to:
```bash
pip install sap
```
## Quick start
A small Python snippet to get you started quickly:
```python
import sap
import numpy as np
import matplotlib.pyplot as plt
image = np.random.random((512, 512))
t = sap.MaxTree(image)
area = t.get_attribute('area')
filtered_image = t.reconstruct(area < 100)
plt.imshow(filtered_image)
plt.show()
```
## Slower launch
This package is a combination of three submodules.
### Trees
The first submodule `sap.trees` is to build trees from images, to compute
attributes, and to filter them.
For example, we can build the max-tree of an image, compute the area
attributes of the nodes and reconstruct a filtered image removing nodes
with area less than 100 pixels:
```python
t = sap.MaxTree(image)
area = t.get_attribute('area')
filtered_image = t.reconstruct(area < 100)
```
### Profiles
The second submodule `sap.profiles` is provided to compute *Attribute
Profiles* (and other profiles) of images. The submodule contains the
utils to easily concatenate the profiles (*Extended Attribute Profiles*)
and to display them.
```python
import imageio.v3 as iio # Reads and writes images
import sap
image = iio.imread('image.png')
ap = sap.attribute_profiles(image, {'area': [100, 1000]})
sap.show_profiles(ap)
```
![Attribute profiles stacks connected component filtering of images (opening and closing) at several scales.](/assets/img/ap_area.png){.img-fluid .rounded .z-depth-1}
### Spectra
The third submodule is `sap.spectra`. We use it to compute Pattern
Spectra of trees and to display them. Pattern Spectra can be useful to
set thresholds of attribute filters and Attribute Profiles.
```python
import rasterio as rio # Reads and writes geospatial raster data
from matplotlib import pyplot as plt # Display plots and images
import sap
dsm = rio.open('dsm.tif').read()[0]
max_tree = sap.MaxTree(dsm)
plt.imshow(max_tree.reconstruct())
plt.show()
```
![](/assets/img/sap_1.png){.img-fluid .z-depth-1 .rounded}
```python
ps = sap.spectrum2d(max_tree, 'area', 'compactness', x_log=True)
sap.show_spectrum(*ps)
plt.xlabel('area')
plt.ylabel('compactness')
plt.colorbar()
plt.title('SAP 2D spectrum')
plt.show()
```
![](/assets/img/sap_2.png){.img-fluid .z-depth-1 .rounded}
To go further, please have a look to the [online documentation][doc].
This package has been used, amongst other projects, to perform an
experimental comparison of the attribute profiles and their variations
in a published paper [^1].
[^1]: Deise Santana Maia, Minh-Tan Pham, Erchan Aptoula, Florent
Guiotte, et Sébastien Lefèvre, « *Classification of Remote Sensing
Data With Morphological Attribute Profiles: A decade of advances* »,
GRSM, vol. 9, nᵒ 3, p. 4371, sept. 2021, doi:
[10.1109/MGRS.2021.3051859](https://doi.org/10.1109/MGRS.2021.3051859).

View File

@ -1,7 +1,7 @@
---
layout: page
title: Spectra
description: Application using the morphological hierarchies and LiDAR data
description: Application using the morphological hierarchies and LiDAR data.
img: /assets/img/spectra.png
importance: 1
category: thesis
@ -21,6 +21,8 @@ represents their compactness (a shape-based
ratio).](/assets/img/spectra.png){.figure-img .img-fluid .rounded
.z-depth-1}
## Interactive filtering
We can use this spectrum to select the attribute thresholds. The current
application allows us to do this in real time!
@ -40,6 +42,8 @@ the square of its perimeter. It ranges from 0 for non-compact shapes to
(e.g. circular shapes) while the bottom of the spectrum represents
linear shapes.
## Example driven
Selecting thresholds in the attribute space can still be difficult. We
propose to drive the threshold selection by the example. The application
allows to select in the LiDAR data structures and to highlight their
@ -49,6 +53,8 @@ shapes and sizes in the spectrum.
.img-fluid .rounded .z-depth-1 }
## Wait, there's more!
In the previous example we showed the use of two attributes, area and
compactness. However, there are many more that we can use or even
define, depending on the purpose of the application.
@ -64,6 +70,8 @@ space exploration!
![3D spectrum (area, compactness, height).](/assets/vid/3D_axis2_trans_2x.mp4){.figure-img .img-fluid
.rounded .z-depth-1 loop=true autoplay=true}
## Notes
The underlying data structure for processing LiDAR data are hierarchical
morphologies, in particular component trees, which allow an efficient
representation of nested connected components for the computation of
@ -73,4 +81,15 @@ The application was developed in Python using the [SAP
package](/projects/sap/) to build the trees, compute the spectra and
filter the data.
This application was developed as part of my Ph.D. thesis.
This application was developed as part of my PhD thesis. Experiments
and quantitative results have been published on use cases in a natural
environment, related to illegal gold panning and dikes detection [^1].
[^1]: F. Guiotte, G. Etaix, S. Lefèvre, et T. Corpetti, « *Interactive
Digital Terrain Model Analysis in Attribute Space* », International
Archives of the Photogrammetry, Remote Sensing and Spatial Information
Sciences, vol. XLIII-B2-2020, p. 12031209, 2020, doi:
[10.5194/isprs-archives-XLIII-B2-2020-1203-2020][doi].
[doi]: https://doi.org/10.5194/isprs-archives-XLIII-B2-2020-1203-2020

BIN
assets/img/ap_area.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

88
assets/img/sap.svg Normal file
View File

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16.139572mm"
height="13.493748mm"
viewBox="0 0 16.139571 13.493747"
version="1.1"
id="svg913"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="sap.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs907" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="-105.35714"
inkscape:cy="5.7142857"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-bottom="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
inkscape:window-width="1849"
inkscape:window-height="758"
inkscape:window-x="341"
inkscape:window-y="309"
inkscape:window-maximized="0"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" />
<metadata
id="metadata910">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-115.82385,-170.77407)">
<g
id="g1498"
transform="translate(2.7096631e-7,-0.79452833)">
<path
inkscape:connector-curvature="0"
id="path884"
d="m 115.95614,179.6384 7.9375,-5.29167 7.9375,5.29167 -7.9375,5.29166 -7.9375,-5.29166"
style="fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
<path
style="fill:#ffffff;stroke:#000000;stroke-width:0.264583px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
d="m 115.95614,178.31548 7.9375,-5.29167 7.9375,5.29167 -7.9375,5.29166 -7.9375,-5.29166"
id="path886"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path888"
d="m 115.95614,176.99256 7.9375,-5.29167 7.9375,5.29167 -7.9375,5.29166 -7.9375,-5.29166"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.264583px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path892"
d="m 121.2478,176.99255 2.64584,1.85209 2.64583,-1.85209 -2.64583,-1.85207 -2.64584,1.85207"
style="fill:#000000;stroke:#000000;stroke-width:0.264583px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
assets/img/sap_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
assets/img/sap_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB