From 45f370389fbe045d4a99391139a833a66e404cc4 Mon Sep 17 00:00:00 2001 From: isaac <22203655+isaaccorley@users.noreply.github.com> Date: Wed, 12 Jan 2022 14:16:06 -0800 Subject: [PATCH] Add DFC2022 dataset (#354) * add DFC2022 dataset * plot fix * mypy fixes * add tests and tests data * maximum coverage * remove local dir * update per suggestions * update monkeypatching * update docstring * fix indentation in docstring --- docs/api/datasets.rst | 5 + tests/data/dfc2022/data.py | 121 ++++++ tests/data/dfc2022/labeled_train.zip | Bin 0 -> 17726 bytes .../44-2013-0295-6713-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2013-0295-6713-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes ...4-2013-0295-6713-LA93-0M50-E080_UA2012.tif | Bin 0 -> 1390 bytes .../06-2014-1007-6318-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2014-1007-6318-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes ...6-2014-1007-6318-LA93-0M50-E080_UA2012.tif | Bin 0 -> 1390 bytes tests/data/dfc2022/unlabeled_train.zip | Bin 0 -> 14420 bytes .../59-2012-0650-7077-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2012-0650-7077-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes .../72-2013-0469-6789-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2013-0469-6789-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes tests/data/dfc2022/val.zip | Bin 0 -> 14323 bytes .../63-2013-0711-6530-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2013-0711-6530-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes .../13-2014-0900-6268-LA93-0M50-E080.tif | Bin 0 -> 3450 bytes ...-2014-0900-6268-LA93-0M50-E080_RGEALTI.tif | Bin 0 -> 4462 bytes tests/datasets/test_dfc2022.py | 96 +++++ torchgeo/datasets/__init__.py | 2 + torchgeo/datasets/dfc2022.py | 361 ++++++++++++++++++ 22 files changed, 585 insertions(+) create mode 100644 tests/data/dfc2022/data.py create mode 100644 tests/data/dfc2022/labeled_train.zip create mode 100644 tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/BDORTHO/44-2013-0295-6713-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/RGEALTI/44-2013-0295-6713-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/UrbanAtlas/44-2013-0295-6713-LA93-0M50-E080_UA2012.tif create mode 100644 tests/data/dfc2022/labeled_train/Nice/BDORTHO/06-2014-1007-6318-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/labeled_train/Nice/RGEALTI/06-2014-1007-6318-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/data/dfc2022/labeled_train/Nice/UrbanAtlas/06-2014-1007-6318-LA93-0M50-E080_UA2012.tif create mode 100644 tests/data/dfc2022/unlabeled_train.zip create mode 100644 tests/data/dfc2022/unlabeled_train/Calais_Dunkerque/BDORTHO/59-2012-0650-7077-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/unlabeled_train/Calais_Dunkerque/RGEALTI/59-2012-0650-7077-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/data/dfc2022/unlabeled_train/LeMans/BDORTHO/72-2013-0469-6789-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/unlabeled_train/LeMans/RGEALTI/72-2013-0469-6789-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/data/dfc2022/val.zip create mode 100644 tests/data/dfc2022/val/Clermont-Ferrand/BDORTHO/63-2013-0711-6530-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/val/Clermont-Ferrand/RGEALTI/63-2013-0711-6530-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/data/dfc2022/val/Marseille_Martigues/BDORTHO/13-2014-0900-6268-LA93-0M50-E080.tif create mode 100644 tests/data/dfc2022/val/Marseille_Martigues/RGEALTI/13-2014-0900-6268-LA93-0M50-E080_RGEALTI.tif create mode 100644 tests/datasets/test_dfc2022.py create mode 100644 torchgeo/datasets/dfc2022.py diff --git a/docs/api/datasets.rst b/docs/api/datasets.rst index 6979999de..0e9cf396b 100644 --- a/docs/api/datasets.rst +++ b/docs/api/datasets.rst @@ -97,6 +97,11 @@ CV4A Kenya Crop Type Competition .. autoclass:: CV4AKenyaCropType +2022 IEEE GRSS Data Fusion Contest (DFC2022) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: DFC2022 + ETCI2021 Flood Detection ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/data/dfc2022/data.py b/tests/data/dfc2022/data.py new file mode 100644 index 000000000..60b0b3d7a --- /dev/null +++ b/tests/data/dfc2022/data.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import hashlib +import os +import random +import shutil + +import numpy as np +import rasterio + +from torchgeo.datasets import DFC2022 + +SIZE = 32 + +np.random.seed(0) +random.seed(0) + + +train_set = [ + { + "image": "labeled_train/Nantes_Saint-Nazaire/BDORTHO/44-2013-0295-6713-LA93-0M50-E080.tif", # noqa: E501 + "dem": "labeled_train/Nantes_Saint-Nazaire/RGEALTI/44-2013-0295-6713-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + "target": "labeled_train/Nantes_Saint-Nazaire/UrbanAtlas/44-2013-0295-6713-LA93-0M50-E080_UA2012.tif", # noqa: E501 + }, + { + "image": "labeled_train/Nice/BDORTHO/06-2014-1007-6318-LA93-0M50-E080.tif", # noqa: E501 + "dem": "labeled_train/Nice/RGEALTI/06-2014-1007-6318-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + "target": "labeled_train/Nice/UrbanAtlas/06-2014-1007-6318-LA93-0M50-E080_UA2012.tif", # noqa: E501 + }, +] + +unlabeled_set = [ + { + "image": "unlabeled_train/Calais_Dunkerque/BDORTHO/59-2012-0650-7077-LA93-0M50-E080.tif", # noqa: E501 + "dem": "unlabeled_train/Calais_Dunkerque/RGEALTI/59-2012-0650-7077-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + }, + { + "image": "unlabeled_train/LeMans/BDORTHO/72-2013-0469-6789-LA93-0M50-E080.tif", # noqa: E501 + "dem": "unlabeled_train/LeMans/RGEALTI/72-2013-0469-6789-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + }, +] + +val_set = [ + { + "image": "val/Marseille_Martigues/BDORTHO/13-2014-0900-6268-LA93-0M50-E080.tif", # noqa: E501 + "dem": "val/Marseille_Martigues/RGEALTI/13-2014-0900-6268-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + }, + { + "image": "val/Clermont-Ferrand/BDORTHO/63-2013-0711-6530-LA93-0M50-E080.tif", # noqa: E501 + "dem": "val/Clermont-Ferrand/RGEALTI/63-2013-0711-6530-LA93-0M50-E080_RGEALTI.tif", # noqa: E501 + }, +] + + +def create_file(path: str, dtype: str, num_channels: int) -> None: + profile = {} + profile["driver"] = "GTiff" + profile["dtype"] = dtype + profile["count"] = num_channels + profile["crs"] = "epsg:4326" + profile["transform"] = rasterio.transform.from_bounds(0, 0, 1, 1, 1, 1) + profile["height"] = SIZE + profile["width"] = SIZE + + if "float" in profile["dtype"]: + Z = np.random.randn(SIZE, SIZE).astype(profile["dtype"]) + else: + Z = np.random.randint( + np.iinfo(profile["dtype"]).max, size=(SIZE, SIZE), dtype=profile["dtype"] + ) + + src = rasterio.open(path, "w", **profile) + for i in range(1, profile["count"] + 1): + src.write(Z, i) + + +if __name__ == "__main__": + for split in DFC2022.metadata: + directory = DFC2022.metadata[split]["directory"] + filename = DFC2022.metadata[split]["filename"] + + # Remove old data + if os.path.isdir(directory): + shutil.rmtree(directory) + if os.path.exists(filename): + os.remove(filename) + + if split == "train": + files = train_set + elif split == "train-unlabeled": + files = unlabeled_set + else: + files = val_set + + for file_dict in files: + # Create image file + path = file_dict["image"] + os.makedirs(os.path.dirname(path), exist_ok=True) + create_file(path, dtype="uint8", num_channels=3) + + # Create DEM file + path = file_dict["dem"] + os.makedirs(os.path.dirname(path), exist_ok=True) + create_file(path, dtype="float32", num_channels=1) + + # Create mask file + if split == "train": + path = file_dict["target"] + os.makedirs(os.path.dirname(path), exist_ok=True) + create_file(path, dtype="uint8", num_channels=1) + + # Compress data + shutil.make_archive(filename.replace(".zip", ""), "zip", ".", directory) + + # Compute checksums + with open(filename, "rb") as f: + md5 = hashlib.md5(f.read()).hexdigest() + print(f"{filename}: {md5}") diff --git a/tests/data/dfc2022/labeled_train.zip b/tests/data/dfc2022/labeled_train.zip new file mode 100644 index 0000000000000000000000000000000000000000..1ef072e59b8510ffd405915dbec4452a171b24f0 GIT binary patch literal 17726 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 literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/BDORTHO/44-2013-0295-6713-LA93-0M50-E080.tif b/tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/BDORTHO/44-2013-0295-6713-LA93-0M50-E080.tif new file mode 100644 index 0000000000000000000000000000000000000000..c457f748fe4710e7fd5a453e419b297c9c12dc90 GIT binary patch literal 3450 zcmajhb##?i76tGZf&>U&+}+(v@#0z>rnnSZT#7H80L9(CP(h2g#oeJuDemr823zwZ zVb=7&d09#ByWf>__TFcouTrIKfsjBT5H}DA3JwGrrSTi|k8vd9U~@pv&Msmh6bYg z|J3iwu;B2x(m8)sSZLtGoh^)4heZmHzN_(vPe}MrkXSxW1Rj@+c=F%>5#Rp*-~X+T zI4fEp5E(9RmPW++U<(S|j2jfPI?U5R)bQ_P(?<_k74~6I%<%t#z=#grr>0!owUi~L zmegrbx_*V)X^Ir+7g)AzS&SGl1`HT5di3brxpV*Y(@(p0?V2`iT8|z*mMmG4C{dyf z8#Zj)w(ZcNLuu2dJ#*$v*|KHVtXWgNdi9wzXTEv!rdF+53l}atckbNIojbq%_S^pb z`+xV{cVB(=mBEc0H>{5yJ^JFsi@SI4-oAbN6DLkwym)cJf(7&D%}bat;TKC>mDPoHknrcH|$Eiz=t;KnFXqIB-uxqkinpMLsj_UzfKR;^mTeEH8l`>aZp zD%Y=HckJfPn}-e^8asCE1`QgBIgEYx!4%Gp@7Xwj@$vpRG8_U&cL zl&M&;VxK;JZr;2pwiPQ@95`?wbLPyID_6dI_wLc7N8R`Krbqfgz$(b{!l#d-dmLNd_!MoAP6DLm0 zlqu7xQ>S+C-kmB{D$8EHc=7)I`wA5*6f9V9@7}#NYSf4pEt+%Er%%6f<;s*PQ*PR{ z3Bvet-Igs|j1lzPZ@KK%9T*DYJNY}Twh?*RP-R zq37Pgg9kehn+^;P4z_;Suwj!XP1>GGDEAl z5GsV7xo6Lwu3fwS{PWMW{rm5~Q`+aBe{PaKoeYysojMgRTsU32bl0w3BQW6&95|3L z=FFL6(ztEgw$u_ia%8H$b?X*XA&ibMzx)zhbLY+#YU0F+NdsBRNS? z&ac1zx^CS%#JL?-zS`)nUcGwNu3h`el`GN-3JMa8vUg7D(xpiVVnXuOQvg!$k3aq> z7~?o`;;0%q65*>?ugJhxVXy_|=~5VCxo6LwVh{`@W5$e0U?itb&8Ti}01&X8KYyMq z{}ukJS+k}{cnA#t{`>D7Ida%SJa_Kg*}8SBr^Jb3wLELqEZaeck;aW1D{56=s8Asp z0Y{Jm!;6rJO2rXXojP^$1 zy*N?NDA0;-oc=rfV^^h0mCUPdrNO~W!;Stq8+T$;%*5@=N*SVFrV3wEa5!@i205`f z%EYXC*}s23@R6c@n4vwqgG>AbrjE42QKLrDCm)uGEU1g}Ny{NnLYcd8ls|v|2wQdz zIv4_!pvOZnMJkFy*5tttg{r{e$s{4B;&ilCt5(TNf6*>Qj(T?OE@g`gOv#I8Olm`9 zeDB^pM?pz{VG9~A)eRan2;*vvPhwW7szEajA3uIPU8yNvO(FCqLI6hCvZq1Jcy`RB*|c$-q#F2fBu8x0rx%i3xpK(}6c*b;OSWgsm~raVspP>+B`!Sui$$2H4FT&= zY|vtL&5D`B$&)8FdOBo)3IVN}j%Zn&OfBFuw)=}>X9`&n{18q-sdiMo=R~zR03Xyr^GgNLTW; zh8J1mWTgQd;ekbCrAg~q5P`8%YfvC0)knk92cvrN4(0`n`NLL~k&4bM5m^g^W{6*H zDjbEz0hpw*>affL)j_xBL7|Sw!)p?4b7qD{1A2jyBrxxa6s1h)hbml$5%mrVE=PXq zh-^A^=ztM_B}giAq-0qO6_R*#3)fXsN`~*TcUXBVbMlcRM<_uH2A3{CV8ky5R9X*S zT0$bUfx{9(t-f4Mfj%^YCa?(47V&r)0~hawfCeFQg5=M1YcOKO2ug-Fg0u;)%X1*Z z;fa&&C?78s0^nUVESLH7=YvaLUY@}Ye1@Pkc<~mhuL{;!h2l#9J`k3>V^yLxjT$x5 U&b(PsrZ9*WS)5$5Y6qDA0ShYsP5=M^ literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/RGEALTI/44-2013-0295-6713-LA93-0M50-E080_RGEALTI.tif b/tests/data/dfc2022/labeled_train/Nantes_Saint-Nazaire/RGEALTI/44-2013-0295-6713-LA93-0M50-E080_RGEALTI.tif new file mode 100644 index 0000000000000000000000000000000000000000..beb1ee0b3b0b4553ec5fc865b3f0696aa77917c8 GIT binary patch literal 4462 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 m-qGR53%@Aa!g=Y(YjAu--hNgea1@7?ce% zQyi*>frWuV21!jY5}U7?hk+TW_8bs5weT>o0qJKzyuO_o>@G2&`5W4K7?^-!VL&En9aLKHSxPuxYL#ub!}n>BCbIg3EfDpS`(SaBTi$?jMJ%Ezh41*wj1q zVZU7x_s;xTubL02HJ8P=xIVcZCa_1mWA^gpQaAsZo@=}Mob&VC3)?!kdS7vN-oW+2 zV%cZO(>E0S%I~Im`iC6)t(zHc6eaZOnSX~n)5AM?rQ9JpPrlD}x!C&R&&het50320 z>GXAJ>so7_D7;i*(StzM^Ep3O&+#&rUa;O{qM^TdMx;*zx8_c`0>; z8=sXosa>nmkZIUBt7oaC%4)7-R;t5q)ZdHdN+RxX|4bw!Y=^oaLfPWxrowzCL7 z__DF6tE^=5=~Z)=toGY~?dmsM>l2HjnFKoW>w2p%$Ap~CczT@zbkH_8Mvg>qJJ7Mi>rFv3iGb>MGQR2Mf2y+J4Yj#r+4X`#l!pJHfKT*tw=`bSmW@3#k25@nsHo?B&irGi7?h2NRIA?HpX`oP=EZTtG- z{F}eJcw=isCTyCPvg9k@^kv)?e47@SFswH^zR-L6T)X+{t;eme^7+1JsOsw;v#_C}4J?{ehRIbD~^lZMlcX9ACIlBa>qeolS-R!NxAq^|ewC%TMk9wQ>9G(qori*MHyhR_$TpO8ytTmweyr{yuzW!&|co z3#FOZyaB0Drs?|rNzLscT zi}YEa`Jm?Bx(jz|Z&V$PaTS~P)3-~=L*6NJm*2wG((=AH*;YJKZExl|x3w#FUAg|0 zAErIwQW`IBRQHA7IDJVnOLhO1lGr1Q6*dN5u@DNuAO0PZoxk?Rua4Ya zXtwCir{dSsA7m=+JoV*k=e0nS2ChGg)9MTpCp&s?IKET9-pJ=3m)b9N*2BNIH2?V) zP(81=Ta|B8<&NtD;dSiO@?ZA%3$_}u_*-w7X>~#V*OyyYmqhOktY0Nxo|=D*dC|$p epKjAn^ZaX`xa{2y`7^s?=LZD@hFoBej{*R6svCU( literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/labeled_train/Nice/BDORTHO/06-2014-1007-6318-LA93-0M50-E080.tif b/tests/data/dfc2022/labeled_train/Nice/BDORTHO/06-2014-1007-6318-LA93-0M50-E080.tif new file mode 100644 index 0000000000000000000000000000000000000000..cf8d48ea3268968dc7cbf81250e59f631df77b6a GIT binary patch literal 3450 zcmajhb(EIX76$NdW^fo}Bo|#nmlDzf0@B?jNOvhAEiFT*(%qeU3F!{$PIb{JEI>d} zVBOz@>-yjQSTmgOeb3qF+0XOry{B^JT!FAaAdn~!2nq=VSw;8>`qw(xI>fV+enMiO zN9_xZT?bny4vG_fw!at2VxLEyNglh7uuc)XClDS8r2SW%y4F#9&-+O*JUn`R)q2>7 z@Ia{lpZQrI84`^vllU7V!vj%wwzA$B861tihjr8^Ec#y%EU^y)PfEqS`RD(bZ~y=I z|MthkiW>;T!Hb)v5fdM6L4mu8g2FaNdK(Ch{yrgdys!u{~rj9>e_2sx+OhI z+fsU2y+&mkR;(LQwBW!%_Uzev_3HKd_3QHG%fEQ>V%V@@@4ox)JMX-+Y15`7M~+yG z8#k^>l`4l09qQe?w^!M+W!tuG+lmz{u3o)bu3WiUvu26-$tRx-7%(7b&Ybb$#j{6D z$A=6VvUBIo!Gi}UN|dO6{rY?M>^XJn)cfzhf91-R1q&9u_uhM+ELpO|EsGZ~zJ2?) zZ3hn?ynFZV!i5XN!^7LQZ7b%zd-pC~x^&>cfw5!9RjQb7Qw;6UAuO@e*JozHfs~XV0ER$eJ~41k92pi;IBqY2Li~4?p|>l4uPZHniu?ojXE(_~C~)Z{Gar zr=RQ*_SLIbb?erZxO|HjFHUq<3nfAP`0U=jJ4uoxK*os^hZ#taI(6z_e)*+m&z?hv z4vil_K7@o$lO~O<{}cV8HB_$fcK`nUbZ^wC(Zh!irC>dG?p$xlI(+!>kt0Xq#M!UD z`pPS04jee}*s)_ZYSj4k*Iz?JLnlt0NSdZio3hiVpMDA(t!)!9L4pL*#|ilaainb7 zvX?Jk225&lkzJQAU7kLD`sbg2o;-OHn7{x2TY`-nH%9oIH*Yp>+(@0yojXfY90-wv zNvgU1+i$$xS5tuMxLbeEGSh#Vh$@WJ83hnYlmutdFj^>~l9@W7dnV?(=R74hM>|L32776d8=qq3F=>a%Ch zl#dUPG}5fnrAwDIX;PiXr3n1}_urvnW=PbvR~UAD#E217rc9YJV+NTNj_h=1Z#5Z_ z;U|r(L1Gn#eE$47dZ~;wk~syr=Ekw0dTS@2kj4fMWQnO$rzT65Of_kSJmB}+w{KaU zf1rY#y>+&{dGj)Z;0A|Yr!;V=b?`GC^$HR6#vVO-NMCkefBiM^gb-X1AN>dU3Rx(6 zX)JP4)XSGIrv>nw?-g-DjWM1{;W~Iw!9{G(jkb*%HOhYTMJcg_n2@Mq8;~P?Rbc1o z)2AOleyn!5oo)O!V&p{vYhyy+V-mVh*%7lwEocrR7#U>M3h?Y|-bpARXORvZYFu(is?o&?;1LkZ#<#fmqd@Awvcwh8d@jtZ56|w{Kr0 zAX6@?343$|7!MEQYTT>I;5-(l4G=D1L&p!K1I})GP5Sqfq0gcR7C1ar> zGoGsj1fE^>WCEd-XPB9eNx0HmRXvc-?~CDi%z=d~I>*OZI~O$H%4 zu;Y+09tD*lBzlX<#ZG8((4SQrBi&g`v(?A2p-Ue(VmYuBzd&MH@~?C(8;Qdss-9hwHW@RGvkOoFnXVF5XN zsAa*q*Jiydrc6kt;*=zuaxo_C0hQL&(d%>uQevJr^g4uapys2{lpAK4L=Tq;W{3q9 z45ZZba_7!nvt~{0g)aC(tbPTvT1LC$%pf(KC@W@GcML{)a&xa6Nx&E=700~rM-*%} zt7Ux~Ayn4H%nO5?QVy~!oJ_9eYQ_8Z?PDZWrt0xy;Qr7lRd4JbPm3s179`Q?1xggHo{5fb&X$FpO?YT!ix^ May)mtStjy-0ZBdbkpKVy literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/labeled_train/Nice/RGEALTI/06-2014-1007-6318-LA93-0M50-E080_RGEALTI.tif b/tests/data/dfc2022/labeled_train/Nice/RGEALTI/06-2014-1007-6318-LA93-0M50-E080_RGEALTI.tif new file mode 100644 index 0000000000000000000000000000000000000000..3b81b21e265fb74d6fe2fcef5200f7a6c73357dd GIT binary patch literal 4462 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 e7u=%l!WTT9jFev=x)kOc| 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 Kh?n*E+5Z8?z!ReY literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/unlabeled_train/Calais_Dunkerque/BDORTHO/59-2012-0650-7077-LA93-0M50-E080.tif b/tests/data/dfc2022/unlabeled_train/Calais_Dunkerque/BDORTHO/59-2012-0650-7077-LA93-0M50-E080.tif new file mode 100644 index 0000000000000000000000000000000000000000..1958f32696d4048b0892ef6e0c2076f6a59b45af GIT binary patch literal 3450 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 fw(W|o3Mw|=zs_Fk?R)n*Ywy$UNNdSV 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 Y{_nL1hxkJ^Ea0mL6bR@G>mR@Uf2rf@lK=n! literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/val/Clermont-Ferrand/BDORTHO/63-2013-0711-6530-LA93-0M50-E080.tif b/tests/data/dfc2022/val/Clermont-Ferrand/BDORTHO/63-2013-0711-6530-LA93-0M50-E080.tif new file mode 100644 index 0000000000000000000000000000000000000000..f8159276887f331027451a530e75644e360e2f38 GIT binary patch literal 3450 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
  • *6 zy2I{Qaqr9FAj)P)i2i6U$GExO`XTl^F8D*MPYKI(H842*#|uU literal 0 HcmV?d00001 diff --git a/tests/data/dfc2022/val/Marseille_Martigues/BDORTHO/13-2014-0900-6268-LA93-0M50-E080.tif b/tests/data/dfc2022/val/Marseille_Martigues/BDORTHO/13-2014-0900-6268-LA93-0M50-E080.tif new file mode 100644 index 0000000000000000000000000000000000000000..c954167ad0d36350521e05377e7111c110224849 GIT binary patch literal 3450 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 DFC2022: + monkeypatch.setitem( # type: ignore[attr-defined] + DFC2022.metadata["train"], "md5", "6e380c4fa659d05ca93be71b50cacd90" + ) + monkeypatch.setitem( # type: ignore[attr-defined] + DFC2022.metadata["train-unlabeled"], + "md5", + "b2bf3839323d4eae636f198921442945", + ) + monkeypatch.setitem( # type: ignore[attr-defined] + DFC2022.metadata["val"], "md5", "e018dc6865bd3086738038fff27b818a" + ) + root = os.path.join("tests", "data", "dfc2022") + split = request.param + transforms = nn.Identity() # type: ignore[attr-defined] + return DFC2022(root, split, transforms, checksum=True) + + def test_getitem(self, dataset: DFC2022) -> None: + x = dataset[0] + assert isinstance(x, dict) + assert isinstance(x["image"], torch.Tensor) + assert x["image"].ndim == 3 + assert x["image"].shape[0] == 4 + + if dataset.split == "train": + assert isinstance(x["mask"], torch.Tensor) + assert x["mask"].ndim == 2 + + def test_len(self, dataset: DFC2022) -> None: + assert len(dataset) == 2 + + def test_extract(self, tmp_path: Path) -> None: + shutil.copyfile( + os.path.join("tests", "data", "dfc2022", "labeled_train.zip"), + os.path.join(tmp_path, "labeled_train.zip"), + ) + shutil.copyfile( + os.path.join("tests", "data", "dfc2022", "unlabeled_train.zip"), + os.path.join(tmp_path, "unlabeled_train.zip"), + ) + shutil.copyfile( + os.path.join("tests", "data", "dfc2022", "val.zip"), + os.path.join(tmp_path, "val.zip"), + ) + DFC2022(root=str(tmp_path)) + + def test_corrupted(self, tmp_path: Path) -> None: + with open(os.path.join(tmp_path, "labeled_train.zip"), "w") as f: + f.write("bad") + with pytest.raises(RuntimeError, match="Dataset found, but corrupted."): + DFC2022(root=str(tmp_path), checksum=True) + + def test_invalid_split(self) -> None: + with pytest.raises(AssertionError): + DFC2022(split="foo") + + def test_not_downloaded(self, tmp_path: Path) -> None: + with pytest.raises(RuntimeError, match="Dataset not found in `root` directory"): + DFC2022(str(tmp_path)) + + def test_plot(self, dataset: DFC2022) -> None: + x = dataset[0].copy() + dataset.plot(x, suptitle="Test") + plt.close() + dataset.plot(x, show_titles=False) + plt.close() + + if dataset.split == "train": + x["prediction"] = x["mask"].clone() + dataset.plot(x) + plt.close() + del x["mask"] + dataset.plot(x) + plt.close() diff --git a/torchgeo/datasets/__init__.py b/torchgeo/datasets/__init__.py index 0571ea765..c1dbf61fc 100644 --- a/torchgeo/datasets/__init__.py +++ b/torchgeo/datasets/__init__.py @@ -24,6 +24,7 @@ from .chesapeake import ( from .cowc import COWC, COWCCounting, COWCDetection from .cv4a_kenya_crop_type import CV4AKenyaCropType from .cyclone import TropicalCycloneWindEstimation +from .dfc2022 import DFC2022 from .etci2021 import ETCI2021 from .eurosat import EuroSAT from .fair1m import FAIR1M @@ -115,6 +116,7 @@ __all__ = ( "COWCCounting", "COWCDetection", "CV4AKenyaCropType", + "DFC2022", "ETCI2021", "EuroSAT", "FAIR1M", diff --git a/torchgeo/datasets/dfc2022.py b/torchgeo/datasets/dfc2022.py new file mode 100644 index 000000000..1caf7e3d3 --- /dev/null +++ b/torchgeo/datasets/dfc2022.py @@ -0,0 +1,361 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +"""2022 IEEE GRSS Data Fusion Contest (DFC2022) dataset.""" + +import glob +import os +from typing import Callable, Dict, List, Optional, Sequence + +import matplotlib.pyplot as plt +import numpy as np +import rasterio +import torch +from matplotlib import colors +from rasterio.enums import Resampling +from torch import Tensor + +from .geo import VisionDataset +from .utils import check_integrity, extract_archive, percentile_normalization + + +class DFC2022(VisionDataset): + """DFC2022 dataset. + + The `DFC2022 `_ + dataset is used as a benchmark dataset for the 2022 IEEE GRSS Data Fusion Contest + and extends the MiniFrance dataset for semi-supervised semantic segmentation. + The dataset consists of a train set containing labeled and unlabeled imagery and an + unlabeled validation set. The dataset can be downloaded from the + `IEEEDataPort DFC2022 website `_. + + Dataset features: + + * RGB aerial images at 0.5 m per pixel spatial resolution (~2,000x2,0000 px) + * DEMs at 1 m per pixel spatial resolution (~1,000x1,0000 px) + * Masks at 0.5 m per pixel spatial resolution (~2,000x2,0000 px) + * 16 land use/land cover categories + * Images collected from the + `IGN BD ORTHO database `_ + * DEMs collected from the + `IGN RGE ALTI database `_ + * Labels collected from the + `UrbanAtlas 2012 database `_ + * Data collected from 19 regions in France + + Dataset format: + + * images are three-channel geotiffs + * DEMS are single-channel geotiffs + * masks are single-channel geotiffs with the pixel values represent the class + + Dataset classes: + + 0. No information + 1. Urban fabric + 2. Industrial, commercial, public, military, private and transport units + 3. Mine, dump and construction sites + 4. Artificial non-agricultural vegetated areas + 5. Arable land (annual crops) + 6. Permanent crops + 7. Pastures + 8. Complex and mixed cultivation patterns + 9. Orchards at the fringe of urban classes + 10. Forests + 11. Herbaceous vegetation associations + 12. Open spaces with little or no vegetation + 13. Wetlands + 14. Water + 15. Clouds and Shadows + + If you use this dataset in your research, please cite the following paper: + + * https://doi.org/10.1007/s10994-020-05943-y + + .. versionadded:: 0.3 + """ # noqa: E501 + + classes = [ + "No information", + "Urban fabric", + "Industrial, commercial, public, military, private and transport units", + "Mine, dump and construction sites", + "Artificial non-agricultural vegetated areas", + "Arable land (annual crops)", + "Permanent crops", + "Pastures", + "Complex and mixed cultivation patterns", + "Orchards at the fringe of urban classes", + "Forests", + "Herbaceous vegetation associations", + "Open spaces with little or no vegetation", + "Wetlands", + "Water", + "Clouds and Shadows", + ] + colormap = [ + "#231F20", + "#DB5F57", + "#DB9757", + "#DBD057", + "#ADDB57", + "#75DB57", + "#7BC47B", + "#58B158", + "#D4F6D4", + "#B0E2B0", + "#008000", + "#58B0A7", + "#995D13", + "#579BDB", + "#0062FF", + "#231F20", + ] + metadata = { + "train": { + "filename": "labeled_train.zip", + "md5": "2e87d6a218e466dd0566797d7298c7a9", + "directory": "labeled_train", + }, + "train-unlabeled": { + "filename": "unlabeled_train.zip", + "md5": "1016d724bc494b8c50760ae56bb0585e", + "directory": "unlabeled_train", + }, + "val": { + "filename": "val.zip", + "md5": "6ddd9c0f89d8e74b94ea352d4002073f", + "directory": "val", + }, + } + + image_root = "BDORTHO" + dem_root = "RGEALTI" + target_root = "UrbanAtlas" + + def __init__( + self, + root: str = "data", + split: str = "train", + transforms: Optional[Callable[[Dict[str, Tensor]], Dict[str, Tensor]]] = None, + checksum: bool = False, + ) -> None: + """Initialize a new DFC2022 dataset instance. + + Args: + root: root directory where dataset can be found + split: one of "train" or "test" + transforms: a function/transform that takes input sample and its target as + entry and returns a transformed version + checksum: if True, check the MD5 of the downloaded files (may be slow) + + Raises: + AssertionError: if ``split`` is invalid + """ + assert split in self.metadata + self.root = root + self.split = split + self.transforms = transforms + self.checksum = checksum + + self._verify() + + self.class2idx = {c: i for i, c in enumerate(self.classes)} + self.files = self._load_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 + """ + files = self.files[index] + image = self._load_image(files["image"]) + dem = self._load_image(files["dem"], shape=image.shape[1:]) + image = torch.cat(tensors=[image, dem], dim=0) # type: ignore[attr-defined] + + sample = {"image": image} + + if self.split == "train": + mask = self._load_target(files["target"]) + sample["mask"] = mask + + if self.transforms is not None: + sample = self.transforms(sample) + + return sample + + def __len__(self) -> int: + """Return the number of data points in the dataset. + + Returns: + length of the dataset + """ + return len(self.files) + + def _load_files(self) -> List[Dict[str, str]]: + """Return the paths of the files in the dataset. + + Returns: + list of dicts containing paths for each pair of image/dem/mask + """ + directory = os.path.join(self.root, self.metadata[self.split]["directory"]) + images = glob.glob( + os.path.join(directory, "**", self.image_root, "*.tif"), recursive=True + ) + + files = [] + for image in sorted(images): + dem = image.replace(self.image_root, self.dem_root) + dem = f"{os.path.splitext(dem)[0]}_RGEALTI.tif" + + if self.split == "train": + target = image.replace(self.image_root, self.target_root) + target = f"{os.path.splitext(target)[0]}_UA2012.tif" + files.append(dict(image=image, dem=dem, target=target)) + else: + files.append(dict(image=image, dem=dem)) + + return files + + def _load_image(self, path: str, shape: Optional[Sequence[int]] = None) -> Tensor: + """Load a single image. + + Args: + path: path to the image + shape: the (h, w) to resample the image to + + Returns: + the image + """ + with rasterio.open(path) as f: + array: "np.typing.NDArray[np.float_]" = f.read( + out_shape=shape, out_dtype="float32", resampling=Resampling.bilinear + ) + tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + return tensor + + def _load_target(self, path: str) -> Tensor: + """Load the target mask for a single image. + + Args: + path: path to the image + + Returns: + the target mask + """ + with rasterio.open(path) as f: + array: "np.typing.NDArray[np.int_]" = f.read( + indexes=1, out_dtype="int32", resampling=Resampling.bilinear + ) + tensor: Tensor = torch.from_numpy(array) # type: ignore[attr-defined] + tensor = tensor.to(torch.long) # type: ignore[attr-defined] + return tensor + + def _verify(self) -> None: + """Verify the integrity of the dataset. + + Raises: + RuntimeError: if checksum fails or the dataset is not downloaded + """ + # Check if the files already exist + exists = [] + for split_info in self.metadata.values(): + exists.append( + os.path.exists(os.path.join(self.root, split_info["directory"])) + ) + + if all(exists): + return + + # Check if .zip files already exists (if so then extract) + exists = [] + for split_info in self.metadata.values(): + filepath = os.path.join(self.root, split_info["filename"]) + if os.path.isfile(filepath): + if self.checksum and not check_integrity(filepath, split_info["md5"]): + raise RuntimeError("Dataset found, but corrupted.") + exists.append(True) + extract_archive(filepath) + else: + exists.append(False) + + if all(exists): + return + + # Check if the user requested to download the dataset + raise RuntimeError( + "Dataset not found in `root` directory, either specify a different" + + " `root` directory or manually download the dataset to this directory." + ) + + def plot( + self, + sample: Dict[str, Tensor], + show_titles: bool = True, + suptitle: Optional[str] = None, + ) -> plt.Figure: + """Plot a sample from the dataset. + + Args: + sample: a sample returned by :meth:`__getitem__` + show_titles: flag indicating whether to show titles above each panel + suptitle: optional string to use as a suptitle + + Returns: + a matplotlib Figure with the rendered sample + """ + ncols = 2 + image = sample["image"][:3] + image = image.to(torch.uint8) # type: ignore[attr-defined] + image = image.permute(1, 2, 0).numpy() + + dem = sample["image"][-1].numpy() + dem = percentile_normalization(dem, lower=0, upper=100, axis=(0, 1)) + + showing_mask = "mask" in sample + showing_prediction = "prediction" in sample + + cmap = colors.ListedColormap(self.colormap) + + if showing_mask: + mask = sample["mask"].numpy() + ncols += 1 + if showing_prediction: + pred = sample["prediction"].numpy() + ncols += 1 + + fig, axs = plt.subplots(nrows=1, ncols=ncols, figsize=(10, ncols * 10)) + + axs[0].imshow(image) + axs[0].axis("off") + axs[1].imshow(dem) + axs[1].axis("off") + if showing_mask: + axs[2].imshow(mask, cmap=cmap, interpolation=None) + axs[2].axis("off") + if showing_prediction: + axs[3].imshow(pred, cmap=cmap, interpolation=None) + axs[3].axis("off") + elif showing_prediction: + axs[2].imshow(pred, cmap=cmap, interpolation=None) + axs[2].axis("off") + + if show_titles: + axs[0].set_title("Image") + axs[1].set_title("DEM") + + if showing_mask: + axs[2].set_title("Ground Truth") + if showing_prediction: + axs[3].set_title("Predictions") + elif showing_prediction: + axs[2].set_title("Predictions") + + if suptitle is not None: + plt.suptitle(suptitle) + + return fig