AIによるチャットボットの作り方>AIの応用例>衛星画像から建物の検出 - 画像セグメンテーション - 更新

衛星画像から建物の検出 - 画像セグメンテーション

AIゆめ
AIゆめ
   本ページでは、衛星画像から建物を検出する技術について、様々な手法について比較しています。画像から画像を生成する手法は、基本的には、Encoder-Decoderモデルを使用したAttentionという技術の応用であり、ドイツのフライブルク大学(Freiburg)のOlaf Ronnebergerらが2015年に発表したU-Net: Convolutional Networks for Biomedical Image Segmentationを使用しています。ちなみに、本サイトのチャット技術もこのAttentionを使用しています。
画像セグメンテーションは、衛星画像や脳画像などのあらゆる画像から、目的とする対象物を探し出すことができる便利なAI技術であり、人が画像を見て判断するような作業を代替することができるでしょう。製造業・非製造業に拘わらず、画像セグメンテーションの応用例をご覧になって、「自社の問題解決に応用できるのではないか?」と思われた方は、ネオラクス・メール送信フォームからお気軽にご相談ください。AI技術を用いて、世の中にある様々な問題の解決に貢献して行きたいと思います。
U-Net概要
図1 U-Net概要
今回テストしたU-Netモデルは、図1に示す標準U-Netモデル、6層U-Netモデル、8層Unetモデルの3種です。図1に示すU字型の左側のEncoder部分は、4段階のmax pool 2x2(これはkerasのMaxPooling2D(2x2)に該当)を使用した5層になっており、Decoder部分は4段階のup-conv 2x2(これはkerasのUpSampling2D(2x2) + Conv2D(2x2)に該当)を使用した4層になっていますので、標準U-Netモデルは5層U-Netモデルに該当します。そして、標準U-NetモデルのEncoderとDecoder部分に一層ずつ追加したモデルを6層U-Netモデルと呼び、三層ずつ追加したモデルを8層U-Netモデルと呼びます。ただし、追加した層にはテンソルの形状が変化するMaxPooling2DやUpSampling2Dを使用せず、Conv2D(畳み込み)、BatchNormalization(バッチごとの正規化)、ReLU(ReLU活性化関数処理)のみを使用しています。なお、各モデルの学習パラメーター数は下表の通りです。
表1 各モデルの学習パラメーター数
標準U-Netモデル 6層U-Netモデル 8層Unetモデル
28,594,171 30,267,003 37,373,627
衛星画像から建物を検出する問題としては、SpaceNet社が提供した課題SpaceNet 1: Building Detection v1のRio de Janeiroの街の衛星画像データを使用させて頂きます。この課題では、ほぼ200mx200mの区画に分割された6,940枚の訓練データと2,795枚のテストデータに該当するTIF画像データと建物データ(以降正解マスクと呼びます)が抽出できるgeojsonデータが用意されているはずでしたが、テストデータに該当するgeojsonデータが見当たらないため、6,940枚の訓練データから、25%がテストデータとなるよう新たに抽出し、訓練データとして5,205枚、検証データとして1,735枚を使用しました。また、AIモデルの生成はTensorFlow/keras2.12.0を使用し、機械学習はGoogle ColabのGPUであるT4で行いました。
衛星画像と建物マスクの一例
図2 衛星画像(438x406ピクセル程度のTIF画像)と建物の正解マスク(geojasonから抽出)の一例

6層U-Netモデルによる建物の予測結果

   機械学習の制度やモデルの詳細を記述する前に、SpaceNet社から提供された正解マスクと6層U-Netモデル(後述)による予測マスクの比較例を図3に示します。この比較例により、このモデルが、衛星画像からずれた正解マスクも見事に予測していることがわかります。
6層U-Netモデルによる衛星画像・建物の正解マスク・予測マスクの比較例
図3 6層U-Netモデルによる衛星画像(左)・建物の正解マスク(中)・予測マスク(右)の比較例
正解マスクと予測マスクを比較した面白そうなもう一例を図4に示します。この比較では、黄緑の楕円形で囲った部分で、予測マスクの予測の方がスリムな形状になっています。衛星画像と見比べてみると、正解マスクでは建物本体に加えて、庭の一部も建物マスクの中に含まれていますが、予測マスクでは庭の部分が除外されて、建物部分のみを正確に予測しています。
以上の例から、AIモデルには正解マスクの誤りをそのまま予測する部分と、誤りを訂正して予測する部分が混在しているようです。今回提供された正解マスクは、明らかに衛星画像からずれた正解マスクと、衛星画像に忠実な正解マスクが混在しているため、このような結果になったと思われます。そして、このことが、機械学習の精度を向上する妨げとなっているようですので、予測精度を上げるためには、モデルの予測精度を上げることは勿論ですが、正確な学習データを与えることも大切だと言えるでしょう。
6層U-Netモデルによる衛星画像・建物の正解マスク・予測マスクの比較例:その2
図4 6層U-Netモデルによる衛星画像(左)・建物の正解マスク(中)・予測マスク(右)の比較例:その2

標準U-Netモデルによる建物の予測結果

   図5に標準U-Netモデルによる建物の予測結果を示します。6層U-Netモデルに比較して、正解マスクとのずれは大きいようですが、誤った正解マスクや過大な範囲を指定した正解マスクの是正効果は大きいかも知れません。この結果も、与えた正解マスクの精度を考えると、まずまずの結果と言えるでしょう。
標準U-Netモデルによる衛星画像・建物の正解マスク・予測マスクの比較例
図5 標準U-Netモデルによる衛星画像(左)・建物の正解マスク(中)・予測マスク(右)の比較例

8層U-Netモデルによる建物の予測結果

   CNN層が深くなると抽象的なイメージが表現されるようになると言われていますが、8層U-Netモデルになると不正確な正解マスクよりも正確に建物を予測しているように思います。
標準U-Netモデルによる衛星画像・建物の正解マスク・予測マスクの比較例
図6 8層U-Netモデルによる衛星画像(左)・建物の正解マスク(中)・予測マスク(右)の比較例

各U-Netモデルの予測精度変化

   図7~図9に各モデルの予測精度変化を示す。なお、標準モデルに関しては過学習の兆候があったため、Encoderの第4層と第5層にはDropout(0.2)(20%の確率でニューロンを消去する)を挿入しています。前述の通り、8層U-Netモデルになると不正確な正解マスクよりも正確に建物を予測しているように思いますが、精度はあくまで正解マスクとの比較ですので、正解マスクの不正確さのバラツキにより、どのモデルも92~93%の精度が限界でした。
標準モデルの予測精度変化
図7 標準U-Netモデルの予測精度変化
6層U-Netモデルの予測精度変化
図8 6層U-Netモデルの予測精度変化
8層U-Netモデルの予測精度変化
図9 8層U-Netモデルの予測精度変化

MobileNetV2とpix2pixによるU-Net簡易モデルによる建物予測

   本課題に取り組み始めた動機は、Encoder部分にGoogleが提唱しているモバイルでも使用できる軽量なMobileNetV2を使用し、Decoder部分に画像変換技術であるpix2pixを組み合わせたU-Net簡易モデルが、このような複雑な画像セグメンテーション問題にどの程度適用できるかという疑問からでした。
MobileNetV2は事前トレーニング済みですので、学習パラメーター数は4,660,323と、通常のU-Netモデルよりはるかに少ないパラメーターになっていますので、GPU T4での学習時間も20分程度と短時間での学習が可能でした。過学習を起こしてはいるものの、ある程度の予測はできているようですので、精度よりも時間を優先する場合にはある程度は使えるでしょう。
U-Net簡易モデルによる衛星画像・建物の正解マスク・予測マスクの比較例
図10 U-Net簡易モデルによる衛星画像(左)・建物の正解マスク(中)・予測マスク(右)の比較例
U-Net簡易モデルの予測精度変化
図9 U-Net簡易モデルの予測精度変化

U-Netに関して誤解しがちな注意点

   図1の"up-conv 2x2(これはkerasのUpSampling2D(2x2) + Conv2D(2x2)に該当)"と、"copy and crop(これはkerasのConcatenate()に該当)"に関して誤解しがちな点を図10に示しました。U-Netに詳しい方については常識かも知れませんが、図1から読み取る限りでは、UpSampling2D(2x2) + Conv2D(2x2)をしてから、Concatenate()し、その後Conv2D(3x3)を2回繰り返すと読み取ることができます。しかし、このモデルを試した結果、精度の下がり方が良くありませんでした。そこで、図10赤丸の中の演算(UpSampling2D(2x2) + Conv2D(2x2)をしてからConv2D(3x3)を2回繰り返す)をした後にConcatenate()した結果、誤差が小さくなりましたので、こちらが正解だと思います。
U-U-Netに関して誤解しがちな注意点
図10 U-Netに関して誤解しがちな注意点


ページトップへ

運営会社情報 | プライバシー・ポリシー
Twitter Twitter Facebook Mail Line

* 無断転載禁止。
* どのページでもご自由にリンクして下さい。
* ご意見・ご質問等がございましたら こちらからメールをご送付下さい。 無料SEO対策 -172.31.37.45。