コンテンツへスキップ
AI Segmentation
QGIS
Tutorial

QGISでプールを検出する5つの方法

公開日 更新日

裏庭のある郊外の住宅を空から見た画像。プールの自動検出の前と後。 (after)
裏庭のある郊外の住宅を空から見た画像。プールの自動検出の前と後。 (before)
画像検出結果
ドラッグして比較
Long Islandの郊外の1区画に、Google Satelliteの画像で自動検出を1回実行した結果です。木の下の小さなものを含め、40個のプールをマゼンタで囲んでいます。ハンドルをドラッグして比べられます。

QGISでプールを検出するには、まずOpenStreetMapを確認します。Vector > QuickOSM > QuickOSM…を開き、キーにleisure、値にswimming_poolを指定します。地図が薄い地域では、セグメンテーションモデルを実行するか、ラスタ計算機で青のしきい値を取ります。どちらを使うかは、地上解像度で決まります。

入力手法コスト
OSMマッパーが活発な地域方法1、QuickOSMでleisure=swimming_pool無料、1クエリ
オルソ画像(RGB)と数百のプール方法2、セグメンテーションモデル無料のプラグインは自作モデルかGPUが必要。クラウド型のプラグインは無料枠の後にサブスクリプション
5〜30cmのオルソ画像(RGB)方法3、ラスタ計算機での色しきい値無料、コアQGIS内
近赤外またはSWIRバンド付き画像方法4、水指数の後にしきい値無料、衛星画像では庭のプールを検出できない
マルチスペクトル画像と半日方法5、SCPまたはdzetsaka無料のプラグイン、訓練エリアを描く時間

ここに載せたバージョン、価格、メニューパスは、2026年9月3日にQGIS 3.44のマニュアルと各ツールのドキュメントで確認しました。

方法1:すでに描かれたプールを取ってくる

OpenStreetMapにはleisure=swimming_poolのタグが付いたオブジェクトが3,036,801件あり、そのうち2,731,704件は実際のジオメトリを持つウェイです(2026年9月3日時点のtaginfo)。

QuickOSMを開いて検索する

Vector > QuickOSM > QuickOSM…を開くと、Overpass APIに問い合わせます。キーにleisure、値にswimming_poolを指定し、範囲はマップキャンバスの表示範囲か、地名で指定した行政区域にします。

ポリゴンだけを残し、庭のプールに絞る

ノードとして描かれたプールには面積がないので、ポリゴンのレイヤを使います。これらのプールのうち1,808,809件にはaccess=privateも付いており、裏庭のプールを絞り込むフィルタになります。

leisure=swimming_areaは別物です。湖や海で泳ぐために指定された場所を指します。

郊外の1区画の衛星画像。OSMのプールのポリゴンが青で3つのプールに付いているが、ほかに見えている7つのプールにはポリゴンがない。
地図化されているプールは3つで、7つは未登録です。マッパーが描くのは公共のプールやホテルのプールで、民家の庭のプールは誰も描きません。税務当局が探しているのは、まさにその庭のプールです。

**使う場合:**公共・商業プールが必要なとき。

**使わない場合:**誰も申告しなかったものを見つける仕事のとき。

方法2:セグメンテーションモデル

セグメンテーションモデルは形と文脈を読むので、同じ色の防水シートとプールを見分けられます。私たちはその1つとしてAI Segmentationを作っています。この節は自社ツールの紹介です。

インストールしてログインする

プラグインマネージャからインストールします。QGIS 3.22以降が必要で、GPUもモデルの重みも不要です。アカウントを作ると無料枠が使え、その後は月€39(税別)です。

範囲を描き、語を入力して絞り込む

swimming poolと入力して実行します。ポリゴンはプロジェクトのCRSで返り、面積、周長、信頼度が付いています。並べ替えてから、誤りを削除します。

実行時に読み込む調整テーブルから、2つの数値を紹介します。プールの実行では、タイルは最大300mで、約0.13m/画素を求めます。それより粗いと、プールがテラスににじむためです。レビューはswimming poolの信頼度0.20から始まり、buildingの0.30より低く設定されています。プールのマスクは屋根よりスコアが低く出るためです。

QGISで開いた航空画像上の住宅街。裏庭のプールがそれぞれ別の色で塗られ、屋根と庭はそのまま残っている。
1つの範囲と1つの語で、解像度20cmの画像を処理した結果です。プールはそれぞれ面積付きの独立したポリゴンで、ほかのベクタ地物と同じように編集できます。

1つ制限があります。カバー付きプールはモデルに届かず、見逃されます。どちらのクラウドモードも、画像をEU内の当社サーバーに送ります。

同じ3軒の庭の2枚パネル。冬季画像では2つのプールにシアン色の検出枠が付き、丸で囲んだベージュ色のカバー付きプールには付いていない。夏季画像では丸の箇所は青い開放水面になっている。
同じ庭の2時期の画像。丸で囲んだプールは冬季にはカバーの下にあり、検出では見逃されている。タイル全体では、同じプロンプトで夏季画像では58件、冬季画像では2件のプールを返した。ただし2つの画像は季節だけでなく提供元も異なる。

同じ用途のツールはほかに4つあります(2026年9月3日時点)。

ツールインストールするものGPUアカウント画像がお使いのコンピュータの外に出るかプール対応コスト
Deepnessプラグインマネージャ、必要なPythonパッケージ、ONNXモデル任意、CPUで動く不要いいえ渡したモデルの通り無料
Geo-SAMプラグインマネージャ、依存パッケージ、モデルの重み任意不要いいえクリックまたは矩形で1オブジェクト無料
samgeoPythonパッケージ、QGISパネルなし推奨不要いいえスクリプト可、プールクラスなし無料
Mapflowプラグインマネージャ不要要クラウドサービスでははい、エンタープライズ向けにオンプレミスも提供Swimming poolsモデル、オンデマンドクレジット、有料
AI Segmentation(当社製)プラグインマネージャ不要要両クラウドモードではい、ローカルモデルではいいえswimming poolと入力無料枠、その後は月€39(税別)

**使う場合:**手で囲むには多すぎるプール数があるとき。

**使わない場合:**画像をお使いのコンピュータから出せないとき。DeepnessかGeo-SAMを使ってください。

公表する精度の数字に誰かが署名する一斉調査には、Mapflowが専用のSwimming poolsモデルをオンデマンドで提供しており、F1は0.95超と添えられています。当社はプールについて精度の数字を公表していません。

方法3:ラスタ計算機で青のしきい値を取る

以下の3つの手順はレイヤの単位で面積をフィルタするため、投影座標系で作業してください。

コアQGISだけでできる、最も近い方法です。Raster > Raster Calculator…を開くと、バンドはlayer_name@band_numberで指定します。オルソ画像(RGB)では、明るく彩度の高い青が残ります。

("ortho@3" > 90) AND ("ortho@3" - "ortho@1" > 25) AND ("ortho@3" - "ortho@2" > 10)

これらの数値は私が解像度20cmのオルソ画像から決めたものです。プールの画素を20個、屋根の画素を20個サンプルしてから、値を調整してください。

Raster > Conversion > Polygonize (Raster to Vector)でポリゴン化し、native:extractbyexpressionでフィルタします。サイズは$area > 6 AND $area < 400、形状はQGISにコンパクトネスの関数がないため、自作の比4 * pi() * $area / ($perimeter ^ 2) > 0.5を使います。

郊外のオルソ画像。ラスタ計算機の赤いマスクが、すべてのプール、青い金属屋根、薪の山にかけた青い防水シートを覆っている。
上のルールを解像度20cmの画像に適用した結果です。開放されたプールはすべて拾えますが、青い金属屋根と防水シートも拾ってしまいます。

RGB値は太陽の角度と露出で変わるため、1つのフライトラインで調整したしきい値は、次のラインでは通用しなくなります。色相と彩度のほうが安定しており、プロセシングツールボックスのモジュールi.rgb.hisで使えます。このモジュールは「transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-Intensity-Saturation) color space」、つまりRGB色空間をHIS(色相・強度・彩度)色空間に変換します。

どちらのルールも、その青いものが何なのかを知りません。

  • **影。**日陰の屋根の斜面は暗い青に見えます。下限を上げると、木の下のプールを取り逃します。
  • **青い屋根と防水シート。**明るく青く、形もプールに近いことがよくあります。
  • **底が暗いプールと緑色のプール。**黒いライナーはアスファルトに、藻は芝生に見えてしまいます。私のルールは両方を取り逃しました。
  • **カバー付きプール。**そもそも画像に写っていません。
拡大切り抜き3枚を横に並べたもの。庭にかぶせた青い防水シート、日陰になった屋根の斜面、庭にある底の暗いプール。
防水シートと影は色のルールを通過してしまいますが、本来は除外すべきものです。底の暗いプールはルールから外れてしまいますが、本来は検出すべきものです。フロリダ州ケープコーラルの解像度20cmの画像から切り抜いたものです。

**使う場合:**手で確認する、均一な1枚のオルソ画像のとき。

**使わない場合:**複数フライトのモザイクのとき。

方法4:バンドがある画像での水指数

解像度を確認します。フランスのプール連盟によれば、新設の埋め込み式プールは29〜30m²で、解像度10cmのオルソ画像では3,000画素、10mのSentinel-2バンドでは1画素の3分の1です。

水は近赤外をほぼ完全に吸収するので、NIRでは黒くなり、青い屋根は明るいまま残ります。

  • NDWI、McFeeters 1996:(Green - NIR) / (Green + NIR)。Sentinel-2では(B3 - B8) / (B3 + B8)。
  • MNDWI、Xu 2006:(Green - SWIR) / (Green + SWIR)。Sentinel-2では(B3 - B11) / (B3 + B11)。NIRをSWIRに替えると市街地が抑えられ、住宅地ではこれが狙いどころです。

0を超える値でしきい値を取り、ポリゴン化して、方法3と同様にフィルタします。Rodríguez-CuencaとAlonsoは2014年に、この用途向けにNormalized Difference Swimming Pools Indexを調整しました。

Sentinel-2はB3とB8が10m、B11が20mなので、30m²のプールは庭から分離できません。住宅街にMNDWIを適用しても、返るのは町外れの貯水池だけで、ほかは何も返りません。

同じ郊外の2枚のパネル。左は解像度20cmのオルソ画像で、プールが11個見える。右は同じ範囲のSentinel-2のMNDWIで、一様な灰色になり、プールは1つも見えない。
左は11個のプール、右はゼロです。範囲も撮影週も同じです。30m²のプールは、10mのセンサーにはオブジェクトとして届きません。

**使う場合:**オルソ画像に解像度50cm以下のNIRバンドがあるとき。色のしきい値より明らかに優れています。

**使わない場合:**3バンドのRGBのとき、またはSentinel-2で庭のプールを検出したいとき。

方法5:自分の画像で分類器を訓練する

分類器は、描いた例からプールの画素を学習します。そのため、固定のしきい値が通用しないモザイクでも使えます。

Luca Congedoが開発したSemi-Automatic Classification Pluginが定番です。SCPドックで訓練入力(.scpx)を作成し、ROIを描いてから、メインウィンドウでSCP > Band processing > Classificationを実行します。Minimum DistanceからRandom Forestまで、6つのアルゴリズムがあります。バージョン9.0.4は2026年7月11日に公開されましたが、QGISの最低バージョンを3.99と宣言しているため、QGIS 3.xにはバージョン8.5.0がインストールされます。

Nicolas Karasiakが開発したdzetsaka 5.0.11は軽量です。分類器は11種類あり、Gaussian Mixture Modelはscikit-learnなしで動きます。

青い屋根のクラスと影のクラスも描いてください。分類器は、見せたものしか除外できません。

同じ郊外の2枚のパネル。解像度20cmのオルソ画像と、その最小距離法による分類結果(プールクラスをシアンで表示)。青灰色の屋根1つが、隣にある2つの本物のプールよりも大きく検出されている。
同じ解像度20cmのオルソ画像の最小距離法による分類です。プールクラスはこのタイル内の58件のプールで学習しました。タイル全体では、プールと判定したピクセルの46%が実際にはプールではなく、その大半は中央に見えるような青灰色の屋根です。

**使う場合:**複数フライトや季節で、ワークフローを再利用するとき。

**使わない場合:**1枚のオルソ画像を1回処理するだけのとき。どちらも画素を分類するだけでオブジェクトではないため、ポリゴン化とフィルタは結局必要です。

5手法を並べる

手持ち手法
よく描かれた町、公共プールで足りる方法1、QuickOSM
数百のプールと誤検出に付き合う気がない方法2、セグメンテーションモデル
解像度30cmより細かいオルソ画像(RGB)1枚方法3、色しきい値の後にフィルタ
NIRバンド付きのオルソ画像方法4、NDWI
Sentinel-2など10mのもの庭のプールにはどれも不向き。より解像度の高い画像を入手してください
複数フライト、繰り返すワークフロー方法5、SCPまたはdzetsaka

覚えること

最初に解像度、次にバンド、最後に手作業で確認できる量によって、使える方法が決まります。

30m²のプールは10mの解像度では庭から分離できないため、裏庭のプールにはどの指数を使ってもSentinel-2は不向きなセンサーです。

色のしきい値は、街区にある青いものをすべて返します。結果を確認する前に、面積とコンパクトネスでフィルタしてください。

カバー付きプールは画像に写っていないため、このページのどの方法でも見つけられず、費用をかけても変わりません。

検出結果は候補です。何を実行しても、誰かがレイヤを使う前に、信頼度の低い10個のポリゴンを開いて確認してください。

QGISで無料で試す(カード不要)

よくある質問

QGISだけでプールを検出できますか?

機能としてはありません。コアQGISにあるのはラスタ計算機、ポリゴン化、ベクタのフィルタで、これが方法3です。プールをオブジェクトとして認識するには、プラグインが必要です。

Sentinel-2の画像で裏庭のプールを見つけられますか?

いいえ。グリーンとNIRは10mバンド、SWIRは20mなので、30m²のプールは1画素の3分の1にしかなりません。解像度30cm以下の航空写真を使ってください。

青い屋根がプールとして返され続けるのはなぜですか?

塗装した金属屋根はプールの水より明るく青く、色のルールは色しか見ないためです。面積とコンパクトネスでフィルタするか、NDWIに切り替えるか、モデルを使ってください。

航空写真からプールを検出するのは合法ですか?

検出結果を区画と所有者名に結合すると個人データになり、EUではGDPRに基づく法的根拠が必要です。税務当局には、法律に定められた根拠があります。民間企業は通常持っていないため、結合の前にデータ保護責任者に確認してください。モデルの出力を、請求前の最終手順にしてはいけません。

どのくらいの精度を見込めばよいですか?

1つの数字では誤解を招きます。画像と季節によって変わるためです。解像度20cmで開放されたプールはよく検出されます。カバー付きプールはここにあるどの方法でも見逃され、青い屋根は手作業で消す必要があります。

検出結果は、そのまま対応できるプールの一覧になりますか?

フランスの税務当局はIGNの航空写真を使ってこの作業を行いましたが、それでも全所有者に書簡を送りました。「Foncier innovant」のパイロットでは、2022年分として9県で20,356件のプールに課税し、金額は980万ユーロに上りました。2023年の全国調査では、課税台帳に載っていない課税対象のプールが150,000件見つかりました。検出結果は候補であり、区画や氏名と結合すると個人データになります。

フィルタ手順の詳細は、QGISで建物フットプリントを検出する方法をご覧ください。マスクの後処理については、QGISでラスタをベクタに変換する方法があります。市区町村全体の画像で同じ「検出してフィルタ」を実行する場合は、QGIS内で1回の指示から手順を実行するAI Agentが使えます。そのほかはQGIS AIハブにまとめています。