def test_kwargs(self): patch = EOPatch() shape = (3, 5, 5, 2) data1 = np.random.randint(0, 5, size=shape) data2 = np.random.randint(0, 5, size=shape) patch[(FeatureType.DATA, 'D1')] = data1 patch[(FeatureType.DATA, 'D2')] = data2 task0 = MapFeatureTask((FeatureType.DATA, 'D1'), (FeatureType.DATA_TIMELESS, 'NON_ZERO'), np.count_nonzero, axis=0) task1 = MapFeatureTask((FeatureType.DATA, 'D1'), (FeatureType.DATA_TIMELESS, 'MAX1'), np.max, axis=0) task2 = ZipFeatureTask({FeatureType.DATA: ['D1', 'D2']}, (FeatureType.DATA, 'MAX2'), np.maximum, dtype=np.float32) patch = task0(patch) patch = task1(patch) patch = task2(patch) self.assertTrue(np.array_equal(patch[(FeatureType.DATA_TIMELESS, 'NON_ZERO')], np.count_nonzero(data1, axis=0))) self.assertTrue(np.array_equal(patch[(FeatureType.DATA_TIMELESS, 'MAX1')], np.max(data1, axis=0))) self.assertTrue(np.array_equal(patch[(FeatureType.DATA, 'MAX2')], np.maximum(data1, data2)))
def test_kwargs(): patch = EOPatch() shape = (3, 5, 5, 2) data1 = np.random.randint(0, 5, size=shape) data2 = np.random.randint(0, 5, size=shape) patch[(FeatureType.DATA, "D1")] = data1 patch[(FeatureType.DATA, "D2")] = data2 task0 = MapFeatureTask((FeatureType.DATA, "D1"), (FeatureType.DATA_TIMELESS, "NON_ZERO"), np.count_nonzero, axis=0) task1 = MapFeatureTask((FeatureType.DATA, "D1"), (FeatureType.DATA_TIMELESS, "MAX1"), np.max, axis=0) task2 = ZipFeatureTask({FeatureType.DATA: ["D1", "D2"]}, (FeatureType.DATA, "MAX2"), np.maximum, dtype=np.float32) patch = task0(patch) patch = task1(patch) patch = task2(patch) assert np.array_equal(patch[(FeatureType.DATA_TIMELESS, "NON_ZERO")], np.count_nonzero(data1, axis=0)) assert np.array_equal(patch[(FeatureType.DATA_TIMELESS, "MAX1")], np.max(data1, axis=0)) assert np.array_equal(patch[(FeatureType.DATA, "MAX2")], np.maximum(data1, data2))
def test_map_features(self): patch = EOPatch.load(self.data_path) move = MapFeatureTask({FeatureType.DATA: ['CLP', 'NDVI', 'BANDS-S2-L1C']}, {FeatureType.DATA: ['CLP2', 'NDVI2', 'BANDS-S2-L1C2']}, copy.deepcopy) patch = move(patch) self.assertTrue(np.array_equal(patch.data['CLP'], patch.data['CLP2'])) self.assertTrue(np.array_equal(patch.data['NDVI'], patch.data['NDVI2'])) self.assertTrue(np.array_equal(patch.data['BANDS-S2-L1C'], patch.data['BANDS-S2-L1C2'])) self.assertTrue(id(patch.data['CLP']) != id(patch.data['CLP2'])) self.assertTrue(id(patch.data['NDVI']) != id(patch.data['NDVI2'])) self.assertTrue(id(patch.data['BANDS-S2-L1C']) != id(patch.data['BANDS-S2-L1C2'])) map_fail = MapFeatureTask({FeatureType.DATA: ['CLP', 'NDVI']}, {FeatureType.DATA: ['CLP2', 'NDVI2', ]}) self.assertRaises(NotImplementedError, map_fail, patch) f_in, f_out = {FeatureType.DATA: ['CLP', 'NDVI']}, {FeatureType.DATA: ['CLP2']} self.assertRaises(ValueError, MapFeatureTask, f_in, f_out)
def test_map_features(test_eopatch): move = MapFeatureTask( {FeatureType.DATA: ["CLP", "NDVI", "BANDS-S2-L1C"]}, {FeatureType.DATA: ["CLP2", "NDVI2", "BANDS-S2-L1C2"]}, copy.deepcopy, ) patch = move(test_eopatch) assert np.array_equal(patch.data["CLP"], patch.data["CLP2"]) assert np.array_equal(patch.data["NDVI"], patch.data["NDVI2"]) assert np.array_equal(patch.data["BANDS-S2-L1C"], patch.data["BANDS-S2-L1C2"]) assert id(patch.data["CLP"]) != id(patch.data["CLP2"]) assert id(patch.data["NDVI"]) != id(patch.data["NDVI2"]) assert id(patch.data["BANDS-S2-L1C"]) != id(patch.data["BANDS-S2-L1C2"]) map_fail = MapFeatureTask( {FeatureType.DATA: ["CLP", "NDVI"]}, {FeatureType.DATA: [ "CLP2", "NDVI2", ]}, ) with pytest.raises(NotImplementedError): map_fail(patch) f_in, f_out = { FeatureType.DATA: ["CLP", "NDVI"] }, { FeatureType.DATA: ["CLP2"] } with pytest.raises(ValueError): MapFeatureTask(f_in, f_out)
def execute(self, eopatch, **kwargs): output_features = [ (self.output_feature_type, f"{self.feature_name_prefix}{ind}") for ind in range(len(self.functions)) ] merge_task = MergeFeatureTask(output_features, self.output_feature) remove_task = RemoveFeature(output_features) for ind, (function, *f_kwargs) in enumerate(self.functions): pass_kwargs = f_kwargs[0] if f_kwargs else {} eopatch = MapFeatureTask(self.input_feature, (self.output_feature_type, f"{self.feature_name_prefix}{ind}"), function, **pass_kwargs)(eopatch) eopatch = merge_task(eopatch) return remove_task(eopatch)
class ComposeTask(EOTask): """Composes several tasks together. """ def __init__(self, tasks): self.tasks = tasks def execute(self, eopatch): for t in self.tasks: eopatch = t(eopatch) return eopatch """ Clouds tasks """ # convert cloud probas to cloud masks cloud_mask = MapFeatureTask((FeatureType.DATA, 'CLOUD_PROB'), (FeatureType.MASK, 'CLOUD'), to_mask, threshold=50) # apply erosion to cloud mask cloud_erosion = MapFeatureTask((FeatureType.MASK, 'CLOUD'), (FeatureType.MASK, 'CLOUD'), post_process_mask, operation=binary_erosion, element=disk(2)) # apply cloud dilation to cloud mask cloud_dilation = MapFeatureTask((FeatureType.MASK, 'CLOUD'), (FeatureType.MASK, 'CLOUD'), post_process_mask, operation=binary_dilation, element=disk(10))