Add SAP
This commit is contained in:
parent
82ea6e9408
commit
c0718c6a66
@ -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/
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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
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
|
||||
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!
|
||||
{.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. 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