From 00f0cec06dcace65268055e5ae31cea08df79787 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 20:59:40 +0100 Subject: [PATCH 1/7] HySpecNet-11k: add new dataset --- docs/api/datasets.rst | 5 + docs/api/datasets/non_geo_datasets.csv | 1 + tests/conf/hyspecnet_byol.yaml | 11 + tests/conf/hyspecnet_moco.yaml | 11 + tests/conf/hyspecnet_simclr.yaml | 11 + tests/data/hyspecnet/data.py | 60 +++++ tests/data/hyspecnet/hyspecnet-11k-01.tar.gz | Bin 0 -> 26926 bytes .../hyspecnet/hyspecnet-11k-splits.tar.gz | Bin 0 -> 478 bytes ...47Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF | Bin 0 -> 502385 bytes ...47Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF | Bin 0 -> 502385 bytes .../hyspecnet-11k/splits/easy/test.csv | 2 + .../hyspecnet-11k/splits/easy/train.csv | 2 + .../hyspecnet-11k/splits/easy/val.csv | 2 + tests/datasets/test_hyspecnet.py | 58 +++++ tests/trainers/test_moco.py | 1 + torchgeo/datamodules/__init__.py | 2 + torchgeo/datamodules/hyspecnet.py | 33 +++ torchgeo/datasets/__init__.py | 2 + torchgeo/datasets/hyspecnet.py | 229 ++++++++++++++++++ 19 files changed, 430 insertions(+) create mode 100644 tests/conf/hyspecnet_byol.yaml create mode 100644 tests/conf/hyspecnet_moco.yaml create mode 100644 tests/conf/hyspecnet_simclr.yaml create mode 100755 tests/data/hyspecnet/data.py create mode 100644 tests/data/hyspecnet/hyspecnet-11k-01.tar.gz create mode 100644 tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz create mode 100644 tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF create mode 100644 tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF create mode 100644 tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv create mode 100644 tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv create mode 100644 tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv create mode 100644 tests/datasets/test_hyspecnet.py create mode 100644 torchgeo/datamodules/hyspecnet.py create mode 100644 torchgeo/datasets/hyspecnet.py diff --git a/docs/api/datasets.rst b/docs/api/datasets.rst index 96ca225344a..99cc4d75427 100644 --- a/docs/api/datasets.rst +++ b/docs/api/datasets.rst @@ -312,6 +312,11 @@ GID-15 .. autoclass:: GID15 +HySpecNet-11k +^^^^^^^^^^^^^ + +.. autoclass:: HySpecNet11k + IDTReeS ^^^^^^^ diff --git a/docs/api/datasets/non_geo_datasets.csv b/docs/api/datasets/non_geo_datasets.csv index f000bc1d8da..2f9b64227fa 100644 --- a/docs/api/datasets/non_geo_datasets.csv +++ b/docs/api/datasets/non_geo_datasets.csv @@ -21,6 +21,7 @@ Dataset,Task,Source,License,# Samples,# Classes,Size (px),Resolution (m),Bands `Forest Damage`_,OD,Drone imagery,"CDLA-Permissive-1.0","1,543",4,"1,500x1,500",,RGB `GeoNRW`_,S,Aerial,"CC-BY-4.0","7,783",11,"1,000x1,000",1,"RGB, DEM" `GID-15`_,S,Gaofen-2,-,150,15,"6,800x7,200",3,RGB +`HySpecNet-11k`_,-,EnMAP,CC0-1.0,11k,-,128,30,HSI `IDTReeS`_,"OD,C",Aerial,"CC-BY-4.0",591,33,200x200,0.1--1,RGB `Inria Aerial Image Labeling`_,S,Aerial,-,360,2,"5,000x5,000",0.3,RGB `LandCover.ai`_,S,Aerial,"CC-BY-NC-SA-4.0","10,674",5,512x512,0.25--0.5,RGB diff --git a/tests/conf/hyspecnet_byol.yaml b/tests/conf/hyspecnet_byol.yaml new file mode 100644 index 00000000000..5c0fa31d609 --- /dev/null +++ b/tests/conf/hyspecnet_byol.yaml @@ -0,0 +1,11 @@ +model: + class_path: BYOLTask + init_args: + model: 'resnet18' + in_channels: 202 +data: + class_path: HySpecNet11kDataModule + init_args: + batch_size: 2 + dict_kwargs: + root: 'tests/data/hyspecnet' diff --git a/tests/conf/hyspecnet_moco.yaml b/tests/conf/hyspecnet_moco.yaml new file mode 100644 index 00000000000..732b83912c1 --- /dev/null +++ b/tests/conf/hyspecnet_moco.yaml @@ -0,0 +1,11 @@ +model: + class_path: MoCoTask + init_args: + model: 'resnet18' + in_channels: 202 +data: + class_path: HySpecNet11kDataModule + init_args: + batch_size: 2 + dict_kwargs: + root: 'tests/data/hyspecnet' diff --git a/tests/conf/hyspecnet_simclr.yaml b/tests/conf/hyspecnet_simclr.yaml new file mode 100644 index 00000000000..d16e8209326 --- /dev/null +++ b/tests/conf/hyspecnet_simclr.yaml @@ -0,0 +1,11 @@ +model: + class_path: SimCLRTask + init_args: + model: 'resnet18' + in_channels: 202 +data: + class_path: HySpecNet11kDataModule + init_args: + batch_size: 2 + dict_kwargs: + root: 'tests/data/hyspecnet' diff --git a/tests/data/hyspecnet/data.py b/tests/data/hyspecnet/data.py new file mode 100755 index 00000000000..2e7e32e51eb --- /dev/null +++ b/tests/data/hyspecnet/data.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import shutil + +import numpy as np +import rasterio +from rasterio import Affine +from rasterio.crs import CRS + +SIZE = 32 +DTYPE = 'int16' + +np.random.seed(0) + +tiles = ['ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z'] +patches = ['Y01460273_X05670694', 'Y01460273_X06950822'] + +profile = { + 'driver': 'GTiff', + 'dtype': DTYPE, + 'nodata': -32768.0, + 'width': SIZE, + 'height': SIZE, + 'count': 224, + 'crs': CRS.from_epsg(32618), + 'transform': Affine(30.0, 0.0, 691845.0, 0.0, -30.0, 4561935.0), + 'blockysize': 3, + 'tiled': False, + 'compress': 'deflate', + 'interleave': 'band', +} + +root = 'hyspecnet-11k' +path = os.path.join(root, 'splits', 'easy') +os.makedirs(path, exist_ok=True) +for tile in tiles: + for patch in patches: + # Split CSV + path = os.path.join(tile, f'{tile}-{patch}', f'{tile}-{patch}-DATA.npy') + for split in ['train', 'val', 'test']: + with open(os.path.join(root, 'splits', 'easy', f'{split}.csv'), 'a+') as f: + f.write(f'{path}\n') + + # Spectral image + path = os.path.join(root, 'patches', path) + os.makedirs(os.path.dirname(path), exist_ok=True) + path = path.replace('DATA.npy', 'SPECTRAL_IMAGE.TIF') + Z = np.random.randint( + np.iinfo(DTYPE).min, np.iinfo(DTYPE).max, size=(SIZE, SIZE), dtype=DTYPE + ) + with rasterio.open(path, 'w', **profile) as src: + for i in range(1, profile['count'] + 1): + src.write(Z, i) + +shutil.make_archive(f'{root}-01', 'gztar', '.', os.path.join(root, 'patches')) +shutil.make_archive(f'{root}-splits', 'gztar', '.', os.path.join(root, 'splits')) diff --git a/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc900f7042ac96b98b326bde051c3b07535c5483 GIT binary patch literal 26926 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 literal 0 HcmV?d00001 diff --git a/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..dba91b8a4046e28a100386349bf69aab373c1a4c GIT binary patch literal 478 zcmV<40U`b$iwFooB{pXQ|7dx0aAjj|WpphuF>5VzaBOLGb1rmYaschv&1%9x6b0a{ zeF|S7$-Q@ek}L`hSm>fHE~K<>LeNO1Dq>R6x9=1SQmb8vv0~1*8HsU(8RvLN5C-9G zH(%Ws`LI}cwV;hdBazbE*I(C}gvD#GyfgSHt9;?U-fJd_+tX@1Ep9kcY>6X@gCy2u ztZ8|0_1@Oyyco=i%4dEL%lTwnm0=C%KZ?v|w40IS=b2|6vC$%i*qwi6EO~8n&hwuR z^XXsrx!Xpg>)Zd}BJyAT&VNS!pC$jJz4@?liY@%zP z-tVNnG?>lTt;=5#>pmWf)I9xmMUax$3;hrMZ%_Xd&4P2^?EbgN$Fq|Zz$5yfGJ^hx z{)hgD{s-uP=zr(#f3ZdXYj*!z=9AMr{yV1sxgR3>ANn8qANn5v000000000000000 U00000008Xz1R%OC%m7dT0P1J^$p8QV literal 0 HcmV?d00001 diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF new file mode 100644 index 0000000000000000000000000000000000000000..498bf304fa18b4b6006e3590f7661bf6c45a772b GIT binary patch literal 502385 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 zsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-q zsc@-qsc>nH0h78u>-u=aBjHlvQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJ zQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsL4+ z`wO+I7IJQ2WZ_cbQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJ zQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsL5-pF@__-aT~G zL*Y{4QsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJ zQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsL4bor^Wh{xa+PQ^KXfrNX7c zrNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7c zrNX7crNX7crNX7crNX7crNX7crNX7crNX67{GMsia^vUm!llBc!llBc!llBc!llBc K!lnN|F8v=x8$k#F literal 0 HcmV?d00001 diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF new file mode 100644 index 0000000000000000000000000000000000000000..5142ff4fbcf2cc4b0cc2017f416cca5a1a184291 GIT binary patch literal 502385 zcmeI*b!?UU!sYSxIPUK5?(R^EyA+4wE~U78aW7IR?(SOLi@O(hcbj$IOJ>ewCiCYc zZ?ewGH|+FCZg)uL)GE1thM`YqM;99iU%bpnN@EbFB~DWXl==-5c_HEj#81Ol<@- zX$)j)0(@ZmngU~+0d<-KDO&)~SwKsmR4X8=KX8SGw&r!+HbB9)fY}Z>!)CV!T6F+k zvz;A*5uJeQoq;4>fJbaYSD=44ph9VEPoG*;F9QG~g2pn+{Z-!E5L< zf%|ODEFf?;P$n3NJ_oqQ7S9E`%mWI~2M)7IA%NckApJt%E!!Omj9LWLT+D0kOMoYA z(^6h@Uj{^44qRj*D}eSZfqbigKkVdcV8$At`C1_BI$#?cx*n*qf!FXi0ugNOCZNw| zpzIc2o8JmtXG^vLIkyAf*^wQ<5|0jW}r+`GKfd_2e8K7@CQ0^=c^BgdT zwLTBzx&ZuOM=t_XE^+^tx&JHNKihki`@aUny$;-AD{lb3ZUQB5asRiuf41-r_kWlB zzsLRG2gbAd5kQ&;z$>=nA@~1?`+v;+KjHq_`lsCgGr)NcoMUre@LtACAonZopB;P6 z{lDS<-*W%&xPLb2J>dHRi1!h=%T|5j{y%g7U%3CT+&>Hb#{GW>zOaKofC)c=2ETx` zzqx<5^AGpWyEoMh14&E+k61U$KvCO(>lirC=D7yidIs`DGVqHXk8EIC6a!788hFOG zL^Cirx`9eD48)IV;2v8Y%Rukg21>^<5G}5OtE^=_1KHyn_{t6?FfcKpfrg0;q)Tkz z4cnE(z{sQqY9upolPybbpnD1f#ZnsZQW?0w=BGB$E{%b_X$|~lC(;?Hlione3BXtH)sz6Sg&8OT}Lz;||}ih;>h4K%7|AVYNn z8`*#w27GE7h*QhJZMLGefu3~?l&EVUayTLV+t8A#UNz!SEq zgMon^4OHx8AZ}*^ci74<26}ZhP_mnWDBTUrV9k3N$lBAuXLg{Mf$;$b>i0H~CeXku zwxf@M;e8Fn=x5+MThiY^*8v8K3^d>jGH{N~9c-Y@5Cge~8u-aZ4>M3}xPjy&3_N9< zM;aJ3%7E`^1M$WfxXV_JH4re)0D=shVl&4ZXfeS+wuuJ5u!EBfOqgt-!4v~&ry6+8 z`c5-YZn}Y(GYs5dOJ{Qbv$+4++36Z16Nq+ zJ_DWh8z>lNz&ybHv)Ko^|3lpWVeX$DKEm^Vl;{5#&p+F6+(7>m-2X}L{}lJnmY?SS z&v5_YJpXLkS)TuM1~Q*F@R9Am!2Mt3{x2Cwb(#BT+ph5ZU*-9~#`Dh>T{qDA2KRrH z`@hBgv*6p@{~hlCF3&$3d5`D+zJa6>1|GAG54it_-2Wr)|1tN^Ry^VPf6DXEPCPR( z{kef=FS!4g+&>F@#r?nL{@-x_Z+ZS%;5(lG_XeVWFmR16{>c4*;{HE#|6jO&Hs>qP z|2Lk0w)?w*Q9lgS{K@_Q;{MsD-`xKn?jI)N8YV(md(%Wd%fugc(l#-}G11&Lk<~Nt znH`8^Vtiy138R>ZU~8kA=o8IE+2|%>#4vH4Es1HOYb+B*Vw-T{n3&8O#Wj&3o{4vC zPka-j6PT!#&_wb?CZ4j*iA@YjVj^-<6PMV6WF|T!H<3Su$sdMHoMJOmnP`#PM7A_0 zzOZ3wO;k;1B2ju157@d4Ci-SHQ7)5-n3+x7U`w-@=$6&Q4|X)0i7DAlG|pinV@?zA z+1^|x#^g3pI}h)f=QZ(+^~z_WWPTG-3YfUe78W$ov5<)Zg-sYmOq^!3ikfIy%)~3U zqqvFTB}`N+X(Dkc6A#(?(kA+qF;Tv(iCE=K++=Oao5)?k#7}n2$Hdf%CYtz~$W+P1 z2ez-WiLq5o)TwIXE?ZU2L_l>DrD~XnTGPZ87Fx?hr`je8)-hq$HF1VDsAnQ=eG{+Q z&ITq%G&E7&&qR_&CLXa3jZO4#VxmG*6X)5yW+vJ;H<71>iC^q^OB2&tnP}>7B6DjK zAKCskCMvZx5x<>@du(-k6TLf_DBaOSv`!|jvPGRubnarJP*)R&*u-uo8g@64u7`;? zY*$YcBYT;s5nv)|ZxfH%#y}Ir`p_iwHF1H>?`NW2e-n8JnE1_33^Xx)kcno4O=KBj zVk;Xm)I{ZBCK3!cai6UjVIpv(i87;1L?3P98e2TZM2@j0zOlpOOiT(g;Wyqy`Uxi9 zvfUF+jGAPk=42DerkGgHdQ3G@e42?!(@k7tAv3uDncV*@?w_5U&HV?PNHxdA3$|^p ziJ|jMRGH8Hhj9OF?E>z9A@?83{Vy^R%={Od$hpMCcXnhc_rHw$U(Wrn;Qra3mE8X- z6LD6XxXo6qG0}6ai4yC$|MlEITd;xq-^l%M;{G?A2x9fNm`J_V#7nk)8~4AR``^L+ z@8tg3x?SA=ZWHz%6KC0+y(U`kGm&dQ_s@=oasLOn|AXBBA?}|IJZz%k5uX2}ChoA6 z$GHFF-2Vyg|0MU%7M|k%PxJh<17~>t!%fsbYa-1#?w{>A&;4KE{x5R>m$-k{^)k=@ z6`udACeE?B*SP=d-2V;kpB=l&{omsLZ}a@K&3AbI@0#$vXCmHx?w_rS;Qk+&DD{y0 zf5iQ>7LR%UpYZ&%gHKINc*gxd=l)-C|7_<=?*A3{|C;BYEq%lD|JFp&cP8BT+&`Q5 zf&2f+{eR;A+40Xj|6h3izw-REE#FKG{?7gX;QoJd|7`Uy?*BLU|A*(F&7#6-Ntct| zwD6T3vMfxrEi`m2q;oC2VY@sF%;From`qUOSu>NT*R7h(fb~+2U*z)uidStLrJfnq3nJipnA(<^?&SK#s z+n?3KxNH{cX19UW_%UYPunw7JVrM!ht zEUbcsARi0$Dq2YGYvCo^Udh6+$`+zmv2cwou4q z*?|@o#<#Rkzm!6fCkt&lTX@Iz zbg?kHtA$$KEF|x4;VIkP!@{7R7JPeIh!;Tn#X9u1kU!Ak|G~6yip}h6p+!Fn+4@`f z!VV6wFkzsD27@d-VCx23=sUzhxuF(f4zqBBEgf#5+XxFqM_O=4Svb!ckG7C;jD`1X z?^p|C##yKxWFf_P3(we=2^I!Vv`}f1h0AQ=WD6aqSST=+E^eBI(`?ps?tcdNKa=}s zhh|x*HrqntU<(h~`Z*T*&E@{*asTtVf3_@y`(MEQFSKxsO%1isWRZnTi!FR$`<8J3 zOS%7L-2Za!pKV=Xq0~wXQCC^G!a`SD=(L9WU(5Zk%aj&lFUxc}qa{|WA&1)t>kKgILUcAd5`@{ENV;oSdO?w@Tu z$Nit@{x5L<7kU0!yGuO(mo5BeC$4b+SGoUd-2Zj%pM~Av{%`X9-{SdaYi?Tzyknuv zUGD!L_s~_Dfj=3`+v^;vrR9!|Cc=fuXz4h z$ZHGj-&n}^miuQX-*Nx%Ej0hY{eR^C+0ais|DSpOzgUQ1Yrk^;-?;zp-2V^mpDp>x z{r}?mXGebX{Qt4g2sSd%M!sWvOdF#u8?|g3$sHR{Sx?tS3C~94NH#991(9uZh+-pu zRGSx^Y@A{Ncj;u+g-pjm))dY+-|I+o)8>M*O-q?y=SNZ1k>gqjUos(Hh#g$`<+A$ll1t zS9YkejfqWcG;C@kT{9bR*skU_Mz*j~qos|ct!yk~-TiG8Yi+}8W8(sw-_}OEb~f_1 zxAB{u=wM@dM;j?S*?7*jcD6C3i;c=%Z6xSs<33x{-9}&!8)bUhh~CS_Y}P8kMvmS# zzOloBHYWA4;n&wj`hGUvvfce{j2d7g_COoA*z!R(dJMKve29%mLv37SA;WC6A8sSx z2pfOcxREyMjR+ZY=|$J(ee&PKu@8xd^ncpH5t*svzr2xq~QZ1_*Mk#mZT z@9fA_8| zpoKQ-h1y8Hi2G;T7jyqhxc{Zx|1$2Mby;qs@CqCDN*ia{oK@WaYVLmx_s@>5<^I=k z|Lbi$VVgGC7`V|!#Z5NiZsz{k$}QagR_=cr_rIO{XU%um$hyYiF{Ikuc zYz#Wh{h#6f!?}O9>MZwvj{85)^Ur2p;Q7C3Bikh#U)aIR-2WBs|0?%?jr(Uiuk-xh z;Q7DF^Us#vveE4}_kV}`zsvozdH1;g``mv7&p#XUfam|AjTDb;JY!oPbN^4c|EJvl zGwz?Qe$Mm%g6IDw&p(^>%0|oA-2WTypB;M3{lDY>-*f*Tc>YBzjOa={tur2pFIC;-!B_uf7__@hx>MLI0QzD#UUSJGO&cYohj z9?wCf_ztGArU@KmPUzqx+n>n6xWo?XCUKA|se>16TQUbjlRJo(!ogLxD5ZnWsT>qa z?Z8UoAe;rKb>N@QLC*9JzO#`T9Ms6@AZaECkJ-k|4hCd#;FHxsoNNwmvlZDL^vvPl zH#?Ej!Sq}Xn&ozoC69woEG(~spnMMM<#&*}fPpLB$FV;`%ta!`fGLkk8k_ zA9k{mgBg__G_T?yYgGrI*@0>f##eVxzlMVdwzj5&KD8W_t?eL29S7IhlDZDM)^kv# zz5}O$gLAA=LkAiB9K2(D8aWu<*g>r(4w5%@@RV(C=3r2B2fi&FTw)7aI_S{KL4JRS z7x5jOVl&$~XwlX|wssD_u!HR#RPEp(QAY<4*t$**`gV3uu8V`1T^-zDOS?Jf*4;tT z9uAJODLoxD?&Tn3fP?pJZ*K=<0v*)u;~+&}2hZ4+ehy0ZcMxTOgUf8;KnEQMIVdpL zfic9vX*O%9gOpx+n=<;OaRHO|3Jwk*g&?(q(O zvSSk*Or7YU$s`AvCOi1R_DyjxcB+Fq(;TFn?qC%QnBkz*Ob1bCIk>_?XLJ9--2WWz ze=hgWX3ukwcD{qxY-fmr5epntU&#H3a{p|@BJO`N_rHYuU+Q2UYrD)rp5+dHvEwVa z|CQYTD(-(Z_s{mP;r`b;h`-LkJ+^wigWek)l-|hwZ{q&hqRrg@7Vdv5_rJ}-MAmS- zgLFF_ykWa`a{s%y|J~gG9`2uQ+{^v%bKvcFaDmMabI|U9gS-d1e|F*!_kWoCKf?VV z<^I`_V?6)IdHzp0xX;#{S-{t=A@%*!G_j&#!98`JW zAmKyqpRIkw{XgdZpK$+Axqs&WjOYJ3&p$iz!olR1-2W@?|26l|_PpW#-*W%&c>dXn z_dNd}9F+LzAo3^fpDp;z{eR*9zjFWIxPMmfJJ0_Qo`1Ier-Na?xc}eW{~zw3t>dd< z`Wi0EnJ&(tc%MqH!b_86&%R&-O-fQ8B8ExY1nPVJoA%=oQ07 z$(Syp#By<&EsX7=V;mO+;<`A%#>aC}Kfa4J30%BlI}*AWp2$VD#4Zviaq*C?PwJvb zG8ayA7w6dA6fWANbdfuii=XURY8O+}xM-5rMW%EvHnTzLUHE2j5ig^QyKGe^7Xg`F zl*-~FYE~ClSZFpE*|NL%!VczeF(Idm2Dx0M&F$hf+nLA3h`cVU=W~%Hzl)`;TLBkE z3%YO%xj4_}6?W0Kh>JW$UHoFli@BIq+(n8KE}pS1C0z_I<)Tt)7xBxuxW`tPb>bl5V&&6*xw!Vux4P2yb=;Ars>gQreBNvq$yGYQ)#eKG>sf)m7 zF3jdG&al}nT(oNGB1bD1-`HV)7n54M@N45DeOniAS^st}DztYIyMv2cYj|fqKnj%T)br4C%YIn#YNSrF0Qe~(_D0!?xOGv z7xqlE?R_f z{|C5#cJLtge~9}(%>5s6v5xgU%JYBBMa<(aZm^{%xc`&f|0(YOH22Tuo#FWp=lN%Q z&$<|M&PDC>-2VmcpKZCw{a@n#FLVD_c>Y<(t33bLTo~6~oMy9baQ`>C|6ANYJ9L}- zzr*u?m*=0YzvrUgeHY~;xc>*-KU?;Y`+vm!Kj!|Q@cgqTPkH{Ix%j~LJ?H*kaQ`p4 z|5w~U+xnXOf5Y?tmgk>^zH`y(y^De$xc`sbKb!rD`~S@Sf8qYwh_5{V-+2DNyLiMl z{NVn7a{s@$|KHp{TmFap=PLt$vEzn^X{Lv!mWRx?hmUN(<6)fZp|0m4RU{8DSntRl zN=NY!EvkpBY*921ouhjw6vKlR(?d85j^)8Wwud)tR~!!`<9etO&qLDq9$ypbVPgUh z0}^`hN#r3;Vh^`jyCfd+CiU=}ok-?kdU6lVQh3Oc(!(bfmdZm=Y7h0&c(~8jr1cP( z&O@2>9-?RPaE&d_=%Gs{4}~*(u(NnL%lxu>NT1EaTeds9hfz5^)XeE2SuPJx*rwbb z2IlclF|UVJE8yV|J6X`fj6xoo7xs{~h=ig`#_+(QIgTf#%1 zk{-&I@(`o6hwE%f84q2{dMHxP!x1*QyoW{=JY?|k@Q&@N=wY<4hgy|9B(Ln@DcfAd zLy4*$B3JWpi7lw^p+gN1`D=QFA|6h$nYBH%sN*49T@TyYuzDV<*7uO8frkfdT|*Cj z{XCRw#D-CLVG%_3(ooZRTN0a}SMMc*xk&!+W;3m4`9@9%{GtkfM!;m8@4= z4<*}qh|=D}Wwx+`hmIXR6zJr^=>=I|4|mzBp&kN; zc_=m9L(~x-uCUON9y*QkP;j&dbBu=xtif0hX~%hZ&2|QP7%|>M^$8x5O!V-GZJ6Yt z|6~vD6c6Xwyr~}APV8yxJR(i{)*=X$uuR?p-9=X3ud z-2VdZpDkL*{fBz^$__2^FmbVmhD$u8Tgv^jUCX%t<=p=Y?tdls&-BNC=VyTTT=nOF z<7ePM+bdD(fB*IWy~rrZ)0gJo5oWcm`OmNa^#>gcf8}ZB#p!<@8-IT_?Tw=o@UIw= zHuCqU1aKq$^VcV)MYMl@?J(H>uU|8#t?yGiRiS*Ta;B20sr~x z0A$abr(l6X=rhjRR@^mvV;HFhqHKj-nYBPxt886!iQPo0;?XfkX}hQV2*4=7#ttIwZ`qlf?M zf9`Y2<6n0t%9o&DiUeQp4_;UOZnMePw`a2=&8qeD!MfS;+y%w^oxe5D_gMOt%`f#W zo%DMADOV2ef405Y=ghq)cOUt&P?Z|HdnEnU{8bFM=d6>???j=$yV)ah7W9uYyUNR+ zy?*8%+d6gqXRY$5xN^Q(fsj#u!n~#>{(dXL_pDR#-sEf0;&z>et)GQ$+_@@yidnh8 zmY@5p)$rsa+V>4T_3&EH%VCZ4$9%aoaNJ3s&8r*suQx60fY0B0fA_jQE7g8n-9PV6 zMIJi#>z1_JlKeb8Bxa*KwTCBo)~9vU#Y?6we04s&cdhBSN}djA7QEqY(hZNTs*lV; z_a1~~so!a5=|wU7$GZ|OIGy$7NxAqt8lS7YJ$ARS*nQV~pRbNP_$}a7tPj5JM#gJ* zCvWv=VrJnAo+N(mNJUw@J zJ(;ZY;{4A;Ye)9ESmnvu32`pJ>DfJcSm8_{?u-#-9pV z`f#4rvPjHE(}z~i6xMy`+nGZecgUXcV$^JjdIeVB6>)A~x&xuFTYX#cqI|2MQlkp3 zk73nlUMFID)y92qM!LTuPRb&CzHOf!x;5XCWVfdtDA#C3Xp+fe6W$w^ed5=r-@kQ^ zo&U_{W6yq`Sd-+?)~zi*9Z7ZMV`$#W?r8T#j)5IAzH4g6%Tw`q1;1Rynuq@VRzByN ze!NbjPp?P&m$`qa!rI!G+cjHvbFaVIDddiC*{aEAwn;Q$Vx7BRGx`}(6M{eD2;y-5V z+dHc(WLcDBS&vOv*w?4s{GFdRn^!w!D9|yeVXycFE4|!b<->_(zapM*p4NX{?yvRl zU$C3+`PQQL+@SCz?;`yQ_q!f9)$G*Id%m0>a5VAMH7#b9OTQ-enr}s|=wk~npI`Cb z<5oNWek+^&a=c!@p(x`aX98tzW$dpEh5qspRssK+fTkp9#y$9zE$Dv8H1W9aWg#b9q@8if{$I>p1z;v z)!FY$bG00p?wjB1Bzf~z86EHOk4G1C_%tebZr`5L#Rt6_wWsx^G&vg;EBZaK``&hi z>X#cbHSx-E6NU_nouk#1zu(HKv-c`bsQ)6|r+ZL9)2Z`!y9p|OTASh?J{7B!Fl0u? zUNH+yYqYY^=@`orMf;RL|A*PDgVyz|bso zjyb6D>Z3KPr9L?0QN-C5Hy`Gh{rTsgRQ?O|rCH$n=h5vIPR~ufqEG&rJiP0=dlOzZ zi5UI9M@Zp=q2ZN^M2qX!@Lsr8;#r1KV``+G8D7SJaKQ1)D?>hf_;zF9m__f#Evb34 z+l9&xZ_LRtV(#ILk#-eAUd;IbTzpgT~>C%u%vsMo%`|)Ch+7laOU39U+pbRsohs@YL>cRFs$zoPb z-t)rqdZXe7jwv&3m(#e+@8P$aHL%*mIP$9XgGL$ppXog1NO*^+owp1Q^G#oUjQ^03 z9ouS+h*x#-`LG$Y+LZrMcYNrAh#L25R*N@0ZI#WxUfr8K|3k4V{l6EglVZ%b(0#xC z+VxGG{^H&EVWS7Gy}lvnQMv6;uOw`KcJlr0D}z7YsZ(b{>+rwd%Ij7m(*}+YuC_G8 zh+l(KUQ0VPz<1!tfTDMfR@gpyeBxN={3Z;mSZPuDsy}{QIk{BN5|f^ii)G zZXIx9_etEwnR-x-fn!fA0FcgK*3RPWwSOp|h5hn}Tk7Og)s?fe1HceDt8 zHzoDDm-~*qUx`H>n?=5#?|1m!XU)#v?XoG_#Zn12l&mr#S&rUa@9ptjwW9LWSie`> zl?}u5u|Euta^+O6bnnhoc^Td^eemUay*9+V@hbhTJ-L>7#XBdOhYQQI#n`-}YWLh( zW^P`-xW&W2--=JRs%iX6c8s<$yW8~jSltEdh7s>xV{;ChjN{!4v$4NJ}e$=_iwnY1QGFPyf?O;JHZ}WKa z`^XROJvZm)$72y@@mdY38~u9Y zlYR4y4LZ`G{evUDqc^C=Z)FGu|G6+=*2j4D>-D*l=gQ-GgGP<2IBNF(ICbl_3jQ?2 znEjw_{){03XP>W0cC7!l!FQ9Dj^BFrXMcC`xrYka6y#?_+&dyl`F;8>eh1z(5l%-s9Z(XRR5PpiD7)gu4nbMlPIWxX$y z|9YFaJIrM1O9cFVR`r92e(=x_9{RyUKX~W|5B=bwA3XGfhpu?&iifUv=!%D~c<73U zu6XE*hiEqYapUe%&kwdhqXdR2>F)uNZvmi(ia)9U54dO59LPOF#G z>gBY0Ij!EuL+|6E_wmsCc<6mR^gbSX9}m5chu+8I?_DF|QsGkJQsGkJQsGkJQsGkJ zQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQsGkJQhip7KC4Ba)uPX8(Py>j zvs&~aar%%reMp=>Bu*a^rw@tKhs5ba;`AYL`gB@-I;}pPR-aC*Pp8$V)9TY{_35-urxY zoN%ddsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-q zsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc>l+O8)trYx?mz!llBc!llBc z!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc z!llBc!llBc!llBc!llBc!llBc!llBc!le(-=3TTjaOl-u!llBc!llBc!llBc!llBc z!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc!llBc z!llBc!llBc!llBc!llBc!li#6-Cp7J+|(<&aH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(IrzKPRcyc<7ExKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}Q zxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}QxKy}Q zxHMu}>(TRGoZ9LmTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~D zTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTq;~DTv|Ws++GY5p zyGK3Pz9*S*sc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-q zsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qX{~|NBl3km|5;49 zRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^Q zRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QRJc^QG~SI@>2K}HwagPP6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJnoxML!-FmHpKMfHs6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn{hYb?Pt{%(8s+J^yX(nhofqeS9$GuH&&4WF)=r3X z`AyI6(ZdQ?S}=8ZM7x*6?r+hp7Ts#mtrp#C(XAHUYSFD0-D=UT7Ts#mtrp#C(XAHU zYSFD0-D=UT7Ts#mtrp#C(XAHUYSFD0-D=UT7Ts#89r0kx-FOXrp!f06`*`SmJoG*u zdLIwHkB8pJL+|6E_wmsCc<6mR^gbSX9}m5chu+6S@8cm{DqJdDDqJdDDqJdDDqJdD zDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdD+9D!N@fnM!wEZMpDqJdD zDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdD zDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDIym6?<&_~HK711{6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn4X(B{!-!vlQ(hA;6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn?Xu=(j*QcD_3kKKDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdD zDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdDDqJdD zDqJdD8t~v^fd8;Ut^I^cg-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA? zg-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?JM>z% z_r$^$*|Q0k3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9( z3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(KI_vu>f$BS7QPZL z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn z6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn6)qJn9h>mpuw4C@kRj#hSHh*jrNX7crNX7crNX7crNX7crNX7crNX7c zrNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7crNX7c zrNX7crNX71w+s&RO<#SCzi_E=sc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-q zsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc>oW z^6w_>UJ?4`y>O{;sc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-q zsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc@-qsc>o2*JnK^dHjvt zgiD1>g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA? zg-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-eA?g-e@X&fdQ9r2<)J2$u?%3YQ9( z3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9( z3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YQ9(3YT6v->g8$s6SzzaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaOr}n!z0?g9Cm+;aH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaOthvP5j4feS2rMaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaB1GWRYu2q{NvF@;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ z;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;ZosJ;nF{)yYF}$ zcEUHZaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*q zaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaH(*qaOv+H725=7KK3 HySpecNet11k: + monkeypatch.setattr(HySpecNet11k, 'url', root + os.sep) + monkeypatch.setattr(HySpecNet11k, 'md5s', md5s) + transforms = nn.Identity() + return HySpecNet11k(root, transforms=transforms) + + def test_getitem(self, dataset: HySpecNet11k) -> None: + x = dataset[0] + assert isinstance(x, dict) + assert isinstance(x['image'], Tensor) + + def test_len(self, dataset: HySpecNet11k) -> None: + assert len(dataset) == 2 + + def test_download(self, dataset: HySpecNet11k, tmp_path: Path) -> None: + HySpecNet11k(tmp_path, download=True) + + def test_extract(self, dataset: HySpecNet11k, tmp_path: Path) -> None: + for file in glob.iglob(os.path.join(root, '*.tar.gz')): + shutil.copy(file, tmp_path) + HySpecNet11k(tmp_path) + + def test_not_downloaded(self, tmp_path: Path) -> None: + with pytest.raises(DatasetNotFoundError, match='Dataset not found'): + HySpecNet11k(tmp_path) + + def test_plot(self, dataset: HySpecNet11k) -> None: + x = dataset[0] + dataset.plot(x, suptitle='Test') + plt.close() + + def test_plot_rgb(self, dataset: HySpecNet11k) -> None: + dataset = HySpecNet11k(root=dataset.root, bands=(1, 2, 3)) + match = 'Dataset does not contain some of the RGB bands' + with pytest.raises(RGBBandsMissingError, match=match): + dataset.plot(dataset[0]) diff --git a/tests/trainers/test_moco.py b/tests/trainers/test_moco.py index 32c002dc573..002944b929e 100644 --- a/tests/trainers/test_moco.py +++ b/tests/trainers/test_moco.py @@ -29,6 +29,7 @@ class TestMoCoTask: 'name', [ 'chesapeake_cvpr_prior_moco', + 'hyspecnet_moco', 'seco_moco_1', 'seco_moco_2', 'ssl4eo_l_moco_1', diff --git a/torchgeo/datamodules/__init__.py b/torchgeo/datamodules/__init__.py index dc9513a6524..8f1cee47720 100644 --- a/torchgeo/datamodules/__init__.py +++ b/torchgeo/datamodules/__init__.py @@ -21,6 +21,7 @@ from .geo import BaseDataModule, GeoDataModule, NonGeoDataModule from .geonrw import GeoNRWDataModule from .gid15 import GID15DataModule +from .hyspecnet import HySpecNet11kDataModule from .inria import InriaAerialImageLabelingDataModule from .iobench import IOBenchDataModule from .l7irish import L7IrishDataModule @@ -75,6 +76,7 @@ 'GID15DataModule', 'GeoDataModule', 'GeoNRWDataModule', + 'HySpecNet11kDataModule', 'IOBenchDataModule', 'InriaAerialImageLabelingDataModule', 'L7IrishDataModule', diff --git a/torchgeo/datamodules/hyspecnet.py b/torchgeo/datamodules/hyspecnet.py new file mode 100644 index 00000000000..39839e8b468 --- /dev/null +++ b/torchgeo/datamodules/hyspecnet.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +"""HySpecNet datamodule.""" + +from typing import Any + +from ..datasets import HySpecNet11k +from .geo import NonGeoDataModule + + +class HySpecNet11kDataModule(NonGeoDataModule): + """LightningDataModule implementation for the HySpecNet11k dataset. + + .. versionadded:: 0.7 + """ + + # https://git.tu-berlin.de/rsim/hyspecnet-tools/-/blob/main/tif_to_npy.ipynb + mean = 0 + std = 10000 + + def __init__( + self, batch_size: int = 64, num_workers: int = 0, **kwargs: Any + ) -> None: + """Initialize a new HySpecNet11kDataModule instance. + + Args: + batch_size: Size of each mini-batch. + num_workers: Number of workers for parallel data loading. + **kwargs: Additional keyword arguments passed to + :class:`~torchgeo.datasets.HySpecNet11k`. + """ + super().__init__(HySpecNet11k, batch_size, num_workers, **kwargs) diff --git a/torchgeo/datasets/__init__.py b/torchgeo/datasets/__init__.py index 3016c3af7e2..d77e13475a0 100644 --- a/torchgeo/datasets/__init__.py +++ b/torchgeo/datasets/__init__.py @@ -61,6 +61,7 @@ from .geonrw import GeoNRW from .gid15 import GID15 from .globbiomass import GlobBiomass +from .hyspecnet import HySpecNet11k from .idtrees import IDTReeS from .inaturalist import INaturalist from .inria import InriaAerialImageLabeling @@ -214,6 +215,7 @@ 'GeoDataset', 'GeoNRW', 'GlobBiomass', + 'HySpecNet11k', 'IDTReeS', 'INaturalist', 'IOBench', diff --git a/torchgeo/datasets/hyspecnet.py b/torchgeo/datasets/hyspecnet.py new file mode 100644 index 00000000000..30b3f7e02f2 --- /dev/null +++ b/torchgeo/datasets/hyspecnet.py @@ -0,0 +1,229 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +"""HySpecNet dataset.""" + +import os +from collections.abc import Callable, Sequence +from typing import ClassVar + +import rasterio as rio +import torch +from einops import rearrange +from matplotlib import pyplot as plt +from matplotlib.figure import Figure +from torch import Tensor + +from .errors import DatasetNotFoundError, RGBBandsMissingError +from .geo import NonGeoDataset +from .utils import Path, download_url, extract_archive, percentile_normalization + +# https://git.tu-berlin.de/rsim/hyspecnet-tools/-/blob/main/tif_to_npy.ipynb +invalid_channels = [ + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 160, + 161, + 162, + 163, + 164, + 165, + 166, +] +valid_channels_ids = [c + 1 for c in range(224) if c not in invalid_channels] + + +class HySpecNet11k(NonGeoDataset): + """HySpecNet-11k dataset. + + `HySpecNet-11k `__ is a large-scale + hyperspectral benchmark dataset made up of 11,483 nonoverlapping image patches + acquired by the `EnMAP satellite `_. Each patch is a + portion of 128 x 128 pixels with 224 spectral bands and with a ground sample + distance of 30 m. + + To construct HySpecNet-11k, a total of 250 EnMAP tiles acquired during the routine + operation phase between 2 November 2022 and 9 November 2022 were considered. The + considered tiles are associated with less than 10% cloud and snow cover. The tiles + were radiometrically, geometrically and atmospherically corrected (L2A water & land + product). Then, the tiles were divided into nonoverlapping image patches. The + cropped patches at the borders of the tiles were eliminated. As a result, more than + 45 patches per tile are obtained, resulting in 11,483 patches for the full dataset. + + We provide predefined splits obtained by randomly dividing HySpecNet into: + + #. a training set that includes 70% of the patches, + #. a validation set that includes 20% of the patches, and + #. a test set that includes 10% of the patches. + + Depending on the way that we used for splitting the dataset, we define two + different splits: + + #. an easy split, where patches from the same tile can be present in different sets + (patchwise splitting); and + #. a hard split, where all patches from one tile belong to the same set + (tilewise splitting). + + If you use this dataset in your research, please cite the following paper: + + * https://arxiv.org/abs/2306.00385 + + .. versionadded:: 0.7 + """ + + url = 'https://hf.co/datasets/torchgeo/hyspecnet/resolve/13e110422a6925cbac0f11edff610219b9399227/' + md5s: ClassVar[dict[str, str]] = { + 'hyspecnet-11k-01.tar.gz': '974aae9197006727b42ec81796049efe', + 'hyspecnet-11k-02.tar.gz': 'f80574485f835b8a263b6c64076c0c62', + 'hyspecnet-11k-03.tar.gz': '6bc1de573f97fa4a75b79719b9270cb3', + 'hyspecnet-11k-04.tar.gz': '2463dc10653cb8be10d44951307c5e7d', + 'hyspecnet-11k-05.tar.gz': '16c1bd9e684673e741c0849bd015c988', + 'hyspecnet-11k-06.tar.gz': '8eef16b67d71af6eb4bc836d294fe3c4', + 'hyspecnet-11k-07.tar.gz': 'f61f0e7d6b05c861e69026b09130a5d6', + 'hyspecnet-11k-08.tar.gz': '19d390bc9e61b85e7d765f3077984976', + 'hyspecnet-11k-09.tar.gz': '197ff47befe5b9de88be5e1321c5ce5d', + 'hyspecnet-11k-10.tar.gz': '9e674cca126a9d139d6584be148d4bac', + 'hyspecnet-11k-splits.tar.gz': '94fad9e3c979c612c29a045406247d6c', + } + + all_bands = valid_channels_ids + rgb_bands = (43, 28, 10) + + def __init__( + self, + root: Path = 'data', + split: str = 'train', + strategy: str = 'easy', + bands: Sequence[int] = all_bands, + transforms: Callable[[dict[str, Tensor]], dict[str, Tensor]] | None = None, + download: bool = False, + checksum: bool = False, + ) -> None: + """Initialize a new HySpecNet11k instance. + + Args: + root: Root directory where dataset can be found. + split: One of 'train', 'val', or 'test'. + strategy: Either 'easy' for patchwise splitting or 'hard' for tilewise + splitting. + bands: Bands to return. + transforms: A function/transform that takes input sample and its target as + entry and returns a transformed version. + download: If True, download dataset and store it in the root directory. + checksum: If True, check the MD5 of the downloaded files (may be slow). + + Raises: + DatasetNotFoundError: If dataset is not found and *download* is False. + """ + self.root = root + self.split = split + self.strategy = strategy + self.bands = bands + self.transforms = transforms + self.download = download + self.checksum = checksum + + self._verify() + + path = os.path.join(root, 'hyspecnet-11k', 'splits', strategy, f'{split}.csv') + with open(path) as f: + self.files = f.read().strip().split('\n') + + def __len__(self) -> int: + """Return the number of data points in the dataset. + + Returns: + Length of the dataset. + """ + return len(self.files) + + def __getitem__(self, index: int) -> dict[str, Tensor]: + """Return an index within the dataset. + + Args: + index: Index to return. + + Returns: + Data and label at that index. + """ + file = self.files[index].replace('DATA.npy', 'SPECTRAL_IMAGE.TIF') + with rio.open(os.path.join(self.root, 'hyspecnet-11k', 'patches', file)) as src: + sample = {'image': torch.tensor(src.read(self.bands).astype('float32'))} + + if self.transforms is not None: + sample = self.transforms(sample) + + return sample + + def _verify(self) -> None: + """Verify the integrity of the dataset.""" + # Check if the extracted files already exist + exists = [] + for directory in ['patches', 'splits']: + path = os.path.join(self.root, 'hyspecnet-11k', directory) + exists.append(os.path.isdir(path)) + + if all(exists): + return + + for file, md5 in self.md5s.items(): + # Check if the file has already been downloaded + path = os.path.join(self.root, file) + if os.path.isfile(path): + extract_archive(path) + continue + + # Check if the user requested to download the dataset + if self.download: + url = self.url + file + download_url(url, self.root, md5=md5 if self.checksum else None) + extract_archive(path) + continue + + raise DatasetNotFoundError(self) + + def plot(self, sample: dict[str, Tensor], suptitle: str | None = None) -> Figure: + """Plot a sample from the dataset. + + Args: + sample: A sample returned by :meth:`__getitem__`. + suptitle: optional string to use as a suptitle + + Returns: + A matplotlib Figure with the rendered sample. + + Raises: + RGBBandsMissingError: If *bands* does not include all RGB bands. + """ + rgb_indices = [] + for band in self.rgb_bands: + if band in self.bands: + rgb_indices.append(self.bands.index(band)) + else: + raise RGBBandsMissingError() + + image = sample['image'][rgb_indices].cpu().numpy() + image = rearrange(image, 'c h w -> h w c') + image = percentile_normalization(image) + + fig, ax = plt.subplots() + ax.imshow(image) + ax.axis('off') + + if suptitle: + fig.suptitle(suptitle) + + return fig From 90850e57d55faac8a4c66e8998535a8c6a9e2289 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 21:03:49 +0100 Subject: [PATCH 2/7] Add docs for data module --- docs/api/datamodules.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/api/datamodules.rst b/docs/api/datamodules.rst index abb0c6eaefa..cab21f872d4 100644 --- a/docs/api/datamodules.rst +++ b/docs/api/datamodules.rst @@ -124,6 +124,11 @@ GID-15 .. autoclass:: GID15DataModule +HySpecNet-11k +^^^^^^^^^^^^^ + +.. autoclass:: HySpecNet11kDataModule + Inria Aerial Image Labeling ^^^^^^^^^^^^^^^^^^^^^^^^^^^ From 9ceb56ac27d96eddd4c8a76fa85c1e0c7955f5ab Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 21:21:38 +0100 Subject: [PATCH 3/7] Shorten filename to appease Windows git --- tests/data/hyspecnet/data.py | 3 ++- tests/data/hyspecnet/hyspecnet-11k-01.tar.gz | Bin 26926 -> 26882 bytes .../hyspecnet/hyspecnet-11k-splits.tar.gz | Bin 478 -> 426 bytes ...8Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF} | Bin ...8Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF} | Bin .../hyspecnet-11k/splits/easy/test.csv | 4 ++-- .../hyspecnet-11k/splits/easy/train.csv | 4 ++-- .../hyspecnet-11k/splits/easy/val.csv | 4 ++-- 8 files changed, 8 insertions(+), 7 deletions(-) rename tests/data/hyspecnet/hyspecnet-11k/patches/{ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF => ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF} (100%) rename tests/data/hyspecnet/hyspecnet-11k/patches/{ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF => ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF} (100%) diff --git a/tests/data/hyspecnet/data.py b/tests/data/hyspecnet/data.py index 2e7e32e51eb..aaa06a7048c 100755 --- a/tests/data/hyspecnet/data.py +++ b/tests/data/hyspecnet/data.py @@ -16,7 +16,8 @@ np.random.seed(0) -tiles = ['ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z'] +# Tile name purposefully shortened to avoid Windows git filename length limit. +tiles = ['ENMAP01-____L2A-DT0000004950_20221103T162438Z'] patches = ['Y01460273_X05670694', 'Y01460273_X06950822'] profile = { diff --git a/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz index cc900f7042ac96b98b326bde051c3b07535c5483..629ef5ce342cb2d15bb7dc3ea9386b8c6b4a58e4 100644 GIT binary patch literal 26882 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 literal 26926 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 diff --git a/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz index dba91b8a4046e28a100386349bf69aab373c1a4c..25f1d8227cbf06bcaf5785ad5da5eb4c7fbb83b4 100644 GIT binary patch delta 408 zcmV;J0cZZ+1F8cCABzYGgjj<+s&P`W4B_p1gh*C0fgAye?I4c zoU>@d8pyjZ?J9hpwKHg(lhV)^acZ zmDb<*uTdBl0r9`~+&(@OeShHbFytPKxHqV3B69^p1PmYsF$e{bB6~^yH9LL|BG-UM z44*=c4d`4Rze3zA21T-1ZaYnFU56PN;_)l&wod*h|6jKMf&AZg|F7(HagqbT0sa@^ zcai*0{wM#F|H=Pn@W0H-|Lykw+Rje%`+tc4K_dB|{7?R;P$-nT@(BTX+54^lC;$L| C64Xfm delta 460 zcmV;-0WmfG3SS_}y?1_+ED8-+=%Otyq_l2A z&`6~!Vp7q!?-UDCt6hk(V$Qc2iE)G(=XgjE2H|ZtU)>k^uvmDtpp8Q#k<#1OU)Pz0 z#cQv;Gx#X0eBr*{YbJ@?(`q~|Za7kGi6e=FB-UiCX?bw<-qz*37|e>wXMcVV%lTwn zm0=C%KZ?v|w40IS=b2|6vC$%i*qwi6EO~8n&hwuR^XXsrx!Xpg>)Zd}BJyAT&VNS! zpC$jJz4@ODtGJ)J&B~tL zhPjL1Z*tso|JH8z`r+xO@?TvAuq2VnUfh$2h-{*3p5E`Iy)>B3*R9K65$ir4i_|>* zc14hq*9-j*{clhI6U~Bi-|YUk$j7sj6u=|;pE82}hyI8DhyDlXe?91b=k9;8MgMDd z|6Ash(>(q=rvJGgBKjZtANn8q9{>OV00000000000000000000?D_;Cx-HBAPyhh4 CVe~Tq diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF similarity index 100% rename from tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF rename to tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF similarity index 100% rename from tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF rename to tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv index c0d8dcd47d6..0620a11793b 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv index c0d8dcd47d6..0620a11793b 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv index c0d8dcd47d6..0620a11793b 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z_001_V010110_20221118T145147Z-Y01460273_X06950822-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy From 44eeda568221edb847ef191d3c5ec0281a346a68 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 21:24:15 +0100 Subject: [PATCH 4/7] Add more tests --- tests/trainers/test_byol.py | 1 + tests/trainers/test_simclr.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/trainers/test_byol.py b/tests/trainers/test_byol.py index b0c13b6075b..808bf937220 100644 --- a/tests/trainers/test_byol.py +++ b/tests/trainers/test_byol.py @@ -41,6 +41,7 @@ class TestBYOLTask: 'name', [ 'chesapeake_cvpr_prior_byol', + 'hyspecnet_byol', 'seco_byol_1', 'seco_byol_2', 'ssl4eo_l_byol_1', diff --git a/tests/trainers/test_simclr.py b/tests/trainers/test_simclr.py index 7e1292ab7c0..3924b6e3785 100644 --- a/tests/trainers/test_simclr.py +++ b/tests/trainers/test_simclr.py @@ -29,6 +29,7 @@ class TestSimCLRTask: 'name', [ 'chesapeake_cvpr_prior_simclr', + 'hyspecnet_simclr', 'seco_simclr_1', 'seco_simclr_2', 'ssl4eo_l_simclr_1', From 3750df6b2d1079801402f06b491b62d65fc15e46 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 21:29:12 +0100 Subject: [PATCH 5/7] Even shorter --- tests/data/hyspecnet/data.py | 2 +- tests/data/hyspecnet/hyspecnet-11k-01.tar.gz | Bin 26882 -> 26832 bytes .../hyspecnet/hyspecnet-11k-splits.tar.gz | Bin 426 -> 413 bytes ...8Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF} | Bin ...8Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF} | Bin .../hyspecnet-11k/splits/easy/test.csv | 4 ++-- .../hyspecnet-11k/splits/easy/train.csv | 4 ++-- .../hyspecnet-11k/splits/easy/val.csv | 4 ++-- 8 files changed, 7 insertions(+), 7 deletions(-) rename tests/data/hyspecnet/hyspecnet-11k/patches/{ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF => ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF} (100%) rename tests/data/hyspecnet/hyspecnet-11k/patches/{ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF => ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF} (100%) diff --git a/tests/data/hyspecnet/data.py b/tests/data/hyspecnet/data.py index aaa06a7048c..3b4b701106e 100755 --- a/tests/data/hyspecnet/data.py +++ b/tests/data/hyspecnet/data.py @@ -17,7 +17,7 @@ np.random.seed(0) # Tile name purposefully shortened to avoid Windows git filename length limit. -tiles = ['ENMAP01-____L2A-DT0000004950_20221103T162438Z'] +tiles = ['ENMAP01_20221103T162438Z'] patches = ['Y01460273_X05670694', 'Y01460273_X06950822'] profile = { diff --git a/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-01.tar.gz index 629ef5ce342cb2d15bb7dc3ea9386b8c6b4a58e4..b5a5ec766a5863566ad74f592d4f73f8d94d4d71 100644 GIT binary patch literal 26832 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 NC-sK@I+Q1W=)aXv#GC*C literal 26882 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 diff --git a/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz b/tests/data/hyspecnet/hyspecnet-11k-splits.tar.gz index 25f1d8227cbf06bcaf5785ad5da5eb4c7fbb83b4..152f71c040f5bc153706d0df4d91928dd6a9b36b 100644 GIT binary patch delta 393 zcmV;40e1eX1Dyi~ABzYGhFy^cAAdn>!Y~xad-hZG3)sHABroYfSYd-*HavLPc9Ecw z$yCI2qThZI53)H2I;&vc-$P3KAW-@LeodBV`CZqo9=#j-MN&&(n?oyrRJ-fVeE}#i zNmt1Q@);_(h}$R44BB*BjiKlx7> zk&puOzxF&lKb2h&eFQ`yKzjD#yN~^U%MU$hzeYV1pppF-&}4uLb<}YCzU-CRY`$*& zZ*M9zSj3}-cYAa5`TWQJ|NZ#fs_Yv9gxKAGKIed( zvuMK_$h$A?Dtw-`GiaiDIi0&MH-c-fG(w`l7?E`t<@)ow^-DKexH9JaEr0dP*|hX& z4gGJ7szzOnfbvVvb7{DeN@)o1xll&1NHy92#n{gOnir-`Cf8U0heNa|J^L3?K$E2nCTMdrAK_JAMu#*MLS0 zpF)id=v*GZLfk6`MY33KJ56m}hZz~-@hj}MPW~tVU$*~&{NHx}uk3Vjk^{g2{ukkQ zk^E2oC;yZG$^U2Yzs$-1?e_oL&QA0De~AAEPyVM+D3rSL0SI~7`>p^e001om B({TU* diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF similarity index 100% rename from tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF rename to tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-SPECTRAL_IMAGE.TIF diff --git a/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF b/tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF similarity index 100% rename from tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF rename to tests/data/hyspecnet/hyspecnet-11k/patches/ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-SPECTRAL_IMAGE.TIF diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv index 0620a11793b..14393bce82a 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/test.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-DATA.npy diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv index 0620a11793b..14393bce82a 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/train.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-DATA.npy diff --git a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv index 0620a11793b..14393bce82a 100644 --- a/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv +++ b/tests/data/hyspecnet/hyspecnet-11k/splits/easy/val.csv @@ -1,2 +1,2 @@ -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X05670694-DATA.npy -ENMAP01-____L2A-DT0000004950_20221103T162438Z/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822/ENMAP01-____L2A-DT0000004950_20221103T162438Z-Y01460273_X06950822-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X05670694/ENMAP01_20221103T162438Z-Y01460273_X05670694-DATA.npy +ENMAP01_20221103T162438Z/ENMAP01_20221103T162438Z-Y01460273_X06950822/ENMAP01_20221103T162438Z-Y01460273_X06950822-DATA.npy From 379b544fa6bbc4db2687dc1593e5ebe4c6900358 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 14 Nov 2024 21:33:38 +0100 Subject: [PATCH 6/7] Fix mypy --- torchgeo/datamodules/hyspecnet.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/torchgeo/datamodules/hyspecnet.py b/torchgeo/datamodules/hyspecnet.py index 39839e8b468..3e508ef11a7 100644 --- a/torchgeo/datamodules/hyspecnet.py +++ b/torchgeo/datamodules/hyspecnet.py @@ -5,6 +5,8 @@ from typing import Any +import torch + from ..datasets import HySpecNet11k from .geo import NonGeoDataModule @@ -16,8 +18,8 @@ class HySpecNet11kDataModule(NonGeoDataModule): """ # https://git.tu-berlin.de/rsim/hyspecnet-tools/-/blob/main/tif_to_npy.ipynb - mean = 0 - std = 10000 + mean = torch.tensor(0) + std = torch.tensor(10000) def __init__( self, batch_size: int = 64, num_workers: int = 0, **kwargs: Any From c98fa61e9088a6aa9883ff6a7df383b0088e988e Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 30 Nov 2024 11:59:24 +0100 Subject: [PATCH 7/7] Clarify benchmark task --- torchgeo/datasets/hyspecnet.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/torchgeo/datasets/hyspecnet.py b/torchgeo/datasets/hyspecnet.py index 30b3f7e02f2..412ea504b24 100644 --- a/torchgeo/datasets/hyspecnet.py +++ b/torchgeo/datasets/hyspecnet.py @@ -50,10 +50,10 @@ class HySpecNet11k(NonGeoDataset): """HySpecNet-11k dataset. `HySpecNet-11k `__ is a large-scale - hyperspectral benchmark dataset made up of 11,483 nonoverlapping image patches - acquired by the `EnMAP satellite `_. Each patch is a - portion of 128 x 128 pixels with 224 spectral bands and with a ground sample - distance of 30 m. + benchmark dataset for hyperspectral image compression and self-supervised learning. + It is made up of 11,483 nonoverlapping image patches acquired by the + `EnMAP satellite `_. Each patch is a portion of 128 x 128 + pixels with 224 spectral bands and with a ground sample distance of 30 m. To construct HySpecNet-11k, a total of 250 EnMAP tiles acquired during the routine operation phase between 2 November 2022 and 9 November 2022 were considered. The