diff --git a/.gitattributes b/.gitattributes index e2e68308705c59d0e047f13c1116ed223f9b7fec..bf71c76dcb8c5612456d5c4aafa2fb493de58753 100644 --- a/.gitattributes +++ b/.gitattributes @@ -31,3 +31,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text +*.tif filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 7f93ebf8528206935415e66e1586654106ea434a..bcdcfe342e779ded49478236a5b806b9d1afa0ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ venv __pycache__ +uploaded_samples +demo_data/results \ No newline at end of file diff --git a/app.py b/app.py index 519294d4de7f41fdf9d68c29000b5e8191815c68..d10043939d83f81d30fef64fc3bd4e505db5259f 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,41 @@ +import os import streamlit as st import zipfile +import torch +from utils import * +import matplotlib.pyplot as plt + +# Load Model +# @title Load pretrained weights + +best_model_daily_file_name = "best_model_daily.pth" +best_model_annual_file_name = "best_model_annual.pth" + +first_input_batch = torch.zeros(71, 9, 5, 48, 48) +# first_input_batch = first_input_batch.view(-1, *first_input_batch.shape[2:]) +daily_model = FPN(opt, first_input_batch, opt.win_size) +annual_model = SimpleNN(opt) + +if torch.cuda.is_available(): + daily_model = torch.nn.DataParallel(daily_model).cuda() + annual_model = torch.nn.DataParallel(annual_model).cuda() + daily_model = torch.nn.DataParallel(daily_model).cuda() + annual_model = torch.nn.DataParallel(annual_model).cuda() +else: + daily_model = torch.nn.DataParallel(daily_model).cpu() + annual_model = torch.nn.DataParallel(annual_model).cpu() + daily_model = torch.nn.DataParallel(daily_model).cpu() + annual_model = torch.nn.DataParallel(annual_model).cpu() + +print('trying to resume previous saved models...') +state = resume( + os.path.join(opt.resume_path, best_model_daily_file_name), + model=daily_model, optimizer=None) +state = resume( + os.path.join(opt.resume_path, best_model_annual_file_name), + model=annual_model, optimizer=None) +daily_model = daily_model.eval() +annual_model = annual_model.eval() st.title('Sentinel 2 Crop Mapping') st.markdown('Using a and giving a zip that contains 32 tiff named correctly you can reach prediction of crop mapping og the area.') @@ -9,6 +45,117 @@ file_uploaded = st.file_uploader( type=["zip"], accept_multiple_files=False, ) +sample_path = None if file_uploaded is not None: with zipfile.ZipFile(file_uploaded, "r") as z: - z.extractall(".") + z.extractall("uploaded_samples") + sample_path = "uploaded_samples/" + file_uploaded.name[:-4] +st.markdown('or use a demo sample') +if st.button('sample 1'): + sample_path = 'demo_data/lombardia' + +if sample_path is not None: + st.markdown(f'elaborating {sample_path}...') + + validationdataset = SentinelDailyAnnualDatasetNoLabel( + sample_path, + opt.years, + opt.classes_path, + opt.sample_duration, + opt.win_size, + tileids=None) + validationdataloader = torch.utils.data.DataLoader( + validationdataset, batch_size=opt.batch_size, shuffle=False, num_workers=opt.workers) + + st.markdown(f'predict in progress...') + + out_dir = os.path.join(opt.result_path, "seg_maps") + if not os.path.exists(out_dir): + os.makedirs(out_dir) + for i, (x_dailies, dates, dirs_path) in enumerate(validationdataloader): + with torch.no_grad(): + # x_dailies, dates, dirs_path = next(iter(validationdataloader)) + # reshape merging the first two dimensions + x_dailies = x_dailies.view(-1, *x_dailies.shape[2:]) + if torch.cuda.is_available(): + x_dailies = x_dailies.cuda() + + feat_daily, outs_daily = daily_model.forward(x_dailies) + # return to original size of batch and year + outs_daily = outs_daily.view( + opt.batch_size, opt.sample_duration, *outs_daily.shape[1:]) + feat_daily = feat_daily.view( + opt.batch_size, opt.sample_duration, *feat_daily.shape[1:]) + + _, out_annual = annual_model.forward(feat_daily) + pred_annual = torch.argmax(out_annual, dim=1).squeeze(1) + pred_annual = pred_annual.cpu().numpy() + # Remapping the labels + pred_annual_nn = ids_to_labels( + validationdataloader, pred_annual).astype(numpy.uint8) + + for batch in range(feat_daily.shape[0]): + # _, profile = read(os.path.join(dirs_path[batch], '20191230_MSAVI.tif')) # todo get the last image + _, tmp_path = get_patch_id(validationdataset.samples, 0) + dates = get_all_dates( + tmp_path, validationdataset.max_seq_length) + last_tif_path = os.path.join(tmp_path, dates[-1] + ".tif") + _, profile = read(last_tif_path) + profile["name"] = dirs_path[batch] + + pth = dirs_path[batch].split(os.path.sep)[-3:] + full_pth_patch = os.path.join( + out_dir, pth[1] + '-' + pth[0], pth[2]) + + if not os.path.exists(full_pth_patch): + os.makedirs(full_pth_patch) + full_pth_pred = os.path.join( + full_pth_patch, 'patch-pred-nn.tif') + profile.update({ + 'nodata': None, + 'dtype': 'uint8', + 'count': 1}) + with rasterio.open(full_pth_pred, 'w', **profile) as dst: + dst.write_band(1, pred_annual_nn[batch]) + + # patch_predictions = None + for ch in range(len(dates)): + soft_seg = outs_daily[batch, ch, :, :, :] + # transform probs into a hard segmentation + pred_daily = torch.argmax(soft_seg, dim=0) + pred_daily = pred_daily.cpu() + daily_pred = ids_to_labels( + validationdataloader, pred_daily).astype(numpy.uint8) + # if patch_predictions is None: + # patch_predictions = numpy.expand_dims(daily_pred, axis=0) + # else: + # patch_predictions = numpy.concatenate((patch_predictions, numpy.expand_dims(daily_pred, axis=0)), + # axis=0) + + # save GT image in opt.root_path + full_pth_date = os.path.join( + full_pth_patch, dates[ch][batch] + f'-ch{ch}-b{batch}-daily-pred.tif') + profile.update({ + 'nodata': None, + 'dtype': 'uint8', + 'count': 1}) + with rasterio.open(full_pth_date, 'w', **profile) as dst: + dst.write_band(1, daily_pred) + + st.markdown('End prediction') + + folder = "demo_data/results/seg_maps/example-lombardia/2" + paths = os.listdir(folder) + + file_picker = st.selectbox("Select day predict (annual is patch-pred-nn.tif)", paths, index=paths.index('patch-pred-nn.tif')) + + file_path = os.path.join(folder, file_picker) + print(file_path) + target, profile = read(file_path) + target = np.squeeze(target) + target = [classes_color_map[p] for p in target] + + fig, ax = plt.subplots() + ax.imshow(target) + st.pyplot(fig) + diff --git a/demo_data/best_model_annual.pth b/demo_data/best_model_annual.pth new file mode 100644 index 0000000000000000000000000000000000000000..40c795d971790a439c2ef29e4f856f998dc777ad --- /dev/null +++ b/demo_data/best_model_annual.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c4d7a0be5d24a55e19f257b37b5bd034f8dceb82e4355e2c98c35995b7bce36 +size 326134860 diff --git a/demo_data/best_model_daily.pth b/demo_data/best_model_daily.pth new file mode 100644 index 0000000000000000000000000000000000000000..2b545739a8db26857d5e87bdff93cd8de9e20491 --- /dev/null +++ b/demo_data/best_model_daily.pth @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:820efc0edf6e22b12049a0dcce37880808d3e5c8773ed7b30441ab2893515253 +size 646423341 diff --git a/demo_data/classes-newmapping.txt b/demo_data/classes-newmapping.txt new file mode 100644 index 0000000000000000000000000000000000000000..8c2af42ed19a4127c1f5e41653294acea3c7523c --- /dev/null +++ b/demo_data/classes-newmapping.txt @@ -0,0 +1,8 @@ +0|Unknown|20180201|20181230 +2|Other cereals|20180324|20180512 +4|Woods and other tree crops|20180521|20180610 +7|Forage|20180402|20180504 +9|Corn|20180612|20180729 +12|Rice|20180606|20180902 +1,3,5,6,8,10,11,13,14,15,16,20|Unknow cropland|20180201|20181230 +17,18,19|No arable land|20180201|20181230 \ No newline at end of file diff --git a/demo_data/lombardia/example/2/20190104.tif b/demo_data/lombardia/example/2/20190104.tif new file mode 100755 index 0000000000000000000000000000000000000000..6ecb68aecadef28b0459e5045d94419896e14524 --- /dev/null +++ b/demo_data/lombardia/example/2/20190104.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c94b20ffd7571807aa0020a3e84d13c342ae20be46b09c3fa30c238c6f6357c +size 37340 diff --git a/demo_data/lombardia/example/2/20190104_MSAVI.tif b/demo_data/lombardia/example/2/20190104_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..16ca9208c392bfeb11eae6fe6e68ba919e578103 --- /dev/null +++ b/demo_data/lombardia/example/2/20190104_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45646b9a5acf52354198ba1fc485f501db6d6bfe7022c772d62fc85feebb9326 +size 5209 diff --git a/demo_data/lombardia/example/2/20190109.tif b/demo_data/lombardia/example/2/20190109.tif new file mode 100755 index 0000000000000000000000000000000000000000..de5914bfa649598764b065f34b772f4df0ff4c6a --- /dev/null +++ b/demo_data/lombardia/example/2/20190109.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f55283e02f82998052bce2d64716996dc70659a7f39d9121858109a05b7fd06c +size 37828 diff --git a/demo_data/lombardia/example/2/20190109_MSAVI.tif b/demo_data/lombardia/example/2/20190109_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..2692b9870fbca4512732eafb009345c8d07f72bd --- /dev/null +++ b/demo_data/lombardia/example/2/20190109_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc465b965eb59d642e44346ed0a353a28750a3f5f48b59349430b56760c4a3c2 +size 5894 diff --git a/demo_data/lombardia/example/2/20190114.tif b/demo_data/lombardia/example/2/20190114.tif new file mode 100755 index 0000000000000000000000000000000000000000..eac0fb7ec02f95861b36952c11ed39e09485f4d9 --- /dev/null +++ b/demo_data/lombardia/example/2/20190114.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6de35a778963ecefe2c89716c1c8080c0fe0f28263af1bf4903426f0fe3aafc9 +size 38022 diff --git a/demo_data/lombardia/example/2/20190114_MSAVI.tif b/demo_data/lombardia/example/2/20190114_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..861e53b6c203c34abf6f9afa9b7d1d14524771d3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190114_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c593c57f88ea02e4f960b413e6c1e98e22872c9c9fa775f9fe0431d8fb8c4ce +size 5989 diff --git a/demo_data/lombardia/example/2/20190119.tif b/demo_data/lombardia/example/2/20190119.tif new file mode 100755 index 0000000000000000000000000000000000000000..1c4f37f9ca2cd50f2e4b25b343b295a856f62115 --- /dev/null +++ b/demo_data/lombardia/example/2/20190119.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71ecf7cc3bf67383d1bfa86e4ba24220453cc56c791b288e451c511b0f7ba18d +size 35530 diff --git a/demo_data/lombardia/example/2/20190119_MSAVI.tif b/demo_data/lombardia/example/2/20190119_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..bdc3f16bc8bc0a2a04b144d95f9a75230ec22361 --- /dev/null +++ b/demo_data/lombardia/example/2/20190119_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eaefb84965c9e7359e19777f3ebc598344896c87e3cf25a8548668ca97060ad9 +size 4688 diff --git a/demo_data/lombardia/example/2/20190124.tif b/demo_data/lombardia/example/2/20190124.tif new file mode 100755 index 0000000000000000000000000000000000000000..ecb543e46a7bc89ed5b8c21a746d56170f6b7161 --- /dev/null +++ b/demo_data/lombardia/example/2/20190124.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a62f00ed8379367b328c1a255c8558f6682c643fc55bbba12a3818c1408437b +size 36511 diff --git a/demo_data/lombardia/example/2/20190124_MSAVI.tif b/demo_data/lombardia/example/2/20190124_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..69659d2ae3595558be9de530c12a957b9eb6ff13 --- /dev/null +++ b/demo_data/lombardia/example/2/20190124_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27dd32479af98502b67c0d773fde36f197c60e5f3c27398397265d14766db4a3 +size 5850 diff --git a/demo_data/lombardia/example/2/20190129.tif b/demo_data/lombardia/example/2/20190129.tif new file mode 100755 index 0000000000000000000000000000000000000000..266b1696177cecf79920e29bf8a3e59049b99a55 --- /dev/null +++ b/demo_data/lombardia/example/2/20190129.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e2fde2de1b559f7a58ba02f8d4ccdf87fd883669cc4bc9d8b4f5f030ed6317f +size 37234 diff --git a/demo_data/lombardia/example/2/20190129_MSAVI.tif b/demo_data/lombardia/example/2/20190129_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..a412253c1063406d80357b5580e7f0c99a197161 --- /dev/null +++ b/demo_data/lombardia/example/2/20190129_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b2b849664835a5c5d6d289c942c5d2b7549f7cb5e1b5f13ff2f8ab3f7135446 +size 5848 diff --git a/demo_data/lombardia/example/2/20190203.tif b/demo_data/lombardia/example/2/20190203.tif new file mode 100755 index 0000000000000000000000000000000000000000..cdc6bfa8eec39bd093a087e27c47bdcc7b52d88d --- /dev/null +++ b/demo_data/lombardia/example/2/20190203.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:742c43825835b164608f855d99ef4f3b524625d0b83d174e89f2608568e00a9b +size 35612 diff --git a/demo_data/lombardia/example/2/20190203_MSAVI.tif b/demo_data/lombardia/example/2/20190203_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..89734ffead110f1f5928961013a2a6d2f92c6122 --- /dev/null +++ b/demo_data/lombardia/example/2/20190203_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33ed3cf5733bc34bb773811fe75bff00abc4a0b00fcbad6e3fb8d9b97a9ac787 +size 4192 diff --git a/demo_data/lombardia/example/2/20190208.tif b/demo_data/lombardia/example/2/20190208.tif new file mode 100755 index 0000000000000000000000000000000000000000..69db82151a878267d3677be1df911c30d286f5f5 --- /dev/null +++ b/demo_data/lombardia/example/2/20190208.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c04ecb495c9a8abf5de4d35f8debd0389c2eee1f0bf6ffc6d5ed8ce321144e80 +size 37647 diff --git a/demo_data/lombardia/example/2/20190208_MSAVI.tif b/demo_data/lombardia/example/2/20190208_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..0ae44c7e1628ee86b436757a6fca99dfe178ffea --- /dev/null +++ b/demo_data/lombardia/example/2/20190208_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cf7ed58170d536604893624eb865dc8dec8e51b2258474b9375539746d80a58 +size 5826 diff --git a/demo_data/lombardia/example/2/20190213.tif b/demo_data/lombardia/example/2/20190213.tif new file mode 100755 index 0000000000000000000000000000000000000000..345a1b30f812795786353306a2c76dccbae3d229 --- /dev/null +++ b/demo_data/lombardia/example/2/20190213.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5add48ba9867f3ee4adc140c22fa458ddac413bcace9ca8ccab0d669d02479df +size 37242 diff --git a/demo_data/lombardia/example/2/20190213_MSAVI.tif b/demo_data/lombardia/example/2/20190213_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..d9f733cdbf469cfe981f7414f8c95e44d8505695 --- /dev/null +++ b/demo_data/lombardia/example/2/20190213_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4e4320a2b9fa9720678d1b3b05ce4284ec3aa14c587a012bd1a05595a39ceb2 +size 5602 diff --git a/demo_data/lombardia/example/2/20190218.tif b/demo_data/lombardia/example/2/20190218.tif new file mode 100755 index 0000000000000000000000000000000000000000..7547aecd3ef07c44e5556006018e3a7214b99c30 --- /dev/null +++ b/demo_data/lombardia/example/2/20190218.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2dd948d2a4ba5cfe01a836496d2462212978767eb9142ceb9df25bd41a4e6bd +size 38514 diff --git a/demo_data/lombardia/example/2/20190218_MSAVI.tif b/demo_data/lombardia/example/2/20190218_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..c6c0c8f3262901f409700dd1fa69195100210014 --- /dev/null +++ b/demo_data/lombardia/example/2/20190218_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ecd82c7e4c0a710abcb11719bf970765b93198f729c1e1345b31afda57038ae +size 5741 diff --git a/demo_data/lombardia/example/2/20190223.tif b/demo_data/lombardia/example/2/20190223.tif new file mode 100755 index 0000000000000000000000000000000000000000..76d38fe59c4e98e6fededbc9659f76c53878056a --- /dev/null +++ b/demo_data/lombardia/example/2/20190223.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c50f6347d57401065fe96baf214fda01ac56e0980525f53bfdf161df6299219 +size 39161 diff --git a/demo_data/lombardia/example/2/20190223_MSAVI.tif b/demo_data/lombardia/example/2/20190223_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..fd51cdddc07e8aec92429fa49cf62ff61787c5c0 --- /dev/null +++ b/demo_data/lombardia/example/2/20190223_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:803128e66dec1a10548e1b0a3b2b97f3d725698c21b6aa3fdd3073de4be396ab +size 5878 diff --git a/demo_data/lombardia/example/2/20190228.tif b/demo_data/lombardia/example/2/20190228.tif new file mode 100755 index 0000000000000000000000000000000000000000..9b09712f1ddacd45bd322517247145e1c2890612 --- /dev/null +++ b/demo_data/lombardia/example/2/20190228.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a29a5eecea7dba19e427abc313c5f238707e33e57c33c86a1c70e9514a92286 +size 39135 diff --git a/demo_data/lombardia/example/2/20190228_MSAVI.tif b/demo_data/lombardia/example/2/20190228_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..db096da6ce82ccff938c3f4d16b248b4f5d9ffdc --- /dev/null +++ b/demo_data/lombardia/example/2/20190228_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:109375eca6a06df8e30c1e64b6ed1f91b4405a0c0d55522699aa379b8946ad97 +size 5866 diff --git a/demo_data/lombardia/example/2/20190305.tif b/demo_data/lombardia/example/2/20190305.tif new file mode 100755 index 0000000000000000000000000000000000000000..a2cbc2397b7c3c7de8c9fb965ca4c1c3a8580fb3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190305.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c92e1de8ec44f07c269f2c0646c186bd1c7149fd855c2260e8a24fbcd1cd47a +size 36980 diff --git a/demo_data/lombardia/example/2/20190305_MSAVI.tif b/demo_data/lombardia/example/2/20190305_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..1ad162d52ac448576986e98803aed8c304138106 --- /dev/null +++ b/demo_data/lombardia/example/2/20190305_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d47e81878088407adf489c87b583a0a4497fa6266887f95adeea0c2d4430b145 +size 5537 diff --git a/demo_data/lombardia/example/2/20190310.tif b/demo_data/lombardia/example/2/20190310.tif new file mode 100755 index 0000000000000000000000000000000000000000..e219d166543441a6106a8b016ad8e8a6225303e3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190310.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3291ceaad6bb04e4ab982545663cb308456a2246aaa54cb9d5f3b23bee0b983 +size 35965 diff --git a/demo_data/lombardia/example/2/20190310_MSAVI.tif b/demo_data/lombardia/example/2/20190310_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..b18bff827c0ad8a78898bc00efd2b6fed09793b0 --- /dev/null +++ b/demo_data/lombardia/example/2/20190310_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a54fdbe8e33d4e1bb853a6be9620b9c83c913438c197672eb9fdb46757256bc +size 5117 diff --git a/demo_data/lombardia/example/2/20190315.tif b/demo_data/lombardia/example/2/20190315.tif new file mode 100755 index 0000000000000000000000000000000000000000..80d0e403d334bf8034cc9a49647ee2578feadb07 --- /dev/null +++ b/demo_data/lombardia/example/2/20190315.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8242615ccd6cb963849799e54557248a90c37d6da58a6846a02d9e351925287 +size 39389 diff --git a/demo_data/lombardia/example/2/20190315_MSAVI.tif b/demo_data/lombardia/example/2/20190315_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..258beebb95c656f53c84cf97e54708b99d717a93 --- /dev/null +++ b/demo_data/lombardia/example/2/20190315_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:934d946cf262959fe9dc68f5226f9e84cdb21d3b552c4b5ba04caabc50436484 +size 5832 diff --git a/demo_data/lombardia/example/2/20190320.tif b/demo_data/lombardia/example/2/20190320.tif new file mode 100755 index 0000000000000000000000000000000000000000..2771bf8db92f5c9dbd1b1c99b979b8caa267c565 --- /dev/null +++ b/demo_data/lombardia/example/2/20190320.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98edceed82c6e8b65bf2ec27f9e3ea5c2422e7c7da264e05eb1aa52aa1081463 +size 39314 diff --git a/demo_data/lombardia/example/2/20190320_MSAVI.tif b/demo_data/lombardia/example/2/20190320_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..993392fc19af9edcb0d90471923530d5bfd445dd --- /dev/null +++ b/demo_data/lombardia/example/2/20190320_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1abbe746efe824eb9454ba72aa039b3545a131ae1fb24623b4e07386e52b76b5 +size 5870 diff --git a/demo_data/lombardia/example/2/20190325.tif b/demo_data/lombardia/example/2/20190325.tif new file mode 100755 index 0000000000000000000000000000000000000000..685aed1c3cbb6e4f9c3a6a9f0c429c5bbcfbe260 --- /dev/null +++ b/demo_data/lombardia/example/2/20190325.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcb18f1a204a4dcf30b10836825f061717d88e8329e6984c01bd10c94e35b0fd +size 39225 diff --git a/demo_data/lombardia/example/2/20190325_MSAVI.tif b/demo_data/lombardia/example/2/20190325_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..7d1ccbe89b8293c45ed15d8ec63f728076532d66 --- /dev/null +++ b/demo_data/lombardia/example/2/20190325_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f950b5eac2a5be6d873385b35b2135c58befa28e883e07a6213de1651d5e4407 +size 5862 diff --git a/demo_data/lombardia/example/2/20190330.tif b/demo_data/lombardia/example/2/20190330.tif new file mode 100755 index 0000000000000000000000000000000000000000..72389d7358ca99a871fc7e361a82dbf529102a59 --- /dev/null +++ b/demo_data/lombardia/example/2/20190330.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20327d5328947da1d15824887e6fae55857d775a0a97bec8c4aafbe82be92889 +size 39181 diff --git a/demo_data/lombardia/example/2/20190330_MSAVI.tif b/demo_data/lombardia/example/2/20190330_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..2c598c4f91d58f3de6848f9dd31278d1c395bebc --- /dev/null +++ b/demo_data/lombardia/example/2/20190330_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73612b4f13f30b317611e00016f15bb199b12448e9412c4d5032fe5d06ca0020 +size 5916 diff --git a/demo_data/lombardia/example/2/20190404.tif b/demo_data/lombardia/example/2/20190404.tif new file mode 100755 index 0000000000000000000000000000000000000000..d83ab6630bf7f3e2e37a468a0f8ff9dfc412ca16 --- /dev/null +++ b/demo_data/lombardia/example/2/20190404.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5ccfd4072e53eb34630de5ed3eceda5c68622a7b41359c02d678973919376f +size 28892 diff --git a/demo_data/lombardia/example/2/20190404_MSAVI.tif b/demo_data/lombardia/example/2/20190404_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..3f5329af913be8a2301a1907851283189fb496eb --- /dev/null +++ b/demo_data/lombardia/example/2/20190404_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fcbb652d7833609b1740e85dfdc66af58fdb304c85f97b2167f2d97d73e63db +size 3608 diff --git a/demo_data/lombardia/example/2/20190409.tif b/demo_data/lombardia/example/2/20190409.tif new file mode 100755 index 0000000000000000000000000000000000000000..1d43a90037b2660160b572d047c335769506c765 --- /dev/null +++ b/demo_data/lombardia/example/2/20190409.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a35822a5aafbc45ca0eb005da17ce7d76250ba6633f69dbd4e6b39159d5acf84 +size 38104 diff --git a/demo_data/lombardia/example/2/20190409_MSAVI.tif b/demo_data/lombardia/example/2/20190409_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..b98c6857ba288b701180b780739f36bb8999e00a --- /dev/null +++ b/demo_data/lombardia/example/2/20190409_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac7c01de5be8c8691a42c2dcbee212c6f97b29d2c5a8c7d5679e83c5c790b511 +size 4388 diff --git a/demo_data/lombardia/example/2/20190414.tif b/demo_data/lombardia/example/2/20190414.tif new file mode 100755 index 0000000000000000000000000000000000000000..2f69942a9f289597e894fc3a9748423c66fb2573 --- /dev/null +++ b/demo_data/lombardia/example/2/20190414.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c09dd573ad82864c7c9bf9fd06e85ee19bce14f829d18563485bc09222b573e +size 26869 diff --git a/demo_data/lombardia/example/2/20190414_MSAVI.tif b/demo_data/lombardia/example/2/20190414_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..1e56819d751672d96a640197b4e2d74d6293e790 --- /dev/null +++ b/demo_data/lombardia/example/2/20190414_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79cb4330749e14bfc21fce428e968565e769dd5001b4e4c6c8cc8b8dc078aaf7 +size 3954 diff --git a/demo_data/lombardia/example/2/20190419.tif b/demo_data/lombardia/example/2/20190419.tif new file mode 100755 index 0000000000000000000000000000000000000000..d62c4e412e212e23c3bb1b3ef59bece861716a0c --- /dev/null +++ b/demo_data/lombardia/example/2/20190419.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11d530ac13cfd47319a5d41bd7fd14fa43031319c99b4b6e6224c4e54de55c49 +size 38952 diff --git a/demo_data/lombardia/example/2/20190419_MSAVI.tif b/demo_data/lombardia/example/2/20190419_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..14ebccf20a74e5397e2112ae88b44336a4761a1b --- /dev/null +++ b/demo_data/lombardia/example/2/20190419_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75b7dadf1a399421e8a17991b717d7a3af301714e567efb213ba6ddf5f7925c3 +size 4455 diff --git a/demo_data/lombardia/example/2/20190424.tif b/demo_data/lombardia/example/2/20190424.tif new file mode 100755 index 0000000000000000000000000000000000000000..2aee5a833ca0dc6a03cf6c2bcbeb5099b68c1891 --- /dev/null +++ b/demo_data/lombardia/example/2/20190424.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa610212419ae2243bc0a98a6b0931db2e10cef4f00fe3e4be7f60a037030ab3 +size 33269 diff --git a/demo_data/lombardia/example/2/20190424_MSAVI.tif b/demo_data/lombardia/example/2/20190424_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..29803d4ce980c73e4800ac6474cee255ed58e3ee --- /dev/null +++ b/demo_data/lombardia/example/2/20190424_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dbf865bf9f103a62e932b8b0a563d9bacb8e95ba0481e183709c920aab7a1bb +size 5031 diff --git a/demo_data/lombardia/example/2/20190429.tif b/demo_data/lombardia/example/2/20190429.tif new file mode 100755 index 0000000000000000000000000000000000000000..061b2bfa082918dc08e8d2bf3c19b507a56e11fe --- /dev/null +++ b/demo_data/lombardia/example/2/20190429.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b004e0e0255d130517a327955985968fe564244f474815fd8eb042efb812a117 +size 25831 diff --git a/demo_data/lombardia/example/2/20190429_MSAVI.tif b/demo_data/lombardia/example/2/20190429_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..a0604243948468944dad89840d8eb9707ec2e993 --- /dev/null +++ b/demo_data/lombardia/example/2/20190429_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7142a284e67a1e92aa4edfd2bed74d4d90c2aec0bac17cc1f1f07f8a245555df +size 2598 diff --git a/demo_data/lombardia/example/2/20190504.tif b/demo_data/lombardia/example/2/20190504.tif new file mode 100755 index 0000000000000000000000000000000000000000..4db5c91823e9395066d82ebc69aeef7867d756e1 --- /dev/null +++ b/demo_data/lombardia/example/2/20190504.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1a4ef1b06b4abe930975b730be64ab34583a371ac4ba2e60d995b09334714a8 +size 34604 diff --git a/demo_data/lombardia/example/2/20190504_MSAVI.tif b/demo_data/lombardia/example/2/20190504_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..193f0457dc6094f081aa4fab1df0056e239c76da --- /dev/null +++ b/demo_data/lombardia/example/2/20190504_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ce5adcf3187ef4d80b419af677490cd63e6ca7377f6d841815d099864c1c843 +size 5051 diff --git a/demo_data/lombardia/example/2/20190509.tif b/demo_data/lombardia/example/2/20190509.tif new file mode 100755 index 0000000000000000000000000000000000000000..f44552f6050d3abdb16b5d81a9d69e4ac8269cc3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190509.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5de84eb4bee631f2ccb1eeff237bb9729626292ea118ec65c3a8aa1313e8f81f +size 38002 diff --git a/demo_data/lombardia/example/2/20190509_MSAVI.tif b/demo_data/lombardia/example/2/20190509_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..31f61a7fac104d6b100d0539b5f2cb93dc6495ef --- /dev/null +++ b/demo_data/lombardia/example/2/20190509_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07e805df9aef5b68153a6ee342a1587187f299d516edc198b6e331978d65f3da +size 4470 diff --git a/demo_data/lombardia/example/2/20190514.tif b/demo_data/lombardia/example/2/20190514.tif new file mode 100755 index 0000000000000000000000000000000000000000..eef5cf666e1ca7cca4c6f899b6110bf7e20fe3ed --- /dev/null +++ b/demo_data/lombardia/example/2/20190514.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de83b18588cfcbf4cfcc668168484db0693dba4b4be0d9c8ee2fa2d99ea7a3dc +size 38608 diff --git a/demo_data/lombardia/example/2/20190514_MSAVI.tif b/demo_data/lombardia/example/2/20190514_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..4f4178722186a71910894c252c7177587598950e --- /dev/null +++ b/demo_data/lombardia/example/2/20190514_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73b0ea14c7d2e4c32213a62fb40130525d9b431c8389e14465382583829fc128 +size 6190 diff --git a/demo_data/lombardia/example/2/20190519.tif b/demo_data/lombardia/example/2/20190519.tif new file mode 100755 index 0000000000000000000000000000000000000000..62aaf0f9f074f14c2158d8865f34be97a2acf978 --- /dev/null +++ b/demo_data/lombardia/example/2/20190519.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c03c7ea3e9f0084112c05fb3fdca8eb287a755293aa1da44d401c9d95b413443 +size 26142 diff --git a/demo_data/lombardia/example/2/20190519_MSAVI.tif b/demo_data/lombardia/example/2/20190519_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..79ffd145d0cefd2ed9e3b743e034d2b9e1fd715b --- /dev/null +++ b/demo_data/lombardia/example/2/20190519_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b4f45286ca5e9eb1a45d3f48594f55c84b8353e55b2893f3816d3f2914c5a35 +size 2680 diff --git a/demo_data/lombardia/example/2/20190524.tif b/demo_data/lombardia/example/2/20190524.tif new file mode 100755 index 0000000000000000000000000000000000000000..06a0d6d5dcc2970ab05ccf6ccdacc16b8e887f4d --- /dev/null +++ b/demo_data/lombardia/example/2/20190524.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4925688f455b10d26c7f8d8636fa8909ac18b97009f34521100b26362fb88ad2 +size 38678 diff --git a/demo_data/lombardia/example/2/20190524_MSAVI.tif b/demo_data/lombardia/example/2/20190524_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..d222de2a0c00ff0397abc7da4ab4119f9ccfa7d1 --- /dev/null +++ b/demo_data/lombardia/example/2/20190524_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0c48feb0ea1858e8d1e1f7662fe646575c53b8accc68065a870ca9c5774a313 +size 6065 diff --git a/demo_data/lombardia/example/2/20190529.tif b/demo_data/lombardia/example/2/20190529.tif new file mode 100755 index 0000000000000000000000000000000000000000..306e129ea8865d318fb759bea05b12e4145fb96e --- /dev/null +++ b/demo_data/lombardia/example/2/20190529.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee5be2e93ba9b641153fa6eea0e71686c8155ea702805f963f9befb9cf8f3e33 +size 34162 diff --git a/demo_data/lombardia/example/2/20190529_MSAVI.tif b/demo_data/lombardia/example/2/20190529_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..10afefc29e5d14329f4d6a6400342869eaa13992 --- /dev/null +++ b/demo_data/lombardia/example/2/20190529_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dce30f737622b9988cb12bef14e6f3dd2e2c11a3abaf5961ec45efdf3dc6e5f +size 3791 diff --git a/demo_data/lombardia/example/2/20190603.tif b/demo_data/lombardia/example/2/20190603.tif new file mode 100755 index 0000000000000000000000000000000000000000..fe6e34a2512aeb042a6e87997201c8b1c3e9fa1b --- /dev/null +++ b/demo_data/lombardia/example/2/20190603.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f22e0df1b732aaeca96a1c311280ec41e14c18fc76820c8071ead9eec51604c8 +size 38967 diff --git a/demo_data/lombardia/example/2/20190603_MSAVI.tif b/demo_data/lombardia/example/2/20190603_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..a7058085a5d2e95c78e7685230a3799cda43f716 --- /dev/null +++ b/demo_data/lombardia/example/2/20190603_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ed2fecf568b82ea8381f125496c5e89f7b93eebf7b583370eced14856b1a39c +size 6051 diff --git a/demo_data/lombardia/example/2/20190613.tif b/demo_data/lombardia/example/2/20190613.tif new file mode 100755 index 0000000000000000000000000000000000000000..6aeee1f8b18d17eba6e3fe1c886110e9396d614b --- /dev/null +++ b/demo_data/lombardia/example/2/20190613.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f06501e23ad4f2ea83759d16c85a9ebf51f084aa75b56e416abc3bbffbf2a4e +size 39128 diff --git a/demo_data/lombardia/example/2/20190613_MSAVI.tif b/demo_data/lombardia/example/2/20190613_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..2a4f49caa5ce3b129e68848d57b5a8f6020b8a58 --- /dev/null +++ b/demo_data/lombardia/example/2/20190613_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:912b9fcd772914dc4d8d45e5b4b880177182817e8e50bf5b2da32c05b8934664 +size 6056 diff --git a/demo_data/lombardia/example/2/20190618.tif b/demo_data/lombardia/example/2/20190618.tif new file mode 100755 index 0000000000000000000000000000000000000000..1f8bbc4c902cfc036d2bb7ae717cbbf99243f7ff --- /dev/null +++ b/demo_data/lombardia/example/2/20190618.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe159a9da1d509b9a23108ab9408b79e3eb2ce6ae3b1e4c97ce86d7e5a5fae36 +size 38964 diff --git a/demo_data/lombardia/example/2/20190618_MSAVI.tif b/demo_data/lombardia/example/2/20190618_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..ff592c0363f2e1224e18a62ae3159b622af314b6 --- /dev/null +++ b/demo_data/lombardia/example/2/20190618_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a585ce7e7fcddda065bb979928a53bf1c872253a54dd841f54df3470d9fec485 +size 4431 diff --git a/demo_data/lombardia/example/2/20190623.tif b/demo_data/lombardia/example/2/20190623.tif new file mode 100755 index 0000000000000000000000000000000000000000..59e7fceec69b870107777a104d128a2ecf9fc628 --- /dev/null +++ b/demo_data/lombardia/example/2/20190623.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03fb0f2b2a5364a14429b8d84fcdec5f77218b9cc5bcac13105165451ea6b274 +size 38825 diff --git a/demo_data/lombardia/example/2/20190623_MSAVI.tif b/demo_data/lombardia/example/2/20190623_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..d4ef94ea8c6218817ce281e7104889aca082ebe8 --- /dev/null +++ b/demo_data/lombardia/example/2/20190623_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba1b559998e34c38fde209a46f2605f8c48a6e7d025868aba182ae7782bcc42 +size 6120 diff --git a/demo_data/lombardia/example/2/20190628.tif b/demo_data/lombardia/example/2/20190628.tif new file mode 100755 index 0000000000000000000000000000000000000000..d31386daef29ba5c8cf79f53e786fe20e41760dd --- /dev/null +++ b/demo_data/lombardia/example/2/20190628.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:279eaa4dc73ac53001b49ca070722e1136b20420e3c00a5574f453f2115bce9e +size 37084 diff --git a/demo_data/lombardia/example/2/20190628_MSAVI.tif b/demo_data/lombardia/example/2/20190628_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..8d72b10c4f3d52e858648236299e62f9d3049607 --- /dev/null +++ b/demo_data/lombardia/example/2/20190628_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75ec80cab076bc0d0f9a3d827bb75228cdd24b61dbcd9be0f9d4ac408bec1b27 +size 4321 diff --git a/demo_data/lombardia/example/2/20190703.tif b/demo_data/lombardia/example/2/20190703.tif new file mode 100755 index 0000000000000000000000000000000000000000..2c0e286ed75f37ca083673026dfddbac3429468c --- /dev/null +++ b/demo_data/lombardia/example/2/20190703.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8840d42969ee92a426436b4a1a1ab65846d381c57ae7d2f9b9ef76ffb2528c72 +size 38342 diff --git a/demo_data/lombardia/example/2/20190703_MSAVI.tif b/demo_data/lombardia/example/2/20190703_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..0b2d939d430c1675ecb5599b794dd68b7e79af93 --- /dev/null +++ b/demo_data/lombardia/example/2/20190703_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4cb4943e43d87fe638ba761ebb7f5dc12145232a9914ffbe5cd96192e71cce5 +size 6020 diff --git a/demo_data/lombardia/example/2/20190708.tif b/demo_data/lombardia/example/2/20190708.tif new file mode 100755 index 0000000000000000000000000000000000000000..f2eb7d069f3c97d00c5de9a347299b1b2f73e89f --- /dev/null +++ b/demo_data/lombardia/example/2/20190708.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ab970aeac8dd82e69da692d7d8b5aafbbe46c81c4652550bc5b56754c44a5ef +size 36274 diff --git a/demo_data/lombardia/example/2/20190708_MSAVI.tif b/demo_data/lombardia/example/2/20190708_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..25b8664f1e9939b824a9854407f085cb4fa5a92f --- /dev/null +++ b/demo_data/lombardia/example/2/20190708_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bcf446e3a6e15751f45da044452b51f4d1e9f860b694d410d2e03cfc10010c67 +size 4185 diff --git a/demo_data/lombardia/example/2/20190713.tif b/demo_data/lombardia/example/2/20190713.tif new file mode 100755 index 0000000000000000000000000000000000000000..d1bea458761b36d220431f0e9a9f9343df8c5b19 --- /dev/null +++ b/demo_data/lombardia/example/2/20190713.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99c3319e062805086bc8df1537efa116127d50196114f7056daaf795f7e8189c +size 38559 diff --git a/demo_data/lombardia/example/2/20190713_MSAVI.tif b/demo_data/lombardia/example/2/20190713_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..3f0e980fdade39c07a969d77ce25ba73505f730a --- /dev/null +++ b/demo_data/lombardia/example/2/20190713_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bff7dbd98414c362c8cd8e9c419cee5940007e8ca05367526cb9549920a23ac +size 6024 diff --git a/demo_data/lombardia/example/2/20190718.tif b/demo_data/lombardia/example/2/20190718.tif new file mode 100755 index 0000000000000000000000000000000000000000..c2e6203de596bf6fe4efc08e60662cf70a54d343 --- /dev/null +++ b/demo_data/lombardia/example/2/20190718.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c9cade3e117bf9502ffa0c8efd4936d39d73830f0c5858d0e7f1d24d712fd49 +size 28201 diff --git a/demo_data/lombardia/example/2/20190718_MSAVI.tif b/demo_data/lombardia/example/2/20190718_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..a73ef03a3f715e12a5852b977bea95e9c6846b2d --- /dev/null +++ b/demo_data/lombardia/example/2/20190718_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15053af036166d75dce48f15712a4644c844626eedec25f6b262244eae8ff64f +size 3134 diff --git a/demo_data/lombardia/example/2/20190723.tif b/demo_data/lombardia/example/2/20190723.tif new file mode 100755 index 0000000000000000000000000000000000000000..991a5488ecad277eb684aab3f2fad41cbbd959cf --- /dev/null +++ b/demo_data/lombardia/example/2/20190723.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d0e5476914e0227538e3a4b27ffd35a24fb5bc5329142c3823189410a0bcac2 +size 38354 diff --git a/demo_data/lombardia/example/2/20190723_MSAVI.tif b/demo_data/lombardia/example/2/20190723_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..22905efbacaaf4d9330b882725f4263bb83e3615 --- /dev/null +++ b/demo_data/lombardia/example/2/20190723_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c72d4cd43bf6e4e0774da581faab65aade6d634c2ec0df615e3746bf5d6869ba +size 5966 diff --git a/demo_data/lombardia/example/2/20190728.tif b/demo_data/lombardia/example/2/20190728.tif new file mode 100755 index 0000000000000000000000000000000000000000..76c48b59039b73ea29154ec28b1785b2e5c71976 --- /dev/null +++ b/demo_data/lombardia/example/2/20190728.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c75e35d15a0a4b67c10f72c4cbf6ad4a829e29baefbcb6973e59a9c2e00d1fb +size 27539 diff --git a/demo_data/lombardia/example/2/20190728_MSAVI.tif b/demo_data/lombardia/example/2/20190728_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..2771770f5c4f69b0580802c49636fe69ff8c2462 --- /dev/null +++ b/demo_data/lombardia/example/2/20190728_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19b6d2900d35dad40006008979a9b72d7bb2130eef8a300eb65acbb163e176f2 +size 3200 diff --git a/demo_data/lombardia/example/2/20190802.tif b/demo_data/lombardia/example/2/20190802.tif new file mode 100755 index 0000000000000000000000000000000000000000..707fdbe30ab6d2ee9c803af880ab3f683c2ae1b3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190802.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:823b04afd66676a8391ca181dadd044c25e0c02bae8083b244156486118f2e11 +size 37656 diff --git a/demo_data/lombardia/example/2/20190802_MSAVI.tif b/demo_data/lombardia/example/2/20190802_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..f74a9e5d0b98c4e1e8ef07307a6f14385b0c5729 --- /dev/null +++ b/demo_data/lombardia/example/2/20190802_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17ac99546b0426ab7254a30a9bfd4e6d506d5ddfaaff0700653f862e1e72f605 +size 5927 diff --git a/demo_data/lombardia/example/2/20190807.tif b/demo_data/lombardia/example/2/20190807.tif new file mode 100755 index 0000000000000000000000000000000000000000..408c3116f79839e3be5bea428d3c17477be90a42 --- /dev/null +++ b/demo_data/lombardia/example/2/20190807.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c977abb88257656bbc73b2559217b1530f8f65f27eff95993b772121d1ae4d6 +size 38143 diff --git a/demo_data/lombardia/example/2/20190807_MSAVI.tif b/demo_data/lombardia/example/2/20190807_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..e432ac2c692e58e88925b1bf055255c3d9e17074 --- /dev/null +++ b/demo_data/lombardia/example/2/20190807_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b0be1031f6aa67462fe9ef845bb8f00ece0e667d6d5cb69e9efa2d958420beb +size 4179 diff --git a/demo_data/lombardia/example/2/20190812.tif b/demo_data/lombardia/example/2/20190812.tif new file mode 100755 index 0000000000000000000000000000000000000000..7a70383a243dcf3da7d0dddce1779d52bdf90dc3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190812.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26ecbc437b7b6f59315283368a91edbe34f5518b993b467139c7b7ac58275f1e +size 35420 diff --git a/demo_data/lombardia/example/2/20190812_MSAVI.tif b/demo_data/lombardia/example/2/20190812_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..762d022bee1afe7a258c84dffa949ff8858bcb97 --- /dev/null +++ b/demo_data/lombardia/example/2/20190812_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:441d5ca95124ed7caf90a7ad6f8c9d13f17739e0140f601f392a0fa02d22fb9c +size 5392 diff --git a/demo_data/lombardia/example/2/20190817.tif b/demo_data/lombardia/example/2/20190817.tif new file mode 100755 index 0000000000000000000000000000000000000000..dd34a750dd4c21f38323a71b17cab948f42e5b38 --- /dev/null +++ b/demo_data/lombardia/example/2/20190817.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dfc226bae1f9dd4c3e4db7b00016f227012e4ce9b534d706267513180fa4dd5 +size 36233 diff --git a/demo_data/lombardia/example/2/20190817_MSAVI.tif b/demo_data/lombardia/example/2/20190817_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..1390e255ad0ac73b4f470b6739b221f8258175ca --- /dev/null +++ b/demo_data/lombardia/example/2/20190817_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d30451efacd14ea323264795dac24f703fcc4f81592855703a4315ba6db4674 +size 3961 diff --git a/demo_data/lombardia/example/2/20190822.tif b/demo_data/lombardia/example/2/20190822.tif new file mode 100755 index 0000000000000000000000000000000000000000..fc49b7fb5467ffe9522a39eed46edd56e2167338 --- /dev/null +++ b/demo_data/lombardia/example/2/20190822.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:406fc1aa314509a491101637d0d224a9ca453cd01f5c7b50025b752d9770f65f +size 32069 diff --git a/demo_data/lombardia/example/2/20190822_MSAVI.tif b/demo_data/lombardia/example/2/20190822_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..9ec3afb1b73be405f49432d2bddb3d9832eb5ca6 --- /dev/null +++ b/demo_data/lombardia/example/2/20190822_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa211f6a76c55a89d2d8b7898a90b0c0b9e48969e15b7b90a85f71230b0507fe +size 4874 diff --git a/demo_data/lombardia/example/2/20190827.tif b/demo_data/lombardia/example/2/20190827.tif new file mode 100755 index 0000000000000000000000000000000000000000..04040c7df382ba38749bce4eb6d2b14308afae77 --- /dev/null +++ b/demo_data/lombardia/example/2/20190827.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:808c199e99c1ffe710ee8e5fac383a76e860f560a31b221e44d11f30a90f74e2 +size 37085 diff --git a/demo_data/lombardia/example/2/20190827_MSAVI.tif b/demo_data/lombardia/example/2/20190827_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..602eb4d053f3fb4b110119b4adc5c3840b251e63 --- /dev/null +++ b/demo_data/lombardia/example/2/20190827_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f38c1e277215beac6843943bd8b20a09dbf73bdffeccc3b7f373eab2b31d7442 +size 4303 diff --git a/demo_data/lombardia/example/2/20190901.tif b/demo_data/lombardia/example/2/20190901.tif new file mode 100755 index 0000000000000000000000000000000000000000..9a27ec5631aa1206e2c3fb0e11e4d7e69079b592 --- /dev/null +++ b/demo_data/lombardia/example/2/20190901.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13c663ee79c21a260795d0792cfe1cd1dc8484ba8afb8dab9080afe26e16ec44 +size 37728 diff --git a/demo_data/lombardia/example/2/20190901_MSAVI.tif b/demo_data/lombardia/example/2/20190901_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..f3c81badddeb4b1bdff86a935a15015dac977fd3 --- /dev/null +++ b/demo_data/lombardia/example/2/20190901_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f48b66f3877c0e18c1a6d7182ef96ff7f1542650bd389f89bdebc4a0efa26c8 +size 5964 diff --git a/demo_data/lombardia/example/2/20190906.tif b/demo_data/lombardia/example/2/20190906.tif new file mode 100755 index 0000000000000000000000000000000000000000..580fd7cad6898277d26ce516bb95766e1ee64ab4 --- /dev/null +++ b/demo_data/lombardia/example/2/20190906.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:148874cdb49f6fb002171826fdea07abe14f92863fe922b83821ea921413698a +size 32498 diff --git a/demo_data/lombardia/example/2/20190906_MSAVI.tif b/demo_data/lombardia/example/2/20190906_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..67a7c4f3b2c257d8bc0d2d2ddfdee5a873d0063f --- /dev/null +++ b/demo_data/lombardia/example/2/20190906_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a394aece9ea17b5e7098f46b665e5e06f4c1b156f189ba8b9318e269f0f2757 +size 3637 diff --git a/demo_data/lombardia/example/2/20190911.tif b/demo_data/lombardia/example/2/20190911.tif new file mode 100755 index 0000000000000000000000000000000000000000..b3b775e5af6de535dc078c7a5de1f7fd1e01031f --- /dev/null +++ b/demo_data/lombardia/example/2/20190911.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebb66a7e5d826d2f948f1481eb556ed17819f8458cf29663a97603b73aa90e9a +size 37779 diff --git a/demo_data/lombardia/example/2/20190911_MSAVI.tif b/demo_data/lombardia/example/2/20190911_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..3efa216d5e10833fa9734268b09e1904619e1a4b --- /dev/null +++ b/demo_data/lombardia/example/2/20190911_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4dba364c4003e3587b76c286c3e24ef6161e397395371d43075656cdaa6b772d +size 5935 diff --git a/demo_data/lombardia/example/2/20190916.tif b/demo_data/lombardia/example/2/20190916.tif new file mode 100755 index 0000000000000000000000000000000000000000..2cbd36fb5a94039483624c027321e182aeca7573 --- /dev/null +++ b/demo_data/lombardia/example/2/20190916.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:284b428c4ad936003fc9a4fc6dde859284abd32dd29dfadff7ad10f016260aa6 +size 37196 diff --git a/demo_data/lombardia/example/2/20190916_MSAVI.tif b/demo_data/lombardia/example/2/20190916_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..5cde9c5e73f144d7ab18ac42e8f2ab06f1011747 --- /dev/null +++ b/demo_data/lombardia/example/2/20190916_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d4b784654413901f83044dff6c5e4b26fa7cc73c7172be721ce618bdf665dab +size 4267 diff --git a/demo_data/lombardia/example/2/20190921.tif b/demo_data/lombardia/example/2/20190921.tif new file mode 100755 index 0000000000000000000000000000000000000000..4806613ed5c67139ebd5c6f0711cc73c70d699fa --- /dev/null +++ b/demo_data/lombardia/example/2/20190921.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7769038593e6a4bcb8137f364b15acca4a33a24f2dd492ad2eead98fdd2143 +size 38192 diff --git a/demo_data/lombardia/example/2/20190921_MSAVI.tif b/demo_data/lombardia/example/2/20190921_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..5fe596dfbc5d7c9b9ae2a00412e64281cbea8d06 --- /dev/null +++ b/demo_data/lombardia/example/2/20190921_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eccb3a2a23bf1d93e197d204f3a78d6c0d0e8555dcd660a2cb39628b69518505 +size 6117 diff --git a/demo_data/lombardia/example/2/20190926.tif b/demo_data/lombardia/example/2/20190926.tif new file mode 100755 index 0000000000000000000000000000000000000000..3b99d3ebfacc2ba5721beed6208451eea3e72186 --- /dev/null +++ b/demo_data/lombardia/example/2/20190926.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ee3266fdb44e9d25ba16d5f1d6950834525451551953dc2333e2034559f5553 +size 37568 diff --git a/demo_data/lombardia/example/2/20190926_MSAVI.tif b/demo_data/lombardia/example/2/20190926_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..7adef9875d74779637c429818c4b78a9cdefa3ae --- /dev/null +++ b/demo_data/lombardia/example/2/20190926_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f77946eb58805f7235518610b3834f8fc86fee2da07fba6fcec2209a832919c +size 4154 diff --git a/demo_data/lombardia/example/2/20191001.tif b/demo_data/lombardia/example/2/20191001.tif new file mode 100755 index 0000000000000000000000000000000000000000..8f6d9ff43353a2e383076ebf8dec2410296dbcb5 --- /dev/null +++ b/demo_data/lombardia/example/2/20191001.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfb6e81eceb0be837e7b4323594933f5078e7cfe6319b04741bb5449fa59b2f3 +size 37753 diff --git a/demo_data/lombardia/example/2/20191001_MSAVI.tif b/demo_data/lombardia/example/2/20191001_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..79ba1128244f11d97232c7fdb5bb14b2dfa7ce4b --- /dev/null +++ b/demo_data/lombardia/example/2/20191001_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cda28ddd5672f7e101fbab63532802fac42b237bdddc6f3dad23fb3cb7f1f9d5 +size 5910 diff --git a/demo_data/lombardia/example/2/20191006.tif b/demo_data/lombardia/example/2/20191006.tif new file mode 100755 index 0000000000000000000000000000000000000000..14ecb6fb43b95f7c02d030d7e2eddcf53b3cfba6 --- /dev/null +++ b/demo_data/lombardia/example/2/20191006.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:977cd82024860baa2fe294e2f346ab051c3d1a02d7a8315adacd89f928a33e8d +size 34456 diff --git a/demo_data/lombardia/example/2/20191006_MSAVI.tif b/demo_data/lombardia/example/2/20191006_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..06122828dc55f50bfee7d94659abad6b4038b68e --- /dev/null +++ b/demo_data/lombardia/example/2/20191006_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:046a3abc0d0748474e4db3d712248e61c098b3698cded4a45ac7d0ee1ecde1e7 +size 3842 diff --git a/demo_data/lombardia/example/2/20191011.tif b/demo_data/lombardia/example/2/20191011.tif new file mode 100755 index 0000000000000000000000000000000000000000..bf66ec2a1973f2b411816c9b1e35a5691ebf7653 --- /dev/null +++ b/demo_data/lombardia/example/2/20191011.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e79a046124c29d743f534b26d50cba7f8a8bfefdb495f3e58f65d8d4cb80379a +size 37406 diff --git a/demo_data/lombardia/example/2/20191011_MSAVI.tif b/demo_data/lombardia/example/2/20191011_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..f42c4970f8c2830e887c96efd3ba86e3ec19127a --- /dev/null +++ b/demo_data/lombardia/example/2/20191011_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec1789056b81e727499b0ed1a66bdf13d2fe9aa3d890f1358f6a4fbabc333ab +size 5642 diff --git a/demo_data/lombardia/example/2/20191016.tif b/demo_data/lombardia/example/2/20191016.tif new file mode 100755 index 0000000000000000000000000000000000000000..9b21f579a8e0e8ab6bdb9c5a62b39a64cf71b289 --- /dev/null +++ b/demo_data/lombardia/example/2/20191016.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a260d7cada3838151262042399367bae2130e269f1ace1d81553dd381db313a +size 37847 diff --git a/demo_data/lombardia/example/2/20191016_MSAVI.tif b/demo_data/lombardia/example/2/20191016_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..044fda40912c116e4fbc1ac187a71c308e804b30 --- /dev/null +++ b/demo_data/lombardia/example/2/20191016_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9203ae2b2f907e54d7db1f36050c2c5b3503838059babdff8c8a87275db9b1d3 +size 4233 diff --git a/demo_data/lombardia/example/2/20191021.tif b/demo_data/lombardia/example/2/20191021.tif new file mode 100755 index 0000000000000000000000000000000000000000..a4b44039f574a6e0a255443538b44e14e52011b1 --- /dev/null +++ b/demo_data/lombardia/example/2/20191021.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53287499c9fe35dfa4eed5c7fa8b39bdf02d5c5af450d1ec73f5725d7a3ec7f0 +size 33665 diff --git a/demo_data/lombardia/example/2/20191021_MSAVI.tif b/demo_data/lombardia/example/2/20191021_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..771d2f40e38f0cd422b973f77b66ca521c169797 --- /dev/null +++ b/demo_data/lombardia/example/2/20191021_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd749d3a9c64bc19d9352c63b2b227b85794534a4e2d4ff9eed8703a8682911a +size 5439 diff --git a/demo_data/lombardia/example/2/20191026.tif b/demo_data/lombardia/example/2/20191026.tif new file mode 100755 index 0000000000000000000000000000000000000000..590af9a795b90dbd403591d704b3456d9dbd98ca --- /dev/null +++ b/demo_data/lombardia/example/2/20191026.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59eaf4a3e91917833bec2ccc28d202655c99a1a209480e301088458138f9ccd7 +size 37401 diff --git a/demo_data/lombardia/example/2/20191026_MSAVI.tif b/demo_data/lombardia/example/2/20191026_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..f190eeaa00f2e3497bbeeb1a8702a197bc6e7e03 --- /dev/null +++ b/demo_data/lombardia/example/2/20191026_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b01b45331562df875274e0ed85e224dcd7611dd338c984995c0d8d865371396b +size 4196 diff --git a/demo_data/lombardia/example/2/20191031.tif b/demo_data/lombardia/example/2/20191031.tif new file mode 100755 index 0000000000000000000000000000000000000000..14ecf0a3e719205c468b39440681f326627a2b37 --- /dev/null +++ b/demo_data/lombardia/example/2/20191031.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0786d74cede4f1a652a8fbedd479a55ea79b7f51127d20a411de651fb5107e1 +size 34043 diff --git a/demo_data/lombardia/example/2/20191031_MSAVI.tif b/demo_data/lombardia/example/2/20191031_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..d39dece251e356b1db9869cd2ab5cfca77d97db5 --- /dev/null +++ b/demo_data/lombardia/example/2/20191031_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1ffe1b9df34ba5bed1791da7a0992e4d3b762fbddd89ed84303e017c2c34189 +size 4869 diff --git a/demo_data/lombardia/example/2/20191105.tif b/demo_data/lombardia/example/2/20191105.tif new file mode 100755 index 0000000000000000000000000000000000000000..ebac6da572339f69427290786d0b077c6d37f187 --- /dev/null +++ b/demo_data/lombardia/example/2/20191105.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e80ec12b1c86debf45fcdcc33fa7561287bc9f86c35694fde3b7f3c3f4289ccd +size 38023 diff --git a/demo_data/lombardia/example/2/20191105_MSAVI.tif b/demo_data/lombardia/example/2/20191105_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..db1b58320549b0a88c385279268396a8602d327e --- /dev/null +++ b/demo_data/lombardia/example/2/20191105_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddd1e4bb87021f7968ab126f738c8cfe1bc6fad33b27691580a5c4964f2ce8d3 +size 4176 diff --git a/demo_data/lombardia/example/2/20191110.tif b/demo_data/lombardia/example/2/20191110.tif new file mode 100755 index 0000000000000000000000000000000000000000..6a59f79bdfb231e785947159f0e791512bf76d3b --- /dev/null +++ b/demo_data/lombardia/example/2/20191110.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6afb59bb63471c3865f5e5cfbd68fdcfc376ca2281b985934475e37e8a91710 +size 38023 diff --git a/demo_data/lombardia/example/2/20191110_MSAVI.tif b/demo_data/lombardia/example/2/20191110_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..71a851429802a4e91f80f2b68b7a26fb9231cede --- /dev/null +++ b/demo_data/lombardia/example/2/20191110_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58f7c48f15f4fff32751864a58c13cb0dad05710f6a6bd320066da87bcf6444c +size 6074 diff --git a/demo_data/lombardia/example/2/20191115.tif b/demo_data/lombardia/example/2/20191115.tif new file mode 100755 index 0000000000000000000000000000000000000000..bd4f14bc5b9d4812c6d3d0706ec712ac45fb5532 --- /dev/null +++ b/demo_data/lombardia/example/2/20191115.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:888f03dc517d04b4a0f837a079ec66be1fe76ced2b836c9977ca410b0aa1d988 +size 31925 diff --git a/demo_data/lombardia/example/2/20191115_MSAVI.tif b/demo_data/lombardia/example/2/20191115_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..5423a20468d21881b76477a069859d824502d6e4 --- /dev/null +++ b/demo_data/lombardia/example/2/20191115_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b6ff57ce3fa96a140a5bc919d69fb740b4457558e8ad649be76ccfd36848f2c +size 3619 diff --git a/demo_data/lombardia/example/2/20191120.tif b/demo_data/lombardia/example/2/20191120.tif new file mode 100755 index 0000000000000000000000000000000000000000..2b2713c487b1bb734917060e290f4e8932d1fafc --- /dev/null +++ b/demo_data/lombardia/example/2/20191120.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2effbe20ea70c0e4fca69453527d065c1cbbb96f695e73492113bdb98b2013d +size 32969 diff --git a/demo_data/lombardia/example/2/20191120_MSAVI.tif b/demo_data/lombardia/example/2/20191120_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..486babafd698d99d40dd9ca0e8e9bda95d2d40ed --- /dev/null +++ b/demo_data/lombardia/example/2/20191120_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16923bbbb71fd4034a9eed78c82ec0368e2d9ec4ef21034891168a4185fff4fd +size 4582 diff --git a/demo_data/lombardia/example/2/20191130.tif b/demo_data/lombardia/example/2/20191130.tif new file mode 100755 index 0000000000000000000000000000000000000000..347275c7d55e2247d1126e87046fa451dc49b208 --- /dev/null +++ b/demo_data/lombardia/example/2/20191130.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e97a8a2ca3d4b48380f6a338023d8f54688d3ce30008b0426d6c2fd487417e4 +size 36307 diff --git a/demo_data/lombardia/example/2/20191130_MSAVI.tif b/demo_data/lombardia/example/2/20191130_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..ea769cf4814b083c617da4ce81ed9a722203e2c4 --- /dev/null +++ b/demo_data/lombardia/example/2/20191130_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0a0062ba401a842936c018ad53e18bebe8132139dcda97afc9e1f22440d82af +size 4495 diff --git a/demo_data/lombardia/example/2/20191205.tif b/demo_data/lombardia/example/2/20191205.tif new file mode 100755 index 0000000000000000000000000000000000000000..23f3b84e2cb2b8e1a889763877812c3e34166ca0 --- /dev/null +++ b/demo_data/lombardia/example/2/20191205.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b70912038e5161b9789c5404d2159c59a9ca6367521023d050c859a9c58cff92 +size 36085 diff --git a/demo_data/lombardia/example/2/20191205_MSAVI.tif b/demo_data/lombardia/example/2/20191205_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..b64713b8055dca32264c7aa530b96087b160db40 --- /dev/null +++ b/demo_data/lombardia/example/2/20191205_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d29b32e78bbf0f00992ef890baf6fa9b42d81500717f7e0aeecd6c48b651e4e6 +size 4110 diff --git a/demo_data/lombardia/example/2/20191210.tif b/demo_data/lombardia/example/2/20191210.tif new file mode 100755 index 0000000000000000000000000000000000000000..1f991f2e1f88ab2a76b34495256af774ff5fdf09 --- /dev/null +++ b/demo_data/lombardia/example/2/20191210.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38fdca874b5ac470c50ebcaf436bf839fe3b796bf924dc90e268acee07b8c7a0 +size 38492 diff --git a/demo_data/lombardia/example/2/20191210_MSAVI.tif b/demo_data/lombardia/example/2/20191210_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..65c51ec53256ff4e9e7db11114947a83c44b518e --- /dev/null +++ b/demo_data/lombardia/example/2/20191210_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:188a1f41d1343f9cc33ba1a1ab5aedc19807883ee4097d788d0896dcd414f03e +size 6159 diff --git a/demo_data/lombardia/example/2/20191215.tif b/demo_data/lombardia/example/2/20191215.tif new file mode 100755 index 0000000000000000000000000000000000000000..a98fb594d3d18854321b5c05c21af055ba5b78c4 --- /dev/null +++ b/demo_data/lombardia/example/2/20191215.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69fe08f502e6ddb683c60b81ec86899688ad06985a9932ef3bb33a8313419977 +size 38849 diff --git a/demo_data/lombardia/example/2/20191215_MSAVI.tif b/demo_data/lombardia/example/2/20191215_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..d4b609dac931e815875eb3cac3bdfa157df56095 --- /dev/null +++ b/demo_data/lombardia/example/2/20191215_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:138dd4a77ecbfe7efc44a7bce56a0d51b54371f0a7ada65fd1a1d1050f306aa6 +size 4141 diff --git a/demo_data/lombardia/example/2/20191220.tif b/demo_data/lombardia/example/2/20191220.tif new file mode 100755 index 0000000000000000000000000000000000000000..244394be69b116a804730341b931ab14fb16acf6 --- /dev/null +++ b/demo_data/lombardia/example/2/20191220.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ad07b45fe64748dab26f2603989dd3ad7f4b675c2e4847e11dc46bdee1d759b +size 33138 diff --git a/demo_data/lombardia/example/2/20191220_MSAVI.tif b/demo_data/lombardia/example/2/20191220_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..0eb91502817cd1d67b35ad2ae18624a780588d83 --- /dev/null +++ b/demo_data/lombardia/example/2/20191220_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9e10bcf0685af33d0cd6f102fcb742615329dc241a3eca967955e0c971444f7 +size 4633 diff --git a/demo_data/lombardia/example/2/20191225.tif b/demo_data/lombardia/example/2/20191225.tif new file mode 100755 index 0000000000000000000000000000000000000000..3301f9f814cd64405a5258f56ab047a77809ed3e --- /dev/null +++ b/demo_data/lombardia/example/2/20191225.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c93215a685dbcb9189a53094f96e0b575ab32df72d470c638fb0dcf9e013ab45 +size 38647 diff --git a/demo_data/lombardia/example/2/20191225_MSAVI.tif b/demo_data/lombardia/example/2/20191225_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..1a2511f32fa71b8768199e21973e759ea0e1db10 --- /dev/null +++ b/demo_data/lombardia/example/2/20191225_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdc912b9f18bbf9c48382b783ba6936e628081154c8e4a6ff938729f546953e4 +size 4442 diff --git a/demo_data/lombardia/example/2/20191230.tif b/demo_data/lombardia/example/2/20191230.tif new file mode 100755 index 0000000000000000000000000000000000000000..2098e3fc78a0e29f940a43e76b80d22cfbd4387a --- /dev/null +++ b/demo_data/lombardia/example/2/20191230.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27a87605469490ec1e141dff6f2ba15fe6bb8b6f6b7512bee05278ae9057346d +size 37375 diff --git a/demo_data/lombardia/example/2/20191230_MSAVI.tif b/demo_data/lombardia/example/2/20191230_MSAVI.tif new file mode 100755 index 0000000000000000000000000000000000000000..6de6ce3a1ac88b76b79a05237a5c108df4a55098 --- /dev/null +++ b/demo_data/lombardia/example/2/20191230_MSAVI.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f146441d7ebf940a98b9cc0a2dd92f142a6ea3d8a04e32a781703bd6cc676560 +size 6011 diff --git a/requirements.txt b/requirements.txt index 12a4706528df633fb7dc92f54e4304c6ccea630c..9762ac1cccb193f093f2b3322cd2699a418c44f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,4 @@ streamlit +rasterio +torch +matplotlib diff --git a/utils.py b/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6fcc06bd0fb4e8ea7f4bef76bf109488418bdd --- /dev/null +++ b/utils.py @@ -0,0 +1,762 @@ +import os +import random +import sys +from functools import partial + +import numpy +import numpy as np +import rasterio +import torch +import torch.nn.functional as F +from torch import nn +from torch.autograd import Variable + + +#@title Dataset Code +def print_stats(stats): + print_lst = list() + for k, v in zip(stats.keys(), stats.values()): + print_lst.append("{}:{}".format(k, v)) + print('\n', ", ".join(print_lst)) + + +def get_dates(path, n=None): + """ + extracts a list of unique dates from dataset sample + + :param path: to dataset sample folder + :param n: choose n random samples from all available dates + :return: list of unique dates in YYYYMMDD format + """ + + files = os.listdir(path) + dates = list() + for f in files: + f = f.split("-")[0] + if len(f) == 8: # 20160101 + dates.append(f) + + dates = set(dates) + + if n is not None: + dates = random.sample(dates, n) + + dates = list(dates) + dates.sort() + return dates + + +def get_all_dates(path, num_max_dates): + """ + extracts a list of unique dates from dataset sample + + :param path: to dataset sample folder + :param num_max_dates: choose num_max_dates random samples from all available dates + :return: list of unique dates in YYYYMMDD format + """ + files = os.listdir(path) + dates = list() + for f in files: + f = f.split("_")[0] + if len(f) == 8: # 20160101 + dates.append(f) + + dates = set(dates) + if num_max_dates < len(dates): + dates = random.sample(dates, num_max_dates) + dates = list(dates) + dates.sort() + return dates + + +def get_sliding_window(pos, x_annual_time_series, win_size): + # x_annual_time_series to sliding window + sw_stop = pos + 1 + sw_start = sw_stop - win_size + if sw_start < 0: + # batch, channels, time_series, H, W = x_annual_time_series.shape + channels, time_series, H, W = x_annual_time_series.shape + # x_win = torch.zeros(batch, channels, win_size, H, W) + x_win = torch.zeros(channels, win_size, H, W) + # x_win[:, :, -sw_stop:, :, :] = x_annual_time_series[:, :, :sw_stop, :, :] + x_win[:, -sw_stop:, :, :] = x_annual_time_series[:, :sw_stop, :, :] + else: + # x_annual[batch, channels, time_series, H, W] + # x_win = x_annual_time_series[:, :, sw_start:sw_stop, :, :] + x_win = x_annual_time_series[:, sw_start:sw_stop, :, :] + return x_win + + +def read_classes(csv): + with open(csv, 'r') as f: + classes = f.readlines() + + ids = list() + names = list() + reliable_start_grow = list() + reliable_end_grow = list() + unreliable_start_grow = list() + unreliable_end_grow = list() + for row in classes: + row = row.replace("\n", "") + if '|' in row: + cls_info = row.split('|') + # we can have multiple id + id_info = cls_info[0].split(',') + id_info = [int(x) for x in id_info] + # ids.append(int(cls_info[0])) + ids.append(id_info) + names.append(cls_info[1]) + if len(cls_info) > 2: + reliable_start_grow.append(cls_info[2]) + reliable_end_grow.append(cls_info[3]) + if len(cls_info) > 4: + unreliable_start_grow.append(cls_info[2]) + unreliable_end_grow.append(cls_info[3]) + + return ids, names, reliable_start_grow, reliable_end_grow, \ + unreliable_start_grow, unreliable_end_grow + + +def get_patch_id(samples, idx_img): + _path = samples[idx_img] + if _path.endswith(os.sep): + _path = _path[:-1] + _id = os.path.basename(_path) + return _id, _path + + +class SentinelDailyAnnualDatasetNoLabel(torch.utils.data.Dataset): + ''' + If the first label is for example "1|unknown" then this will be replaced with a 0 (zero). + If you want to ignore other labels, then remove them from the classes.txt file and + this class will assigne label 0 (zero). + ''' + + def __init__(self, root_dirs, years, classes_path, max_seq_length, win_size, tileids=None): + self.max_seq_length = max_seq_length + self.win_size = win_size + # labels read from groudtruth files (y.tif) + # useful field to check the available labels + self.unique_labels = np.array([], dtype=float) + self.reliable_start_grow = list() + self.reliable_stop_grow = list() + self.unreliable_start_grow = list() + self.unreliable_stop_grow = list() + cls_info = read_classes(classes_path) + self.classids = cls_info[0] + self.classes = cls_info[1] + if len(cls_info[2]) > 0: + self.reliable_start_grow = cls_info[2] + self.reliable_stop_grow = cls_info[3] + if len(cls_info[4]) > 0: + self.unreliable_start_grow = cls_info[4] + self.unreliable_stop_grow = cls_info[5] + + if type(years) is not list: + years = [years] + self.data_dirs = years + + if type(root_dirs) is not list: + root_dirs = [root_dirs] + self.root_dirs = [r.rstrip("/") for r in root_dirs] + self.name = "" + self.samples = list() + self.ndates = list() + for root_dir in self.root_dirs: + print("Reading dataset info:", root_dir) + self.name += os.path.basename(root_dir) + '_' + + for d in self.data_dirs: + if not os.path.isdir(os.path.join(root_dir, d)): + sys.exit('The directory ' + os.path.join(root_dir, d) + " does not exist!") + + stats = dict( + rejected_nopath=0, + rejected_length=0, + total_samples=0) + + dirs = [] + if tileids is None: + # files = os.listdir(self.data_dirs) + for d in self.data_dirs: + dirs_name = os.listdir(os.path.join(root_dir, d)) + dirs_path = [os.path.join(root_dir, d, f) for f in dirs_name] + dirs.extend(dirs_path) + else: + # tileids e.g. "tileids/train_fold0.tileids" path of line separated tileids specifying + with open(os.path.join(root_dir, tileids), 'r') as f: + files = [el.replace("\n", "") for el in f.readlines()] + for d in self.data_dirs: + dirs_path = [os.path.join(root_dir, d, f) for f in files] + dirs.extend(dirs_path) + + for path in dirs: + if not os.path.exists(path): + stats["rejected_nopath"] += 1 + continue + ndates = len(get_dates(path)) + + stats["total_samples"] += 1 + self.samples.append(path) + self.ndates.append(ndates) + + print_stats(stats) + + def __len__(self): + return len(self.samples) + + def __getitem__(self, idx_img): + patch_id, path = get_patch_id(self.samples, idx_img) + + dates = get_all_dates(path, self.max_seq_length) + + x_annual = list() + + for date in dates: + x10_img, profile = read(os.path.join(path, date + ".tif")) + x_annual.append(x10_img) + + padding_size = max(0, self.max_seq_length - len(dates)) + for i in range(padding_size): + # y_dailies.append(np.zeros_like(y_dailies[0])) + x_annual.append(np.zeros_like(x_annual[0])) + dates.append(dates[-1][:4] + '1231') + # dates = np.pad(dates, (0, padding_size - 1), mode='edge') # padding with mirror + + x_annual = np.array(x_annual) * 1e-4 + x_annual = torch.from_numpy(x_annual) + + # permute channels with time_series (t x c x h x w) -> (c x t x h x w) + x_annual = x_annual.permute(1, 0, 2, 3) + + x_annual = x_annual.float() + + # create sliding windows from x_annual + x_dailies = list() + for i in range(len(dates)): + x_win = get_sliding_window(i, x_annual, self.win_size) + x_dailies.append(x_win) + x_dailies = torch.stack(x_dailies) + + # return x_dailies, y_annual, y_dailies, dates, patch_id + return x_dailies, dates, path + + +#@title Models code + +# annual model +class SimpleNN(nn.Module): + + def __init__(self, opt): + super(SimpleNN, self).__init__() + self.num_classes = opt.n_classes + self.conv1 = nn.Conv3d( + opt.sample_duration, + # opt.sample_channels, + 64, + kernel_size=(7, 3, 3), # orig: 7 + stride=(1, 1, 1), # orig: (1, 2, 2) + padding=(3, 1, 1), # orig: (3, 3, 3) + bias=False) + self.conv2 = nn.Conv3d( + 64, + 128, + # kernel_size=(opt.sample_channels-opt.n_classes+1, 3, 3), # orig: 7 + kernel_size=(3, 3, 3), # orig: 7 + stride=(1, 1, 1), # orig: (1, 2, 2) + padding=(1, 1, 1), # orig: (3, 3, 3) + bias=False) + self.conv3 = nn.Conv3d( + 128, + 1, + # kernel_size=(opt.sample_channels-opt.n_classes+1, 3, 3), # orig: 7 + kernel_size=(3, 3, 3), # orig: 7 + stride=(1, 1, 1), # orig: (1, 2, 2) + padding=(1, 1, 1), # orig: (3, 3, 3) + bias=False) + + @staticmethod + def upsample3d(x, d, h, w): + return F.interpolate(x, size=(d, h, w), mode='trilinear', align_corners=True) + + def forward(self, x): + _, _, _, h, w = x.shape + out = torch.relu(self.conv1(x)) + out = self.upsample3d(out, self.num_classes, h, w) + out = torch.relu(self.conv2(out)) + out = self.conv3(out) + out = out.squeeze(1) + return out, out + + +# daily +def get_fine_tuning_parameters(model, ft_begin_index): + if ft_begin_index == 0: + return model.parameters() + + ft_module_names = [] + for i in range(ft_begin_index, 5): + ft_module_names.append('layer{}'.format(i)) + ft_module_names.append('fc') + + parameters = [] + for k, v in model.named_parameters(): + for ft_module in ft_module_names: + if ft_module in k: + parameters.append({'params': v}) + break + else: + parameters.append({'params': v, 'lr': 0.0}) + + return parameters + + +def downsample_basic_block(x, planes, stride): + out = F.avg_pool3d(x, kernel_size=1, stride=stride) + zero_pads = torch.Tensor( + out.size(0), planes - out.size(1), out.size(2), out.size(3), + out.size(4)).zero_() + if isinstance(out.data, torch.cuda.FloatTensor): + zero_pads = zero_pads.cuda() + + out = Variable(torch.cat([out.data, zero_pads], dim=1)) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv3d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm3d(planes) + self.conv2 = nn.Conv3d( + planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) + self.bn2 = nn.BatchNorm3d(planes) + self.conv3 = nn.Conv3d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = nn.BatchNorm3d(planes * 4) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, + block, + layers, + opt, + # sample_size, # Height and width of inputs es. 112 x 112 + sample_duration, # Temporal duration of inputs, es. 16 + # shortcut_type='B', + # num_classes=400 + ): + super(ResNet, self).__init__() + self.inplanes = 64 + kernel0 = min(7, sample_duration) + padding0 = int(kernel0 / 2) + self.conv1 = nn.Conv3d( + # opt.sample_duration, + opt.sample_channels, + 64, + kernel_size=(kernel0, 3, 3), # orig: 7 + stride=(1, 1, 1), # orig: (1, 2, 2) + padding=(padding0, 1, 1), # orig: (3, 3, 3) + bias=False) + self.bn1 = nn.BatchNorm3d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool3d(kernel_size=(3, 3, 3), stride=2, padding=1) + self.layer1 = self._make_layer(block, 64, layers[0], opt.resnet_shortcut) + self.layer2 = self._make_layer(block, 128, layers[1], opt.resnet_shortcut, stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], opt.resnet_shortcut, stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], opt.resnet_shortcut, stride=2) + # last_duration = int(math.ceil(sample_duration / 16)) + # last_size = int(math.ceil(sample_size / 32)) + # self.avgpool = nn.AvgPool3d( + # (last_duration, last_size, last_size), stride=1) + # self.fc = nn.Linear(512 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv3d): + m.weight = nn.init.kaiming_normal_(m.weight, mode='fan_out') + elif isinstance(m, nn.BatchNorm3d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + def _make_layer(self, block, planes, blocks, shortcut_type, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + if shortcut_type == 'A': + downsample = partial( + downsample_basic_block, + planes=planes * block.expansion, + stride=stride) + else: + downsample = nn.Sequential( + nn.Conv3d( + self.inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), nn.BatchNorm3d(planes * block.expansion)) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + low_level_feat1 = x + + x = self.layer1(x) + low_level_feat2 = x + x = self.layer2(x) + low_level_feat3 = x + x = self.layer3(x) + low_level_feat4 = x + x = self.layer4(x) + low_level_feat5 = x + return [low_level_feat1, low_level_feat2, low_level_feat3, low_level_feat4, low_level_feat5] + + # x = self.avgpool(x) + + # x = x.view(x.size(0), -1) + # x = self.fc(x) + + # return x + + +def resnet50(opt, sample_duration): + """Constructs a ResNet-50 model. + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], opt, sample_duration) + return model + + +class FPN(nn.Module): + + def __init__(self, opt, first_batch, sample_duration): + super(FPN, self).__init__() + # self.first_run = True + self.in_planes = 64 + self.num_classes = opt.n_classes + + model = resnet50(opt, sample_duration) + self.back_bone = nn.DataParallel(model, device_ids=None) + # if opt.pretrain_path: + # print('loading pretrained model {}'.format(opt.pretrain_path)) + # pretrain = torch.load(opt.pretrain_path) + # assert opt.arch == pretrain['arch'] + # + # model.load_state_dict(pretrain['state_dict']) + # + # if opt.model == 'densenet': + # model.module.classifier = nn.Linear( + # model.module.classifier.in_features, opt.n_finetune_classes) + # model.module.classifier = model.module.classifier.cuda() + # else: + # model.module.fc = nn.Linear(model.module.fc.in_features, + # opt.n_finetune_classes) + # model.module.fc = model.module.fc.cuda() + # + # parameters = get_fine_tuning_parameters(model, opt.ft_begin_index) + + # self.back_bone, parameters = generate_model(opt, sample_duration) + + # Top layer + self.toplayer = None # nn.Conv3d(512, 256, kernel_size=1, stride=1, padding=0) # Reduce channels + + # Lateral layers + self.latlayer1 = None # nn.Conv3d(256, 256, kernel_size=1, stride=1, padding=0 + self.latlayer2 = None # nn.Conv3d(128, 256, kernel_size=1, stride=1, padding=0) + self.latlayer3 = None # nn.Conv3d(64, 256, kernel_size=1, stride=1, padding=0) + + # Addendum layers to reduce channels before sum + self.sumlayer1 = None + self.sumlayer2 = None + self.sumlayer3 = None + + # Semantic branch + self.conv2_3d_p5 = None + self.conv2_3d_p4 = None + self.conv2_3d_p3 = None + self.conv2_3d_p2 = None + self.iam_joking(first_batch, not opt.no_cuda) + + self.semantic_branch_2d = nn.Conv2d(256, 128, kernel_size=3, stride=1, padding=1) + self.conv2_2d = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1) + # self.conv3 = nn.Conv2d(128, self.num_classes, kernel_size=1, stride=1, padding=0) + self.conv3 = nn.Conv2d(128, 64, kernel_size=1, stride=1, padding=0) + # opt.sample_duration is the number of samples taken from the time series + self.conv4out = nn.Conv2d(64, opt.sample_duration, kernel_size=3, stride=1, padding=1) + self.conv5out = nn.Conv2d(opt.sample_duration, self.num_classes, kernel_size=3, stride=1, padding=1) + # num_groups, num_channels + self.gn1 = nn.GroupNorm(128, 128) + self.gn2 = nn.GroupNorm(256, 256) + + def iam_joking(self, x, use_cuda): + low_level_features = self.back_bone(x) + c1 = low_level_features[0] + c2 = low_level_features[1] + c3 = low_level_features[2] + c4 = low_level_features[3] + c5 = low_level_features[4] + + # Top layer + self.toplayer = nn.Conv3d(c5.size()[1], c5.size()[1], kernel_size=1, stride=1, padding=0) # Reduce channels + # Lateral layers + self.latlayer1 = nn.Conv3d(c4.size()[1], c4.size()[1], kernel_size=1, stride=1, padding=0) + self.latlayer2 = nn.Conv3d(c3.size()[1], c3.size()[1], kernel_size=1, stride=1, padding=0) + self.latlayer3 = nn.Conv3d(c2.size()[1], c2.size()[1], kernel_size=1, stride=1, padding=0) + + # Addendum layers to reduce channels + self.sumlayer1 = nn.Conv3d(c5.size()[1], c4.size()[1], kernel_size=1, stride=1, padding=0) # Reduce channels + self.sumlayer2 = nn.Conv3d(c4.size()[1], c3.size()[1], kernel_size=1, stride=1, padding=0) + self.sumlayer3 = nn.Conv3d(c3.size()[1], c2.size()[1], kernel_size=1, stride=1, padding=0) + + if use_cuda: + self.toplayer = self.toplayer.cuda() + self.latlayer1 = self.latlayer1.cuda() + self.latlayer2 = self.latlayer2.cuda() + self.latlayer3 = self.latlayer3.cuda() + self.sumlayer1 = self.sumlayer1.cuda() + self.sumlayer2 = self.sumlayer2.cuda() + self.sumlayer3 = self.sumlayer3.cuda() + + # Top-down + p5 = self.toplayer(c5) + p4 = self._upsample_add(self.sumlayer1(p5), self.latlayer1(c4)) + p3 = self._upsample_add(self.sumlayer2(p4), self.latlayer2(c3)) + p2 = self._upsample_add(self.sumlayer3(p3), self.latlayer3(c2)) + + # calculate the sizes so that dimension c becomes 1 + self.conv2_3d_p5 = nn.Conv3d(p5.size()[1], 256, kernel_size=(p5.size()[2] + 2, 3, 3), stride=1, padding=1) + self.conv2_3d_p4 = nn.Conv3d(p4.size()[1], 256, kernel_size=(p4.size()[2] + 2, 3, 3), stride=1, padding=1) + self.conv2_3d_p3 = nn.Conv3d(p3.size()[1], 128, kernel_size=(p3.size()[2] + 2, 3, 3), stride=1, padding=1) + self.conv2_3d_p2 = nn.Conv3d(p2.size()[1], 128, kernel_size=(p2.size()[2] + 2, 3, 3), stride=1, padding=1) + + def _upsample3d(self, x, d, h, w): + return F.interpolate(x, size=(d, h, w), mode='trilinear', align_corners=True) + + def _upsample2d(self, x, h, w): + return F.interpolate(x, size=(h, w), mode='bilinear', align_corners=True) + + def _make_layer(self, Bottleneck, planes, num_blocks, stride): + strides = [stride] + [1] * (num_blocks - 1) + layers = [] + for stride in strides: + layers.append(Bottleneck(self.in_planes, planes, stride)) + self.in_planes = planes * Bottleneck.expansion + return nn.Sequential(*layers) + + def _upsample_add(self, x, y): + '''Upsample and add two feature maps. + Args: + x: (Variable) top feature map to be upsampled. + y: (Variable) lateral feature map. + Returns: + (Variable) added feature map. + Note in PyTorch, when input size is odd, the upsampled feature map + with `F.upsample(..., scale_factor=2, mode='nearest')` + maybe not equal to the lateral feature map size. + e.g. + original input size: [N,_,15,15] -> + conv2d feature map size: [N,_,8,8] -> + upsampled feature map size: [N,_,16,16] + So we choose bilinear upsample which supports arbitrary output sizes. + ''' + _, _, D, H, W = y.size() + return F.interpolate(x, size=(D, H, W), mode='trilinear', align_corners=True) + y + + def forward(self, x): + # Bottom-up using backbone + low_level_features = self.back_bone(x) + # c1 = low_level_features[0] + c2 = low_level_features[1] + c3 = low_level_features[2] + c4 = low_level_features[3] + c5 = low_level_features[4] + + # Top-down + p5 = self.toplayer(c5) + p4 = self._upsample_add( + torch.relu(self.sumlayer1(p5)), torch.relu(self.latlayer1(c4))) # p5 interpolation to the size of c4 + p3 = self._upsample_add( + torch.relu(self.sumlayer2(p4)), torch.relu(self.latlayer2(c3))) + p2 = self._upsample_add( + torch.relu(self.sumlayer3(p3)), torch.relu(self.latlayer3(c2))) + + # Smooth + # p4 = F.relu(self.smooth1(p4)) + # p3 = F.relu(self.smooth2(p3)) + # p2 = F.relu(self.smooth3(p2)) + + # Semantic + _, _, _, h, w = p2.size() + # 256->256 + s5 = self.conv2_3d_p5(p5) + s5 = torch.squeeze(s5, 2) # squeeze only dim 2 to avoid to remove the batch dimension + s5 = self._upsample2d(torch.relu(self.gn2(s5)), h, w) + # 256->256 [32, 256, 24, 24] + s5 = self._upsample2d(torch.relu(self.gn2(self.conv2_2d(s5))), h, w) + # 256->128 [32, 128, 24, 24] + s5 = self._upsample2d(torch.relu(self.gn1(self.semantic_branch_2d(s5))), h, w) + + # 256->256 p4:[32, 256, 4, 6, 6] -> s4:[32, 256, 1, 6, 6] + s4 = self.conv2_3d_p4(p4) + s4 = torch.squeeze(s4, 2) # s4:[32, 256, 6, 6] + s4 = self._upsample2d(torch.relu(self.gn2(s4)), h, w) # s4:[32, 256, 24, 24] + # 256->128 s4:[32, 128, 24, 24] + s4 = self._upsample2d(torch.relu(self.gn1(self.semantic_branch_2d(s4))), h, w) + + # 256->128 + s3 = self.conv2_3d_p3(p3) + s3 = torch.squeeze(s3, 2) + s3 = self._upsample2d(torch.relu(self.gn1(s3)), h, w) + + s2 = self.conv2_3d_p2(p2) + s2 = torch.squeeze(s2, 2) + s2 = self._upsample2d(torch.relu(self.gn1(s2)), h, w) + + out = self._upsample2d(self.conv3(s2 + s3 + s4 + s5), 2 * h, 2 * w) + # introducing MSELoss on NDVI signal + out_cai = torch.sigmoid(self.conv4out(out)) # for Class Activation Interval + out_cls = self.conv5out(out_cai) # for Classification + + return out_cai, out_cls + + +def ids_to_labels(dataloader, pred_labels): + new = np.zeros(pred_labels.shape, np.int) + for cl, i in zip(dataloader.dataset.classids, range(len(dataloader.dataset.classids))): + if type(cl) is list: + new[pred_labels == i] = cl[0] + # for c in cl: + # new[pred_labels == c] = i + else: + new[pred_labels == i] = cl + return new + + +def resume(path, model, optimizer): + if torch.cuda.is_available(): + snapshot = torch.load(path) + else: + snapshot = torch.load(path, map_location="cpu") + print("Loaded snapshot from", path) + + model_state = snapshot.pop('model_state', snapshot) + optimizer_state = snapshot.pop('optimizer_state', None) + + if model is not None and model_state is not None: + print("loading model...") + model.load_state_dict(model_state) + + if optimizer is not None and optimizer_state is not None: + optimizer.load_state_dict(optimizer_state) + return snapshot + + +def read(file): + with rasterio.open(file) as src: + return src.read(), src.profile + + +#@title Setup Parameters + +opt = type('test', (), {})() + +opt.gpu_id = '' +opt.no_cuda = True + +opt.n_classes = 8 +opt.model_depth = 50 +opt.batch_size = 1 +opt.sample_duration = 71 +opt.sample_channels = 9 +opt.win_size = 5 +opt.model = 'resnet' +opt.resnet_shortcut = 'B' +# opt.n_epochs = 20 +# opt.learning_rate = 0.01 +# opt.loss = 'ce' +# opt.optimizer = 'sgd' +# opt.export_only +# opt.test_tile = 'test_small.tileids' +opt.result_path = 'demo_data/results' +input_data_folder = 'demo_data/lombardia' #@param {type:"string"} +opt.root_path = [input_data_folder] +opt.years = ['example'] +opt.classes_path = 'demo_data/classes-newmapping.txt' +opt.resume_path = 'demo_data' +opt.pretrain_path = '' +opt.workers = 1 + +os.environ['CUDA_VISIBLE_DEVICES'] = opt.gpu_id +if opt.no_cuda: + os.environ['CUDA_VISIBLE_DEVICES'] = "" + +classes_color_map = np.array([[0., 0., 0.], # Black + [0.79215686, 1.00000000, 0.43921569], # DarkGreen + [0.78039216, 0.08235294, 0.52156863], # MediumVioletRed + [0.00000000, 0.39215686, 0.00000000], # DarkOliveGreen1 + [0, 0, 1], # Blue + [1.00000000, 0.84313725, 0.00000000], # gold + [0.62745098, 0.12549020, 0.94117647], # purple + [0.0, 100/255, 0.0], # DarkGreen + [0.98039216, 0.66666667, 0.62745098], # + [1, 1, 0], # yellow + [0.2745098, 0.2745098, 0.2745098], # + [0, 250/255, 154/255], # MediumSpringGreen + [64/255, 224/255, 208/255], # turquoise + [0.70588235, 0.64705882, 0.70588235], # + [0.58823529, 0.39215686, 0.39215686], # + [139/255, 35/255, 35/255], # brown4 + [0.6, 0.6, 0.6], + [0.98039216, 0.66666667, 0.11764706], + [0.8627451, 0.8627451, 0.], + [0.41960784, 0.55686275, 0.1372549], + [0.2745098, 0.50980392, 0.70588235], + [0.8627451, 0.07843137, 0.23529412], + [1., 0., 0.], + [0., 0., 0.55686275], + [0., 0., 0.2745098], + [0., 0.23529412, 0.39215686], + [0., 0., 0.35294118], + [0., 0., 0.43137255], + [0., 0.31372549, 0.39215686], + [0., 0., 0.90196078], + [0.46666667, 0.04313725, 0.1254902], + [0., 0., 0.55686275]]) +colors = classes_color_map[:8] # num classes