はじめに
本連載記事は、地理空間情報のAI-ReadyなDataLoaderである『SpatialArrow』を設計し、実装し、検証した内容を3部作として執筆したものです。今回は、その第3回目の記事となります。
第1回【SpatialArrow概念編】GeoAI学習で「画像分割によって地物が途切れる問題」をどう解決するか?(固定タイル方式の課題とSpatialArrowの設計思想)
第2回【SpatialArrow実装編】GeoAI学習で地物を切り刻まずに学習へ渡す(ROI単位で画像とBBを生成する、AI-ReadyなDataLoaderの実装)
第3回【SpatialArrow検証編】GeoAI学習で地物を分割せずに学習させたら精度は上がるか?(屋根上PV検出の比較検証で見逃しが16.5%減少)
前回は、分割前の地物を保持し、必要な画像とBounding Box(以下BB)を実行時に生成するSpatialArrow DataLoaderを実装しました。本記事では、その実装を屋根上ソーラーパネル(以下PV)の検出に適用し、データセットの整備と精度検証を行います。PVの形状を扱ううえでは、セグメンテーションによる評価も重要です。ただし、今回は最初の検証としてBBを対象に、従来の固定タイル方式で学習したモデルと比較しました。
本記事でいう**「従来方式」**は、空中写真を1024×1024ピクセルの固定タイルとして保存し、その画像範囲でBBをクリップしてCOCO形式の教師データを作る方法です。物体検出の既存手法全般を指すものではありません。
比較では両方式にRF-DETR Mediumを使用し、共通の検証ビューで評価しました。mAP@0.50:0.95は56.97%から59.35%となり、confidence 0.3・IoU 0.5での見逃しは472件から394件へ減少(16.5%)しました。データ構成、評価条件、結果の解釈を順に説明します。
1. 固定タイルで生じるBBの断片化
空中写真を1024×1024ピクセルに分割し、タイル境界でBBをクリップする場合を考えます。
分割前の地物のBBを $B$、タイルの領域を $T_i$ とすると、タイル内のアノテーションは次のようになります。
B_i = B \cap T_i
同じ地物が2つのタイルにまたがると、それぞれのタイルには、地物全体ではなく一部分を囲んだBBが登録されます。
| 状況 | モデルに与える教師情報 |
|---|---|
| 地物がタイル内に収まる | 地物全体を囲むBB |
| 地物がタイル境界をまたぐ | 地物の一部分を囲むBB |
| 小さな断片を除外する | 画像に地物の一部があるのに、対応するラベルがない場合がある |
断片を学習することが常に悪いわけではありません。部分的にしか見えない対象への対応に役立つ可能性もあります。
一方、地物全体を1つの単位として検出したい場合、画像の都合で作られた断片と、業務上の検出単位が一致しないという問題があります。今回の目的は、分割前に定義したアノテーションの単位を維持して、モデルへ渡すことです。
図1:従来方式による地物の断片化

図1:固定タイル方式では、画像の分割位置によってPVとBBが断片化する。青線が画像分割線、赤枠が屋根上ソーラーパネルBB、黄枠が画像分割によって断片化するBB
ただし、BBの断片化はCOCO形式そのものの制約ではなく、固定タイルの範囲で画像と教師データを切り出す、今回のデータセット作成方法によって生じるものです。
2. データセットとアノテーションの整備
空中写真とPVの目視判読
背景画像には、NTTインフラネット株式会社の航空写真サービス「GEOSPACE CDS」の画像を使用しました。QGIS上でズームレベル19の画像を表示し、屋根上のソーラーパネルを目視判読して、その範囲を囲むBBをポリゴンとして記録しました。
ここでのズームレベル19は、背景画像を取得・表示するタイルのズームレベルです。モデルの入力サイズである1024×1024ピクセルとは異なる設定です。
アノテーションは、原則として建物単位で作成しました。1棟の建物に複数のパネルが設置されている場合も、それらをまとめて囲む1つのBBとして記録しています。一方、工場などの大規模な建物で、建物の区切りを画像から明確に判断できない場合には、目視で区別できるパネル群の最小のまとまりごとに、複数のBBへ分けて記録しました。
このため、BBの数は個々の太陽電池モジュールの枚数を表すものではありません。 本実験では、この作成方針に基づいて定義したPVのまとまりを検出対象とします。分割前の矩形ポリゴンは、FlatGeoBuf形式のpv_bb.fgbとして保存しました。
入力データの対象範囲(リージョン)
今回の入力データは、個々の建物を切り出した画像ではなく、複数の市街地や住宅地、農地などを含む、まとまった地理的範囲を対象としています。本記事では、この入力データが対象とする範囲を「リージョン」と呼びます。
下図は、入力元の地理空間データの全域です。空中写真上に、画像タイルの範囲を青枠で、目視判読により作成したPVの矩形ポリゴンを赤で重ねています。PVの分布密度や周辺の土地利用は場所によって異なり、画像タイルの配置にも空白があります。このため、図の外接矩形全体を、画像と教師情報が連続してそろった領域として扱うわけではありません。
図2:学習に使用する地理空間データ全域

図2:使用データの全域。青枠は画像タイルの範囲、赤はPVの矩形ポリゴンを示す。背景の空中写真:NTTインフラネット株式会社「GEOSPACE CDS」。
ここでは、リージョン、保存された画像タイル、モデルへ入力するROIを区別します。リージョンはデータ全体の対象範囲、画像タイルは背景画像の保存単位、ROIは学習用の画像を構成するために選ぶ範囲です。
従来方式では、保存した画像タイルの範囲をそのまま学習画像の範囲とし、境界をまたぐBBをクリップします。一方、SpatialArrowによる今回の実装では、分割前の地物を地理座標とともに保持し、その全体が収まるROIを計画します。ROIが複数の保存タイルにまたがる場合は、必要な画像部分を読み出して接合します。
ただし、リージョン内の任意の場所から学習画像を作れるわけではありません。必要な背景画像がそろい、既知のPVのBBを途中で切断せず、trainとvalidの画像領域が混在しない範囲を採用します。したがって、入力データ全体の範囲と、実際に学習・検証に採用したビューの範囲は必ずしも一致しません。
アノテーション時の囲み方のゆれ
屋根上のソーラーパネル(以下、PV)を空中写真から検出するとき、BBをどのように囲むかは、必ずしも一意には決まりません。
屋根の形状や向き、パネルの配置、パネル群の間隔によって、ひとまとまりとして囲む範囲が変わります。例えば、複数の屋根面に分かれたパネル、斜めに並ぶパネル、L字型に配置されたパネルでは、全体を1つのBBで囲むか、複数のBBで囲むかによって、教師情報が変わります。
今回のアノテーションは建物に応じた理由に基づいて作成しており、一括で囲むか、個別に囲むかを無作為に混在させているわけではありません。それでも、建物の形状や配置に応じた囲み方の違いは、画像とBBだけを受け取るモデルにとって、学習すべき複雑さになります。 同じような配置に異なる基準を適用してしまった場合には、さらにラベルの不整合が加わります。
この「囲み方のゆれ」は、学習だけでなく、検証・推論にも影響します。
| 段階 | 囲み方の違いが影響する点 |
|---|---|
| 学習 | どの範囲を1つの物体として扱うか、位置・大きさ・個数の教師情報が変わる |
| 検証 | PVの位置を捉えていても、正解と囲む単位が違えばIoUや1対1の対応が成立せず、誤検出・見逃しと評価されることがある |
| 推論 | 複数PVをまとめた大きなBB、個別BBとの重複、候補の信頼度低下などとして現れる可能性がある |
例えば、正解では2つのBBに分かれているPVを1つの大きなBBで検出しても、2件の正検出にはなりません。「パネルがある場所を見つけること」と「業務上の単位で正しく囲むこと」は、同じではありません。
さらに従来の固定タイル方式では、画像の分割位置によって、元のBBが途中で切断されます。これにより、建物や設備に基づく囲み方に、画像分割の都合による別の変動が加わります。
そこで今回は、SpatialArrowの部分地物の扱い方の一つとして、既知のPVのBBが途中で切れないビューを採用する方針を選びました。SpatialArrow全体が切り抜きを禁止するわけではなく、本実験では地物全体を保つ条件で、その効果を検証します。
従来方式でのデータセット作成
従来方式では、ズームレベル19の背景画像タイルを接合し、1024×1024ピクセルの画像を作成しました。画像の位置を扱えるように、PNG画像とともに、ワールドファイル(PGW)および座標参照系の情報(PRJ)を保持しています。
各画像に対応する教師データは、PVの矩形ポリゴンをその画像の範囲でクリップし、地理座標から画像内の画素座標へ変換して作成しました。画像と対応するBBの注釈をCOCO形式で保存し、RF-DETRの学習に使用しています。
したがって、PVが画像の境界をまたぐ場合には、元のBB全体ではなく、画像内に収まる部分が注釈になります。これは第1節で述べた、固定タイルによる断片化に相当します。
3. SpatialArrowで比較用データを構成する
前回のDataLoaderを使い、分割前のpv_bb.fgbと、従来方式でも使用する位置情報付き画像タイルから学習・検証用ビューを構成しました。処理の実装と環境構築は前回の記事を参照してください。
既存のtrain/valid分割を維持し、次の条件を満たすROIを採用しました。
- ROIと交差する既知のPVのBBがすべて完全に収まる。
- ROI全体を構成する背景画像が存在する。
- trainとvalidの画像領域が混在しない。
切り出す範囲は1024~2048ピクセル四方、モデル入力は1024×1024ピクセルです。大きな範囲を選んだ場合は縮小されるため、地物の見かけの大きさも変わります。BBが別のBBに内包されることを理由に、地物を削除する処理は行っていません。
GeoParquet/GeoArrowで元の形状とIDを保持し、学習時に必要なタイルを接合して画像とBBを生成します。RF-DETRの評価処理との接続にはCOCO互換索引を使用します。この構成はアノテーションの囲み方を自動的に統一するものではありません。
4. データセット構築の結果
| 項目 | 結果 |
|---|---|
| 元の地物数 | 18,813 |
| 採用ビューでカバーできた地物数 | 18,566 |
| 未カバーの地物数 | 247 |
| カバー率 | 98.69% |
| trainのビュー数 | 1,961 |
| validのビュー数 | 377 |
| 途中で切断された正解BB | 0 |
| train/validをまたぐビュー | 0 |
「切断されたBBが0」は、採用されたビューの範囲での結果です。すべての地物を採用できたという意味ではありません。
探索では、地物の部分的な入り込み、背景画像の欠損、別splitの画像領域との交差などによって候補を却下しています。候補の却下件数は地物数ではなく、同じ地物について複数の候補が却下されることもあります。
また、有限の候補探索なので、実際には利用可能な範囲を見つけられていない可能性もあります。
アノテーション数と地物数は異なる
| split | ビュー内アノテーション数 | ユニーク地物数 |
|---|---|---|
| train | 27,231 | 15,947 |
| valid | 4,053 | 2,619 |
アノテーション数が地物数より多いのは、同じPVが複数の重複ビューに含まれるためです。これは地物を断片化した結果ではなく、同じ地物全体を異なる画像範囲から複数回参照しているためです。
ただし、地物によって学習に登場する回数が異なる点は、今後の評価対象になります。
5. 学習と比較方法
モデルには、DINOv2系のバックボーンを持つRF-DETR Mediumを使用しました。両方式で同じモデルを用いることで、モデル種類の変更による影響を避けています。RF-DETR Largeへの変更による効果は、本実験では検証していません。
| 項目 | 主な学習設定 |
|---|---|
| モデル | RF-DETR Medium |
| 入力解像度 | 1024×1024 |
| 最大epoch数 | 50 |
| batch size | 8 |
| 勾配累積 | 2 |
| 基本学習率 | 1×10⁻⁴ |
| スケジューラ | cosine |
| 混合精度 | bfloat16 |
| EMA | 有効 |
| Early stopping | 有効 |
| GPU | NVIDIA RTX PRO 6000 Blackwell Max-Q |
比較対象は、従来の固定タイルで学習したモデルと、SpatialArrowで構成したデータセットで学習したモデルです。両方とも保存されたbest EMAチェックポイントを使用しました。
同じ検証データで評価する
各学習ログの数値をそのまま並べるのではなく、同じ377ビュー、同じ正解BB、同じ評価処理で両モデルを評価しました。
| 項目 | 条件 |
|---|---|
| 検証ビュー数 | 377 |
| 正解アノテーション数 | 4,053 |
| ユニークPV数 | 2,619 |
| AP評価 | pycocotools |
| 最大検出数 | 300/ビュー |
| 保存する予測の最低スコア | 0.001 |
| 件数評価のconfidence閾値 | 0.3 |
| 件数評価の一致条件 | IoU ≥ 0.5 |
| NMS・BB内包による削除 | 使用しない |
APはスコア順位を用いて評価し、Precision・Recall・検出件数はconfidence 0.3で計算しました。評価単位は、地理空間上で重複を統合した地物ではなく、各ビュー内の検出結果です。
6. 共通の検証データでの比較結果
従来方式とSpatialArrowによる方式でそれぞれ学習したモデルを、同じ377ビューで評価しました。両モデルとも、学習時の検証mAPに基づいて保存されたbest EMAチェックポイント(checkpoint_best_ema.pth)を使用しました。
| 指標 | 従来モデル | SpatialArrow | 差 |
|---|---|---|---|
| mAP@0.50:0.95 | 56.97% | 59.35% | +2.38ポイント |
| AP@0.50 | 88.45% | 90.34% | +1.89ポイント |
| AP@0.75 | 66.48% | 70.41% | +3.94ポイント |
| Precision | 80.71% | 82.54% | +1.83ポイント |
| Recall | 88.35% | 90.28% | +1.92ポイント |
| F1 | 84.36% | 86.24% | +1.88ポイント |
| 正検出 TP | 3,581 | 3,659 | +78 |
| 誤検出 FP | 856 | 774 | -82 |
| 見逃し FN | 472 | 394 | -78 |
見逃しは78件減少し、削減率は約16.5%でした。誤検出も82件(約9.6%)減少しました。
\frac{472-394}{472}\times100 \approx 16.5\%
固定閾値0.3でのPrecision・Recallがともに改善しており、この条件では、見逃しの減少と誤検出の抑制を両立しています。AP@0.75も3.94ポイント改善し、より厳しいIoU条件での検出性能が向上しました。ただし、APには信頼度順位や検出件数も影響するため、この値だけで位置精度の改善量を分離することはできません。
ただし、見逃しの純減78件が、そのまま「新たに検出できた対象78件」を意味するわけではありません。改善した対象と逆に見逃すようになった対象の内訳は、個別の予測・正解対応を照合して確認する必要があります。
7. 個別ケースの確認状況
cases.csvには、確認用ビューと地物ID、レビュー画像のパスが保存されています。ただし、この一覧だけでは、各モデルの見逃し理由や画像上の配置は判断できません。レビュー画像と個別予測を照合して確認する必要があります。
nested_cases.jsonは空で、完全内包と判定された正解BBのある検証ビューは0でした。これは「内包ケースを正しく検出できた」という意味ではなく、そのケースでの性能を今回評価できていないことを意味します。
近接するPVをまとめて囲む問題、斜め配置やL字型の検出については、画像と個別予測による確認を今後の作業とします。
8. BB評価で分かったことと、まだ分からないこと
改善の原因を1つに限定できない
今回の結果は、地物を分割せずに学習するデータ構成の有効性を支持する結果です。ただし、変更されたのはBBの切断の有無だけではありません。
- ビューの位置と背景の範囲
- 学習サンプル数と、同じ地物が登場する回数
- 大きなビューを縮小したときの地物の見かけの大きさ
- 採用・未採用となる地物の構成
- データ拡張の適用条件(SpatialArrow側では地物を切断するクロップを使わない)
これらも学習に影響します。現段階で「精度改善のすべてが断片化の解消によるもの」とは断定できません。学習条件とサンプリング条件を統制し、切断の有無を切り分けた追加実験が必要です。
評価対象は今回採用した検証ビュー
共通評価は、SpatialArrowで作成した検証ビュー上で行いました。従来の固定タイル上での比較や、別地域の独立したテストデータでの評価は、まだ行っていません。
構築時に未カバーとなった247地物の性能も、この結果には含まれません。また、重複ビューを独立した地物として数えることはできないため、地物単位・地域単位の集計も今後必要です。
ここでの評価は、モデル選択にも使用する検証データに対する比較であり、独立したテストデータでの最終評価ではありません。
今回は単一の学習結果同士の比較であり、乱数seedを変えた反復実験によるばらつきは確認していません。
斜め配置・L字型・完全内包は別途評価が必要
今回のモデルでは、斜め配置の個別画像確認と配置別の定量評価は未実施です。
正解BBの完全内包ケースは、今回の検証ビューでは判定上0件でした。そのため、内包ケースで検出漏れが起きないことを確認したわけではありません。
L字型も、BBだけでは形状そのものを表現できず、個別の確認が必要です。
9. 次の段階はセグメンテーション
斜め配置やL字型のPVを軸に平行なBBで囲むと、矩形内に背景や別の対象が入り込みます。セグメンテーションでは、対象が占める画素を表現できるため、こうした形状をBBより直接的に扱えます。
ただし、建物単位・設備単位で区別したい場合には、マスクに加えてインスタンスの識別も重要です。セグメンテーションにしても、「どこまでを同じ対象としてまとめるか」という定義は必要です。
そして、セグメンテーションでも固定タイルによる断片化は残ります。地物がタイル境界をまたぐと、1つのインスタンスのマスクが複数の画像に分かれるためです。
今回の仕組みを拡張する場合は、次の流れが考えられます。
- 分割前のポリゴンと地物IDを保持する。
- 地物全体が収まるビューを作成する。
- ビュー内の画像座標へポリゴンを変換する。
- 対応するインスタンスマスクを生成する。
- マスク精度と、地物単位の検出・分離性能を評価する。
今回使用したBBから詳細なPV形状を復元することはできません。セグメンテーションを検証するには、対応する形状アノテーションが必要です。
おわりに
今回、SpatialArrowの実装を用いて、分割前のPVを保持したまま学習用ビューを構成し、RF-DETRによるBB検出を行いました。
共通の検証データでは、従来方式に対してmAP@0.50:0.95が2.38ポイント改善し、見逃しは16.5%減少しました。誤検出も9.6%減少しました。一方、残った394件の見逃しと774件の誤検出については、画像と予測を照合して原因を確認する必要があります。
BBの囲み方には、建物や設備に基づく意味上の判断と、画像分割による機械的な切断の両方が影響します。今回の実装では、前者のアノテーションを保持し、後者によって地物が断片化することを採用ビュー内で防ぎました。
画像サイズに合わせて地物を切るデータセットから、地物と画像の対応を維持してモデル入力を構成する方式へ変えることで、今回のBB検出では改善が得られました。
今後は、比較条件を統制した実験、未採用地物や別地域での評価、インスタンスセグメンテーションへと検証を進めます。
第1回【SpatialArrow概念編】GeoAI学習で「画像分割によって地物が途切れる問題」をどう解決するか?(固定タイル方式の課題とSpatialArrowの設計思想)
第2回【SpatialArrow実装編】GeoAI学習で地物を切り刻まずに学習へ渡す(ROI単位で画像とBBを生成する、AI-ReadyなDataLoaderの実装)
第3回【SpatialArrow検証編】GeoAI学習で地物を分割せずに学習させたら精度は上がるか?(屋根上PV検出の比較検証で見逃しが16.5%減少)