航空写真とDEMから教師なし地形分類を行うGUIアプリ(AerialTerrainML_GUI_r001)を作成しました
はじめに
アプリ名は AerialTerrainML_GUI です。
国土地理院の地理院タイルから航空写真とDEMを取得し、画像特徴量と地形量を作成して、K-meansやGMMで教師なし分類を行います。
最終的な地形名を完全自動で決めるものではなく、航空写真判読や地形分類のための 一次分類・判読支援ツール として使うことを想定しています。
何を作ったか
今回作成したのは、以下のような流れで地形分類を試せるデスクトップGUIです。
- 国土地理院タイルから航空写真を取得
- 国土地理院DEMタイルから標高データを取得
- 航空写真から色・明度・テクスチャ特徴量を作成
- DEMから標高・傾斜・起伏量・地形量を作成
- 教師なし分類で似た領域をグルーピング
- 分類結果を2D表示・重ね合わせ・3D表示で確認
- 結果画像、CSV、NumPy、JSONとして保存
GUIは PySide6 + PyQtGraph で作成しています。
地形・GIS系の解析では、画像を拡大縮小しながら確認したい場面が多いため、PyQtGraphでインタラクティブ表示できるようにしました。
背景
航空写真を使った地形分類では、色、陰影、模様、土地被覆の違いから、森林、裸地、河川、谷底低地、斜面、市街地などを読み取ります。
一方で、航空写真だけでは次のような問題があります。
- 日陰や撮影条件の影響を受ける
- 森林や裸地の見た目が地域によって変わる
- 地形の高低差や傾斜は写真だけでは分かりにくい
- 人による判読には経験が必要
そこで、航空写真の画像特徴量に加えて、DEMから作成した地形量を組み合わせ、教師なし分類で「似た特徴を持つ領域」を自動抽出するプロトタイプを作成しました。
主な機能
データ取得
GUIから緯度・経度・ズームレベル・タイル枚数を指定し、国土地理院タイルを取得します。
対応している主なレイヤは以下です。
- 航空写真
- 全国最新写真
seamlessphoto - 電子国土基本図オルソ画像
ort - 簡易空中写真
airphoto
- 全国最新写真
- DEM
dem_pngdem5a_pngdem5b_pngdem5c_png
写真タイルが白抜きに近い場合は、代替レイヤを自動試行する設定も入れています。
特徴量作成
航空写真とDEMから、機械学習用の特徴量を作成します。
| 種類 | 内容 |
|---|---|
| RGB | 赤・緑・青の色特徴 |
| HSV | 色相・彩度・明度 |
| ExG / VARI | 近赤外を使わない簡易植生指標 |
| テクスチャ | 局所的な模様・ざらつき |
| エッジ | 境界・線状構造 |
| DEM地形量 | 標高・傾斜・起伏量・TPI・曲率など |
航空写真だけで分類すると土地被覆寄りの結果になりやすく、DEMを加えると地形的なまとまりも反映しやすくなります。
教師なし分類
分類方法は、画素単位とセグメント単位の両方を用意しています。
| 分類方法 | 概要 |
|---|---|
| 画素単位 k-means | 各画素を直接クラスタリング |
| 画素単位 MiniBatch k-means | 大きめの画像でも比較的高速 |
| 画素単位 GMM | クラスの重なりを確率的に扱う |
| SLIC + k-means | 小領域単位で分類し、ごま塩ノイズを抑える |
| SLIC + GMM | 小領域単位でGMM分類 |
特に地形分類では、1画素ごとの結果よりも、ある程度まとまりのある領域として見る方が分かりやすい場合があります。
そのため、SLICで小領域化してから分類する方式を追加しています。
GUI構成
GUIは以下のタブ構成です。
| タブ | 内容 |
|---|---|
| データ取得 | 地理院タイルから航空写真とDEMを取得 |
| 特徴量・分類 | 特徴量、分類方法、クラス数などを設定 |
| 処理前/分類後比較 | 航空写真と分類結果を左右比較 |
| 重ね合わせ | 航空写真に分類結果を半透明で重ねる |
| 分類結果表 | クラス別の統計値を確認 |
| 3D表示 | DEM地形面に写真・分類結果を貼り付け |
| ログ・出力ファイル | 実行ログと保存処理 |
| 使用方法 | 初心者向けの説明とMarkdown保存 |
画像表示では、航空写真とDEM、処理前画像と分類後画像のズーム・パンを連動できるようにしています。
これにより、同じ場所を比較しながら分類結果を確認できます。
3D表示
DEMを3D地形面として表示し、以下のレイヤを貼り付けられるようにしています。
- 航空写真
- 教師なし分類
- 重ね合わせ
- DEM標高階調
- DEM傾斜
3D表示には PyOpenGL を利用しています。
航空写真や分類結果をDEM上に貼り付けることで、斜面、谷、尾根、低地などの関係が把握しやすくなります。
インストール方法
今回は exe 版を使います。
ソースファイルについて、後日gitで公開する予定です。
- AerialTerrainML_GUI_r001.zipをダウンロードします。
- ZIP ファイルを任意のフォルダーに解凍します。
- 解凍したフォルダー内の AerialTerrainML_GUI_r001.exe を実行します。
基本的な使い方
1. サンプル地点を選ぶ
まずは「データ取得」タブでサンプル地点を選びます。
例として、以下のような地点を用意しています。
| 地点 | 確認しやすい内容 |
|---|---|
| 富士山南麓 | 火山山麓、森林斜面 |
| 箱根・大涌谷 | 火山地形、谷地形、裸地 |
| 阿蘇・草千里 | カルデラ、草地、斜面 |
| 多摩丘陵 | 丘陵地、谷戸、市街地境界 |
| 輪島付近 | 海岸段丘、低地、丘陵、市街地 |
| 三浦海岸付近 | 砂浜、低地、丘陵、市街地境界 |
| 宇奈月付近 | 峡谷、山地斜面、谷底低地、河川 |
2. 航空写真とDEMを取得する
「写真+DEMを取得」をクリックすると、航空写真とDEMを取得して表示します。
取得後は、写真とDEMを左右に並べて確認できます。
表示範囲の連動をONにすると、ズームやパンを同期できます。
3. 特徴量と分類方法を設定する
最初は以下の設定がおすすめです。
| 項目 | 推奨値 |
|---|---|
| 写真レイヤ | 全国最新写真 seamlessphoto
|
| DEMレイヤ | dem_png |
| ズーム | 14 |
| タイル枚数 | 3 × 3 |
| 分類方法 | 画素単位 MiniBatch k-means |
| クラス数 | 8 |
| PCA | ON |
| 最大サンプル数 | 80,000 |
ノイズが多い場合は、SLIC + k-means または SLIC + GMM を試すと、まとまりのある分類結果になりやすいです。
4. 教師なし分類を実行する
「教師なし分類を実行」をクリックすると、特徴量作成、標準化、PCA、クラスタリングが実行されます。
処理の内部フローは以下です。
航空写真・DEM取得
↓
RGB / HSV / テクスチャ / エッジ / DEM地形量を作成
↓
特徴量を標準化
↓
必要に応じてPCAで次元圧縮
↓
K-means / MiniBatch K-means / GMMで分類
↓
分類図・重ね合わせ図・クラス別統計表を作成
5. 結果を確認する
分類結果は、複数のタブで確認できます。
- 処理前/分類後比較
- 重ね合わせ
- 分類結果表
- 3D表示
教師なし分類のクラス番号には、最初から地形名が付いているわけではありません。
分類結果表や重ね合わせ図を見ながら、人が以下のように意味付けします。
- クラス1:森林斜面らしい
- クラス2:市街地・人工改変地らしい
- クラス3:裸地・砂礫地らしい
- クラス4:谷底低地・河川周辺らしい
このように、教師なし分類は「答えを出す」ためではなく、「判読の手がかりを出す」ために使うのが現実的です。
出力ファイル
解析結果は以下のような形式で保存できます。
| 形式 | 内容 |
|---|---|
| PNG | 航空写真、DEM表示、分類図、重ね合わせ図 |
| NumPy | 配列データ |
| CSV | クラス別統計表 |
| JSON | メタデータ、処理条件 |
後からQGIS、Python、Excelなどで確認しやすいように、画像だけでなく数値データも保存できるようにしています。
注意点
このアプリは研究・検証用のプロトタイプです。
実務で正式な地形分類図として使う場合は、以下が必要です。
- 教師データによる精度検証
- 現地状況や既存地形分類図との照合
- 人による判読修正
- 分類クラス名の整理
- 地理院タイル等の出典明示
- 対象地域に応じたパラメータ調整
特に、教師なし分類のクラス番号は自動的に「森林」「裸地」「低地」などを意味するわけではありません。
分類後に人が確認し、クラスの意味を付ける必要があります。
国土地理院タイルの出典表示
地理院タイルを利用する場合は、出典の明示が必要です。
アプリや成果物には、例えば以下のような表記を入れます。
地図・写真・標高データの出典:国土地理院 地理院タイル
参考:
- https://maps.gsi.go.jp/development/ichiran.html
- https://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html
今後の拡張案
今後は、以下のような拡張が考えられます。
教師あり分類への拡張
教師なし分類で得られた結果をもとに、人がクラス名を付けた教師データを作成し、Random ForestやLightGBMなどで教師あり分類へ発展させることができます。
QGIS連携
分類結果をGeoTIFFやGeoPackageで出力できるようにすれば、QGIS上で既存の地形分類図、土地利用図、ハザードマップなどと重ねて確認できます。
航空写真からDEM推定への発展
将来的には、航空写真から相対的な高さや深度マップを推定し、実際のDEMと比較することで、地形分類や微地形抽出に使うことも考えられます。
Webデモ化
OpenLayersやLeafletと組み合わせて、分類結果をWeb上で確認できるようにすると、説明用・デモ用として使いやすくなります。
参考リンク
-
国土地理院 地理院タイル
https://maps.gsi.go.jp/development/ichiran.html -
PySide6
https://doc.qt.io/qtforpython-6/ -
PyQtGraph
https://pyqtgraph.readthedocs.io/ -
scikit-learn
https://scikit-learn.org/ -
scikit-image
https://scikit-image.org/ -
PyOpenGL
https://pyopengl.sourceforge.net/
まとめ
航空写真とDEMを組み合わせることで、単なる画像分類ではなく、地形的なまとまりを意識した分類ができるようになります。
今回のGUIでは、国土地理院タイルの取得、特徴量作成、教師なし分類、2D比較、重ね合わせ、3D表示、結果保存までを一通り試せるようにしました。
教師なし分類だけで地形名を完全に決めることは難しいですが、航空写真判読や地形分類の前処理としては有効です。
今後は、教師あり分類、QGIS連携、Web公開デモ、航空写真からのDEM推定などへ拡張していきたいと考えています。




