Add SAP
This commit is contained in:
parent
82ea6e9408
commit
c0718c6a66
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
layout: about
|
layout: about
|
||||||
title: about
|
title: bio
|
||||||
permalink: /
|
permalink: /
|
||||||
subtitle: Researcher in computer vision, machine learning and remote sensing, Ph.D.
|
subtitle: Researcher in computer vision, machine learning and remote sensing, Ph.D.
|
||||||
profile:
|
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
|
as a postdoc on the [SIXP][sixp] project. I have worked on plant species
|
||||||
and very high resolution multispectral imagery with **semantic
|
and very high resolution multispectral imagery with **semantic
|
||||||
segmentation** on a very a fine scale! Earlier, I did my [Ph.D.
|
segmentation** on a very a fine scale! Earlier, I did my [Ph.D.
|
||||||
thesis][thesis] in [LETG Rennes][letg] and [IRISA's OBELIX
|
thesis][thesis] in [LETG Rennes][letg], [IRISA's OBELIX team][obelix]
|
||||||
team][obelix]. The topic was to propose new and efficient ways of
|
and [Tellus Environment][tellus]. The topic was to propose new and
|
||||||
processing **3D point clouds** from **LiDAR data**, using
|
efficient ways of processing **3D point clouds** from **LiDAR data**,
|
||||||
**morphological hierarchies** and deep learning.
|
using **morphological hierarchies** and deep learning.
|
||||||
|
|
||||||
I am currently looking for new adventures!
|
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
|
[thesis]: assets/pdf/Guiotte - 2021 - 2D3D discretization of Lidar point clouds Proces.pdf
|
||||||
[obelix]: http://www-obelix.irisa.fr/
|
[obelix]: http://www-obelix.irisa.fr/
|
||||||
|
[tellus]: https://tellus-environment.com/
|
||||||
[letg]: https://letg.cnrs.fr/
|
[letg]: https://letg.cnrs.fr/
|
||||||
[aj]: https://lavionjaune.com/
|
[aj]: https://lavionjaune.com/
|
||||||
[sixp]: https://sixp.inria.fr/
|
[sixp]: https://sixp.inria.fr/
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
layout: page
|
layout: page
|
||||||
title: projects
|
title: projects
|
||||||
permalink: /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: true
|
||||||
nav_order: 2
|
nav_order: 2
|
||||||
display_categories: [thesis, other]
|
display_categories: [thesis, other]
|
||||||
|
@ -3,8 +3,8 @@ layout: page
|
|||||||
title: project 1
|
title: project 1
|
||||||
description: a project with a background image
|
description: a project with a background image
|
||||||
img: assets/img/12.jpg
|
img: assets/img/12.jpg
|
||||||
importance: 1
|
importance: 9
|
||||||
category: thesis
|
category: demo
|
||||||
---
|
---
|
||||||
|
|
||||||
Every project has a beautiful feature showcase page.
|
Every project has a beautiful feature showcase page.
|
||||||
|
145
_projects/sap.md
Normal file
145
_projects/sap.md
Normal 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)
|
||||||
|
```
|
||||||
|
|
||||||
|
{.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()
|
||||||
|
```
|
||||||
|
|
||||||
|
{.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()
|
||||||
|
```
|
||||||
|
|
||||||
|
{.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. 43‑71, sept. 2021, doi:
|
||||||
|
[10.1109/MGRS.2021.3051859](https://doi.org/10.1109/MGRS.2021.3051859).
|
@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: page
|
layout: page
|
||||||
title: Spectra
|
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
|
img: /assets/img/spectra.png
|
||||||
importance: 1
|
importance: 1
|
||||||
category: thesis
|
category: thesis
|
||||||
@ -21,6 +21,8 @@ represents their compactness (a shape-based
|
|||||||
ratio).](/assets/img/spectra.png){.figure-img .img-fluid .rounded
|
ratio).](/assets/img/spectra.png){.figure-img .img-fluid .rounded
|
||||||
.z-depth-1}
|
.z-depth-1}
|
||||||
|
|
||||||
|
## Interactive filtering
|
||||||
|
|
||||||
We can use this spectrum to select the attribute thresholds. The current
|
We can use this spectrum to select the attribute thresholds. The current
|
||||||
application allows us to do this in real time!
|
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
|
(e.g. circular shapes) while the bottom of the spectrum represents
|
||||||
linear shapes.
|
linear shapes.
|
||||||
|
|
||||||
|
## Example driven
|
||||||
|
|
||||||
Selecting thresholds in the attribute space can still be difficult. We
|
Selecting thresholds in the attribute space can still be difficult. We
|
||||||
propose to drive the threshold selection by the example. The application
|
propose to drive the threshold selection by the example. The application
|
||||||
allows to select in the LiDAR data structures and to highlight their
|
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 }
|
.img-fluid .rounded .z-depth-1 }
|
||||||
|
|
||||||
|
|
||||||
|
## Wait, there's more!
|
||||||
|
|
||||||
In the previous example we showed the use of two attributes, area and
|
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
|
compactness. However, there are many more that we can use or even
|
||||||
define, depending on the purpose of the application.
|
define, depending on the purpose of the application.
|
||||||
@ -64,6 +70,8 @@ space exploration!
|
|||||||
{.figure-img .img-fluid
|
{.figure-img .img-fluid
|
||||||
.rounded .z-depth-1 loop=true autoplay=true}
|
.rounded .z-depth-1 loop=true autoplay=true}
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
The underlying data structure for processing LiDAR data are hierarchical
|
The underlying data structure for processing LiDAR data are hierarchical
|
||||||
morphologies, in particular component trees, which allow an efficient
|
morphologies, in particular component trees, which allow an efficient
|
||||||
representation of nested connected components for the computation of
|
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
|
package](/projects/sap/) to build the trees, compute the spectra and
|
||||||
filter the data.
|
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. 1203‑1209, 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
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
88
assets/img/sap.svg
Normal 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
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
BIN
assets/img/sap_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Loading…
Reference in New Issue
Block a user