├── .github └── workflows │ └── ci.yml ├── CONTRIBUTING.md ├── GeoTorchAI_Sigmod_Demo.001.png ├── LICENSE.md ├── README.md ├── binders ├── classification_satellite.ipynb ├── distributed │ ├── .ipynb_checkpoints │ │ ├── raster_classification_training_with_preprocessing-checkpoint.ipynb │ │ ├── st-prediction-training-with-preprocessing-checkpoint.ipynb │ │ ├── train_bike_nyc_prediction-checkpoint.ipynb │ │ ├── train_raster_classification-checkpoint.ipynb │ │ └── train_raster_segmentation-checkpoint.ipynb │ ├── end_to_end_raster_classification.ipynb │ ├── end_to_end_st_prediction.ipynb │ ├── train_bike_nyc_prediction.ipynb │ ├── train_raster_classification.ipynb │ └── train_raster_segmentation.ipynb ├── prediction_spatiotemporal.ipynb ├── sample-figure │ ├── euro-highway.png │ └── euro-industry.png └── segmentation_satellite.ipynb ├── data ├── 38-Cloud_training │ ├── train_blue │ │ ├── blue_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF │ │ ├── blue_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF │ │ ├── blue_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF │ │ ├── blue_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF │ │ ├── blue_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF │ │ ├── blue_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF │ │ ├── blue_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF │ │ ├── blue_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF │ │ ├── blue_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF │ │ ├── blue_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF │ │ ├── blue_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF │ │ └── blue_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF │ ├── train_green │ │ ├── green_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF │ │ ├── green_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF │ │ ├── green_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF │ │ ├── green_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF │ │ ├── green_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF │ │ ├── green_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF │ │ ├── green_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF │ │ ├── green_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF │ │ ├── green_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF │ │ ├── green_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF │ │ ├── green_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF │ │ └── green_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF │ ├── train_gt │ │ ├── gt_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF │ │ ├── gt_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF │ │ ├── gt_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF │ │ ├── gt_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF │ │ ├── gt_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF │ │ ├── gt_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF │ │ ├── gt_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF │ │ ├── gt_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF │ │ ├── gt_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF │ │ ├── gt_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF │ │ ├── gt_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF │ │ └── gt_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF │ ├── train_nir │ │ ├── nir_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF │ │ ├── nir_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF │ │ ├── nir_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF │ │ ├── nir_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF │ │ ├── nir_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF │ │ ├── nir_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF │ │ ├── nir_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF │ │ ├── nir_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF │ │ ├── nir_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF │ │ ├── nir_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF │ │ ├── nir_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF │ │ └── nir_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF │ └── train_red │ │ ├── red_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF │ │ ├── red_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF │ │ ├── red_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF │ │ ├── red_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF │ │ ├── red_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF │ │ ├── red_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF │ │ ├── red_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF │ │ ├── red_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF │ │ ├── red_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF │ │ ├── red_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF │ │ ├── red_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF │ │ └── red_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF ├── GeoTorchLogo.png ├── GoeTorchAILogo.png ├── architecture.png ├── county_small.tsv ├── county_small_wkb.tsv ├── euro-highway.png ├── euro-industry.png ├── eurosat │ ├── AnnualCrop │ │ ├── AnnualCrop_1.tif │ │ ├── AnnualCrop_10.tif │ │ ├── AnnualCrop_11.tif │ │ ├── AnnualCrop_12.tif │ │ ├── AnnualCrop_13.tif │ │ ├── AnnualCrop_14.tif │ │ ├── AnnualCrop_15.tif │ │ ├── AnnualCrop_16.tif │ │ ├── AnnualCrop_17.tif │ │ ├── AnnualCrop_18.tif │ │ ├── AnnualCrop_19.tif │ │ ├── AnnualCrop_2.tif │ │ ├── AnnualCrop_20.tif │ │ ├── AnnualCrop_3.tif │ │ ├── AnnualCrop_4.tif │ │ ├── AnnualCrop_5.tif │ │ ├── AnnualCrop_6.tif │ │ ├── AnnualCrop_7.tif │ │ ├── AnnualCrop_8.tif │ │ └── AnnualCrop_9.tif │ ├── Forest │ │ ├── Forest_1.tif │ │ ├── Forest_10.tif │ │ ├── Forest_11.tif │ │ ├── Forest_12.tif │ │ ├── Forest_13.tif │ │ ├── Forest_14.tif │ │ ├── Forest_15.tif │ │ ├── Forest_16.tif │ │ ├── Forest_17.tif │ │ ├── Forest_18.tif │ │ ├── Forest_19.tif │ │ ├── Forest_2.tif │ │ ├── Forest_20.tif │ │ ├── Forest_3.tif │ │ ├── Forest_4.tif │ │ ├── Forest_5.tif │ │ ├── Forest_6.tif │ │ ├── Forest_7.tif │ │ ├── Forest_8.tif │ │ └── Forest_9.tif │ ├── HerbaceousVegetation │ │ ├── HerbaceousVegetation_1.tif │ │ ├── HerbaceousVegetation_10.tif │ │ ├── HerbaceousVegetation_11.tif │ │ ├── HerbaceousVegetation_12.tif │ │ ├── HerbaceousVegetation_13.tif │ │ ├── HerbaceousVegetation_14.tif │ │ ├── HerbaceousVegetation_15.tif │ │ ├── HerbaceousVegetation_16.tif │ │ ├── HerbaceousVegetation_17.tif │ │ ├── HerbaceousVegetation_18.tif │ │ ├── HerbaceousVegetation_19.tif │ │ ├── HerbaceousVegetation_2.tif │ │ ├── HerbaceousVegetation_20.tif │ │ ├── HerbaceousVegetation_3.tif │ │ ├── HerbaceousVegetation_4.tif │ │ ├── HerbaceousVegetation_5.tif │ │ ├── HerbaceousVegetation_6.tif │ │ ├── HerbaceousVegetation_7.tif │ │ ├── HerbaceousVegetation_8.tif │ │ └── HerbaceousVegetation_9.tif │ ├── Highway │ │ ├── Highway_1.tif │ │ ├── Highway_10.tif │ │ ├── Highway_11.tif │ │ ├── Highway_12.tif │ │ ├── Highway_13.tif │ │ ├── Highway_14.tif │ │ ├── Highway_15.tif │ │ ├── Highway_16.tif │ │ ├── Highway_17.tif │ │ ├── Highway_18.tif │ │ ├── Highway_19.tif │ │ ├── Highway_2.tif │ │ ├── Highway_20.tif │ │ ├── Highway_3.tif │ │ ├── Highway_4.tif │ │ ├── Highway_5.tif │ │ ├── Highway_6.tif │ │ ├── Highway_7.tif │ │ ├── Highway_8.tif │ │ └── Highway_9.tif │ ├── Industrial │ │ ├── Industrial_1.tif │ │ ├── Industrial_10.tif │ │ ├── Industrial_11.tif │ │ ├── Industrial_12.tif │ │ ├── Industrial_13.tif │ │ ├── Industrial_14.tif │ │ ├── Industrial_15.tif │ │ ├── Industrial_16.tif │ │ ├── Industrial_17.tif │ │ ├── Industrial_18.tif │ │ ├── Industrial_19.tif │ │ ├── Industrial_2.tif │ │ ├── Industrial_20.tif │ │ ├── Industrial_3.tif │ │ ├── Industrial_4.tif │ │ ├── Industrial_5.tif │ │ ├── Industrial_6.tif │ │ ├── Industrial_7.tif │ │ ├── Industrial_8.tif │ │ └── Industrial_9.tif │ ├── Pasture │ │ ├── Pasture_1.tif │ │ ├── Pasture_10.tif │ │ ├── Pasture_11.tif │ │ ├── Pasture_12.tif │ │ ├── Pasture_13.tif │ │ ├── Pasture_14.tif │ │ ├── Pasture_15.tif │ │ ├── Pasture_16.tif │ │ ├── Pasture_17.tif │ │ ├── Pasture_18.tif │ │ ├── Pasture_19.tif │ │ ├── Pasture_2.tif │ │ ├── Pasture_20.tif │ │ ├── Pasture_3.tif │ │ ├── Pasture_4.tif │ │ ├── Pasture_5.tif │ │ ├── Pasture_6.tif │ │ ├── Pasture_7.tif │ │ ├── Pasture_8.tif │ │ └── Pasture_9.tif │ ├── PermanentCrop │ │ ├── PermanentCrop_1.tif │ │ ├── PermanentCrop_10.tif │ │ ├── PermanentCrop_11.tif │ │ ├── PermanentCrop_12.tif │ │ ├── PermanentCrop_13.tif │ │ ├── PermanentCrop_14.tif │ │ ├── PermanentCrop_15.tif │ │ ├── PermanentCrop_16.tif │ │ ├── PermanentCrop_17.tif │ │ ├── PermanentCrop_18.tif │ │ ├── PermanentCrop_19.tif │ │ ├── PermanentCrop_2.tif │ │ ├── PermanentCrop_20.tif │ │ ├── PermanentCrop_3.tif │ │ ├── PermanentCrop_4.tif │ │ ├── PermanentCrop_5.tif │ │ ├── PermanentCrop_6.tif │ │ ├── PermanentCrop_7.tif │ │ ├── PermanentCrop_8.tif │ │ └── PermanentCrop_9.tif │ ├── Residential │ │ ├── Residential_1.tif │ │ ├── Residential_10.tif │ │ ├── Residential_11.tif │ │ ├── Residential_12.tif │ │ ├── Residential_13.tif │ │ ├── Residential_14.tif │ │ ├── Residential_15.tif │ │ ├── Residential_16.tif │ │ ├── Residential_17.tif │ │ ├── Residential_18.tif │ │ ├── Residential_19.tif │ │ ├── Residential_2.tif │ │ ├── Residential_20.tif │ │ ├── Residential_3.tif │ │ ├── Residential_4.tif │ │ ├── Residential_5.tif │ │ ├── Residential_6.tif │ │ ├── Residential_7.tif │ │ ├── Residential_8.tif │ │ └── Residential_9.tif │ ├── River │ │ ├── River_1.tif │ │ ├── River_10.tif │ │ ├── River_11.tif │ │ ├── River_12.tif │ │ ├── River_13.tif │ │ ├── River_14.tif │ │ ├── River_15.tif │ │ ├── River_16.tif │ │ ├── River_17.tif │ │ ├── River_18.tif │ │ ├── River_19.tif │ │ ├── River_2.tif │ │ ├── River_20.tif │ │ ├── River_3.tif │ │ ├── River_4.tif │ │ ├── River_5.tif │ │ ├── River_6.tif │ │ ├── River_7.tif │ │ ├── River_8.tif │ │ └── River_9.tif │ └── SeaLake │ │ ├── SeaLake_1.tif │ │ ├── SeaLake_10.tif │ │ ├── SeaLake_11.tif │ │ ├── SeaLake_12.tif │ │ ├── SeaLake_13.tif │ │ ├── SeaLake_14.tif │ │ ├── SeaLake_15.tif │ │ ├── SeaLake_16.tif │ │ ├── SeaLake_17.tif │ │ ├── SeaLake_18.tif │ │ ├── SeaLake_19.tif │ │ ├── SeaLake_2.tif │ │ ├── SeaLake_20.tif │ │ ├── SeaLake_3.tif │ │ ├── SeaLake_4.tif │ │ ├── SeaLake_5.tif │ │ ├── SeaLake_6.tif │ │ ├── SeaLake_7.tif │ │ ├── SeaLake_8.tif │ │ └── SeaLake_9.tif ├── eurosat_total │ ├── AnnualCrop_1.tif │ ├── AnnualCrop_2.tif │ ├── AnnualCrop_3.tif │ ├── AnnualCrop_4.tif │ ├── AnnualCrop_5.tif │ ├── Forest_1.tif │ ├── Forest_2.tif │ ├── Forest_3.tif │ ├── Forest_4.tif │ ├── Forest_5.tif │ ├── HerbaceousVegetation_1.tif │ ├── HerbaceousVegetation_2.tif │ ├── HerbaceousVegetation_3.tif │ ├── HerbaceousVegetation_4.tif │ ├── HerbaceousVegetation_5.tif │ ├── Highway_1.tif │ ├── Highway_2.tif │ ├── Highway_3.tif │ ├── Highway_4.tif │ ├── Highway_5.tif │ ├── Industrial_1.tif │ ├── Industrial_2.tif │ ├── Industrial_3.tif │ ├── Industrial_4.tif │ ├── Industrial_5.tif │ ├── Pasture_1.tif │ ├── Pasture_2.tif │ ├── Pasture_3.tif │ ├── Pasture_4.tif │ ├── Pasture_5.tif │ ├── PermanentCrop_1.tif │ ├── PermanentCrop_2.tif │ ├── PermanentCrop_3.tif │ ├── PermanentCrop_4.tif │ ├── PermanentCrop_5.tif │ ├── Residential_1.tif │ ├── Residential_2.tif │ ├── Residential_3.tif │ ├── Residential_4.tif │ ├── Residential_5.tif │ ├── River_1.tif │ ├── River_2.tif │ ├── River_3.tif │ ├── River_4.tif │ ├── River_5.tif │ ├── SeaLake_1.tif │ ├── SeaLake_2.tif │ ├── SeaLake_3.tif │ ├── SeaLake_4.tif │ └── SeaLake_5.tif ├── nyc_st_df.parquet ├── partial_datasets │ ├── grid1 │ │ ├── flow_data.npy │ │ └── poi_data.npy │ ├── grid2 │ │ └── TaxiBJ21.npy │ ├── raster1 │ │ ├── AnnualCrop │ │ │ └── AnnualCrop_1.tif │ │ ├── Forest │ │ │ └── Forest_1.tif │ │ ├── HerbaceousVegetation │ │ │ └── HerbaceousVegetation_1.tif │ │ ├── Highway │ │ │ └── Highway_1.tif │ │ ├── Industrial │ │ │ └── Industrial_1.tif │ │ ├── Pasture │ │ │ └── Pasture_1.tif │ │ ├── PermanentCrop │ │ │ └── PermanentCrop_1.tif │ │ ├── Residential │ │ │ └── Residential_1.tif │ │ ├── River │ │ │ └── River_1.tif │ │ └── SeaLake │ │ │ └── SeaLake_1.tif │ ├── raster2 │ │ ├── bs_as │ │ │ ├── T21HUB_0_32_832_864.tif │ │ │ └── vya_T21HUB_4832_4864_5536_5568.tif │ │ └── cordoba_capital │ │ │ ├── T20JLL_0_32_2560_2592.tif │ │ │ └── vya_T20JLL_7488_7520_8000_8032.tif │ └── raster3 │ │ ├── train_blue │ │ └── blue_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF │ │ ├── train_green │ │ └── green_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF │ │ ├── train_gt │ │ └── gt_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF │ │ ├── train_nir │ │ └── nir_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF │ │ └── train_red │ │ └── red_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF ├── raster-written │ ├── _SUCCESS │ └── part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000 │ │ ├── .test1.tiff.crc │ │ ├── .test2.tiff.crc │ │ ├── .test3.tif.crc │ │ ├── test1.tiff │ │ ├── test2.tiff │ │ └── test3.tif ├── raster │ ├── test1.tiff │ ├── test2.tiff │ └── test3.tif ├── taxi_trip │ └── taxi_zones_2 │ │ ├── taxi_zones.dbf │ │ ├── taxi_zones.shp │ │ └── taxi_zones.shx ├── testPolygon.json └── yellow_trip_10_fraction.parquet ├── examples ├── st_preprocess.py ├── train_convlstm.py ├── train_deepsatv2.py ├── train_deepstn.py ├── train_fcn.py ├── train_resnet.py ├── train_satcnn.py └── train_unet.py ├── geotorchai ├── __init__.py ├── datasets │ ├── __init__.py │ ├── grid │ │ ├── __init__.py │ │ ├── geopotential.py │ │ ├── nyc_bike_deepstn.py │ │ ├── nyc_bike_stdn.py │ │ ├── nyc_taxi_stdn.py │ │ ├── processed.py │ │ ├── taxi_bj_21.py │ │ ├── temperature.py │ │ ├── toa_incident_solar_radiation.py │ │ ├── total_cloud_cover.py │ │ └── total_precipitation.py │ └── raster │ │ ├── __init__.py │ │ ├── cloud_38.py │ │ ├── euro_sat.py │ │ ├── processed.py │ │ ├── processed_extra_features.py │ │ ├── sat4.py │ │ ├── sat6.py │ │ ├── slum_detection.py │ │ └── utility │ │ ├── __init__.py │ │ ├── spectral_indices.py │ │ └── textural_features.py ├── models │ ├── __init__.py │ ├── grid │ │ ├── __init__.py │ │ ├── conv_lstm.py │ │ ├── deep_stn_net.py │ │ ├── periodical_cnn.py │ │ └── st_resnet.py │ └── raster │ │ ├── __init__.py │ │ ├── deepsat2.py │ │ ├── fcn.py │ │ ├── resnet50.py │ │ ├── sat_cnn.py │ │ └── unet.py ├── preprocessing │ ├── __init__.py │ ├── adapter.py │ ├── enums │ │ ├── __init__.py │ │ ├── adjacency_type.py │ │ ├── aggregation_type.py │ │ ├── geo_file_type.py │ │ └── geo_relationship.py │ ├── geo_io.py │ ├── grid │ │ ├── __init__.py │ │ ├── adjacency.py │ │ ├── space_partition.py │ │ └── st_manager.py │ ├── raster │ │ ├── __init__.py │ │ └── raster_processing.py │ ├── sedona_registration.py │ └── torch_df │ │ ├── __init__.py │ │ ├── rs_classify_df.py │ │ ├── rs_segment_df.py │ │ └── st_df.py ├── transforms │ ├── __init__.py │ └── raster.py └── utility │ ├── __init__.py │ ├── _download_utils.py │ ├── exceptions.py │ ├── method_overload.py │ ├── properties.py │ ├── torch_adapter.py │ └── types.py ├── setup.py └── tests ├── __init__.py ├── deep-learning ├── __init__.py ├── test_grid_datasets.py ├── test_models.py ├── test_raster_datasets.py └── test_transforms.py └── preprocessing ├── __init__.py ├── test_adjacency.py ├── test_data_loader.py ├── test_distributed_torch_df.py ├── test_feature_aggregation.py ├── test_raster_transform.py ├── test_sedona_registration.py ├── test_space_partition.py └── utility.py /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python 3 | 4 | name: Continuous Integration 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | paths-ignore: 10 | - 'README.md' 11 | - 'CONTRIBUTING.md' 12 | pull_request: 13 | branches: [ "main" ] 14 | 15 | jobs: 16 | build: 17 | 18 | runs-on: ubuntu-22.04 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | include: 23 | - spark: '3.4.1' 24 | hadoop: '3' 25 | scala: '2.12.8' 26 | python: '3.10' 27 | spark_compat: '3.4' 28 | - spark: '3.4.1' 29 | hadoop: '3' 30 | scala: '2.12.8' 31 | python: '3.7' 32 | spark_compat: '3.4' 33 | 34 | steps: 35 | - uses: actions/checkout@v3 36 | - name: Set up Python ${{ matrix.python-version }} 37 | uses: actions/setup-python@v3 38 | with: 39 | python-version: ${{ matrix.python-version }} 40 | - name: Download spark-hadoop 41 | env: 42 | SPARK_VERSION: ${{ matrix.spark }} 43 | HADOOP_VERSION: ${{ matrix.hadoop }} 44 | run: wget https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz 45 | - name: Install spark-hadoop 46 | env: 47 | SPARK_VERSION: ${{ matrix.spark }} 48 | HADOOP_VERSION: ${{ matrix.hadoop }} 49 | run: tar -xzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz 50 | - run: sudo apt-get install -y python3-pip python3-dev libgeos-dev gdal-bin libgdal-dev 51 | - run: python3 -m pip install --upgrade pip 52 | - run: python3 -m pip install -U setuptools 53 | - run: python3 -m pip install -U wheel 54 | - run: python3 -m pip install -U virtualenvwrapper 55 | - run: python3 -m pip install pipenv 56 | # Download Sedona jar 57 | - env: 58 | SPARK_COMPAT: ${{ matrix.spark_compat }} 59 | run: wget https://repo1.maven.org/maven2/org/apache/sedona/sedona-spark-shaded-${SPARK_COMPAT}_2.12/1.4.1/sedona-spark-shaded-${SPARK_COMPAT}_2.12-1.4.1.jar 60 | # Put Sedona jar in place 61 | - env: 62 | SPARK_VERSION: ${{ matrix.spark }} 63 | HADOOP_VERSION: ${{ matrix.hadoop }} 64 | run: find . -name sedona-spark-shaded-*.jar -exec cp {} spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}/jars/ \; 65 | # Download Geotools jar 66 | - run: wget https://repo1.maven.org/maven2/org/datasyslab/geotools-wrapper/1.4.0-28.2/geotools-wrapper-1.4.0-28.2.jar 67 | # Put Geotools jar in place 68 | - env: 69 | SPARK_VERSION: ${{ matrix.spark }} 70 | HADOOP_VERSION: ${{ matrix.hadoop }} 71 | run: find . -name geotools-wrapper-*.jar -exec cp {} spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}/jars/ \; 72 | - name: Install dependencies 73 | env: 74 | SPARK_VERSION: ${{ matrix.spark }} 75 | HADOOP_VERSION: ${{ matrix.hadoop }} 76 | run: | 77 | python3 -m pip install flake8 pytest 78 | python3 -m pip install pandas 79 | python3 -m pip install numpy 80 | python3 -m pip install xarray 81 | python3 -m pip install torch torchvision torchaudio 82 | python3 -m pip install -U scikit-image>=0.19.0 83 | python3 -m pip install cdsapi 84 | python3 -m pip install rasterio 85 | python3 -m pip install petastorm 86 | python3 -m pip install matplotlib 87 | python3 -m pip install pydeck 88 | python3 -m pip install geojson 89 | python3 -m pip install pyspark==${SPARK_VERSION} 90 | python3 -m pip install apache-sedona 91 | if [ -f requirements.txt ]; then pip3 install -r requirements.txt; fi 92 | - name: Install main package 93 | run: | 94 | python3 -m pip install -e .[tests] 95 | - name: Lint with flake8 96 | run: | 97 | # stop the build if there are Python syntax errors or undefined names 98 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 99 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 100 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 101 | - name: Test with pytest 102 | run: | 103 | (export SPARK_HOME=$PWD/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION};export PYSPARK_PYTHON=/usr/bin/python3;python3 -m pytest tests) 104 | env: 105 | SPARK_VERSION: ${{ matrix.spark }} 106 | HADOOP_VERSION: ${{ matrix.hadoop }} 107 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing to GeoTorch 2 | We welcome contributions from geospatial and deep learning communities. You can contribute by proposing and implementing new models or datasets in either raster imagery category or spatiotemporal non-imagery category. Besides proposing new datasets and models, you can also propose new preprocessing functions for either raster imagery or non-imagery datasets. Lastly, you can also propose solve any issues in the existing features. If you find a dataset or model already implemented in Keras or TensorFlow frameworks, you can propose to implement it on PyTorch. 3 | 4 | ## Create an Issue Proposing the Feature 5 | Click on the 'Issues' menu of this repository and create a new issue to propose your feature (model/dataset/preprocessing function/existing issue). Give a detailed description of the feature or issue you will be solving. If you are proposing a new model or dataset, try to give the link to the corresponding raw dataset/model/research paper. 6 | 7 | ## Create the Pull Request 8 | In order to create a pull request, you first need to fork this [repository](https://github.com/DataSystemsLab/GeoTorchAI). The repository will be available under the repository list on your GitHub account. Clone the repository from your GitHub profile, commit and push all the changes to that repository. In the last step, create a pull request against the main branch of this [repository](https://github.com/DataSystemsLab/GeoTorchAI/). 9 | 10 | ## Write Unit Tests 11 | If you implement a new dataset or preprocessing function or solve an existing issue, you need to write unit tests to verify the correctness of your implementation. Write as many tests as possible. All tests should go under the [tests module](https://github.com/DataSystemsLab/GeoTorchAI/tree/main/tests). Based on the category of your feature (model/dataset/preprocessing function, raster/grid), select the corresponding file to add your tests. 12 | 13 | ## Coding Conventions 14 | Strictly follow the coding convention strictly maintained in this repository. If you are implementing a model, check the coding structure of [raster and grid-based models](https://github.com/DataSystemsLab/GeoTorchAI/tree/main/geotorchai/models). In the case of a new dataset, check the coding convention for the datasets [here](https://github.com/DataSystemsLab/GeoTorchAI/tree/main/geotorchai/datasets). Preprocessing functions can be added [here](https://github.com/DataSystemsLab/GeoTorchAI/tree/main/geotorchai/preprocessing). Write proper comments for each code block. Commit messages should be meaningful. 15 | 16 | ## Optional Tutorial 17 | If you wish to write a turorial or example on how to use your implemented feature, you may include the example to the [examples module](https://github.com/DataSystemsLab/GeoTorchAI/tree/main/examples). In the case of preprocessing functions, try to include the example to the [st_preprocess.py file](https://github.com/DataSystemsLab/GeoTorchAI/blob/main/examples/st_preprocess.py). 18 | -------------------------------------------------------------------------------- /GeoTorchAI_Sigmod_Demo.001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/GeoTorchAI_Sigmod_Demo.001.png -------------------------------------------------------------------------------- /binders/sample-figure/euro-highway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/binders/sample-figure/euro-highway.png -------------------------------------------------------------------------------- /binders/sample-figure/euro-industry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/binders/sample-figure/euro-industry.png -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_blue/blue_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_green/green_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_gt/gt_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_nir/nir_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_3_LC08_L1TP_011002_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_5_LC08_L1TP_044010_20160220_20170224_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_5_LC08_L1TP_059014_20160620_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_061017_20160720_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_063016_20160920_20170221_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_064014_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_064017_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_7_LC08_L1TP_066017_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_011247_20160620_20170323_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_029040_20160720_20170222_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_032029_20160420_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/38-Cloud_training/train_red/red_patch_51_3_by_9_LC08_L1TP_034034_20160520_20170223_01_T1.TIF -------------------------------------------------------------------------------- /data/GeoTorchLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/GeoTorchLogo.png -------------------------------------------------------------------------------- /data/GoeTorchAILogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/GoeTorchAILogo.png -------------------------------------------------------------------------------- /data/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/architecture.png -------------------------------------------------------------------------------- /data/euro-highway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/euro-highway.png -------------------------------------------------------------------------------- /data/euro-industry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/euro-industry.png -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_1.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_10.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_11.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_12.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_13.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_14.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_15.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_16.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_17.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_18.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_19.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_2.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_20.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_3.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_4.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_5.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_6.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_7.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_8.tif -------------------------------------------------------------------------------- /data/eurosat/AnnualCrop/AnnualCrop_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/AnnualCrop/AnnualCrop_9.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_1.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_10.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_11.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_12.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_13.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_14.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_15.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_16.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_17.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_18.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_19.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_2.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_20.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_3.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_4.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_5.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_6.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_7.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_8.tif -------------------------------------------------------------------------------- /data/eurosat/Forest/Forest_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Forest/Forest_9.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_1.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_10.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_11.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_12.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_13.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_14.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_15.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_16.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_17.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_18.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_19.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_2.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_20.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_3.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_4.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_5.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_6.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_7.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_8.tif -------------------------------------------------------------------------------- /data/eurosat/HerbaceousVegetation/HerbaceousVegetation_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/HerbaceousVegetation/HerbaceousVegetation_9.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_1.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_10.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_11.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_12.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_13.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_14.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_15.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_16.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_17.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_18.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_19.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_2.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_20.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_3.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_4.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_5.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_6.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_7.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_8.tif -------------------------------------------------------------------------------- /data/eurosat/Highway/Highway_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Highway/Highway_9.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_1.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_10.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_11.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_12.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_13.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_14.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_15.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_16.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_17.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_18.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_19.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_2.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_20.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_3.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_4.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_5.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_6.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_7.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_8.tif -------------------------------------------------------------------------------- /data/eurosat/Industrial/Industrial_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Industrial/Industrial_9.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_1.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_10.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_11.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_12.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_13.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_14.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_15.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_16.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_17.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_18.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_19.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_2.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_20.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_3.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_4.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_5.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_6.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_7.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_8.tif -------------------------------------------------------------------------------- /data/eurosat/Pasture/Pasture_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Pasture/Pasture_9.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_1.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_10.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_11.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_12.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_13.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_14.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_15.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_16.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_17.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_18.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_19.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_2.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_20.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_3.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_4.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_5.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_6.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_7.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_8.tif -------------------------------------------------------------------------------- /data/eurosat/PermanentCrop/PermanentCrop_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/PermanentCrop/PermanentCrop_9.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_1.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_10.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_11.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_12.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_13.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_14.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_15.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_16.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_17.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_18.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_19.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_2.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_20.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_3.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_4.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_5.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_6.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_7.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_8.tif -------------------------------------------------------------------------------- /data/eurosat/Residential/Residential_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/Residential/Residential_9.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_1.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_10.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_11.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_12.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_13.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_14.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_15.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_16.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_17.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_18.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_19.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_2.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_20.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_3.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_4.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_5.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_6.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_7.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_8.tif -------------------------------------------------------------------------------- /data/eurosat/River/River_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/River/River_9.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_1.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_10.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_10.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_11.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_11.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_12.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_12.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_13.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_13.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_14.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_14.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_15.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_15.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_16.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_16.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_17.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_17.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_18.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_18.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_19.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_19.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_2.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_20.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_20.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_3.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_4.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_5.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_6.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_6.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_7.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_7.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_8.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_8.tif -------------------------------------------------------------------------------- /data/eurosat/SeaLake/SeaLake_9.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat/SeaLake/SeaLake_9.tif -------------------------------------------------------------------------------- /data/eurosat_total/AnnualCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/AnnualCrop_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/AnnualCrop_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/AnnualCrop_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/AnnualCrop_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/AnnualCrop_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/AnnualCrop_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/AnnualCrop_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/AnnualCrop_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/AnnualCrop_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/Forest_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Forest_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/Forest_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Forest_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/Forest_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Forest_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/Forest_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Forest_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/Forest_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Forest_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/HerbaceousVegetation_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/HerbaceousVegetation_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/HerbaceousVegetation_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/HerbaceousVegetation_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/HerbaceousVegetation_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/HerbaceousVegetation_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/HerbaceousVegetation_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/HerbaceousVegetation_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/HerbaceousVegetation_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/HerbaceousVegetation_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/Highway_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Highway_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/Highway_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Highway_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/Highway_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Highway_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/Highway_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Highway_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/Highway_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Highway_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/Industrial_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Industrial_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/Industrial_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Industrial_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/Industrial_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Industrial_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/Industrial_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Industrial_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/Industrial_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Industrial_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/Pasture_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Pasture_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/Pasture_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Pasture_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/Pasture_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Pasture_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/Pasture_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Pasture_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/Pasture_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Pasture_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/PermanentCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/PermanentCrop_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/PermanentCrop_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/PermanentCrop_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/PermanentCrop_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/PermanentCrop_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/PermanentCrop_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/PermanentCrop_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/PermanentCrop_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/PermanentCrop_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/Residential_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Residential_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/Residential_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Residential_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/Residential_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Residential_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/Residential_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Residential_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/Residential_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/Residential_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/River_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/River_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/River_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/River_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/River_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/River_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/River_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/River_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/River_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/River_5.tif -------------------------------------------------------------------------------- /data/eurosat_total/SeaLake_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/SeaLake_1.tif -------------------------------------------------------------------------------- /data/eurosat_total/SeaLake_2.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/SeaLake_2.tif -------------------------------------------------------------------------------- /data/eurosat_total/SeaLake_3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/SeaLake_3.tif -------------------------------------------------------------------------------- /data/eurosat_total/SeaLake_4.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/SeaLake_4.tif -------------------------------------------------------------------------------- /data/eurosat_total/SeaLake_5.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/eurosat_total/SeaLake_5.tif -------------------------------------------------------------------------------- /data/nyc_st_df.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/nyc_st_df.parquet -------------------------------------------------------------------------------- /data/partial_datasets/grid1/flow_data.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/grid1/flow_data.npy -------------------------------------------------------------------------------- /data/partial_datasets/grid1/poi_data.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/grid1/poi_data.npy -------------------------------------------------------------------------------- /data/partial_datasets/grid2/TaxiBJ21.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/grid2/TaxiBJ21.npy -------------------------------------------------------------------------------- /data/partial_datasets/raster1/AnnualCrop/AnnualCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/AnnualCrop/AnnualCrop_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/Forest/Forest_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/Forest/Forest_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/HerbaceousVegetation/HerbaceousVegetation_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/HerbaceousVegetation/HerbaceousVegetation_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/Highway/Highway_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/Highway/Highway_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/Industrial/Industrial_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/Industrial/Industrial_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/Pasture/Pasture_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/Pasture/Pasture_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/PermanentCrop/PermanentCrop_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/PermanentCrop/PermanentCrop_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/Residential/Residential_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/Residential/Residential_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/River/River_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/River/River_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster1/SeaLake/SeaLake_1.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster1/SeaLake/SeaLake_1.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster2/bs_as/T21HUB_0_32_832_864.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster2/bs_as/T21HUB_0_32_832_864.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster2/bs_as/vya_T21HUB_4832_4864_5536_5568.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster2/bs_as/vya_T21HUB_4832_4864_5536_5568.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster2/cordoba_capital/T20JLL_0_32_2560_2592.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster2/cordoba_capital/T20JLL_0_32_2560_2592.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster2/cordoba_capital/vya_T20JLL_7488_7520_8000_8032.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster2/cordoba_capital/vya_T20JLL_7488_7520_8000_8032.tif -------------------------------------------------------------------------------- /data/partial_datasets/raster3/train_blue/blue_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster3/train_blue/blue_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF -------------------------------------------------------------------------------- /data/partial_datasets/raster3/train_green/green_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster3/train_green/green_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF -------------------------------------------------------------------------------- /data/partial_datasets/raster3/train_gt/gt_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster3/train_gt/gt_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF -------------------------------------------------------------------------------- /data/partial_datasets/raster3/train_nir/nir_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster3/train_nir/nir_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF -------------------------------------------------------------------------------- /data/partial_datasets/raster3/train_red/red_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/partial_datasets/raster3/train_red/red_patch_1_1_by_1_LC08_L1TP_002053_20160520_20170324_01_T1.TIF -------------------------------------------------------------------------------- /data/raster-written/_SUCCESS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/_SUCCESS -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test1.tiff.crc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test1.tiff.crc -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test2.tiff.crc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test2.tiff.crc -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test3.tif.crc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/.test3.tif.crc -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test1.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test1.tiff -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test2.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test2.tiff -------------------------------------------------------------------------------- /data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster-written/part-00000-027093ba-45fc-4339-8a6f-58e11e1f012d-c000/test3.tif -------------------------------------------------------------------------------- /data/raster/test1.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster/test1.tiff -------------------------------------------------------------------------------- /data/raster/test2.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster/test2.tiff -------------------------------------------------------------------------------- /data/raster/test3.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/raster/test3.tif -------------------------------------------------------------------------------- /data/taxi_trip/taxi_zones_2/taxi_zones.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/taxi_trip/taxi_zones_2/taxi_zones.dbf -------------------------------------------------------------------------------- /data/taxi_trip/taxi_zones_2/taxi_zones.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/taxi_trip/taxi_zones_2/taxi_zones.shp -------------------------------------------------------------------------------- /data/taxi_trip/taxi_zones_2/taxi_zones.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/taxi_trip/taxi_zones_2/taxi_zones.shx -------------------------------------------------------------------------------- /data/yellow_trip_10_fraction.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/data/yellow_trip_10_fraction.parquet -------------------------------------------------------------------------------- /examples/st_preprocess.py: -------------------------------------------------------------------------------- 1 | from pyspark.sql import SparkSession 2 | from sedona.register import SedonaRegistrator 3 | from sedona.utils import SedonaKryoRegistrator, KryoSerializer 4 | from sedona.spark import * 5 | 6 | from geotorchai.preprocessing import SedonaRegistration, load_geo_data, load_parquet_data, load_geotiff_image_as_array_data, write_geotiff_image_with_array_data 7 | from geotorchai.preprocessing.enums import GeoFileType 8 | from geotorchai.preprocessing.enums import AggregationType 9 | from geotorchai.preprocessing.enums import GeoRelationship 10 | from geotorchai.preprocessing.raster import RasterProcessing as rp 11 | from geotorchai.preprocessing.grid import SpacePartition 12 | from geotorchai.preprocessing.grid import STManager as stm 13 | from geotorchai.preprocessing import Adapter 14 | 15 | 16 | 17 | config = SedonaContext.builder().config('spark.jars.packages', 18 | 'org.apache.sedona:sedona-spark-shaded-3.4_2.12:1.4.1,' 19 | 'org.datasyslab:geotools-wrapper:1.4.0-28.2').getOrCreate() 20 | sedona = SedonaContext.create(config) 21 | sc = sedona.sparkContext 22 | 23 | SedonaRegistration.set_sedona_context(sedona) 24 | 25 | ## Raster data preprocessing 26 | raster_df = load_geotiff_image_as_array_data("data/eurosat_total", options_dict = {"readToCRS": "EPSG:4326"}) 27 | raster_df.show() 28 | 29 | band1_df = rp.get_band_from_array_data(raster_df, 1, "data", "nBands", new_column_name = "new_band", return_full_dataframe = False) 30 | band1_df.show() 31 | 32 | norm_diff_df = rp.get_normalized_difference_index(raster_df, 2, 1, "data", "nBands", new_column_name = "norm_band", return_full_dataframe = False) 33 | norm_diff_df.show() 34 | 35 | appended_df = rp.append_normalized_difference_index(raster_df, 2, 1, "data", "nBands") 36 | appended_df.show() 37 | 38 | write_geotiff_image_with_array_data(appended_df, "data/raster-written", options_dict = {"fieldNBands": "nBands", "writeToCRS": "EPSG:4326"}, num_partitions = 1) 39 | 40 | 41 | ## Spatiotemporal grid data preprocessing 42 | taxi_trip_path = "data/yellow_trip_10_fraction.parquet" 43 | taxi_df = load_parquet_data(taxi_trip_path) 44 | taxi_df = taxi_df.select("pickup_datetime", "pickup_latitude", "pickup_longitude") 45 | taxi_df.show(5, False) 46 | 47 | taxi_df = stm.trim_on_datetime(taxi_df, target_column = "pickup_datetime", upper_date = "2010-10-25 15:43:00", lower_date = "2010-10-05 03:31:00") 48 | taxi_df.show(5, False) 49 | 50 | taxi_df = stm.get_unix_timestamp(taxi_df, "pickup_datetime", new_column_alias = "converted_unix_time").drop("pickup_datetime") 51 | taxi_df.show(5, False) 52 | 53 | taxi_df = stm.add_temporal_steps(taxi_df, timestamp_column = "converted_unix_time", step_duration = 3600, temporal_steps_alias = "timesteps_id").drop("converted_unix_time") 54 | taxi_df.show(5, False) 55 | total_temporal_setps = stm.get_temporal_steps_count(taxi_df, temporal_steps_column = "timesteps_id") 56 | 57 | taxi_df = stm.add_spatial_points(taxi_df, lat_column="pickup_latitude", lon_column="pickup_longitude", new_column_alias="point_loc").drop(*("pickup_latitude", "pickup_longitude")) 58 | taxi_df.show(5, False) 59 | 60 | zones = load_geo_data("data/taxi_trip/taxi_zones_2", GeoFileType.SHAPE_FILE) 61 | zones.CRSTransform("epsg:2263", "epsg:4326") 62 | 63 | zones_df = Adapter.rdd_to_spatial_df(zones) 64 | grid_df = SpacePartition.generate_grid_cells(zones_df, "geometry", 50, 50) 65 | grid_df.show(5, False) 66 | 67 | column_list = ["point_loc"] 68 | agg_types_list = [AggregationType.COUNT] 69 | alias_list = ["point_cnt"] 70 | st_df = stm.aggregate_st_dfs(grid_df, taxi_df, "geometry", "point_loc", "cell_id", "timesteps_id", GeoRelationship.CONTAINS, column_list, agg_types_list, alias_list) 71 | st_df.show(5, False) 72 | 73 | st_tensor = stm.get_st_grid_array(st_df, "timesteps_id", "cell_id", alias_list, temporal_length = total_temporal_setps, height = 50, width = 50, missing_data = 0) 74 | print(st_tensor[0]) 75 | print("Tensor shape:") 76 | print(st_tensor.shape) 77 | -------------------------------------------------------------------------------- /geotorchai/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | __version__ = "0.1.0" 3 | 4 | __all__ = [ 5 | "__version__", 6 | ] 7 | -------------------------------------------------------------------------------- /geotorchai/datasets/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/geotorchai/datasets/__init__.py -------------------------------------------------------------------------------- /geotorchai/datasets/grid/__init__.py: -------------------------------------------------------------------------------- 1 | from .nyc_bike_deepstn import BikeNYCDeepSTN 2 | from .nyc_bike_stdn import BikeNYCSTDN 3 | from .nyc_taxi_stdn import TaxiNYCSTDN 4 | from .taxi_bj_21 import TaxiBJ21 5 | from .total_precipitation import TotalPrecipitation 6 | from .temperature import Temperature 7 | from .geopotential import Geopotential 8 | from .total_cloud_cover import TotalCloudCover 9 | from .toa_incident_solar_radiation import ToaIncidentSolarRadiation 10 | from .processed import Processed 11 | 12 | __all__ = ["BikeNYCDeepSTN", "BikeNYCSTDN", "TaxiNYCSTDN", "TaxiBJ21", "TotalPrecipitation", "Temperature", "Geopotential", "TotalCloudCover", "ToaIncidentSolarRadiation", "Processed"] 13 | -------------------------------------------------------------------------------- /geotorchai/datasets/raster/__init__.py: -------------------------------------------------------------------------------- 1 | from .euro_sat import EuroSAT 2 | from .sat6 import SAT6 3 | from .sat4 import SAT4 4 | from .slum_detection import SlumDetection 5 | from .cloud_38 import Cloud38 6 | from .processed import Processed 7 | from .processed_extra_features import ProcessedWithExtraFeatures 8 | 9 | __all__ = ["EuroSAT", "SAT6", "SAT4", "SlumDetection", "Cloud38", "Processed", "ProcessedWithExtraFeatures"] 10 | -------------------------------------------------------------------------------- /geotorchai/datasets/raster/cloud_38.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | from typing import Optional, Callable 4 | import torch 5 | from torch.utils.data import Dataset 6 | from geotorchai.utility.exceptions import InvalidParametersException 7 | import numpy as np 8 | import rasterio 9 | 10 | 11 | class Cloud38(Dataset): 12 | ''' 13 | This is a segmentation dtaaset. Link: https://www.kaggle.com/datasets/sorour/38cloud-cloud-segmentation-in-satellite-images 14 | Image Height and Width: 384 x 384, No of bands: 4 15 | 16 | Parameters 17 | .......... 18 | root (String) - Path to the dataset if it is already downloaded. If not downloaded, it will be downloaded in the given path. 19 | bands (List, Optional) - List of all bands that need to be included in the dataset. Default: list of all bands in the images of Cloud38. 20 | transform (Callable, Optional) - Tranforms to apply to each image. Default: None 21 | target_transform (Callable, Optional) - Tranforms to apply to each label. Default: None 22 | ''' 23 | 24 | 25 | SPECTRAL_BANDS = ["red", "green", "blue", "nir"] 26 | RGB_BANDS = ["red", "green", "blue"] 27 | 28 | def __init__(self, root, bands = SPECTRAL_BANDS, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None): 29 | super().__init__() 30 | # first check if selected bands are valid. Trow exception otherwise 31 | if not self._is_valid_bands(bands): 32 | raise InvalidParametersException("Invalid band names") 33 | 34 | self.selected_band_indices = torch.tensor([self.SPECTRAL_BANDS.index(band) for band in bands]) 35 | self.transform = transform 36 | self.target_transform = target_transform 37 | self.image_paths = [] 38 | 39 | image_folders = ["train_red", "train_green", "train_blue", "train_nir"] 40 | label_folder = "train_gt" 41 | data_dir = self._get_path(root) 42 | band_indices = self.selected_band_indices.numpy() 43 | folder_band_1 = data_dir + "/" + image_folders[band_indices[0]] 44 | files = os.listdir(folder_band_1) 45 | for i in range(len(files)): 46 | if os.path.isfile(folder_band_1 + "/" + files[i]): 47 | img_path = {} 48 | if i == 0: 49 | color_name = files[i].split("_")[0] 50 | for index in band_indices: 51 | img_path[self.SPECTRAL_BANDS[index]] = data_dir + "/" + image_folders[index] + "/" + files[i].replace(color_name, self.SPECTRAL_BANDS[index]) 52 | img_path["gt"] = data_dir + "/" + label_folder + "/" + files[i].replace(color_name, "gt") 53 | self.image_paths.append(img_path) 54 | 55 | 56 | def __len__(self) -> int: 57 | return len(self.image_paths) 58 | 59 | def __getitem__(self, index: int): 60 | img = [] 61 | for band_index in self.selected_band_indices.numpy(): 62 | img.append(self._tiff_loader(self.image_paths[index][self.SPECTRAL_BANDS[band_index]])) 63 | img = torch.stack(img) 64 | 65 | label = self._tiff_loader_int64(self.image_paths[index]['gt']) 66 | label = torch.where(label==255, 1, 0) 67 | 68 | if self.transform is not None: 69 | img = self.transform(img) 70 | if self.target_transform is not None: 71 | label = self.target_transform(label) 72 | 73 | return img, label 74 | 75 | def _get_path(self, root_dir): 76 | queue = [root_dir] 77 | while queue: 78 | data_dir = queue.pop(0) 79 | folders = os.listdir(data_dir) 80 | if "train_red" in folders or "train_green" in folders or "train_blue" in folders: 81 | return data_dir 82 | 83 | for folder in folders: 84 | if os.path.isdir(data_dir + "/" + folder): 85 | queue.append(data_dir + "/" + folder) 86 | 87 | return None 88 | 89 | 90 | def _is_valid_bands(self, bands): 91 | for band in bands: 92 | if band not in self.SPECTRAL_BANDS: 93 | return False 94 | return True 95 | 96 | 97 | def _tiff_loader(self, path: str): 98 | with rasterio.open(path) as f: 99 | tiff_data = f.read().astype(np.float32) 100 | return torch.tensor(tiff_data[0]) 101 | 102 | 103 | def _tiff_loader_int64(self, path: str): 104 | with rasterio.open(path) as f: 105 | tiff_data = f.read().astype(np.int64) 106 | return torch.tensor(tiff_data[0]) 107 | 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /geotorchai/datasets/raster/processed.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | from typing import Optional, Callable 4 | import torch 5 | from torch.utils.data import Dataset 6 | import numpy as np 7 | import rasterio 8 | 9 | 10 | class Processed(Dataset): 11 | ''' 12 | This dataset is a custom dataset which can be used for any preprocessed raster image data. Datasets that are not preprocessed 13 | can also be used to create a custom PyTorch dataset with this class. All raster images should be put inside multiple folders 14 | where each folder represents a class. All folders representing classes should be located inside a root folder. 15 | 16 | Parameters 17 | .......... 18 | root (String) - Path to the root folder of the dataset where all subfolders representing classes are located. 19 | transform (Callable, Optional) - Tranforms to apply to each image. Default: None 20 | target_transform (Callable, Optional) - Tranforms to apply to each label. Default: None 21 | ''' 22 | 23 | 24 | def __init__(self, root, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None): 25 | super().__init__() 26 | 27 | self.transform = transform 28 | self.target_transform = target_transform 29 | 30 | self.image_paths = [] 31 | self.labels = [] 32 | 33 | folders = os.listdir(root) 34 | for i in range(len(folders)): 35 | if os.path.isdir(root + "/" + folders[i]): 36 | class_dir = root + "/" + folders[i] 37 | files = os.listdir(class_dir) 38 | for file in files: 39 | if os.path.isfile(class_dir + "/" + file): 40 | self.image_paths.append(class_dir + "/" + file) 41 | self.labels.append(i) 42 | 43 | 44 | def __len__(self) -> int: 45 | return len(self.image_paths) 46 | 47 | def __getitem__(self, index: int): 48 | img = self._tiff_loader(self.image_paths[index]) 49 | label = torch.tensor(self.labels[index]) 50 | 51 | if self.transform is not None: 52 | img = self.transform(img) 53 | if self.target_transform is not None: 54 | label = self.target_transform(label) 55 | 56 | return img, label 57 | 58 | 59 | def _tiff_loader(self, path: str): 60 | with rasterio.open(path) as f: 61 | tiff_data = f.read().astype(np.float32) 62 | return torch.tensor(tiff_data) 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /geotorchai/datasets/raster/processed_extra_features.py: -------------------------------------------------------------------------------- 1 | 2 | from typing import Optional, Callable 3 | import torch 4 | from torch.utils.data import Dataset 5 | import numpy as np 6 | import pandas as pd 7 | import rasterio 8 | 9 | 10 | class ProcessedWithExtraFeatures(Dataset): 11 | ''' 12 | This dataset is a custom dataset which is exactly similar to Processed dataset with the only exception that users can include 13 | pre-extracted additional features similar to the EuroSAT. The difference with EuroSAT is that, here, users need to extract 14 | the features beforehand and save to a CSV file. The CSV file should include more than two column: one column contains the path 15 | to each image, another column contains the image label, and rest of the columns represent features. 16 | 17 | Parameters 18 | .......... 19 | path_to_features (String) - Path to the CSV file which contains image locations, labels, and features. 20 | origin (String) - Name of the column in the CSV file which contains image locations. 21 | class_label (String) - Name of the column in the CSV file which contains image labels or classes. 22 | feature_list (List, Optional) - A list of column names in the CSV file which need to be included as additional features. 23 | If None, all columns in the CSV file except origin and class_label will be included in the feature list. 24 | transform (Callable, Optional) - Tranforms to apply to each image. Default: None 25 | target_transform (Callable, Optional) - Tranforms to apply to each label. Default: None 26 | ''' 27 | 28 | 29 | def __init__(self, path_to_features, origin, class_label, feature_list = None, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None): 30 | super().__init__() 31 | 32 | self.transform = transform 33 | self.target_transform = target_transform 34 | 35 | df = pd.read_csv(path_to_features) 36 | df_data = df.iloc[np.random.permutation(len(df))] 37 | all_classes = df_data[class_label].drop_duplicates() 38 | 39 | self._idx_to_class = {i:j for i, j in enumerate(all_classes)} 40 | self._class_to_idx = {value:key for key, value in self._idx_to_class.items()} 41 | 42 | self.image_paths = df_data[origin].tolist() 43 | self.image_labels = df_data[class_label].tolist() 44 | 45 | if feature_list != None: 46 | self.additional_features = torch.tensor(df_data[feature_list].values) 47 | else: 48 | self.additional_features = torch.tensor(df_data.drop(columns=[origin, class_label]).values) 49 | 50 | 51 | ## This method returns the class labels as a dictionary of key-value pairs. Key-> class name, value-> class index 52 | def get_class_labels(self): 53 | return self._class_to_idx 54 | 55 | 56 | def __len__(self) -> int: 57 | return len(self.image_paths) 58 | 59 | 60 | def __getitem__(self, index: int): 61 | img = self._tiff_loader(self.image_paths[index]) 62 | label = torch.tensor(self._class_to_idx[self.image_labels[index]]) 63 | 64 | if self.transform is not None: 65 | img = self.transform(img) 66 | if self.target_transform is not None: 67 | label = self.target_transform(label) 68 | 69 | return img, label, self.additional_features[index] 70 | 71 | 72 | def _tiff_loader(self, path: str): 73 | with rasterio.open(path) as f: 74 | tiff_data = f.read().astype(np.float32) 75 | return torch.tensor(tiff_data) 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /geotorchai/datasets/raster/utility/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/geotorchai/datasets/raster/utility/__init__.py -------------------------------------------------------------------------------- /geotorchai/datasets/raster/utility/spectral_indices.py: -------------------------------------------------------------------------------- 1 | 2 | import numpy as np 3 | import torch 4 | 5 | def _get_normalized_difference_index(band1, band2): 6 | sum_band = band1 + band2 7 | sum_band[sum_band == 0] = 1e-12 8 | return (band1 - band2)/sum_band 9 | 10 | # index should be replaced for NDWI 11 | def get_NDWI(band_green, band_nir): 12 | return _get_normalized_difference_index(band_green, band_nir) 13 | 14 | def get_MNDWI(band_green, band_swir): 15 | return _get_normalized_difference_index(band_green, band_swir) 16 | 17 | def get_NDMI(band_nir, band_swir): 18 | return _get_normalized_difference_index(band_nir, band_swir) 19 | 20 | def get_NDVI(band_nir, band_red): 21 | return _get_normalized_difference_index(band_nir, band_red) 22 | 23 | def get_AWEI(band_green, band_swir1, band_nir, band_swir2): 24 | return 4*(band_green - band_swir1) - (0.25*band_nir + 2.75*band_swir2) 25 | 26 | def get_builtup_index(band_swir, band_nir): 27 | return _get_normalized_difference_index(band_swir, band_nir) 28 | 29 | def get_RVI(band_nir, band_red): 30 | band_red[band_red == 0] = 1e-12 31 | return band_nir/band_red 32 | 33 | def get_mean_index(normalized_difference_index, height, width): 34 | return torch.sum(normalized_difference_index)/(height*width) -------------------------------------------------------------------------------- /geotorchai/datasets/raster/utility/textural_features.py: -------------------------------------------------------------------------------- 1 | 2 | import numpy as np 3 | from skimage.feature import * 4 | from skimage.feature import graycoprops as gc 5 | import torch 6 | 7 | def _normalize(img): 8 | divider = np.amax(img.numpy())/255.0 9 | return torch.div(img, divider, rounding_mode='floor') 10 | 11 | def _rgb_to_grayscale(rgb_image): 12 | a = 0.299*rgb_image[0] + 0.587*rgb_image[1] + 0.114*rgb_image[2] 13 | return a.round() 14 | 15 | def _get_digitized_image(pixels): 16 | mi, ma = 0, 255 17 | #ks = 5 18 | nbit = 8 19 | bins = np.linspace(mi, ma + 1, nbit + 1) 20 | bin_image = np.digitize(pixels, bins) - 1 21 | return bin_image 22 | 23 | def _get_GLCM_Contrast(digitized_image): 24 | glcm = graycomatrix(digitized_image, [1], [0, np.pi/4, np.pi/2], levels=8 , normed=True, symmetric=True) 25 | feature = gc(glcm, "contrast") 26 | return sum(feature[0].tolist())/len(feature[0].tolist()) 27 | 28 | def _get_GLCM_Dissimilarity(digitized_image): 29 | glcm = graycomatrix(digitized_image, [1], [0, np.pi/4, np.pi/2], levels=8 , normed=True, symmetric=True) 30 | feature = gc(glcm, "dissimilarity") 31 | return sum(feature[0].tolist())/len(feature[0].tolist()) 32 | 33 | 34 | def _get_GLCM_Homogeneity(digitized_image): 35 | glcm = graycomatrix(digitized_image, [1], [0, np.pi/4, np.pi/2], levels=8 , normed=True, symmetric=True) 36 | feature = gc(glcm, "homogeneity") 37 | return sum(feature[0].tolist())/len(feature[0].tolist()) 38 | 39 | def _get_GLCM_Energy(digitized_image): 40 | glcm = graycomatrix(digitized_image, [1], [0, np.pi/4, np.pi/2], levels=8 , normed=True, symmetric=True) 41 | feature = gc(glcm, "energy") 42 | return sum(feature[0].tolist())/len(feature[0].tolist()) 43 | 44 | 45 | def _get_GLCM_Correlation(digitized_image): 46 | glcm = graycomatrix(digitized_image, [1], [0, np.pi/4, np.pi/2], levels=8 , normed=True, symmetric=True) 47 | feature = gc(glcm, "correlation") 48 | return sum(feature[0].tolist())/len(feature[0].tolist()) 49 | 50 | def _get_GLCM_ASM(digitized_image): 51 | glcm = graycomatrix(digitized_image, [1], [np.pi/4,np.pi/2], levels=8 , normed=True, symmetric=True) 52 | feature = gc(glcm, "ASM") 53 | return sum(feature[0].tolist())/len(feature[0].tolist()) -------------------------------------------------------------------------------- /geotorchai/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/geotorchai/models/__init__.py -------------------------------------------------------------------------------- /geotorchai/models/grid/__init__.py: -------------------------------------------------------------------------------- 1 | from .deep_stn_net import DeepSTN 2 | from .st_resnet import STResNet 3 | from .conv_lstm import ConvLSTM 4 | from .periodical_cnn import PeriodicalCNN 5 | 6 | __all__ = ["DeepSTN", "STResNet", "ConvLSTM", "PeriodicalCNN"] 7 | -------------------------------------------------------------------------------- /geotorchai/models/grid/conv_lstm.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | ## This implementation follows the implementation available here: https://github.com/ndrplz/ConvLSTM_pytorch 5 | 6 | class ConvLSTM(nn.Module): 7 | ''' 8 | Implementation of the model ConvLSTM. Paper link: https://dl.acm.org/doi/10.5555/2969239.2969329 9 | 10 | Parameters 11 | .......... 12 | input_dim (Int) - Number of input features or channels 13 | hidden_dim (Int or List of Int, Optional) - Default: [128, 64, 64]. Indicates the number of nodes or 14 | filters in all layers. If not a list, same value will be used for each layer. 15 | kernel_size (Tuple or List of Tuple, Optional) - Default: (3, 3). Indicates the filter size. If not list, 16 | same kernel size will be used in all layers. 17 | num_layers (Int, Optional) - Default: 3. Indicates number of layers. 18 | bias (Boolean, Optional) - Default: True. Denotes whether bias parameter is True or False. 19 | ''' 20 | 21 | def __init__(self, input_dim, hidden_dim = [128, 64, 64], kernel_size = (3, 3), num_layers = 3, bias=True): 22 | super(ConvLSTM, self).__init__() 23 | 24 | if not isinstance(kernel_size, list): 25 | kernel_size = [kernel_size] * num_layers 26 | 27 | if not isinstance(hidden_dim, list): 28 | hidden_dim = [hidden_dim] * num_layers 29 | 30 | if not len(kernel_size) == len(hidden_dim) == num_layers: 31 | raise ValueError('Lengths of parameters hidden_dim, kernel_size, and num_layers are wrong') 32 | 33 | self.input_dim = input_dim 34 | self.hidden_dim = hidden_dim 35 | self.kernel_size = kernel_size 36 | self.num_layers = num_layers 37 | self.bias = bias 38 | 39 | self.device = None 40 | 41 | cell_list = [] 42 | for i in range(0, self.num_layers): 43 | cur_input_dim = self.input_dim if i == 0 else self.hidden_dim[i - 1] 44 | 45 | cell_list.append(_ConvLSTMCell(input_dim=cur_input_dim, 46 | hidden_dim=self.hidden_dim[i], 47 | kernel_size=self.kernel_size[i], 48 | bias=self.bias)) 49 | 50 | self.cell_list = nn.ModuleList(cell_list) 51 | 52 | def forward(self, input_tensor, hidden_state=None): 53 | ''' 54 | Parameters 55 | .......... 56 | input_tensor (Tensor) - History sequence part of the input sample 57 | hidden_state (Tuple, Optional) - A tuple of pair denoting the hidden state: (h, c). Default: None 58 | ''' 59 | 60 | if self.device is None: 61 | self.device = input_tensor.device 62 | 63 | b, seq_len, channels, h, w = input_tensor.size() 64 | 65 | if hidden_state is None: 66 | hidden_state = self._init_hidden(b, h, w) 67 | 68 | cur_layer_input = input_tensor 69 | 70 | for layer_idx in range(self.num_layers): 71 | 72 | h, c = hidden_state[layer_idx] 73 | output_inner = [] 74 | for t in range(seq_len): 75 | h, c = self.cell_list[layer_idx](input_tensor=cur_layer_input[:, t, :, :, :], cur_state=[h, c]) 76 | output_inner.append(h) 77 | 78 | layer_output = torch.stack(output_inner, dim=1) 79 | cur_layer_input = layer_output 80 | 81 | return layer_output, (h, c) 82 | 83 | def _init_hidden(self, batch_size, height, width): 84 | init_states = [] 85 | for i in range(self.num_layers): 86 | init_states.append(self.cell_list[i].init_hidden(batch_size, height, width, self.device)) 87 | return init_states 88 | 89 | 90 | 91 | class _ConvLSTMCell(nn.Module): 92 | 93 | def __init__(self, input_dim, hidden_dim, kernel_size, bias): 94 | 95 | super(_ConvLSTMCell, self).__init__() 96 | 97 | self.input_dim = input_dim 98 | self.hidden_dim = hidden_dim 99 | 100 | self.kernel_size = kernel_size 101 | self.padding = kernel_size[0] // 2, kernel_size[1] // 2 102 | self.bias = bias 103 | 104 | self.conv = nn.Conv2d(in_channels=self.input_dim + self.hidden_dim, 105 | out_channels=4 * self.hidden_dim, 106 | kernel_size=self.kernel_size, 107 | padding="same", 108 | bias=self.bias) 109 | 110 | def forward(self, input_tensor, cur_state): 111 | h_cur, c_cur = cur_state 112 | 113 | combined = torch.cat([input_tensor, h_cur], dim=1) # concatenate along channel axis 114 | 115 | combined_conv = self.conv(combined) 116 | cc_i, cc_f, cc_o, cc_g = torch.split(combined_conv, self.hidden_dim, dim=1) 117 | i = torch.sigmoid(cc_i) 118 | f = torch.sigmoid(cc_f) 119 | o = torch.sigmoid(cc_o) 120 | g = torch.tanh(cc_g) 121 | 122 | c_next = f * c_cur + i * g 123 | h_next = o * torch.tanh(c_next) 124 | 125 | return h_next, c_next 126 | 127 | def init_hidden(self, batch_size, height, width, device): 128 | return (torch.zeros(batch_size, self.hidden_dim, height, width, device=device), torch.zeros(batch_size, self.hidden_dim, height, width, device=device)) 129 | 130 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /geotorchai/models/grid/periodical_cnn.py: -------------------------------------------------------------------------------- 1 | 2 | import torch 3 | import torch.nn as nn 4 | 5 | ## This implementation follows the implementation available here: https://github.com/pangeo-data/WeatherBench 6 | 7 | 8 | class PeriodicalCNN(nn.Module): 9 | ''' 10 | Implementation of the segmentation model Fully Convolutional Network (FCN). Paper link: https://arxiv.org/abs/1411.4038 11 | 12 | Parameters 13 | .......... 14 | num_features (Int) - Number of features or variables 15 | filters (List, Optional) - Each element represents the number of filters in a periodical convolution layer. Default: [32] 16 | kernels (List, Optional) - Each element represents the number of kernels in a periodical convolution layer. Default: [5] 17 | drop_val (Float, Optional) - Droput after a periodical convolution layer. Default: 0 18 | ''' 19 | 20 | def __init__(self, num_features, filters=[32], kernels=[5], drop_val=0): 21 | super(PeriodicalCNN, self).__init__() 22 | 23 | if len(filters) != len(kernels): 24 | raise ValueError('Lengths of parameters filters and kernels should be same') 25 | if len(filters) == 0: 26 | raise ValueError('Parameter filters cannot be empty') 27 | 28 | moduleList = [] 29 | 30 | input_channels = num_features 31 | for i in range(len(filters)): 32 | if i > 0: 33 | input_channels = filters[i-1] 34 | 35 | moduleList.append(_PeriodicConv2D(input_channels, filters[i], kernels[i])) 36 | moduleList.append(nn.ReLU()) 37 | moduleList.append(nn.Dropout(drop_val)) 38 | 39 | moduleList.append(_PeriodicConv2D(filters[-1], num_features, kernels[-1])) 40 | self.modelSequences = nn.Sequential(*moduleList) 41 | 42 | 43 | def forward(self, inputs): 44 | ''' 45 | Parameters 46 | .......... 47 | inputs (Tensor) - Tensor containing the features 48 | ''' 49 | 50 | return self.modelSequences(inputs) 51 | 52 | 53 | 54 | class _PeriodicPadding2D(nn.Module): 55 | def __init__(self, pad_width): 56 | super(_PeriodicPadding2D, self).__init__() 57 | self.pad_width = pad_width 58 | 59 | def forward(self, x): 60 | if self.pad_width == 0: 61 | return x 62 | x = torch.cat((x[:, :, :, -self.pad_width:], x, x[:, :, :, :self.pad_width]), dim=3) 63 | x = nn.functional.pad(x, (0, 0, self.pad_width, self.pad_width, 0, 0, 0, 0)) 64 | 65 | return x 66 | 67 | 68 | 69 | class _PeriodicConv2D(nn.Module): 70 | def __init__(self, in_channels, out_channels, kernel_size): 71 | super(_PeriodicConv2D, self).__init__() 72 | pad_width = (kernel_size - 1) // 2 73 | self.padding = _PeriodicPadding2D(pad_width) 74 | self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, padding = "valid") 75 | 76 | def forward(self, x): 77 | return self.conv(self.padding(x)) 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /geotorchai/models/raster/__init__.py: -------------------------------------------------------------------------------- 1 | from .deepsat2 import DeepSatV2 2 | from .sat_cnn import SatCNN 3 | from .fcn import FullyConvolutionalNetwork 4 | from .unet import UNet 5 | 6 | __all__ = ["DeepSatV2", "SatCNN", "FullyConvolutionalNetwork", "UNet"] 7 | -------------------------------------------------------------------------------- /geotorchai/models/raster/deepsat2.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as torch_f 4 | import numpy as np 5 | 6 | 7 | class DeepSatV2(nn.Module): 8 | ''' 9 | Implementation of the classification model DeepSatV2. Paper link: https://arxiv.org/abs/1911.07747 10 | 11 | Parameters 12 | .......... 13 | in_channels (Int) - Number of channels in the input images 14 | in_height (Int) - Height of the input images 15 | in_width (Int) - Width of the input images 16 | num_classes (Int) - Total number of classes/labels in the dataset 17 | num_filtered_features (Int) - Number of filtered features. Default: 0 18 | ''' 19 | 20 | def __init__(self, in_channels, in_height, in_width, num_classes, num_filtered_features = 0): 21 | super(DeepSatV2, self).__init__() 22 | 23 | self.sequences_part1 = nn.Sequential( 24 | nn.Conv2d(in_channels, 32, kernel_size=3, padding="same"), 25 | nn.ReLU(), 26 | nn.Conv2d(32, 64, kernel_size=3, padding="same"), 27 | nn.ReLU(), 28 | nn.ZeroPad2d((in_width//2, in_width//2, in_height//2, in_height//2)), 29 | nn.MaxPool2d(2), 30 | nn.Dropout(0.25)) 31 | 32 | self.sequences_part2 = nn.Sequential( 33 | nn.Linear(64*in_height*in_width + num_filtered_features, 32), 34 | nn.BatchNorm1d(num_features=32, eps=0.001, momentum=0.99, affine=False), 35 | nn.ReLU(), 36 | nn.Linear(32, 128), 37 | nn.ReLU(), 38 | nn.Dropout(0.2), 39 | nn.Linear(128, num_classes)) 40 | 41 | 42 | def forward(self, images, filtered_features): 43 | ''' 44 | Parameters 45 | .......... 46 | images (Tensor) - Tensor containing the sample images 47 | filtered_features (Tensor) - Tensor containing the additional features 48 | ''' 49 | 50 | x = self.sequences_part1(images) 51 | x = x.view(x.size(0), -1) 52 | 53 | if filtered_features != None: 54 | x = torch.cat((x, filtered_features), axis=1) 55 | 56 | x = self.sequences_part2(x) 57 | x = torch_f.softmax(x, dim=1) 58 | 59 | return x 60 | 61 | -------------------------------------------------------------------------------- /geotorchai/models/raster/fcn.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import numpy as np 4 | 5 | 6 | class FullyConvolutionalNetwork(nn.Module): 7 | ''' 8 | Implementation of the segmentation model Fully Convolutional Network (FCN). Paper link: https://arxiv.org/abs/1411.4038 9 | 10 | Parameters 11 | .......... 12 | in_channels (Int) - Number of channels in the input images 13 | num_classes (Int) - Total number of output classes/channels in the dataset 14 | num_filters (Int, Optional) - Number of filters in the hidden convolution layers. Default: 64 15 | num_hidden_conv_layers (Int, Optional) - Number of hidden convolution layers. Default: 5 16 | ''' 17 | 18 | def __init__(self, in_channels, out_channels, num_filters = 64, num_hidden_conv_layers = 5): 19 | super(FullyConvolutionalNetwork, self).__init__() 20 | 21 | moduleList = [] 22 | 23 | input_channels = in_channels 24 | for i in range(num_hidden_conv_layers): 25 | if i > 0: 26 | input_channels = num_filters 27 | moduleList.append(nn.Conv2d(input_channels, num_filters, kernel_size=3, stride=1, padding=1)) 28 | moduleList.append(nn.LeakyReLU(inplace=True)) 29 | 30 | if num_hidden_conv_layers > 0: 31 | moduleList.append(nn.Conv2d(num_filters, out_channels, kernel_size=1, stride=1, padding=0)) 32 | else: 33 | moduleList.append(nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0)) 34 | 35 | self.modelSequences = nn.Sequential(*moduleList) 36 | 37 | 38 | def forward(self, images): 39 | ''' 40 | Parameters 41 | .......... 42 | images (Tensor) - Tensor containing the sample images 43 | ''' 44 | 45 | return self.modelSequences(images) 46 | 47 | -------------------------------------------------------------------------------- /geotorchai/models/raster/resnet50.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torchvision.models import resnet50 4 | import torch.nn.functional as torch_f 5 | 6 | class ResNet50(): 7 | 8 | def __init__(self, in_channels, num_classes, pretrained=True): 9 | self.in_channels = in_channels 10 | self.num_classes = num_classes 11 | self.pretrained = pretrained 12 | 13 | 14 | def get_model(self): 15 | model = resnet50(pretrained=self.pretrained) 16 | 17 | # Modify the first layer to accept inputs with more than 3 channels 18 | model.conv1 = torch.nn.Conv2d(self.in_channels, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False) 19 | 20 | # Freeze the weights of all layers except the first (conv1) and the last (fc) 21 | if self.pretrained == True: 22 | for name, param in model.named_parameters(): 23 | if "conv1" not in name and "fc" not in name: 24 | param.requires_grad = False 25 | 26 | # Modify the last layer to suit our task 27 | num_features = model.fc.in_features 28 | model.fc = torch.nn.Linear(num_features, self.num_classes) 29 | 30 | return model 31 | -------------------------------------------------------------------------------- /geotorchai/models/raster/sat_cnn.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as torch_f 4 | import numpy as np 5 | 6 | 7 | class SatCNN(nn.Module): 8 | ''' 9 | Implementation of the classification model SatCNN. Paper link: https://www.tandfonline.com/doi/abs/10.1080/2150704X.2016.1235299?journalCode=trsl20 10 | 11 | Parameters 12 | .......... 13 | in_channels (Int) - Number of channels in the input images 14 | in_height (Int) - Height of the input images 15 | in_width (Int) - Width of the input images 16 | num_classes (Int) - Total number of classes/labels in the dataset 17 | ''' 18 | 19 | def __init__(self, in_channels, in_height, in_width, num_classes): 20 | super(SatCNN, self).__init__() 21 | 22 | self.sequences_part1 = nn.Sequential( 23 | nn.Conv2d(in_channels, 32, kernel_size=3, padding="same"), 24 | nn.ReLU(), 25 | nn.ZeroPad2d((in_width//2, in_width//2, in_height//2, in_height//2)), 26 | nn.MaxPool2d(2), 27 | nn.Conv2d(32, 64, kernel_size=3, padding="same"), 28 | nn.ReLU(), 29 | nn.ZeroPad2d((in_width//2, in_width//2, in_height//2, in_height//2)), 30 | nn.MaxPool2d(2), 31 | nn.Conv2d(64, 128, kernel_size=3, padding="same"), 32 | nn.ReLU(), 33 | nn.ZeroPad2d((in_width//2, in_width//2, in_height//2, in_height//2)), 34 | nn.MaxPool2d(2)) 35 | 36 | self.sequences_part2 = nn.Sequential( 37 | nn.Linear(128*in_height*in_width, 128), 38 | nn.ReLU(), 39 | nn.Dropout(0.5), 40 | nn.Linear(128, num_classes)) 41 | 42 | 43 | def forward(self, images): 44 | ''' 45 | Parameters 46 | .......... 47 | images (Tensor) - Tensor containing the sample images 48 | ''' 49 | 50 | x = self.sequences_part1(images) 51 | x = x.view(x.size(0), -1) 52 | 53 | x = self.sequences_part2(x) 54 | x = torch_f.softmax(x, dim=1) 55 | 56 | return x 57 | 58 | -------------------------------------------------------------------------------- /geotorchai/models/raster/unet.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as torch_f 4 | 5 | # This implementation is based on https://github.com/milesial/Pytorch-UNet 6 | class UNet(nn.Module): 7 | ''' 8 | Implementation of the segmentation model UNet. Paper link: https://link.springer.com/chapter/10.1007/978-3-319-24574-4_28 9 | 10 | Parameters 11 | .......... 12 | in_channels (Int) - Number of channels in the input images 13 | num_classes (Int) - Total number of output classes/channels 14 | ''' 15 | 16 | def __init__(self, in_channels, num_classes): 17 | super(UNet, self).__init__() 18 | 19 | self.input_conv = _ConvolutionNetwork(in_channels, 64) 20 | 21 | self.down_sample1 = _DownSampling(64, 128) 22 | self.down_sample2 = _DownSampling(128, 256) 23 | self.down_sample3 = _DownSampling(256, 512) 24 | self.down_sample4 = _DownSampling(512, 1024) 25 | 26 | self.up_sample1 = _UpSampling(1024, 512) 27 | self.up_sample2 = _UpSampling(512, 256) 28 | self.up_sample3 = _UpSampling(256, 128) 29 | self.up_sample4 = _UpSampling(128, 64) 30 | 31 | self.outpu_conv = _FinalConvolution(64, num_classes) 32 | 33 | 34 | def forward(self, images): 35 | ''' 36 | Parameters 37 | .......... 38 | images (Tensor) - Tensor containing the sample images 39 | ''' 40 | 41 | x1 = self.input_conv(images) 42 | 43 | x2 = self.down_sample1(x1) 44 | x3 = self.down_sample2(x2) 45 | x4 = self.down_sample3(x3) 46 | x5 = self.down_sample4(x4) 47 | 48 | x = self.up_sample1(x5, x4) 49 | x = self.up_sample2(x, x3) 50 | x = self.up_sample3(x, x2) 51 | x = self.up_sample4(x, x1) 52 | 53 | output = self.outpu_conv(x) 54 | return output 55 | 56 | 57 | 58 | class _FinalConvolution(nn.Module): 59 | def __init__(self, in_channels, out_channels): 60 | super(_FinalConvolution, self).__init__() 61 | self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size=1) 62 | 63 | def forward(self, x): 64 | return self.conv2d(x) 65 | 66 | 67 | 68 | class _ConvolutionNetwork(nn.Module): 69 | 70 | def __init__(self, in_channels, out_channels): 71 | super(_ConvolutionNetwork, self).__init__() 72 | self.conv_net = nn.Sequential( 73 | nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, bias=False), 74 | nn.BatchNorm2d(out_channels), 75 | nn.ReLU(inplace=True), 76 | nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False), 77 | nn.BatchNorm2d(out_channels), 78 | nn.ReLU(inplace=True) 79 | ) 80 | 81 | def forward(self, x): 82 | return self.conv_net(x) 83 | 84 | 85 | class _DownSampling(nn.Module): 86 | 87 | def __init__(self, in_channels, out_channels): 88 | super(_DownSampling, self).__init__() 89 | self.down_sampled_conv = nn.Sequential( 90 | nn.MaxPool2d(kernel_size=2, stride=2), 91 | _ConvolutionNetwork(in_channels, out_channels) 92 | ) 93 | 94 | def forward(self, x): 95 | return self.down_sampled_conv(x) 96 | 97 | 98 | class _UpSampling(nn.Module): 99 | 100 | def __init__(self, in_channels, out_channels): 101 | super(_UpSampling, self).__init__() 102 | 103 | self.up_sample = nn.ConvTranspose2d(in_channels, in_channels//2, kernel_size=2, stride=2) 104 | self.up_sample_cov = _ConvolutionNetwork(in_channels, out_channels) 105 | 106 | 107 | def forward(self, x1, x2): 108 | x1 = self.up_sample(x1) 109 | diff2 = x2.size()[2] - x1.size()[2] 110 | diff3 = x2.size()[3] - x1.size()[3] 111 | 112 | x1 = torch_f.pad(x1, [diff3//2, diff3 - diff3//2, diff2//2, diff2 - diff2//2]) 113 | x = torch.cat([x2, x1], dim=1) 114 | return self.up_sample_cov(x) 115 | 116 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/__init__.py: -------------------------------------------------------------------------------- 1 | from .sedona_registration import SedonaRegistration 2 | from .adapter import Adapter 3 | from .geo_io import * 4 | 5 | __all__ = ["load_geo_data", "load_parquet_data", "load_data", "load_geotiff_image_as_binary_data", "load_geotiff_image_as_array_data", "write_geotiff_image_with_binary_data", "write_geotiff_image_with_array_data", 6 | "SedonaRegistration", "Adapter"] 7 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/enums/__init__.py: -------------------------------------------------------------------------------- 1 | from .geo_file_type import GeoFileType 2 | from .adjacency_type import AdjacencyType 3 | from .aggregation_type import AggregationType 4 | from .geo_relationship import GeoRelationship 5 | 6 | 7 | __all__ = ["GeoFileType", "AdjacencyType", "AggregationType", "GeoRelationship"] 8 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/enums/adjacency_type.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | import attr 3 | 4 | class AdjacencyType(Enum): 5 | BINARY = "SHAPE_FILE" 6 | EXPONENTIAL_DISTANCE = 'EXPONENTIAL_DISTANCE' 7 | EXPONENTIAL_CENTROID_DISTANCE = 'EXPONENTIAL_CENTROID_DISTANCE' 8 | COMMON_BORDER_RATIO = 'COMMON_BORDER_RATIO' 9 | 10 | @classmethod 11 | def from_str(cls, adjacency_type: str) -> 'AdjacencyType': 12 | try: 13 | adjacency_type = getattr(cls, adjacency_type.upper()) 14 | except AttributeError: 15 | raise AttributeError(f"{cls.__class__.__name__} has no {adjacency_type} attribute") 16 | return -------------------------------------------------------------------------------- /geotorchai/preprocessing/enums/aggregation_type.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | import attr 3 | 4 | class AggregationType(Enum): 5 | COUNT = "COUNT" 6 | SUM = 'SUM' 7 | AVG = 'AVG' 8 | MIN = 'MIN' 9 | MAX = 'MAX' 10 | 11 | def __str__(self): 12 | return str(self.value) 13 | 14 | @classmethod 15 | def from_str(cls, aggregation_type: str) -> 'AggregationType': 16 | try: 17 | aggregation_type = getattr(cls, aggregation_type.upper()) 18 | except AttributeError: 19 | raise AttributeError(f"{cls.__class__.__name__} has no {aggregation_type} attribute") 20 | return -------------------------------------------------------------------------------- /geotorchai/preprocessing/enums/geo_file_type.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | import attr 3 | 4 | class GeoFileType(Enum): 5 | SHAPE_FILE = "SHAPE_FILE" 6 | JSON_FILE = "JSON_FILE" 7 | WKB_FILE = "WKB_FILE" 8 | WKT_FILE = "WKT_FILE" 9 | 10 | @classmethod 11 | def from_str(cls, file_type: str) -> 'GeoFileType': 12 | try: 13 | file_type = getattr(cls, file_type.upper()) 14 | except AttributeError: 15 | raise AttributeError(f"{cls.__class__.__name__} has no {file_type} attribute") 16 | return -------------------------------------------------------------------------------- /geotorchai/preprocessing/enums/geo_relationship.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | import attr 3 | 4 | class GeoRelationship(Enum): 5 | CONTAINS = "ST_Contains" # 6 | INTERSECTS = 'ST_Intersects' 7 | TOUCHES = 'ST_Touches' 8 | WITHIN = 'ST_Within' 9 | 10 | def __str__(self): 11 | return str(self.value) 12 | 13 | @classmethod 14 | def from_str(cls, geo_relationship: str) -> 'GeoRelationship': 15 | try: 16 | geo_relationship = getattr(cls, geo_relationship.upper()) 17 | except AttributeError: 18 | raise AttributeError(f"{cls.__class__.__name__} has no {geo_relationship} attribute") 19 | return 20 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/grid/__init__.py: -------------------------------------------------------------------------------- 1 | from .adjacency import Adjacency 2 | from .st_manager import STManager 3 | from .space_partition import SpacePartition 4 | 5 | __all__ = ["Adjacency", "STManager", "SpacePartition"] 6 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/raster/__init__.py: -------------------------------------------------------------------------------- 1 | from .raster_processing import RasterProcessing 2 | 3 | __all__ = ["RasterProcessing"] 4 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/sedona_registration.py: -------------------------------------------------------------------------------- 1 | from pyspark.sql import SparkSession 2 | from geotorchai.utility.exceptions import SparkSessionInitException 3 | 4 | class SedonaRegistration: 5 | 6 | # class variables 7 | sedona = None 8 | 9 | @classmethod 10 | def set_sedona_context(cls, sedona: SparkSession): 11 | ''' 12 | Function sets the SparkSession object for use throughout the project. 13 | Same SparkSession instance is used in all functions and methods throughout the project 14 | 15 | Parameters 16 | .......... 17 | sparkSession: instance of SparkSession for use throughout the project 18 | 19 | Returns 20 | ....... 21 | It does not return anything, just store the sparkSession object (passed as parameter) or raise exception in the case od errors 22 | ''' 23 | 24 | try: 25 | SedonaRegistration.sedona = sedona 26 | except Exception as e: 27 | raise SparkSessionInitException(str(e)) 28 | 29 | 30 | 31 | def _get_sedona_context(): 32 | ''' 33 | returns the SparkSession instance 34 | ''' 35 | if SedonaRegistration.sedona == None: 36 | raise SparkSessionInitException("SparkSession was not initialized correctly") 37 | else: 38 | return SedonaRegistration.sedona 39 | 40 | 41 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/torch_df/__init__.py: -------------------------------------------------------------------------------- 1 | from .rs_classify_df import RasterClassificationDf 2 | from .rs_segment_df import RasterSegmentationDf 3 | from .st_df import SpatiotemporalDfToTorchData 4 | 5 | __all__ = ["RasterClassificationDf", "RasterSegmentationDf", "SpatiotemporalDfToTorchData"] 6 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/torch_df/rs_classify_df.py: -------------------------------------------------------------------------------- 1 | from pyspark.sql.functions import * 2 | from pyspark.sql.types import * 3 | import numpy as np 4 | from functools import partial 5 | from petastorm import TransformSpec 6 | from torchvision import transforms 7 | from geotorchai.preprocessing.sedona_registration import SedonaRegistration 8 | 9 | 10 | 11 | class RasterClassificationDf: 12 | 13 | def __init__(self, df_raster, col_data, col_label, include_additional_features=False, col_additional_features=None): 14 | self.df_raster = df_raster 15 | self.col_data = col_data 16 | self.col_label = col_label 17 | self.include_additional_features = include_additional_features 18 | self.col_additional_features = col_additional_features 19 | 20 | 21 | @classmethod 22 | def __transform_row(cls, batch_data, n_bands, height, width, transform=None): 23 | transformers = [transforms.Lambda(lambda x: x.reshape((n_bands, height, width)))] 24 | if transform is not None: 25 | transformers.extend([transforms.ToTensor(), transform]) 26 | 27 | trans = transforms.Compose(transformers) 28 | 29 | batch_data['image_data'] = batch_data['image_data'].map(lambda x: trans(x)) 30 | return batch_data 31 | 32 | 33 | 34 | def get_formatted_df(self): 35 | 36 | spark = SedonaRegistration._get_sedona_context() 37 | 38 | labels = list(self.df_raster.select(self.col_label).distinct().sort(col(self.col_label).asc()).toPandas()[self.col_label]) 39 | idx_to_class = {i: j for i, j in enumerate(labels)} 40 | class_to_idx = {value: key for key, value in idx_to_class.items()} 41 | self.class_ids_labels = idx_to_class 42 | class_data = list(class_to_idx.items()) 43 | class_df = spark.createDataFrame(class_data, ["__class_name__", "__label__"]) 44 | 45 | formatted_df = self.df_raster.join(class_df, self.df_raster[self.col_label] == class_df["__class_name__"], "left_outer") 46 | if self.include_additional_features: 47 | formatted_df = formatted_df.select(self.col_data, "__label__", self.col_additional_features) 48 | formatted_df = formatted_df.withColumnRenamed(self.col_data, "image_data").withColumnRenamed("__label__", "label") 49 | else: 50 | formatted_df = formatted_df.select(self.col_data, "__label__") 51 | formatted_df = formatted_df.withColumnRenamed(self.col_data, "image_data").withColumnRenamed("__label__", 52 | "label") 53 | return formatted_df 54 | 55 | 56 | def get_transform_spec(self, n_bands, height, width, transform=None): 57 | if self.include_additional_features: 58 | return TransformSpec(partial(RasterClassificationDf.__transform_row, n_bands=n_bands, height=height, width=width, transform=transform), 59 | edit_fields=[('image_data', np.float32, (n_bands, height, width), False)], 60 | selected_fields=['image_data', 'label', 'additional_features']) 61 | else: 62 | return TransformSpec(partial(RasterClassificationDf.__transform_row, n_bands=n_bands, height=height, width=width, transform=transform), 63 | edit_fields=[ 64 | ('image_data', np.float32, (n_bands, height, width), False)], 65 | selected_fields=['image_data', 'label']) 66 | 67 | 68 | def get_class_labels(self): 69 | return self.class_ids_labels 70 | 71 | 72 | -------------------------------------------------------------------------------- /geotorchai/preprocessing/torch_df/rs_segment_df.py: -------------------------------------------------------------------------------- 1 | from pyspark.sql.functions import * 2 | from pyspark.sql.types import * 3 | import numpy as np 4 | from functools import partial 5 | from petastorm import TransformSpec 6 | from torchvision import transforms 7 | from geotorchai.preprocessing.sedona_registration import SedonaRegistration 8 | 9 | 10 | class RasterSegmentationDf: 11 | 12 | def __init__(self, df_raster, col_data, col_label, is_label_masked=True, masking_threshold=255): 13 | self.df_raster = df_raster 14 | self.col_data = col_data 15 | self.col_label = col_label 16 | self.is_label_masked = is_label_masked 17 | self.masking_threshold = masking_threshold 18 | 19 | @classmethod 20 | def __transform_row(cls, batch_data, n_bands, height, width, transform=None): 21 | transformers = [transforms.Lambda(lambda x: x.reshape((n_bands, height, width)))] 22 | if transform is not None: 23 | transformers.extend([transforms.ToTensor(), transform]) 24 | trans = transforms.Compose(transformers) 25 | 26 | transformers_label = [transforms.Lambda(lambda x: x.reshape((height, width)))] 27 | trans_label = transforms.Compose(transformers_label) 28 | 29 | batch_data['image_data'] = batch_data['image_data'].map(lambda x: trans(x)) 30 | batch_data['label'] = batch_data['label'].map(lambda x: trans_label(x)) 31 | return batch_data 32 | 33 | 34 | def get_formatted_df(self): 35 | spark = SedonaRegistration._get_sedona_context() 36 | 37 | df_schema = StructType( 38 | [StructField("image_data", ArrayType(DoubleType()), False), StructField("label", ArrayType(IntegerType()), False)]) 39 | 40 | if self.is_label_masked: 41 | formatted_rdd = self.df_raster.rdd.map( 42 | lambda x: Row(image_data=x[self.col_data], label=x[self.col_label])) 43 | else: 44 | formatted_rdd = self.df_raster.rdd.map( 45 | lambda x: Row(image_data=x[self.col_data], label=np.where(np.array(x[self.col_label]) >= self.masking_threshold, 1, 0).tolist())) 46 | formatted_df = spark.createDataFrame(formatted_rdd, schema=df_schema) 47 | 48 | return formatted_df 49 | 50 | 51 | def get_transform_spec(self, n_bands, height, width, transform=None): 52 | return TransformSpec(partial(RasterSegmentationDf.__transform_row, n_bands=n_bands, height=height, width=width, transform=transform), 53 | edit_fields=[('image_data', np.float32, (n_bands, height, width), False), 54 | ('label', np.int32, (height, width), False)], 55 | selected_fields=['image_data', 'label']) 56 | 57 | -------------------------------------------------------------------------------- /geotorchai/transforms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/geotorchai/transforms/__init__.py -------------------------------------------------------------------------------- /geotorchai/transforms/raster.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | 4 | class AppendNormalizedDifferenceIndex(object): 5 | ''' 6 | This is a tranformation operation that calculates the Normalized Difference Index between two input 7 | channels and appends the calculated Normalized Difference Index to the raster image as a new channel. 8 | 9 | Parameters 10 | .......... 11 | band_index1 (Int) - Index of the first band. 12 | band_index2 (Int) - Index of the second band 13 | ''' 14 | 15 | def __init__(self, band_index1, band_index2): 16 | self.band_index1 = band_index1 17 | self.band_index2 = band_index2 18 | 19 | 20 | def __call__(self, sample): 21 | band1 = sample[self.band_index1] 22 | band2 = sample[self.band_index2] 23 | 24 | ndi = self._get_normalized_difference_index(band1, band2) 25 | 26 | return torch.cat((sample, ndi[None, :, :])) 27 | 28 | 29 | def _get_normalized_difference_index(self, band1, band2): 30 | sum_band = band1 + band2 31 | sum_band[sum_band == 0] = 1e-12 32 | return (band1 - band2)/sum_band 33 | 34 | 35 | 36 | class AppendRatioIndex(object): 37 | ''' 38 | This is a tranformation operation that calculates the ratio index between two input channels 39 | and appends the calculated Normalized Difference Index to the raster image as a new channel. 40 | 41 | Parameters 42 | .......... 43 | band_index1 (Int) - Index of the first band. 44 | band_index2 (Int) - Index of the second band 45 | ''' 46 | 47 | def __init__(self, band_index1, band_index2): 48 | self.band_index1 = band_index1 49 | self.band_index2 = band_index2 50 | 51 | 52 | def __call__(self, sample): 53 | band1 = sample[self.band_index1] 54 | band2 = sample[self.band_index2] 55 | 56 | ratio = self._get_ratio_index(band1, band2) 57 | 58 | return torch.cat((sample, ratio[None, :, :])) 59 | 60 | 61 | def _get_ratio_index(self, band1, band2): 62 | band2[band2 == 0] = 1e-12 63 | return band1/band2 64 | 65 | 66 | 67 | class AppendAWEI(object): 68 | ''' 69 | This is a tranformation operation that calculates the ratio index between two input channels 70 | and appends the calculated Normalized Difference Index to the raster image as a new channel. 71 | 72 | Parameters 73 | .......... 74 | band_index_green (Int) - Index of the green band. 75 | band_index_nir (Int) - Index of the NIR band 76 | band_index_swir1 (Int) - Index of the first SWIR band. 77 | band_index_swir2 (Int) - Index of the second SWIR band 78 | ''' 79 | 80 | def __init__(self, band_index_green, band_index_nir, band_index_swir1, band_index_swir2): 81 | self.band_index_green = band_index_green 82 | self.band_index_nir = band_index_nir 83 | self.band_index_swir1 = band_index_swir1 84 | self.band_index_swir2 = band_index_swir2 85 | 86 | 87 | def __call__(self, sample): 88 | band_green = sample[self.band_index_green] 89 | band_nir = sample[self.band_index_nir] 90 | band_swir1 = sample[self.band_index_swir1] 91 | band_swir2 = sample[self.band_index_swir2] 92 | 93 | awei = self._get_awei(band_green, band_nir, band_swir1, band_swir2) 94 | 95 | return torch.cat((sample, awei[None, :, :])) 96 | 97 | 98 | def _get_awei(self, band_green, band_nir, band_swir1, band_swir2): 99 | return 4*(band_green - band_swir1) - (0.25*band_nir + 2.75*band_swir2) 100 | 101 | -------------------------------------------------------------------------------- /geotorchai/utility/__init__.py: -------------------------------------------------------------------------------- 1 | from .torch_adapter import TorchAdapter 2 | 3 | __all__ = ["TorchAdapter"] 4 | -------------------------------------------------------------------------------- /geotorchai/utility/_download_utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import urllib.request 3 | import gzip 4 | import tarfile 5 | import zipfile 6 | import torch 7 | from torch.utils.model_zoo import tqdm 8 | import cdsapi 9 | from .exceptions import FileDownloadException, ExtractArchiveException 10 | 11 | 12 | def _download_remote_file(file_url: str, save_path: str) -> None: 13 | os.makedirs(save_path, exist_ok=True) 14 | file_name = file_url.split("/")[-1] 15 | full_save_path = os.path.join(save_path, file_name) 16 | 17 | for _ in range(4): 18 | with urllib.request.urlopen(urllib.request.Request(file_url, headers = {"Method": "HEAD", "User-Agent": "pytorch/geotorchai"})) as response: 19 | if response.url == file_url or response.url is None: 20 | break 21 | file_url = response.url 22 | else: 23 | raise FileDownloadException("Unable to download the requested file") 24 | 25 | print("File downloading started...") 26 | with urllib.request.urlopen(urllib.request.Request(file_url, headers={"User-Agent": "pytorch/geotorchai"})) as response: 27 | _save_chunk(iter(lambda: response.read(1024 * 32), b""), full_save_path, response.length) 28 | print("File downloading finished") 29 | 30 | 31 | 32 | def _extract_archive(from_path, to_path) -> None: 33 | if _is_tar(from_path): 34 | print("Archive extraction started...") 35 | with tarfile.open(from_path, 'r') as tar: 36 | tar.extractall(path=to_path) 37 | print("Archive extraction finished") 38 | elif _is_targz(from_path): 39 | print("Archive extraction started...") 40 | with tarfile.open(from_path, 'r:gz') as tar: 41 | tar.extractall(path=to_path) 42 | print("Archive extraction finished") 43 | elif _is_gzip(from_path): 44 | print("Archive extraction started...") 45 | to_path = os.path.join(to_path, os.path.splitext(os.path.basename(from_path))[0]) 46 | with open(to_path, "wb") as out_f, gzip.GzipFile(from_path) as zip_f: 47 | out_f.write(zip_f.read()) 48 | print("Archive extraction finished") 49 | elif _is_zip(from_path): 50 | print("Archive extraction started...") 51 | with zipfile.ZipFile(from_path, 'r') as z: 52 | z.extractall(to_path) 53 | print("Archive extraction finished") 54 | else: 55 | raise ExtractArchiveException("Extraction of {} not supported".format(from_path)) 56 | 57 | 58 | 59 | def _save_chunk(chunks, save_path, response_size): 60 | with open(save_path, "wb") as f, tqdm(total=response_size) as progress: 61 | for chunk in chunks: 62 | if not chunk: 63 | continue 64 | f.write(chunk) 65 | progress.update(len(chunk)) 66 | 67 | 68 | 69 | def _is_tar(filename): 70 | return filename.endswith(".tar") 71 | 72 | 73 | def _is_targz(filename): 74 | return filename.endswith(".tar.gz") 75 | 76 | 77 | def _is_gzip(filename): 78 | return filename.endswith(".gz") and not filename.endswith(".tar.gz") 79 | 80 | 81 | def _is_zip(filename): 82 | return filename.endswith(".zip") 83 | 84 | 85 | def _download_single_cdsapi_file(save_path: str, variable, years, months, days, times, level_type, pressure_level, grid, product_type, format_name): 86 | if level_type == 'pressure': 87 | file_name = variable + '_' + pressure_level + '_' + years[0] + '.nc' 88 | else: 89 | file_name = variable + '_' + years[0] + '.nc' 90 | 91 | api = cdsapi.Client() 92 | 93 | request_parameters = { 94 | 'product_type': product_type, 95 | 'format': format_name, 96 | 'variable': variable, 97 | 'year': years, 98 | 'month': months, 99 | 'day': days, 100 | 'time': times, 101 | } 102 | if level_type == 'pressure': 103 | request_parameters.update({'pressure_level': pressure_level}) 104 | if grid != None: 105 | request_parameters.update({'grid': grid}) 106 | 107 | api.retrieve( 108 | f'reanalysis-era5-{level_type}-levels', 109 | request_parameters, 110 | save_path + '/' + file_name 111 | ) 112 | 113 | 114 | def _download_cdsapi_files(save_path: str, variable, years, months, days, times, level_type, pressure_level = None, grid = None, product_type = 'reanalysis', format_name = 'netcdf'): 115 | os.makedirs(save_path, exist_ok=True) 116 | 117 | for year in years: 118 | _download_single_cdsapi_file(save_path, variable, [year], months, days, times, level_type, pressure_level = pressure_level, grid = grid, product_type = product_type, format_name = format_name) 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /geotorchai/utility/exceptions.py: -------------------------------------------------------------------------------- 1 | 2 | class InvalidParametersException(Exception): 3 | """ 4 | Exception added to handle invalid constructor of function parameters 5 | """ 6 | 7 | def __init__(self, msg: str): 8 | super().__init__(msg) 9 | 10 | 11 | 12 | 13 | class FileDownloadException(Exception): 14 | """ 15 | Exception added to handle error in downloading file from remote url 16 | """ 17 | 18 | def __init__(self, msg: str): 19 | super().__init__(msg) 20 | 21 | 22 | 23 | 24 | class ExtractArchiveException(Exception): 25 | """ 26 | Exception added to handle invalid file type in extracting archives 27 | """ 28 | 29 | def __init__(self, msg: str): 30 | super().__init__(msg) 31 | 32 | 33 | 34 | 35 | class SparkSessionInitException(Exception): 36 | """ 37 | Exception added to handle errors related to dealing SparkSession instance 38 | """ 39 | 40 | def __init__(self, msg: str): 41 | super().__init__(msg) -------------------------------------------------------------------------------- /geotorchai/utility/properties.py: -------------------------------------------------------------------------------- 1 | 2 | class classproperty(object): 3 | 4 | def __init__(self, f): 5 | self.f = f 6 | 7 | def __get__(self, obj, owner): 8 | return self.f(owner) 9 | 10 | def __set__(self, instance, value): 11 | return self.f() 12 | -------------------------------------------------------------------------------- /geotorchai/utility/types.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | numeric = Union[float, int] 4 | path = str 5 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import find_packages, setup 2 | from pathlib import Path 3 | 4 | this_directory = Path(__file__).parent 5 | long_description = (this_directory / "README.md").read_text() 6 | 7 | keywords=[ 8 | "spatial-machine-learning", 9 | "spatiotemporal-deep-learning", 10 | "spatial forecasting", 11 | "deep learning", 12 | "machine learning", 13 | "spatiotemporal forecasting", 14 | "temporal signal", 15 | "raster classification", 16 | "satellite classification", 17 | "raster segmentation", 18 | "satellite segmentation", 19 | "convlstm", 20 | "st-resnet", 21 | "deepstn+", 22 | "deepsatv2", 23 | "lstm", 24 | "temporal network", 25 | "eurosat", 26 | "representation learning", 27 | ] 28 | 29 | setup( 30 | name='geotorchai', 31 | packages=find_packages(), 32 | version='1.1.0', 33 | description='GeoTorchAI, formarly GeoTorch, A Spatiotemporal Deep Learning Framework', 34 | long_description = long_description, 35 | long_description_content_type = "text/markdown", 36 | author='Kanchan Chowdhury', 37 | author_email='kchowdh1@asu.edu', 38 | url='https://github.com/DataSystemsLab/GeoTorch', 39 | license='AGPL-3.0', 40 | install_requires=[ 41 | 'torch', 42 | 'torchvision', 43 | 'rasterio', 44 | 'scikit-image >= 0.19.0', 45 | 'petastorm', 46 | 'numpy', 47 | 'Pandas<=1.3.5', 48 | 'xarray', 49 | 'cdsapi', 50 | 'matplotlib', 51 | 'pydeck', 52 | 'geojson', 53 | ], 54 | extras_require={ 55 | 'Preprocessing': ['pyspark', 'apache-sedona'], 56 | }, 57 | setup_requires=['pytest-runner'], 58 | tests_require=['pytest'], 59 | test_suite='tests', 60 | python_requires=">=3.7", 61 | keywords=keywords, 62 | classifiers=[ 63 | "Development Status :: 3 - Alpha", 64 | "Intended Audience :: Developers", 65 | "Intended Audience :: Science/Research", 66 | "Topic :: Software Development :: Build Tools", 67 | "Topic :: Scientific/Engineering :: Artificial Intelligence", 68 | "Topic :: Scientific/Engineering :: GIS", 69 | "Operating System :: OS Independent", 70 | "Programming Language :: Python :: 3.7", 71 | ], 72 | ) 73 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/tests/__init__.py -------------------------------------------------------------------------------- /tests/deep-learning/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/tests/deep-learning/__init__.py -------------------------------------------------------------------------------- /tests/deep-learning/test_grid_datasets.py: -------------------------------------------------------------------------------- 1 | from geotorchai.datasets.grid import BikeNYCDeepSTN, TaxiBJ21 2 | 3 | 4 | class TestGridDatasets: 5 | 6 | 7 | def test_bike_nyc_deepstn_dataset_length(self): 8 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 9 | assert len(data) == 792 10 | 11 | 12 | def test_bike_nyc_deepstn_dataset_closeness(self): 13 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 14 | sample = data[0]["x_closeness"].shape 15 | assert sample[0] == 6 and sample[1] == 21 and sample[2] == 12 16 | 17 | 18 | def test_bike_nyc_deepstn_dataset_period(self): 19 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 20 | sample = data[0]["x_period"].shape 21 | assert sample[0] == 8 and sample[1] == 21 and sample[2] == 12 22 | 23 | 24 | def test_bike_nyc_deepstn_dataset_trend(self): 25 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 26 | sample = data[0]["x_trend"].shape 27 | assert sample[0] == 8 and sample[1] == 21 and sample[2] == 12 28 | 29 | 30 | def test_bike_nyc_deepstn_dataset_label(self): 31 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 32 | sample = data[0]["y_data"].shape 33 | assert sample[0] == 2 and sample[1] == 21 and sample[2] == 12 34 | 35 | 36 | def test_taxi_bj21_dataset_length(self): 37 | data = TaxiBJ21(root = "data/partial_datasets/grid2") 38 | data.set_sequential_representation(24, 1) 39 | assert len(data) == 1399 40 | 41 | 42 | 43 | def test_taxi_bj21_dataset_history(self): 44 | data = TaxiBJ21(root = "data/partial_datasets/grid2") 45 | data.set_sequential_representation(24, 1) 46 | sample = data[0]["x_data"].shape 47 | assert sample[0] == 24 and sample[1] == 2 and sample[2] == 32 and sample[3] == 32 48 | 49 | 50 | def test_taxi_bj21_dataset_predict(self): 51 | data = TaxiBJ21(root = "data/partial_datasets/grid2") 52 | data.set_sequential_representation(24, 1) 53 | sample = data[0]["y_data"].shape 54 | assert sample[0] == 1 and sample[1] == 2 and sample[2] == 32 and sample[3] == 32 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /tests/deep-learning/test_models.py: -------------------------------------------------------------------------------- 1 | from geotorchai.datasets.raster import EuroSAT, Cloud38 2 | from geotorchai.models.raster import DeepSatV2, SatCNN, FullyConvolutionalNetwork, UNet 3 | from geotorchai.models.grid import STResNet, DeepSTN, ConvLSTM 4 | from geotorchai.datasets.grid import BikeNYCDeepSTN 5 | from torch.utils.data import DataLoader 6 | import torch 7 | 8 | 9 | class TestModels: 10 | 11 | 12 | def test_deepsatv2(self): 13 | model = DeepSatV2(3, 64, 64, 10, len(EuroSAT.ADDITIONAL_FEATURES)) 14 | data = EuroSAT(root = "data/partial_datasets/raster1", bands=EuroSAT.RGB_BANDS, include_additional_features = True) 15 | loader = DataLoader(data, batch_size=2) 16 | inputs, labels, features = next(iter(loader)) 17 | outputs = model(inputs, features) 18 | assert outputs.shape[0] == labels.shape[0] 19 | 20 | 21 | def test_satcnn(self): 22 | model = SatCNN(3, 64, 64, 10) 23 | data = EuroSAT(root = "data/partial_datasets/raster1", bands=EuroSAT.RGB_BANDS) 24 | loader = DataLoader(data, batch_size=2) 25 | inputs, labels = next(iter(loader)) 26 | outputs = model(inputs) 27 | assert outputs.shape[0] == labels.shape[0] 28 | 29 | 30 | def test_fcn(self): 31 | model = FullyConvolutionalNetwork(4, 2) 32 | data = Cloud38(root = "data/partial_datasets/raster3") 33 | loader = DataLoader(data, batch_size=1) 34 | inputs, labels = next(iter(loader)) 35 | outputs = model(inputs) 36 | predicted = outputs.argmax(dim=1) 37 | assert predicted.shape[0] == labels.shape[0] 38 | 39 | 40 | def test_unet(self): 41 | model = UNet(4, 2) 42 | data = Cloud38(root = "data/partial_datasets/raster3") 43 | loader = DataLoader(data, batch_size=1) 44 | inputs, labels = next(iter(loader)) 45 | outputs = model(inputs) 46 | predicted = outputs.argmax(dim=1) 47 | assert predicted.shape[0] == labels.shape[0] 48 | 49 | 50 | def test_stresnet(self): 51 | len_closeness = 3 52 | len_period = 4 53 | len_trend = 4 54 | nb_residual_unit = 4 55 | map_height, map_width = 21, 12 56 | nb_flow = 2 57 | 58 | model = STResNet((len_closeness, nb_flow, map_height, map_width), 59 | (len_period, nb_flow, map_height, map_width), 60 | (len_trend, nb_flow , map_height, map_width), 61 | external_dim = None, nb_residual_unit = nb_residual_unit) 62 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 63 | loader = DataLoader(data, batch_size=4) 64 | 65 | sample = next(iter(loader)) 66 | X_c = sample["x_closeness"].type(torch.FloatTensor) 67 | X_p = sample["x_period"].type(torch.FloatTensor) 68 | X_t = sample["x_trend"].type(torch.FloatTensor) 69 | Y_batch = sample["y_data"].type(torch.FloatTensor) 70 | 71 | outputs = model(X_c, X_p, X_t, None) 72 | assert outputs.shape[0] == Y_batch.shape[0] 73 | 74 | 75 | def test_deepstn(self): 76 | len_closeness = 3 77 | len_period = 4 78 | len_trend = 4 79 | nb_residual_unit = 4 80 | map_height, map_width = 21, 12 81 | nb_flow = 2 82 | 83 | model = DeepSTN(H=map_height, W=map_width,channel=2, 84 | c=len_closeness,p=len_period, t = len_trend, 85 | pre_F=64,conv_F=64,R_N=2, 86 | is_plus=True, 87 | plus=8,rate=1, 88 | is_pt=True,P_N=9,T_F=56,PT_F=9,T=24, 89 | dropVal=0.1) 90 | data = BikeNYCDeepSTN(root = "data/partial_datasets/grid1") 91 | loader = DataLoader(data, batch_size=2) 92 | 93 | sample = next(iter(loader)) 94 | X_c = sample["x_closeness"].type(torch.FloatTensor) 95 | X_p = sample["x_period"].type(torch.FloatTensor) 96 | X_t = sample["x_trend"].type(torch.FloatTensor) 97 | t_data = sample["t_data"].type(torch.FloatTensor) 98 | p_data = sample["p_data"].type(torch.FloatTensor) 99 | Y_batch = sample["y_data"].type(torch.FloatTensor) 100 | 101 | outputs = model(X_c, X_p, X_t, t_data, p_data) 102 | assert outputs.shape[0] == Y_batch.shape[0] 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /tests/deep-learning/test_raster_datasets.py: -------------------------------------------------------------------------------- 1 | from geotorchai.datasets.raster import EuroSAT, SlumDetection, Cloud38 2 | 3 | 4 | class TestRasterDatasets: 5 | 6 | 7 | def test_eurosat_length(self): 8 | data = EuroSAT(root = "data/partial_datasets/raster1") 9 | assert len(data) == 10 10 | 11 | 12 | def test_eurosat_input_bands(self): 13 | data = EuroSAT(root = "data/partial_datasets/raster1") 14 | input_data, label = data[0] 15 | assert input_data.shape[0] == 13 16 | 17 | 18 | def test_eurosat_input_grid(self): 19 | data = EuroSAT(root = "data/partial_datasets/raster1") 20 | input_data, label = data[0] 21 | assert input_data.shape[1] == 64 and input_data.shape[2] == 64 22 | 23 | 24 | def test_eurosat_input_features(self): 25 | data = EuroSAT(root = "data/partial_datasets/raster1", include_additional_features = True) 26 | input_data, label, feature = data[0] 27 | assert len(feature) == 13 28 | 29 | 30 | def test_slum_detection_length(self): 31 | data = SlumDetection(root = "data/partial_datasets/raster2") 32 | assert len(data) == 4 33 | 34 | 35 | def test_slum_detection_input_bands(self): 36 | data = SlumDetection(root = "data/partial_datasets/raster2") 37 | input_data, label = data[0] 38 | assert input_data.shape[0] == 4 39 | 40 | 41 | def test_slum_detection_input_grid(self): 42 | data = SlumDetection(root = "data/partial_datasets/raster2") 43 | input_data, label = data[0] 44 | assert input_data.shape[1] == 32 and input_data.shape[2] == 32 45 | 46 | 47 | def test_cloud38_length(self): 48 | data = Cloud38(root = "data/partial_datasets/raster3") 49 | assert len(data) == 1 50 | 51 | 52 | def test_cloud38_input_bands(self): 53 | data = Cloud38(root = "data/partial_datasets/raster3") 54 | input_data, label = data[0] 55 | assert input_data.shape[0] == 4 56 | 57 | 58 | def test_cloud38_input_grid(self): 59 | data = Cloud38(root = "data/partial_datasets/raster3") 60 | input_data, label = data[0] 61 | assert input_data.shape[1] == 384 and input_data.shape[2] == 384 62 | 63 | 64 | def test_cloud38_output_grid(self): 65 | data = Cloud38(root = "data/partial_datasets/raster3") 66 | input_data, label = data[0] 67 | assert label.shape[0] == 384 and label.shape[1] == 384 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /tests/deep-learning/test_transforms.py: -------------------------------------------------------------------------------- 1 | from geotorchai.datasets.raster import EuroSAT 2 | from geotorchai.transforms.raster import AppendNormalizedDifferenceIndex, AppendRatioIndex, AppendAWEI 3 | 4 | 5 | class TestTransforms: 6 | 7 | 8 | def test_append_norm_diff_index(self): 9 | transformation = AppendNormalizedDifferenceIndex(2, 7) 10 | data = EuroSAT(root = "data/partial_datasets/raster1", transform = transformation) 11 | input_data, label = data[0] 12 | assert input_data.shape[0] == 14 13 | 14 | 15 | def test_append_ratio_index(self): 16 | transformation = AppendRatioIndex(3, 7) 17 | data = EuroSAT(root = "data/partial_datasets/raster1", transform = transformation) 18 | input_data, label = data[0] 19 | assert input_data.shape[0] == 14 20 | 21 | 22 | def test_append_awei_index(self): 23 | transformation = AppendAWEI(2, 7, 11, 12) 24 | data = EuroSAT(root = "data/partial_datasets/raster1", transform = transformation) 25 | input_data, label = data[0] 26 | assert input_data.shape[0] == 14 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /tests/preprocessing/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wherobots/GeoTorchAI/d2a6c399fef2a23fc262946cdfa737629a27110d/tests/preprocessing/__init__.py -------------------------------------------------------------------------------- /tests/preprocessing/test_adjacency.py: -------------------------------------------------------------------------------- 1 | from geotorchai.preprocessing.grid import Adjacency 2 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 3 | from tests.preprocessing.utility import are_dfs_equal 4 | from shapely.geometry import Polygon 5 | from shapely.geometry import Point 6 | from pyspark.sql.types import StructType 7 | from pyspark.sql.types import StructField 8 | from pyspark.sql.types import IntegerType 9 | from pyspark.sql.types import ArrayType 10 | from pyspark.sql.types import LongType 11 | from pyspark.sql.types import DoubleType 12 | from sedona.sql.types import GeometryType 13 | 14 | 15 | class TestAdjacency: 16 | 17 | 18 | def test_get_polygons_adjacency(self): 19 | TestSedonaRegistration.set_sedona_context() 20 | 21 | spark = TestSedonaRegistration._get_sedona_context() 22 | 23 | schema_cells = StructType( 24 | [ 25 | StructField("cell_id", IntegerType(), False), 26 | StructField("geometry", GeometryType(), False) 27 | ]) 28 | 29 | ids = [0, 1, 2, 3] 30 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]), Polygon([[0, 1], [1, 1], [1, 2], [0, 2], [0, 1]]), Polygon([[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]])] 31 | cells_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 32 | actual_df = Adjacency.get_polygons_adjacency(cells_df, "cell_id", "geometry") 33 | 34 | adj_list = [[0, 1, 1, 1], [1, 0, 1, 1], [1, 1, 0, 1], [1, 1, 1, 0]] 35 | schema_adj_list = StructType( 36 | [ 37 | StructField("id", LongType(), False), 38 | StructField("binary_adjacency", ArrayType(LongType()), False) 39 | ]) 40 | expected_df = spark.createDataFrame(zip(ids, adj_list), schema = schema_adj_list) 41 | 42 | assert are_dfs_equal(expected_df, actual_df) 43 | 44 | 45 | 46 | 47 | def test_get_points_adjacency(self): 48 | TestSedonaRegistration.set_sedona_context() 49 | 50 | spark = TestSedonaRegistration._get_sedona_context() 51 | 52 | schema_cells = StructType( 53 | [ 54 | StructField("point_id", IntegerType(), False), 55 | StructField("geometry", GeometryType(), False) 56 | ]) 57 | 58 | ids = [0, 1, 2, 3] 59 | points = [Point(0, 0), Point(1, 0), Point(0, 1), Point(1, 1)] 60 | points_df = spark.createDataFrame(zip(ids, points), schema = schema_cells) 61 | actual_df = Adjacency.get_points_adjacency(points_df, "point_id", "geometry") 62 | 63 | adj_list = [[1.0, 0.6065306597126335, 0.6065306597126335, 0.36787944117144233], [0.6065306597126335, 1.0, 0.36787944117144233, 0.6065306597126335], [0.6065306597126335, 0.36787944117144233, 1.0, 0.6065306597126335], [0.36787944117144233, 0.6065306597126335, 0.6065306597126335, 1.0]] 64 | schema_adj_list = StructType( 65 | [ 66 | StructField("id", LongType(), False), 67 | StructField("exponential_distances", ArrayType(DoubleType()), False) 68 | ]) 69 | expected_df = spark.createDataFrame(zip(ids, adj_list), schema = schema_adj_list) 70 | 71 | assert are_dfs_equal(expected_df, actual_df) 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /tests/preprocessing/test_data_loader.py: -------------------------------------------------------------------------------- 1 | import os 2 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 3 | from geotorchai.preprocessing import load_geo_data, load_geotiff_image_as_array_data, write_geotiff_image_with_array_data 4 | from geotorchai.preprocessing.enums import GeoFileType 5 | 6 | 7 | class TestDataLoading: 8 | 9 | 10 | def test_load_geo_data_with_shape_file(self): 11 | TestSedonaRegistration.set_sedona_context() 12 | 13 | zones = load_geo_data("data/taxi_trip/taxi_zones_2", GeoFileType.SHAPE_FILE) 14 | assert zones.rawSpatialRDD.count() == 263 15 | 16 | 17 | def test_load_geo_data_with_json_file(self): 18 | TestSedonaRegistration.set_sedona_context() 19 | 20 | zones = load_geo_data("data/testPolygon.json", GeoFileType.JSON_FILE) 21 | assert zones.rawSpatialRDD.count() == 1001 22 | 23 | 24 | def test_load_geo_data_with_wkb_file(self): 25 | TestSedonaRegistration.set_sedona_context() 26 | 27 | zones = load_geo_data("data/county_small_wkb.tsv", GeoFileType.WKB_FILE) 28 | assert zones.rawSpatialRDD.count() == 103 29 | 30 | 31 | def test_load_geo_data_with_wkt_file(self): 32 | TestSedonaRegistration.set_sedona_context() 33 | 34 | zones = load_geo_data("data/county_small.tsv", GeoFileType.WKT_FILE) 35 | assert zones.rawSpatialRDD.count() == 103 36 | 37 | 38 | def test_load_geotiff_without_reading_crs(self): 39 | TestSedonaRegistration.set_sedona_context() 40 | 41 | df = load_geotiff_image_as_array_data("data/raster") 42 | df_first = df.first() 43 | assert str(df_first[1]) == "POLYGON ((-13095782 4021226.5, -13095782 3983905, -13058822 3983905, -13058822 4021226.5, -13095782 4021226.5))" 44 | assert df_first[2] == 517 45 | assert df_first[3] == 512 46 | assert df_first[5] == 1 47 | 48 | 49 | def test_load_geotiff_with_read_from_crs(self): 50 | TestSedonaRegistration.set_sedona_context() 51 | 52 | df = load_geotiff_image_as_array_data("data/raster", options_dict={"readFromCRS": "EPSG:4499"}) 53 | df_first = df.first() 54 | assert str(df_first[1]) == "POLYGON ((-13095782 4021226.5, -13095782 3983905, -13058822 3983905, -13058822 4021226.5, -13095782 4021226.5))" 55 | assert df_first[2] == 517 56 | assert df_first[3] == 512 57 | assert df_first[5] == 1 58 | 59 | 60 | def test_geotiff_writing_with_coalesce(self): 61 | TestSedonaRegistration.set_sedona_context() 62 | 63 | df = load_geotiff_image_as_array_data("data/raster", options_dict={"readToCRS": "EPSG:4326"}) 64 | write_geotiff_image_with_array_data(df, "data/raster-written", num_partitions = 1) 65 | 66 | load_path = "data/raster-written" 67 | folders = os.listdir(load_path) 68 | for folder in folders: 69 | if os.path.isdir(load_path + "/" + folder): 70 | load_path = load_path + "/" + folder 71 | 72 | df = load_geotiff_image_as_array_data(load_path) 73 | df_first = df.first() 74 | assert df_first[2] == 517 75 | assert df_first[3] == 512 76 | assert df_first[5] == 1 77 | 78 | 79 | def test_geotiff_writing_with_write_to_crs(self): 80 | TestSedonaRegistration.set_sedona_context() 81 | 82 | df = load_geotiff_image_as_array_data("data/raster") 83 | write_geotiff_image_with_array_data(df, "data/raster-written", options_dict={"writeToCRS": "EPSG:4499"}, num_partitions = 1) 84 | 85 | load_path = "data/raster-written" 86 | folders = os.listdir(load_path) 87 | for folder in folders: 88 | if os.path.isdir(load_path + "/" + folder): 89 | load_path = load_path + "/" + folder 90 | 91 | df = load_geotiff_image_as_array_data(load_path) 92 | df_first = df.first() 93 | assert df_first[2] == 517 94 | assert df_first[3] == 512 95 | assert df_first[5] == 1 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /tests/preprocessing/test_distributed_torch_df.py: -------------------------------------------------------------------------------- 1 | from pyspark.sql.functions import lit 2 | import torch 3 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 4 | from geotorchai.preprocessing import load_geotiff_image_as_binary_data, load_parquet_data 5 | from geotorchai.preprocessing.torch_df import RasterClassificationDf 6 | from geotorchai.preprocessing.torch_df import SpatiotemporalDfToTorchData 7 | from geotorchai.preprocessing.raster import RasterProcessing as rp 8 | 9 | 10 | class TestRasterTransform: 11 | 12 | def test_classify_formatted_df_input(self): 13 | TestSedonaRegistration.set_sedona_context() 14 | 15 | df = load_geotiff_image_as_binary_data("data/raster/test3.tif") 16 | df_data = rp.get_array_from_binary_raster(df, 4, "content", "image_data") 17 | df_data = df_data.withColumn("category", lit(0)) 18 | 19 | formatted_df = RasterClassificationDf(df_data, "image_data", "category").get_formatted_df() 20 | assert len(formatted_df.select("image_data").first()[0]) == 4096 21 | 22 | 23 | def test_classify_formatted_df_label(self): 24 | TestSedonaRegistration.set_sedona_context() 25 | 26 | df = load_geotiff_image_as_binary_data("data/raster/test3.tif") 27 | df_data = rp.get_array_from_binary_raster(df, 4, "content", "image_data") 28 | df_data = df_data.withColumn("category", lit(0)) 29 | 30 | formatted_df = RasterClassificationDf(df_data, "image_data", "category").get_formatted_df() 31 | assert formatted_df.select("label").first()[0] == 0 32 | 33 | 34 | def test_classify_formatted_df_input_element(self): 35 | TestSedonaRegistration.set_sedona_context() 36 | 37 | df = load_geotiff_image_as_binary_data("data/raster/test3.tif") 38 | df_data = rp.get_array_from_binary_raster(df, 4, "content", "image_data") 39 | df_data = df_data.withColumn("category", lit(0)) 40 | 41 | formatted_df = RasterClassificationDf(df_data, "image_data", "category").get_formatted_df() 42 | assert formatted_df.select("image_data").first()[0][0] == 1151.0 43 | 44 | 45 | def test_st_prediction_formatted_df_periodical_length(self): 46 | TestSedonaRegistration.set_sedona_context() 47 | 48 | df = load_parquet_data('data/nyc_st_df.parquet') 49 | objStDf = SpatiotemporalDfToTorchData(df, "_id_timestep", "cell_id", ["aggregated_feature"], 744, 12, 12) 50 | objStDf.set_periodical_representation() 51 | assert len(objStDf) == 72 52 | 53 | 54 | def test_st_prediction_formatted_df_min_max_info(self): 55 | TestSedonaRegistration.set_sedona_context() 56 | 57 | df = load_parquet_data('data/nyc_st_df.parquet') 58 | objStDf = SpatiotemporalDfToTorchData(df, "_id_timestep", "cell_id", ["aggregated_feature"], 744, 12, 12) 59 | min_max_difference, min_max_sum = objStDf.get_min_max_info() 60 | assert min_max_difference == 12.0 and min_max_sum == 12.0 61 | 62 | 63 | def test_st_prediction_formatted_df_representation(self): 64 | TestSedonaRegistration.set_sedona_context() 65 | 66 | df = load_parquet_data('data/nyc_st_df.parquet') 67 | objStDf = SpatiotemporalDfToTorchData(df, "_id_timestep", "cell_id", ["aggregated_feature"], 744, 12, 12) 68 | sample = objStDf[0] 69 | assert sample['x_data'].shape == torch.Size([1, 12, 12]) and sample['y_data'].shape == torch.Size( 70 | [1, 12, 12]) 71 | 72 | 73 | def test_st_prediction_formatted_df_sequential_representation(self): 74 | TestSedonaRegistration.set_sedona_context() 75 | 76 | df = load_parquet_data('data/nyc_st_df.parquet') 77 | objStDf = SpatiotemporalDfToTorchData(df, "_id_timestep", "cell_id", ["aggregated_feature"], 744, 12, 12) 78 | objStDf.set_sequential_representation(24, 5) 79 | sample = objStDf[0] 80 | assert sample['x_data'].shape == torch.Size([24, 1, 12, 12]) and sample['y_data'].shape == torch.Size( 81 | [5, 1, 12, 12]) 82 | 83 | 84 | def test_st_prediction_formatted_df_periodical_representation(self): 85 | TestSedonaRegistration.set_sedona_context() 86 | 87 | df = load_parquet_data('data/nyc_st_df.parquet') 88 | objStDf = SpatiotemporalDfToTorchData(df, "_id_timestep", "cell_id", ["aggregated_feature"], 744, 12, 12) 89 | objStDf.set_periodical_representation() 90 | sample = objStDf[0] 91 | assert sample['x_closeness'].shape == torch.Size([3, 12, 12]) and sample['x_period'].shape == torch.Size([4, 12, 12]) and sample['x_trend'].shape == torch.Size([4, 12, 12]) and sample['t_data'].shape == torch.Size([31, 12, 12]) and sample['y_data'].shape == torch.Size([1, 12, 12]) 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /tests/preprocessing/test_feature_aggregation.py: -------------------------------------------------------------------------------- 1 | from geotorchai.preprocessing.grid import STManager 2 | from geotorchai.preprocessing.enums import GeoRelationship 3 | from geotorchai.preprocessing.enums import AggregationType 4 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 5 | from tests.preprocessing.utility import are_dfs_equal 6 | from shapely.geometry import Polygon 7 | from shapely.geometry import Point 8 | from pyspark.sql.types import StructType 9 | from pyspark.sql.types import StructField 10 | from pyspark.sql.types import IntegerType 11 | from pyspark.sql.types import ArrayType 12 | from pyspark.sql.types import LongType 13 | from pyspark.sql.types import DoubleType 14 | from sedona.sql.types import GeometryType 15 | 16 | 17 | class TestFeatureAggregation: 18 | 19 | 20 | 21 | def test_aggregate_two_spatial_dataframes(self): 22 | TestSedonaRegistration.set_sedona_context() 23 | 24 | spark = TestSedonaRegistration._get_sedona_context() 25 | 26 | schema_cells = StructType( 27 | [ 28 | StructField("cell_id", IntegerType(), False), 29 | StructField("geometry1", GeometryType(), False) 30 | ]) 31 | ids = [0, 1] 32 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]])] 33 | cells_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 34 | 35 | schema_points = StructType( 36 | [ 37 | StructField("geometry", GeometryType(), False), 38 | StructField("feature", IntegerType(), False) 39 | ]) 40 | feature = [2, 4] 41 | points = [Point(0.5, 0.5), Point(0.75, 0.5)] 42 | points_df = spark.createDataFrame(zip(points, feature), schema = schema_points) 43 | 44 | schema_expected = StructType( 45 | [ 46 | StructField("cell_id", IntegerType(), False), 47 | StructField("avg_feature", DoubleType(), False) 48 | ]) 49 | expected_df = spark.createDataFrame(zip([0], [3.0]), schema = schema_expected) 50 | 51 | column_list = ["feature"] 52 | agg_types_list = [AggregationType.AVG] 53 | alias_list = ["avg_feature"] 54 | actual_df = STManager.aggregate_spatial_dfs(cells_df, points_df, "geometry1", "geometry", "cell_id", GeoRelationship.CONTAINS, column_list, agg_types_list, alias_list) 55 | 56 | assert are_dfs_equal(expected_df, actual_df) 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /tests/preprocessing/test_raster_transform.py: -------------------------------------------------------------------------------- 1 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 2 | from geotorchai.preprocessing import load_geotiff_image_as_array_data, load_geotiff_image_as_binary_data 3 | from geotorchai.preprocessing.raster import RasterProcessing as rp 4 | 5 | 6 | class TestRasterTransform: 7 | 8 | 9 | def test_get_raster_band(self): 10 | TestSedonaRegistration.set_sedona_context() 11 | 12 | df = load_geotiff_image_as_array_data("data/raster") 13 | df = rp.get_band_from_array_data(df, 0, "data", "nBands", return_full_dataframe=False) 14 | assert len(df.first()[0]) == 512 * 517 15 | 16 | 17 | def test_get_second_raster_band(self): 18 | TestSedonaRegistration.set_sedona_context() 19 | 20 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 21 | df = rp.get_band_from_array_data(df, 1, "data", "nBands", return_full_dataframe=False) 22 | assert len(df.first()[0]) == 32 * 32 23 | 24 | 25 | def test_get_second_raster_band_elements(self): 26 | TestSedonaRegistration.set_sedona_context() 27 | 28 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 29 | df = rp.get_band_from_array_data(df, 1, "data", "nBands", return_full_dataframe=False) 30 | assert df.first()[0][1] == 956.0 31 | 32 | 33 | def test_get_fourth_raster_band_elements(self): 34 | TestSedonaRegistration.set_sedona_context() 35 | 36 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 37 | df = rp.get_band_from_array_data(df, 3, "data", "nBands", return_full_dataframe=False) 38 | assert df.first()[0][2] == 0.0 39 | 40 | 41 | def test_append_norm_diff_data_length(self): 42 | TestSedonaRegistration.set_sedona_context() 43 | 44 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 45 | df = df.selectExpr("data", "nBands") 46 | df_first = df.first() 47 | n_bands = df_first[1] 48 | length_initial = len(df_first[0]) 49 | length_band = length_initial//n_bands 50 | 51 | df = rp.append_normalized_difference_index(df, 0, 1, "data", "nBands") 52 | assert len(df.first()[0]) == length_initial + length_band 53 | 54 | 55 | def test_append_norm_diff_data_elements(self): 56 | TestSedonaRegistration.set_sedona_context() 57 | 58 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 59 | df = df.selectExpr("data", "nBands") 60 | df_first = df.first() 61 | n_bands = df_first[1] 62 | length_initial = len(df_first[0]) 63 | length_band = length_initial//n_bands 64 | 65 | df = rp.append_normalized_difference_index(df, 1, 0, "data", "nBands") 66 | df_first = df.first() 67 | assert df_first[0][length_initial] == 0.13 and df_first[0][length_initial + length_band - 1] == 0.03 68 | 69 | 70 | def test_append_norm_diff_bands_count(self): 71 | TestSedonaRegistration.set_sedona_context() 72 | 73 | df = load_geotiff_image_as_array_data("data/raster/test3.tif") 74 | df = df.selectExpr("data", "nBands") 75 | n_bands = df.first()[1] 76 | 77 | df = rp.append_normalized_difference_index(df, 0, 1, "data", "nBands") 78 | assert df.first()[1] == n_bands + 1 79 | 80 | 81 | def test_get_array_from_binary_raster(self): 82 | TestSedonaRegistration.set_sedona_context() 83 | 84 | df = load_geotiff_image_as_binary_data("data/raster/test3.tif") 85 | df_data = rp.get_array_from_binary_raster(df, 4, "content", "image_data") 86 | 87 | assert len(df_data.select("image_data").first()[0]) == 4096 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /tests/preprocessing/test_sedona_registration.py: -------------------------------------------------------------------------------- 1 | from sedona.spark import SedonaContext 2 | from geotorchai.utility.exceptions import SparkSessionInitException 3 | from geotorchai.preprocessing import SedonaRegistration 4 | 5 | class TestSedonaRegistration: 6 | 7 | # class variables 8 | sedona = None 9 | 10 | @classmethod 11 | def set_sedona_context(cls): 12 | ''' 13 | Function sets the SparkSession object for use throughout the project. 14 | Same SparkSession instance is used in all functions and methods throughout the project 15 | 16 | Parameters 17 | .......... 18 | sparkSession: instance of SparkSession for use throughout the project 19 | 20 | Returns 21 | ....... 22 | It does not return anything, just store the sparkSession object (passed as parameter) or raise exception in the case od errors 23 | ''' 24 | 25 | if TestSedonaRegistration.sedona: 26 | return 27 | 28 | try: 29 | TestSedonaRegistration.sedona = SedonaContext.create(SedonaContext.builder().master("local[*]").getOrCreate()) 30 | 31 | SedonaRegistration.set_sedona_context(TestSedonaRegistration.sedona) 32 | except Exception as e: 33 | raise SparkSessionInitException(str(e)) 34 | 35 | 36 | 37 | @classmethod 38 | def _get_sedona_context(cls): 39 | ''' 40 | returns the SparkSession instance 41 | ''' 42 | if TestSedonaRegistration.sedona == None: 43 | raise SparkSessionInitException("SparkSession was not initialized correctly") 44 | else: 45 | return TestSedonaRegistration.sedona 46 | 47 | 48 | -------------------------------------------------------------------------------- /tests/preprocessing/test_space_partition.py: -------------------------------------------------------------------------------- 1 | from geotorchai.preprocessing.grid import SpacePartition 2 | from tests.preprocessing.test_sedona_registration import TestSedonaRegistration 3 | from tests.preprocessing.utility import are_dfs_equal 4 | from shapely.geometry import Polygon 5 | from pyspark.sql.types import StructType 6 | from pyspark.sql.types import StructField 7 | from pyspark.sql.types import IntegerType 8 | from sedona.sql.types import GeometryType 9 | 10 | 11 | class TestSpacePartition: 12 | 13 | 14 | def test_generate_grid_cells_from_df_varying_xy(self): 15 | TestSedonaRegistration.set_sedona_context() 16 | 17 | spark = TestSedonaRegistration._get_sedona_context() 18 | 19 | schema_cells = StructType( 20 | [ 21 | StructField("cell_id", IntegerType(), False), 22 | StructField("geometry", GeometryType(), False) 23 | ]) 24 | 25 | ids = [0, 1] 26 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]])] 27 | expected_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 28 | 29 | polygons = [Polygon([[0, 0], [0.5, 0], [0.5, 1], [0, 1]]), Polygon([[0.5, 0], [2, 0], [2, 1], [0.5, 1]])] 30 | test_df = spark.createDataFrame(zip(ids, polygons), schema = schema_cells) 31 | actual_df = SpacePartition.generate_grid_cells(test_df, "geometry", 2, 1) 32 | 33 | assert are_dfs_equal(expected_df, actual_df) 34 | 35 | 36 | 37 | def test_generate_grid_cells_from_df_equal_xy(self): 38 | TestSedonaRegistration.set_sedona_context() 39 | 40 | spark = TestSedonaRegistration._get_sedona_context() 41 | 42 | schema_cells = StructType( 43 | [ 44 | StructField("cell_id", IntegerType(), False), 45 | StructField("geometry", GeometryType(), False) 46 | ]) 47 | 48 | ids = [0, 1, 2, 3] 49 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]), Polygon([[0, 1], [1, 1], [1, 2], [0, 2], [0, 1]]), Polygon([[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]])] 50 | expected_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 51 | 52 | polygons = [Polygon([[0, 0], [0.5, 0], [0.5, 2], [0, 2]]), Polygon([[0.5, 0], [2, 0], [2, 2], [0.5, 2]])] 53 | test_df = spark.createDataFrame(zip([0, 1], polygons), schema = schema_cells) 54 | actual_df = SpacePartition.generate_grid_cells(test_df, "geometry", 2) 55 | 56 | assert are_dfs_equal(expected_df, actual_df) 57 | 58 | 59 | 60 | def test_generate_grid_cells_from_boundary_varying_xy(self): 61 | TestSedonaRegistration.set_sedona_context() 62 | 63 | spark = TestSedonaRegistration._get_sedona_context() 64 | 65 | schema_cells = StructType( 66 | [ 67 | StructField("cell_id", IntegerType(), False), 68 | StructField("geometry", GeometryType(), False) 69 | ]) 70 | 71 | ids = [0, 1] 72 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]])] 73 | 74 | expected_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 75 | actual_df = SpacePartition.generate_grid_cells([[0, 0], [2, 1]], 2, 1) 76 | 77 | assert are_dfs_equal(expected_df, actual_df) 78 | 79 | 80 | 81 | def test_generate_grid_cells_from_boundary_equal_xy(self): 82 | TestSedonaRegistration.set_sedona_context() 83 | 84 | spark = TestSedonaRegistration._get_sedona_context() 85 | 86 | schema_cells = StructType( 87 | [ 88 | StructField("cell_id", IntegerType(), False), 89 | StructField("geometry", GeometryType(), False) 90 | ]) 91 | 92 | ids = [0, 1, 2, 3] 93 | cells = [Polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]), Polygon([[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]), Polygon([[0, 1], [1, 1], [1, 2], [0, 2], [0, 1]]), Polygon([[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]])] 94 | 95 | expected_df = spark.createDataFrame(zip(ids, cells), schema = schema_cells) 96 | actual_df = SpacePartition.generate_grid_cells([[0, 0], [2, 2]], 2) 97 | 98 | assert are_dfs_equal(expected_df, actual_df) 99 | 100 | 101 | -------------------------------------------------------------------------------- /tests/preprocessing/utility.py: -------------------------------------------------------------------------------- 1 | 2 | def are_dfs_equal(df1, df2): 3 | '''if df1.schema != df2.schema: 4 | return False''' 5 | if df1.collect() != df2.collect(): 6 | return False 7 | return True 8 | --------------------------------------------------------------------------------