minigrida/minigrida/descriptors/fps.py
2020-05-31 15:55:57 +02:00

78 lines
2.2 KiB
Python

#!/usr/bin/env python
# file fps.py
# author Florent Guiotte <florent.guiotte@irisa.fr>
# version 0.0
# date 31 mai 2020
"""Abstract
doc.
"""
import numpy as np
import sap
from joblib import Memory
memory = Memory(location='cache/', verbose=0)
@memory.cache
def _feature_profiles(**kwargs):
return sap.feature_profiles(**kwargs)
def _origin_profile(image, name):
return sap.Profiles([image[None,:]], [{
'attribute': 'Origin',
'filtering rule': None,
'name': 'copy',
'out feature': 'altitude',
'profiles': [{'operation': 'copy feature altitude'}],
'tree': {'adjacency': None, 'image_hash': None, 'image_name': name}}])
def run(gt, rasters, coords, remove, attributes, adjacency=4,
feature='same', filtering='direct'):
X = []
y = []
groups = []
Xn = None
for i, (gti, rastersi, coordsi) in enumerate(zip(gt, rasters, coords)):
# Compute EAP
eap = []
for name, raster in rastersi.items():
eap += [_origin_profile(raster, name)]
eap += [_feature_profiles(image=raster,
attribute=attributes,
adjacency=adjacency,
image_name=name,
out_feature=feature,
filtering_rule=filtering)]
eap = sap.concatenate(eap)
Xn = [' '.join((a['tree']['image_name'],
a['attribute'],
'feature',
a['out feature'],
*[str(v) for v in p.values()]))
for a in eap.description for p in a['profiles']] if not Xn else Xn
# Create vectors
X_raw = np.moveaxis(np.array(list(eap.vectorize())), 0, -1)
y_raw = gti
# Remove unwanted label X, y
lbl = np.ones_like(y_raw, dtype=np.bool)
for l in remove if remove else []:
lbl &= y_raw != l
X += [X_raw[lbl]]
y += [y_raw[lbl]]
groups += [np.repeat(coordsi, lbl.sum())]
X = np.concatenate(X)
y = np.concatenate(y)
groups = np.concatenate(groups)
return X, y, groups, Xn