pix2pixおかわり！CS立体図から地すべり地形分布図を作成してみた

# はじめに
　FOSS4G Advent Calendar 2016で[pix2pixで色々やってみた話](http://qiita.com/wayama_ryousuke/items/ca43cabffde90a66434b)を投稿しましたが、その奥深さに惹かれていろいろ試したくなりましたので、その中間報告的な感じのお話を今回はしてみようかと思います。

# 地理院タイル　to OpenStreetMapリベンジ
　前回のお話で地理院タイルからOpenStreetMapをやってみましたが、精度がいまいちでした。
　この原因として考えられるのがデータセットの偏りです。
　前回は東京で学習させて京都を未知画像としました。
　東京は極めて密集しており、道路もマス目状ではなく、複雑な形状をしております。東京はある意味日本の中では特殊な形状ではないかと思い、東京だけではなく、別な都市を教師データとして追加してみることにしました。今回は京都を対象としたいので、同じようにマス目である札幌市を加えてみることにしました。
　また、OpenStreetMapは建物地物が場所により密だったり疎だったりと一定ではないので、建物地物が密な場所を学習データに使ったほうが衛星写真と矛盾しないのではないかという仮説を立てました。
　東京と札幌は他の地域と比べると建物地物の密度がかなり高いように思えます。やはりマッパー人口でしょうか。我が地元の盛岡市はスカスカでした・・・。こういうマッパー人口が少ないことによる地域格差を何とかするには自動生成によるプロポーサルを人間が判定するような仕組みは良いような気がします。
　京都市も建物地物はあまりなかったので、建物地物が無いところに密な建物地物が現れるのでしょうか？
　さてさて結果はどうなったでしょう？
<br /><br /><br /><br />
![pix2pix_osm](https://qiita-image-store.s3.amazonaws.com/0/58671/00fa62e9-dd61-adc3-45fa-879e3ea7a579.jpeg)
[出典：地理院タイル](http://maps.gsi.go.jp/development/ichiran.html)
おお！？
前よりいい感じに建物が描画されているような気がします。
道路も比較的はっきり描画されている気がします。
ためらい線のような迷ってる感じが減ってますね。
個人的には良さげに見えますので、リベンジ完了！

## おまけ
東京 to 東京で試しにやってみました。ちなみに対象は未知データです。
精度がすごい高いような気がします。
やはり特徴（あるいは衛星写真の露出などの条件？）が似通っていると精度が高くなるのでしょうか。
![pix2pix_etc.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/9835a66a-107f-ea78-444f-455962e68dab.jpeg)



# 標高タイル to 色別標高図
　OpenStreetMapの出来に感動したので、では次はということで標高タイルから色別標高図はいけるのかが気になりました。
　標高タイルから色別標高図は簡単にできるので意義的にはあまりないのですが、色別標高図にある川とか湖とかその辺をどうやって表現できるのかが気になりました。
　まずは単純に標高タイルから色別標高図をやってみます。ちなみに標高タイルはそのままでは標高数値データのみですのでこれをpix2pixで扱うためにPNG画像に変換しました。標高PNGタイルに関しては産業技術総合研究所さんの[こちら](https://gsj-seamless.jp/labs/elev/)を参照しております。ありがとうございます！

![pix2pix_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/fefd6e20-df0f-df1c-cda1-7cb98d476eac.jpeg)
[出典：地理院タイル](http://maps.gsi.go.jp/development/ichiran.html)
　色や陰影はほぼいい感じに再現されていますが、川がなんか同じ場所に連続で出ていますので迷っている感じが有ります。これは標高タイルに川の特徴が取れないからではないかと推測されます。川底までの標高があるような1mメッシュDEMであれば川も行けるかもしれませんが、とりあえずアルファチャンネルに川画像タイルを追加してみました。
　川画像タイルに関しては皆さんご存知TAKEMURA Kazuhiro氏(@vec2ras)作[川だけ地図](http://www.gridscapes.net/AllRivers/)を使わせて頂きました！ありがとうございます！


![pix2pix_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/3db5fe2c-0f73-cd90-2a54-1e20af619fe2.jpeg)
[出典：地理院タイル](http://maps.gsi.go.jp/development/ichiran.html)
　おお！いい感じに川が描画されました。ただ元々湖のデータがなかったのでこちらは再現されていないようです。これは別途湖データを加えれば良いかもしれません。
　ここで分かったのはnチャンネルからnチャンネルに変換できることです。モノクロ(1ch) to カラー(3ch)が出来るので行けるかなーとは思ったのですがチェンネル数が増えても問題ないようです。

# 標高タイル to 陰影図
　川の判定がまだイマイチだったので、今度は完全に標高データのみから作成できる陰影図はどうだろうかと試してみました。
　![pix2pix_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/c9492647-db36-817a-3527-52547943759c.jpeg)
　影の向きが怪しいですがほぼほぼいい感じです。やはり特徴が完全に取れるものは再現率高いような感じです。

# netcdf to 等高線
　先程の標高タイル to 色別標高図でチャンネル追加して4chから3chに変換できましたので、これは多次元グリッドデータも変換できるのかということで[NetCDF化した数値予報GPV](http://database.rish.kyoto-u.ac.jp/arch/jmadata/gpv-netcdf.html)から気圧の等高線が書けるのかが！私、気になります！
　NetCDFはそのままではpix2pixで読めませんので画像からではなくnetcdfから直接数値データをインプットデータに突っ込むようにパッチを当てました。
　それでは早速試してみます。
　※インプットがnetcdfのためインプット画像はありません。
![pix2pix_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/95c4554a-e89d-2b7c-b6ae-0610b77ec9c5.jpeg)
　うーん。
　なんかだめですね。学習用データ数が少ないのかと思い増やしてみましたが結果は変わりませんでした。考えられるのは等高線のようなスパースなデータは苦手かもしれません。そこでカラーグラデーションにしてやってみることにします。
<br /><br />
![pix2pix_6.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/c1755c4d-6838-7380-2160-d6312d7623ca.jpeg)
　おお！
　これはいい感じです！やはり畳み込む性質上密なデータが良いかもしれません。

# 標高タイル to CS立体図
　nチャンネル to nチャンネルがいい感じに行けることがわかったので、次はfoss4g
 advent calendarでfrogcatさんが書かれていた[地理院標高タイルと Leaflet でつくるCS立体図](http://qiita.com/frogcat/items/b9aaa3df866a89d46ef5)を見て初めて知ったCS立体図を、標高タイルから作れるか試してみます。
　[CS立体図](http://ci.nii.ac.jp/els/110009884638.pdf?id=ART0010408964&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1481865156&cp=)とは標高データから算出される曲率と傾斜による立体図法のことで長野県林業総合センターで作られたオープンな立体図法のようです。この辺の立体図関係は特許が合ったりするのでオープンな規格は大変助かります。
　frogcatさんが書かれていたのはjavascriptでしたので、それをnode.js使ってそのまま使うか迷ったのですが、今後の汎用性を考えてpythonに移植しました。pythonはforが遅いですが、想像以上に遅いです。numpyとかcythonとかpypyとか使えるならそっち使ったほうが良いですね。~~ソースはリファンダリングにしたらgithubに置いておきます。~~ [ソース置きました]
(https://github.com/makinux/PyCsmap)

　標高タイル to 陰影図のような元データから計算できる系は精度が高いのではないかという予想は有りました。
　さて結果の方は・・・？
<br /><br />
![pix2pix_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/51fe21ff-07b3-078e-8ad1-79a8a9b2898d.jpeg)

　解像度がちょっと低い感じですが、まるっと学習できているように見えます。
　すごいですねぇ・・・pix2pix。アルゴリズムによって算出できるものはほぼまるっと学習出来るのではないでしょうか。

# CS立体図 to 地すべり地形分布図
　実はCS立体図できた段階で満足してたんですが、某氏より以下のようなネタ振りがあったので全力で釣られてみました。

　![pix2pix_8.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/f326c620-9c17-bc80-0be1-193b0027f6a1.jpeg)

　この辺は専門外なのでよくわかっていなかったのですが、そもそも崩壊地形って何処かで情報出しているのだろうか探ってみました。
　調べてみると[J-SHIS（地震ハザードステーション）](http://www.j-shis.bosai.go.jp/)で地すべり地形分布図という名前でWMSサービスが有りましたので、こちらを使わせて頂きました。
　WMSでしたので、tmsに変換したりと一手間加えました。あと、何故かWMSの場合にリクエストがまれに失敗する場合があるのでリトライ処理など加えたほうが良いかもしれません。
　さてさて結果の方は如何でしょうか？　

![pix2pix_9.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/e3fa3689-2ae3-54e7-edb1-ec2cede98d37.jpeg)

　うーん？
　平野部ではほとんど無く、山間部などに集中していることからある程度は地すべりの特徴を学習しているようです。
　ただ、正解と比べるとまだまだ違いが目立ちます。
　CS立体図だけではなく、地質など別な要因も見ないと地すべりの判定はできないかもしれませんが、とりあえず今回はCS立体図のみでどこまで学習できるのか試してみます。CS立体図のみで地すべりが判定できると仮定した場合、うまく判別できない理由は、微細地形ではないからか？という仮設を立てました。
　今回はざっくり様子を見るつもりだったので地理院標高タイルの10mメッシュでやってみたのですが、よくよく考えると地すべりってもっと細かい単位でないと学習できない？人の目で見て判定するのもそう言えば[元々のCS立体図を考案した長野県林業総合センターも1mメッシュ使って判定していたし](https://www.jstage.jst.go.jp/article/jfsc/125/0/125_669/_article/-char/ja/)、CS立体図のメッシュ解像度が足りてない可能性が高いです。
　それでは1mメッシュのDEMが何処かに無いか探したのですが、国土地理院で公開されているのは基盤地図数値情報の5mメッシュまでです。有料だといろいろあるのですが、検証のためには使いたくありませんので、色々探してみました。
　USGC(アメリカ地質調査所)で1/9 arc seconds＝3mのDEMは有りましたが、対応する地すべりマップはなさそうでした。
　NOAA（アメリカ海洋大気庁）で1m以下の海底地形データは有りましたが、これもやはり対応する地すべりマップはなさそうでした。というか海底地形は関係ないですね、今回は。
　日本で良い感じのデータがないかなーと探していたところ、そう言えばCS立体図を作った長野県林業総合センターで公開してないんだろうかと見に行ったら、WORDで申請書を書かなければいけないのと、そもそも林業関係者でないとだめっぽいので諦めました。
　他にはないかなーと探していると、frogcatさんの記事に[静岡県CS立体図](https://www.geospatial.jp/ckan/dataset/shizuokakencsmap)という記述を発見しました。どれどれと見てみると、なんと1mメッシュで作成したCS立体図のgeotiffがコモンライセンスで公開されておりました！
　これは使うしかないとい言うことで早速試してみました。

![pix2pix_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/1c2b1919-8dbc-78a3-5fa4-727486774d8e.jpeg)

・・・
全く学習できてないですね・・・。
もしかして参照系がズレているんでしょうか。
見た目的に崩落と関係なさそうなところにシェープが有ります。
というわけで今のところCS立体図（1mメッシュ）では精度が上がりませんでした。むしろ10mメッシュのほうがなんかそれっぽい感じで学習できていました。
残念！
この辺はもう少し時間をかけて良い結果が出たらお知らせします！

#追記
CS立体図だけではうまく行かんかったので、CS立体図＋地すべりの6chで学習させたところいい感じになりました。もういくつ寝るとお正月～♪ということで大規模データセットで正月ガッツリ寝かして結果を待ってみます。
![pix2pix_13.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/9860c017-a660-3398-dcac-af9f0efa8a69.jpeg)



#おまけ
札幌＋東京 to 札幌でやってみた結果も載せておきます。

![pix2pix_11.jpg](https://qiita-image-store.s3.amazonaws.com/0/58671/dadb7d4a-9be7-75b2-9c91-630a8b917144.jpeg)

かなりよいですねぇ。札幌は建物と道路の境界がはっきりしているので認識しやすいのかもしれません。