衛星画像のSegmentation（セグメンテーション）により建物地図を作成する．

目標であった衛星画像をセグメンテーションを行うことで，建物地図（マスク地図）を作ることを目的に勉強しています．

調べてみると，Segmentationを自分で学習できるモデルを行っている方がいたので，そちらのページを参考に，衛星画像のSegmentationを行います．(感謝！)

参考：[Uネット構造で，画像セグメンテーションをしてみた．（２）](https://qiita.com/taashi/items/161f828472c6196633f1)


##1.環境構築．
GPU付きのLinuxパソコンに以下の環境を構築しました．

OS:Ubuntu 16.04LTS
GPU:GepForce 1070

Python 3.5

tensorflow 1.7.0
tensorflow-gpu 1.5.0
Keras 2.1.5
numpy 1.13.3
matplotlib 2.2.2

Kerasをつかうときは，GPUのバージョンを注意したほうが良い，との記事を見たいので，このバージョンにダウングレードして構築しています．

では，この環境でSegmentationを行います．

##2.処理方針
Segmentationはいくつかの方法が研究されており，全般的な比較紹介は以下が参考になると思います．

[ディープラーニングによるセマンティックセグメンテーションのガイド２０１７年版](https://postd.cc/semantic-segmentation-deep-learning-review/)

今回は，この中でも一般的なU-NETモデルを用います． 

KaggleのDSTLでチャレンジがありましたが，３位の方はどんなアイデアを出して試していたのか，U-NETも含めて詳しく紹介されています．一読の価値あります．
 [Dstl Satellite Imagery Competition, 3rd Place Winner's Interview](http://blog.kaggle.com/2017/05/09/dstl-satellite-imagery-competition-3rd-place-winners-interview-vladimir-sergey/)

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3136323039372f30316366383962392d326130662d373335662d396264382d6563383333386431623831392e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/187602/bae93ee4-2fec-7360-b938-970f2ce7edb2.png)
U-NET©Uネット構造で，画像セグメンテーションをしてみた．（１）

私のハードのスペックにより，インプットデータの画像は512☓512になりました．

用いた画像は，衛星画像ではなく，以前紹介した[Inria Satellite image set](https://project.inria.fr/aerialimagelabeling/)の高分解能の航空画像になります．

画像１枚のサイズは5000x5000あるため，2048x2048サイズにリサイズし，それを512x512にImageMagicのCropで分割して処理しました．学習後のアウトプットデータはマージ（結合）し，一つの画像に戻しています．

処理は，１０データを１単位とし，１０００回繰り返して学習させます．

精度評価は，モデルデータと，学習モデルを用いが学習後のデータの重なり率の評価であるDice係数を用いました．

##3 学習コード

コードとインプット画像，教師画像，サンプル画像，学習後の画像，は以下の構成でフォルダにいれます．

home
  |
  |-Inputs :学習用の衛星画像
  |
  |-Teachsers:上記の学習画像のマスク画像（建物のみを抽出）
  |
  |-TestData：学習済みモデルを用いて、衛星画像から建物のみを抽出。その対象の衛星画像。
  |
  |-Outputs：学習済みモデルを用いた、識別結果。
  |
  |-Model：学習モデルを生成、もしくはここのモデルを使用
  |
  |-src ：各コードがはいる。

ここで，srcに学習コードがはいります．その関係は以下となります．
srcに入る学習コードは[こちら](https://github.com/shirokawakita/Segmentation-for-building)になります．
元のコードを，自分の使いやすいようにモディファイしています． 
学習済みのモデルもあったほうが，気軽に試せる（遊べる）のですが，モデルのファイル容量が200MBほどあり，どこに永続的に共有できるかわからなかったので，諦めました．
どこかよいサイトを御存知でしたら，教えてください． 

では解析結果です．
仲間と共有用にPPTでまとめてしまったので，それを画像変化して記載します． 

##3 解析結果
###3-1 ケース１
![Slide15.png](https://qiita-image-store.s3.amazonaws.com/0/187602/2912c2f0-9c63-d50b-d914-a17c46b236b9.png)
![Slide16.png](https://qiita-image-store.s3.amazonaws.com/0/187602/79008205-f621-f542-cbd9-8505c32ff1f4.png)
![Slide17.png](https://qiita-image-store.s3.amazonaws.com/0/187602/367b0000-08dd-7027-939f-a8abbe217646.png)![Slide19.png](https://qiita-image-store.s3.amazonaws.com/0/187602/fc745c4a-4c0d-8f93-94db-d6480226c61a.png)

![Slide18.png](https://qiita-image-store.s3.amazonaws.com/0/187602/b38f387a-e577-e560-6436-a0b93b99c4c0.png)
![Slide19.png](https://qiita-image-store.s3.amazonaws.com/0/187602/5f1c9b00-32a2-723d-ea65-98f9ce2ed1f6.png)

小さな建物（家）がうまく検知できていないように見えます． 

###3-2 ケース2
![Slide20.png](https://qiita-image-store.s3.amazonaws.com/0/187602/58a2f743-e99a-2236-7fd4-e218075962ce.png)
![Slide22.png](https://qiita-image-store.s3.amazonaws.com/0/187602/fac77e26-2ca7-4a8e-ed10-1dbbec95a2cc.png)
![Slide23.png](https://qiita-image-store.s3.amazonaws.com/0/187602/b2c7ecc1-2e4f-b83d-7062-9340f3551bbc.png)
![Slide24.png](https://qiita-image-store.s3.amazonaws.com/0/187602/392dde16-c001-7af0-583b-466feed71a8c.png)

学習データ数を４話にしたけども，それほど変わっていないかな．

###3-3 ケース3
![Slide25.png](https://qiita-image-store.s3.amazonaws.com/0/187602/48694d2b-3392-66ff-0ef0-107de2ba0fe6.png)
![Slide27.png](https://qiita-image-store.s3.amazonaws.com/0/187602/ef34648d-823f-b8d5-cc63-f186a2184026.png)
![Slide28.png](https://qiita-image-store.s3.amazonaws.com/0/187602/19d7949e-2d38-1050-12f2-6bc016123e23.png)
![Slide29.png](https://qiita-image-store.s3.amazonaws.com/0/187602/44fbfd3d-6c84-e88f-0845-2ff5d7b53da5.png)
学習数を10倍に増やしたので，ようやくモデルに近づいてきたかな．ただ，建物でないところが，建物といってしまっています．

###3-4 ケース4
![Slide30.png](https://qiita-image-store.s3.amazonaws.com/0/187602/f0413ee5-ca14-9b15-da74-85a651087918.png)
![Slide32.png](https://qiita-image-store.s3.amazonaws.com/0/187602/7f289dab-f8b7-61ab-a39e-aa7fc1f4c7e3.png)
![Slide33.png](https://qiita-image-store.s3.amazonaws.com/0/187602/73040951-6668-9ecb-a61a-ac513ec942bb.png)
![Slide34.png](https://qiita-image-store.s3.amazonaws.com/0/187602/83176c80-3743-8ce7-a9e5-3d699c4a416e.png)
建物がない広場以外はなんとかいえるか，というところです．

モデルと合わせて比較します．
 ![Slide35.png](https://qiita-image-store.s3.amazonaws.com/0/187602/774d0dd5-c9a7-3659-a1ad-9917ea8c0653.png)

こうみると，長屋のような形が一定の建物はしっかり検出できていますが，複雑な形状になると誤検知が多く思えます．建物域が広くでています．

衛星画像を販売しているDigital Globeの話では，米国の高分解能光学衛星であるWorldViewの衛星画像からDeep Learningで算出した建物モデルの一致度は95％だそうです．
汎用性もあり確度が高いのは，さすがプロです．

##4 応用例
衛星画像から建物検出をしてかったのは，災害前後での被害場所の自動検知をこの手法でできないかと考えたからです．
公開されている，東日本大震災の災害前後の画像から，ケース4の学習モデルを用いて試してみました．

![Slide36.png](https://qiita-image-store.s3.amazonaws.com/0/187602/5ba51297-aded-23ce-1cd4-74251ac2fd24.png)
![Slide37.png](https://qiita-image-store.s3.amazonaws.com/0/187602/0c886f3e-072e-fd67-f603-c2758929c1f3.png)
災害前の画像は2003年ということで，かなり古いデータになってしまいますが，それでも建物の被害箇所が検出できているように見えます．

被害抽出が目的であれば，これぐらいのモデルでも適用できそうです．

##5 まとめ
目的であった衛星画像のセグメンテーションによる建物検知を，公開されているコードをベースにU-NETを用いて実験してみました．
サンプル数が1000程度と，それほど多くない中でもそこそこの精度を出すことができました．
ただ，同じ航空画像のみであり，色々な種類の衛星画像をつかって，より汎用性が高く，また確度の高いモデルがつくることを次の目標にします．

紹介した[Sentinel-2の画像](https://qiita.com/nigo1973/items/9bb6a11caac8e3e1e850)でもいいのですが，分解能が10mしかないため，そもそも建物を識別することができません．
どこかにコンペがあって，そこに教師データモデルがオープンになりましたら，トライしてみます．

##参考
[無料で最新の衛星画像を入手する方法](https://qiita.com/nigo1973/items/9bb6a11caac8e3e1e850)