衛星データ超解像のモデル(SR4RS)を動かす
衛星データの超解像モデルSR4RSを動かすだけ。
SR4RSはSpot-6/7の画像を元に学習されており、Sentinel-2(10m)を2.5m解像度にしてくれる。
環境
READMEにある通り、Dockerを使う。
docker run -ti -v ./:/home/otbuser --runtime=nvidia mdl4eo/otbtf:3.4.0-gpu bash
準備
READMEにある通り、モデルをダウンロードする。
wget https://nextcloud.inrae.fr/s/boabW9yCjdpLPGX/download/sr4rs_sentinel2_bands4328_france2020_savedmodel.zip
unzip sr4rs_sentinel2_bands4328_france2020_savedmodel.zip
なお、モデルはフランス周辺で学習されているので、そのまま使うと別の地域では精度が良くない。
READMEにある通り、ツールをダウンロードする。
git clone https://github.com/remicres/sr4rs.git
ツール内ではOrfeo ToolBoxが利用されている。
入力画像
これもREADMEにある通りだが、Red(4), Green(3), Blue(2), NearInfrared(8)の順で4バンドをレイヤーで重ねたtiffを用意する。
Sentinel-2は通常、各バンドごとにファイルが用意されているため、これをtiffに加工しなければいけない。
加工する方法はいろいろあるが、READMEにある通りにOTBTFの関数(otbcli_ConcatenateImages)を使うのが楽。
OTBTFを使わずやろうとした場合、例えばPythonで元画像を読み込もうとすると、やれfloat32のデータには対応していないやら、やれ4レイヤーには対応していないやら、ライブラリによってエラーが出るので、素直にOTBTFを使うのが良い。
# Docker内で
otbcli_ConcatenateImages -il {ID}_B04_10m.jp2 {ID}_B03_10m.jp2 {ID}_B02_10m.jp2 {ID}_B08_10m.jp2 -out otbConcatenateImages.tif
後述するが、画像サイズが大きいと処理に時間がかかるので、欲しい部分だけクロップしたいケースがある。
クロップの処理もOTBTFを使ったほうが確実。使わないで別のライブラリなどで切り出したtiffを処理しようとすると、
Please check the input(s) field of view (FOV), the output field of expression (FOE), and the output spacing scale if you run the model in fully convolutional mode (how many strides in your model?)
のようなエラーが出たりする。tiffファイルを正しく保存するのは案外めんどうくさい。
# Docker内で
otbcli_ExtractROI -in otbConcatenateImages.tif -out test.tif -startx 0 -starty 0 -sizex 640 -sizey 640
処理
# Docker内で
python sr4rs/code/sr.py \
--savedmodel sr4rs_sentinel2_bands4328_france2020_savedmodel \
--input in.tif \
--output out.tif
シーン全体のtiffファイルはおおよそ10980*10980px(2GB)だが、これを処理すると、一例としてGPU(V100)では処理完了に2時間かかり、処理後のファイルは28GBの大きさになる。
640*640px程度にクロップしたファイルなら処理は20秒もかからない。
GPUじゃなくても処理ができる(mdl4eo/otbtf:3.4.0-cpu)が、その場合はクロップしたファイルの処理に5分半ほどかかる。
Discussion