# 埼玉県AI事業AIによる被災総額早期検知モデル作成
## リンク集
* [Discode(グループ用会議室)](https://discord.com/channels/755782354215370782/755782354215370785)
* [中間報告](https://discord.com/channels/755782354215370782/779551690901815296/809968059929853952)
* [参加者リスト・役割分担](https://drive.google.com/file/d/1GsqDp_eu8y-Z-hFOW7mqvyAXDruu4Eso/view?usp=sharing)
---
## 1. 取り組む課題
災害が発生し住宅が損壊した場合、被災の程度を罹災届出証明書により示し、市町村に申請して保険料や税金の減免、住宅の修理や再建のための支援が受けられることになっている。住宅の修理に使用できるものは、災害救助法の応急修理制度(半壊以上)、被災者生活再建支援法の支援金(大規模半壊以上)がある。
しかしながら、通常、発災から1か月以内に必要な手続きを行い、自治体は、罹災証明書の内容に基づく被災額を取りまとめ、県に申請し、県は取りまとめて国から補助金を確保する。
この時、申請内容と被害の実態のミスマッチが生じ、補助金の上限が被害の実態と合わないような場合は、罹災状況の見直しが自治体に求められる。
道路施設、河川施設の場合は、施設の管理官庁が被災額を算定し、事業所管省庁がそれぞれ被害状況を把握し、災害復旧事業費を算定する。
被災範囲が広範囲で、甚大であるほど、被災額の推定誤差が実態と乖離するため、早期に被災額の全体把握が出来ればこの乖離は少なくなる。
本事業は、人工衛星やドローンによる広範囲な被災状況把握技術を用い、AIによる判読を利用して、災害被害額の早期検知に供するアプリを構築するものである。
---
## 2. 課題に対するアプローチ
------
## 3. 役割分担
* 進行管理:
* データ収集:
* ドキュメント整備(このHackMDの利用を推奨):
* コミュニケーションデザイン:
* 開発:
---
## 4. 報告書
1)データ作成(台風19号での被災状況・家屋データ) 酒井さん
2)AIモデル全壊半壊、農業被害被災状況把握モデル開発
3)被災総額算出モデル開発
4)災害復興事業・平時の事業への応用モデル開発
5)中小企業向け技術移転

## システムイメージ
### 1)データ作成(台風19号での被災状況・家屋データ) (酒井さん)
[PPT](https://drive.google.com/file/d/1PYK7gO3i5OGkVKFyXbwM1WB5dIpbwpAe/view?usp=sharing)
* 台風19号での被災状況・家屋被害デ撮影データより、被災状況のオルソ画像、点群データ、復興計画図面を作成し、家屋被害、公共物被害抽出から3D画像、点群のみによる復興計画策定用図面の検証用データを作成した。
* 撮影日、ケースの説明
[検証データ](https://discord.com/channels/755782354215370782/780571971497885717/801358784940998658)
* 撮影方法
* 復興計画作成・補測内容・方法
### 2)AIモデル全壊半壊、農業被害被災状況把握モデル開発
* 家屋の全壊・半壊判読、公共物の被災状況把握のモデルとして2DではYOLO、SSDを適用。3DについてはPointnetを適用し、被災地の画像から被災個所の抽出を行った。その結果、3Dについては、認識精度、認識に要する時間を考慮すると、精度的にも実用的ではなく、2D認識モデルで十分である事を結論付け、認識のための教師データを作成している。最終的には、検証用データで判読精度を確認する予定である。
* 教師データ作成(立正大学青木先生)
* 分類アイテム
2019年10月台風19号により被害を受けた湯尻川、鏑川周辺の6地点を撮影したドローン画像を用いた。教師データ作成に用いたドローン画像は計521枚である。また、各地点で撮影したドローン画像を結合した、オルソモザイク画像を用いて、被災箇所の検出テストを実施した。
抽出する被災箇所としては、家屋のほかに公共設備の被害抽出を想定し、0. clp_offroad:道路被害(未舗装)、1. clp_asphalt:道路被害(アスファルト)、2. clp_river:河川被害、3. landslide:がけ崩れ、4. non_clp_house:家屋(被害なし)、5. bluetarp_house:半壊家屋(ブルーシートあり)、6. clp_house:全壊家屋、7. half_clp_house:半壊家屋(ブルーシートなし)、8. bluetarp:その他のブルーシート、の9分類(9クラス)とした。
* labelImgの方法・実行環境
labelImgはWindowsやLinuxで動作するアノテーション(教師データ作成)アプリケーションである。
[labelImg(GitHub)](https://github.com/tzutalin/labelImg)
labelImgを用いた教師データ作成方法は、次の手順書を参考のこと。
[教師データ作成手順(PPT)](https://risshouniv-my.sharepoint.com/:p:/g/personal/uf05051dm_rissho-univ_jp/ET1ZsHwpNDZEpqfSZLDNdjIBbY4jExVvBz_MZy7LkhJr7g?e=y17tHV)
教師データ判読ラベル

* 作成データ
[]()
* 3Dモデル
* PointNet(牧内さん)
+実行環境・リソース
* マシンスペック
|項目 |値|
|----|------|
|CPU |Xeon4110x2
|GPU |TitanVx1 192GB
* 主要なソフトウェア
|ソフトウェア名 |バージョン|
|----------|------|
|Ubuntu |18.04
|Anaconda |4.9.2
|Python |3.6
|KUDA |10.0.130
* 利用する主要なライブラリ
|ライブラリ名 |バージョン|備考|
|-----------|------|----|
|numpy |1.19.2|
|cython |0.29.21|
|pytorch |1.4.0|
|torchvision|0.5.0|
|torchaudio |0.4.0|
|Kaolin |0.1.0|コミット時刻:2020/10/28 14:29:34 -0400
* Kaolinのセットアップ
1. Anacondaのセットアップ
Anacondaを取得してインストールする。
```bash
cd ~/ダウンロード
wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
bash Anaconda3-2020.11-Linux-x86_64.sh
```
Termを承認してインストールする。
初期化については、デフォルト値Noだったので、ここで中断した。
```bash
conda init
```
.bashrcに書き込まれるので、反映させる。
```bash
source ~/.bashrc
```
2. 仮想環境の作成
KaolinはPython3.6対応なので、Anacondaで環境を作成する。
```bash
conda create --name kaolin python=3.6
```
アクティベートする。
```bash
conda activate kaolin
```
3. pytorchインストール
CUDAのバージョンが必要なので確認する。
```bash
cat /usr/local/cuda-10.0/version.txt
```
pytorchが必要とするライブラリをあらかじめインストールする。
```bash
conda activate kaolin
conda install numpy==1.19.2
conda install cython==0.29.21
```
pytorchと必要なライブラリをインストールする。
```bash
conda install pytorch==1.4.0 torchvision==0.5.0 torchaudio==0.4.0 cudatoolkit=10.0 -c pytorch
```
4. kaolinセットアップ
githubからkaolinをcloneする。
```bash
https://github.com/NVIDIAGameWorks/kaolin.git
cd kaolin
python setup.py
```
バージョン確認を行う。
```bash
cd ..
python
>>> import kaolin as kal
>>> print(kal.__version__)
0.1.0
```
* データセット
家屋の分類を行うため、家屋と家屋以外のデータを準備した。家屋はドローンで空撮した点群データから家屋部分を切り取った。空撮したデータと切り出したデータについては、[スライド](https://docs.google.com/presentation/d/1CjA2CJnhpt82-_u_4HiIltnhXMlGFtAd_nQcxQ9-cRQ/edit#slide=id.gbfb25094ba_0_37)にまとめた。ドローン空撮の結果を3D点群データにする際中間ファイルとして`.obj`ファイルを出力するため、ファイル形式は`.obj`ファイルとした。家屋以外は[Princeton ModelNet](https://modelnet.cs.princeton.edu/)が提供しているデータセットModelNet10を利用した。ModelNet10は`.off`形式となる。それぞれのファイル形式は、以下の特徴がある。
* `.obj`ファイル
Wavefront社のAdvanced Visualizerというソフト用のファイルフォーマットで、多くのCGソフトがサポートし、CGソフトの中間ファイルフォーマットとして広く使用されている。記録される3Dモデルデータは、頂点座標値データ、頂点法線ベクトルデータ、テクスチャ座標値データ、凸多角形面データなど。頂点座標値データ、頂点法線ベクトルデータ、テクスチャ座標値データは、X成分、Y成分、Z成分が記録され流。凸多角形面データは、頂点座標値データ、頂点法線ベクトルデータ、テクスチャ座標値データそれぞれの番号の配列として記録される。
* `.off`ファイル
Princeton Shape Benchmarkの`.off`ファイルは、次の標準に準拠している。OFFファイルは、キーワードOFFで始まるすべてのASCIIファイルで、次の行は、頂点の数、面の数、およびエッジの数を示している。エッジの数は無視しても問題ない。頂点は、x、y、z座標でリストされ、1行に1つずつ書き込まれる。頂点のリストの後に、1行に1つの面が表示される。面ごとに、頂点の数が指定され、その後に頂点のリストへのインデックスが続く。`.off`ファイルは、モデルのサーフェスのポリゴンを指定することにより、モデルのジオメトリを表すために使用される。
ModelNet10のデータについては、`.off`から`.obj`へ変換して利用した。変換には[MeshLab](https://www.meshlab.net/)のコマンドを利用して一括変換した。
+実行ケース
* 点群データの配置
点群データは以下のディレクトリ構成とする。
```text
{データセットのルートディレクトリ}
└── {カテゴリ名}
├── test・・・試験用
└── train・・・トレーニング用
```
切り出した家屋データは、カテゴリ名を`kaoku`とし、切り出したファイルの3分の2をトレーニング用、残りを試験用とにわけてそれぞれのディレクトリに格納した。データ量が足りないため、ファイルの複製を行いデータ量を100倍にした。
実行用にデータを以下のディレクトリ構成で格納した。`kaoku`以外のカテゴリも含めて学習させ、切り出した家屋が正しく分類できるか確認する。
```text
{データセットのルートディレクトリ}
├── bed
│ ├── test
│ └── train
├── chair
│ ├── test
│ └── train
├── daigaku
│ ├── test
│ └── train
├── desk
│ ├── test
│ └── train
├── kaoku・・・切り出した家屋
│ ├── test
│ └── train
└── toilet
├── test
└── train
```
* 実行プログラム
kaolinから提供されている学習から試験までを行う一括して実行するサンプルプログラムに機能を追加して実行した。追加した機能は以下の通り。
* `.obj`形式を読み込む
kaolinに添付のサンプルプログラムは、[Princeton ModelNet](https://modelnet.cs.princeton.edu/)が提供しているデータセットModelNet10を前提として作成されていたため、読み込む3Dデータが`.off`ファイルとなっている。家屋のデータは`obj`ファイルなので、`.obj`ファイルを読み込むようにした。モデルにインプットする形式は`Tensor`となっているが、`.obj`の三角メッシュ(頂点と表面のデータ)から`Tensor`への変換はkaolinが提供している機能を利用した。
* 結果画像にファイル名を表示する
良いこんだ三角メッシュを変換した点群データを結果画像に表示しているが、ここに読み込んだデータファイル名を表示するようにした。これはどの3Dデータがどのように認識したかを明確にするためである。
実行したプログラムは以下のようなパラメータを受け取る。指定できるバッチサイズは学習用となっており、モデルを作成した後検証を行う。この際のバッチ数はプログラム内で20と固定している。これは結果出力画像を作成する数を指定するためである。また、試験の際の入力ファイルは、パラメータのカテゴリからランダムに抽出するようになっている。
```bash
python {kaolinを使った分類プログラム} \
--modelnet-root {データセットのルートディレクトリ} \
--categories kaoku desk daigaku bed toilet \
--epochs 20 \ ・・・エピック数
--batch-size 12 \ ・・・学習用バッチサイズ
--transforms-device cuda \ ・・・CUDAを利用する
--viz-test ・・・検証結果を画像出力する
```
+結果
実行結果は以下のように、正解と予測、検証に用いた.objファイル名、.objファイルの点群を散布図にした。散布図の色は、正解と予測が一致したものを緑、異なっているものを赤で表示している。kaokuとそれ以外(deskやtoilet)が20件中17件正しく分類されている。3件誤った分類を行った。家屋についてはbedと誤って分類したが、家屋以外を家屋と分類したものはなかった。

家屋で結果に細い三角形が表示されている`.obj`データを[MeshLab](https://www.meshlab.net/)で表示すると以下のようになっている。TIN構造のデータを使ったためかと考えたが、ドローン撮影から作成された`.obj`ファイルから切り出した全ての家屋データが三角形になっていない。
[細い三角形になる家屋(kaoku5-80)]

[三角形にならない家屋(obj2-house10-48)]

* 2Dモデル
* YOLO(立正大学青木先生)
+アルゴリズム
被災箇所の検出には、深層学習(ディープラーニング)を用いた物体検出アルゴリズムであるYOLO(You Only Look Once)を適用した。YOLOは既存のR-CNNなどと比較すると、構造がシンプルであるため処理速度が早いという特徴がある。また、画像全体の情報を用いて学習や検出を行うため、背景を物体として検出する認識が減少している。また、検出精度のみで比較するとFaster R-CNNには若干劣るものの、汎化性能は高いという特徴がある。
YOLO以前の物体検出手法、たとえばR-CNNなどでは、次のような手順で物体検出を行っている。
1.物体領域(Region)候補の検出
2.各領域に対してCNN(AlexNet)で特徴抽出
3.領域を分類(SVM:Suppor Vector Machine)
これらの処理を別々のネットワークで行っているため、ネットワーク構造が複雑になり、処理時間が増大するという問題点があった。
YOLOでは、次のように画像を単一のニューラルネットワークに入力して処理し、直接物体領域を出力している。このように、領域を決定してからその領域がどの物体であるか分類するのではなく、物体の領域と分類を同時に予測するアプローチがYOLOである。
+実行環境・リソース
検証に使用した環境として、OSにUbuntu20.04を用いた。また、ハードウェアとしてはGPUにRTX2070、メモリ32GBの計算機を使用した。YOLOはv5というバージョンを用いた。以下に、環境構築のための利用手順を述べる。
1. Ubuntu20.04をインストールして、インストール後にアップデートを実施する。その後、ソフトウェアアップデートの「追加のドライバ」から、利用するGPUに適切なバージョンのドライバに変更する。
2. ターミナルからcudaをインストールする。
```bash
$ sudo apt update
$ sudo apt install nvidia-cuda-toolkit
```
3. anacondaをインストールする。
https://www.anaconda.com/
上記サイトからLinuxのインストーラを入手し、以下のコマンドを実行する。実行ファイル名はダウンロードしたファイルによって異なる。
```bash
$ bash Anaconda3-2020.02-Linux-x86_64.sh
```
4. 仮想環境を構築し、アクティベートする。
```bash
$ conda create -n yolo python=3.8
$ conda activate yolo
```
5. YOLOv5をインストールする。
```bash
$ git clone https://github.com/ultralytics/yolov5.git
$ cd yolov5
$ pip install -U -r requirements.txt
```
環境によっては、以下のコマンドも必要となる可能性がある。
```bash
$ pip install pyqt5
$ pip install opencv-python-headless
```
+実行ケース
データセットは、以下のように配置する。各ディレクトリには画像ファイルと、教師データの内容が記述されている同名のテキストファイルが格納されている。データセット全体を訓練用、バリデーション用に分けるが、その割合や分割方法は任意である。
```text
{データセットのルートディレクトリ}
├── train・・・訓練用
├── valid・・・バリデーション用
├── test ・・・テスト用
└── sample.yaml ・・・コンフィグファイル
```
コンフィグファイルは、以下のように記述する。
```text
train: /home/user/yolov5/train
val: /home/user/yolov5/valid
nc: 9
names: ['clp_offroad', 'clp_asphalt', 'clp_river', 'landslide', 'non_clp_house', 'bluetarp_house', 'clp_house', 'half_clp_house', 'bluetarp']
```
学習は、以下のコマンド例で実行する。この例の場合、バッチサイズ16、エポック数500、画像のサイズを800x800とし、sample.yamlをパラメータファイルとして実行する。また、プロジェクト名がsampleとなる。
```bash
$ python train.py --batch 16 --epochs 500 ––img-size 800 --data 'sample.yaml' --name sample
```
学習結果は、「runs/train/sample」に格納され、「runs/train/sample/weights」以下に重みファイルが格納される。重みファイル「best.pt」は学習中で最も結果が良かった重み、「last.pt」は最後の重みが格納されている。ここでは、best.ptを用いて検出テストを行った。
```bash
$ python detect.py --source test --weight best.pt
```
検出結果は「runs/detect/exp」に格納される。実行回数に応じて「exp1, exp2」のようにフォルダ名が変更されていく。
+結果
[鏑川被災地判読事例]

崖崩れ現場のオルソモザイク画像からの検出結果では、崖崩れの箇所が3箇所存在しており、これらが検出できている。画像中央左下の大きな崖崩れは、複数の崖崩れとして検出されており、概ね崖崩れの範囲を検出できている。ブルーシートがかかっている家屋も1箇所あり、これも検出できている。それ以外のブルーシートは、ブルーシートのみとして検出されており、正しく分類できていることが確認できる。通常の家屋は13箇所あるが、これらも検出できている。しかし、誤検出も2箇所存在している。
[湯尻川被災地判読事例]

湯尻川周辺の河川被害画像からの検出結果では、橋周辺で河川被害箇所が1箇所検出されている。ただし、橋周辺では橋の下部でも被害が確認されるが、こちらは検出できていない。また、橋周辺の道路被害箇所も検出できていない。家屋やブルーシートに関してはほぼ正しく検出できているものの、ソーラーパネルを家屋として誤検出している箇所が確認できる。
+報告資料
[2021年3月26日成果報告資料](https://risshouniv-my.sharepoint.com/:p:/g/personal/uf05051dm_rissho-univ_jp/EcJMKFy8XnZCgoQnE962okQBYwiTvycMR83rjyTM-aDDLQ?e=tvXdOV)
* SSD(立正大学後藤)
[小谷野卒業論文:CNN.pdf](https://discord.com/channels/755782354215370782/780571971497885717/807397593683329054)
+アルゴリズム
+実行環境・リソース
+実行ケース
+結果
* YOLOとSSDの比較 P
+YOLO2SSD(立正大学青木先生)
YOLOとSSDでは、学習用の画像ファイルと、教師データのラベルや位置を記録したファイルをセットで用いるが、ファイル形式が異なっている。YOLOでは画像ファイルとテキストファイルのセット(例:img001.jpg, img001.txt)、SSDでは画像ファイルとxmlファイルのセット(例:img001.jpg, img001.xml)を用いる。テキストファイルとxmlを相互変換するためには、以下のスクリプトを利用した。
YOLO(txt)→SSD(xml)変換:
https://github.com/ZZANZU/YOLO-convert-txt-2-xml
SSD(xml)→YOLO(txt)変換:
https://github.com/Ryo-Kawanami/xml2yolo
+比較結果
* 浸水家屋抽出モデル(立正大学後藤・高杉)









ピオニーウォーク周辺親水被害前

ピオニーウォーク周辺浸水被害後
出典:2019年台風19号による入間川水系の洪水状況(https://rakuno-gis.maps.arcgis.com/apps/StorytellingSwipe/index.html?appid=4268dd1c5f734a579e8b75057be3852c)

浸水前のピオニウォーク周辺の3D化

浸水時のピオニーウォークの3D化
出典:国土地理院発行令和元年度台風第19号浸水推定段彩図 荒川水系(撮影日:10月14日16時),国土地理院発行基盤地図情報DEM(5mメッシュ)(2019/06/14)
* 農業被害抽出モデル(LiDAR、UAV)(立正大学後藤)

2019/8/7 日向沼a

2019/8/7 日向沼b

2019/8/26 日向沼a

2019/8/26 日向沼b

2019/8/15 内洞沢a

2019/8/15 内洞沢b
+アルゴリズム
+実行環境・リソース
+実行ケース
+結果
農業被害判読事例

* 農業被害抽出モデル(ハイパーカメラ)(立正大学後藤)
### 3)被災総額算出モデル開発
* 2)で抽出した被災個所を設計用のCADソフトに入力し、被災前の状況を推定し単位面積・単位容積当たりの修復費用をかけ、被災状況から被災前の状況に復元する費用として被災額算出モデルを作成する。
* 歩掛表(酒井さん、長谷川さん、後藤)
単価表はコンクリートブロック積工/機械盛土/機械切土
* 被災総額算出フロー・モデル(Autocad使用方法、Surfaceモデル作成、土量推定)(長谷川さん)

### 4)災害復興事業・平時の事業への応用モデル開発
* 3)で作成したモデルはドローンで撮影した画像から点群データを作成し、3Dデータを設計用CADソフトに取り込み設計図を作成するものである。検証データとして作成した復興計画図は、点群データから作成した3Dデータに測量結果を加えて作成した設計図である。災害時を想定し、ドローン画像のみから作成した復興計画図面と補測結果を加えて作成した設計図とを比較して、平時での設計図作成業務への適用可能性を判断し、災害復興事業・平時の事業への応用モデルへの適用可能性を検討した。
* 災害復興事業の業務フロー(酒井さん、長谷川さん、〇後藤)
* 追加測量の作業内容
*
* 災害復興事業の平時の業務への展開(酒井さん、長谷川さん、〇後藤)
*
*
* 課題(酒井さん、長谷川さん、〇後藤)
### 5)中小企業向け技術移転
* 2)-5)の成果は、大洋画地と共に、埼玉県GIS普及推進研究会に加入している測量会社、情報処理会社に対して研修を行うべく、テキストを作成し、技術移転を行う予定である。
* 研修内容(ドローン撮影、点群作成、復興計画作成)(大洋画地、立正大学)
* 点群研修会(12/1,3/15)
* ドローン撮影
* 点群処理(Metashape使用)
* Autocad(recap(las-obj)、Civil3D、結果の評価)
* 研修マニュアル
点群作成マニュアル:(https://drive.google.com/file/d/14hxOO5We0uNVCCjEQzks5_JDoeJ0QtaJ/view?usp=sharing)
* マッピング研修会(2月)
* OpenStreetMap(OSM)データ入力・GitHub研修
* 災害範囲の建物データをOSMに書き込む
* 建物高さ、階数などを入れることを想定
* 2019年台風19号による入間川水系の洪水状況

* 東松山ピオニウォーク・都幾川周辺のOSM書き込み(研修期間中に1,138件の建物を書き込んだ)

* OSMデータを基に作成された3DMap

* GitHub研修
* ソフトウェアのバージョン管理について
* Git/GitHub/VSCodeについて
* OSSプロジェクトの紹介
* OSMを使ったアプリをGitHubからローカル環境で動かす