Sentinel-2で東京湾の船を数えてみた(コード付き)
東京湾に船が何隻いるか。衛星画像で数えたら358隻だった。使ったのは無料データだけ。
1. 無料の衛星画像で船は見えるのか
前回の記事で、海外ファンドが衛星画像で港湾や船舶を追跡している事例を紹介した。TankerTrackersはSAR衛星とAISデータを組み合わせてイランの原油輸出を追跡している。
では、同じことが無料データで、個人のPCでできるのか。今回はそれを実際に試した。
使ったのはSentinel-2。ESA(欧州宇宙機関)が運用する地球観測衛星で、10m解像度のマルチスペクトル画像を全世界に向けて無料公開している。13バンドのセンサーを搭載し、5日周期で同じ場所を撮影する。
10m解像度ということは、1ピクセルが地上の10m四方に対応する。300mのコンテナ船なら30ピクセル程度で映る。50mの内航船は5ピクセル。漁船やプレジャーボートは数ピクセル以下で、実質的に検知は困難だ。
先行研究では、Sentinel-2の10mバンドで100m以上の船舶に対し検知率80%以上が報告されている。解像度で劣る分を、マルチスペクトルバンドの豊富さで補っているとされる。
100m以上の商用船舶なら、十分に検知できる可能性がある。東京湾で試してみた。
2. Sentinel-2で東京湾を撮る

Copernicus Data Spaceから、2日分の画像を取得した。
項目3月7日3月12日衛星Sentinel-2BSentinel-2C撮影時刻10:27 JST10:27 JST処理レベルL2A(大気補正済み)L2A(大気補正済み)雲量16%10%東京湾エリアほぼ快晴ほぼ快晴
L2A処理済み(大気補正済み)のデータを使用した。
雲量はタイル全体の数値で、雲は主にタイル西側の山間部に集中していた。肝心の東京湾エリアはクリアで、分析に支障はなかった。
検知対象のエリアは、東京湾の広域(北緯35.25°〜35.70°、東経139.60°〜140.00°)に設定した。東京港、横浜港、川崎港、千葉港、木更津港、横須賀港を含むエリアだ。
3. 検知の仕組み: 水を見つけて、明るすぎるピクセルを探す
船舶検知のアルゴリズムは、意外とシンプルだ。機械学習は使っていない。やっていることは2つ。まず水域を特定し、次にその水域内で「明るすぎるピクセル」を探す。水面は暗い。船は水面より明るい。その差を統計的に検出する。
Step 1: 水域マスクの生成
水域の特定にはNDWI(Normalized Difference Water Index)を使う。近赤外線(B08バンド)は水に強く吸収されるため、水面ではB08の反射率が低くなる。緑色光(B03バンド)との差分を正規化した指標がNDWIで、値が大きいほど水域である可能性が高い。
NDWI = (B03 - B08) / (B03 + B08)
ただし、NDWIだけでは不十分だった(この話は次のセクションで詳しく書く)。最終的には、NDWIに加えてNIR(近赤外)の吸収特性と可視光の低輝度という3つの条件を組み合わせて水域を判定した。
さらに、小さな水域パッチ(河川、池、都市部の反射)を除去し、海岸線から150m内側にエロージョン(収縮処理)をかけた。防波堤、桟橋、埋立地の境界構造物を検知対象から除外するためだ。
Step 2: 輝度異常の検出
水域内のピクセルについて、バンドごとの平均輝度と標準偏差を計算する。そこから「平均 + 3σ(標準偏差の3倍)」を閾値として、4バンド(Blue, Green, Red, NIR)のうち2バンド以上で閾値を超えたピクセルを船舶候補とした。
単一バンドだと波しぶきや浮遊物でも閾値を超えることがある。複数バンドで一致する異常は、実体のある構造物(=船)である可能性が高い。
Step 3: 形態学フィルタリング
候補ピクセルを連結成分としてグルーピングし、船らしい形状のものだけを抽出する。条件は以下の通り。
推定全長: 40〜500m
アスペクト比(長さ/幅): 1.3以上
面積: 2ピクセル以上
船は細長い。丸い構造物(ブイ、浮きなど)はアスペクト比が低いので除外される。
検知コードの全文はGitHubにある。
4. 試行錯誤の記録
最終的な検知結果に至るまでに、何度かやり直している。この過程自体が、衛星データ解析の難しさを端的に示しているので、正直に書いておく。
最初の実装: 水域認識率1.1%
最初はNDWIの閾値を0.1に設定した。McFeeters (1996) 以来広く使われている標準的な値だ。結果、東京湾が水として認識されない。水域認識率はわずか1.1%。開水面(外洋や湾の中央部)の反射特性が、一般的なNDWI閾値の想定と合わなかった。
この段階での検知数は12〜26隻。明らかに少なすぎる。
水域マスク改善: 認識率62.8%
NDWI閾値を-0.1に引き下げ、NIR吸収(B08が低い)と可視光低輝度(B02+B03+B04の平均が低い)を併用する方式に変更した。水域認識率は62.8%に改善。
しかし今度は検知数が4,691隻に跳ね上がった。東京湾に4,691隻もいるはずがない。沿岸の構造物 — 防波堤、桟橋、コンテナクレーン、埋立地の境界 — が全て「水域内の明るいピクセル」として検知されていた。
エロージョン導入: 320〜358隻
海岸線から150m(15ピクセル)内側に水域マスクを収縮させるエロージョン処理を導入した。これで沿岸構造物の大部分が除外され、検知数は358隻(3/7)、320隻(3/12)に収束した。
段階水域認識率検知数問題NDWI閾値0.11.1%12-26隻水域が認識されないNDWI+NIR+VIS併用62.8%4,691隻沿岸構造物の誤検知エロージョン150m62.8%→収縮後320-358隻妥当な範囲に収束
NDWI閾値の0.1→-0.1という変更は小さく見えるが、結果は劇的に変わる。こうしたパラメータの感度の高さは、衛星データ解析では常に意識しておく必要がある。
5. 結果: 3月7日 vs 3月12日
2日分の検知結果を並べる。

検知数の比較
3月7日 (S2B)3月12日 (S2C)変化大型 (200m+)5463+9 (+16.7%)中型 (100-200m)109103-6 (-5.5%)小型 (50-100m)195154-41 (-21.0%)合計358320-38 (-10.6%)
5日間で全体の船舶数は10.6%減少した。
内訳を見ると、大型船(200m以上)は54→63隻でほぼ安定している。大型船はコンテナ船やタンカーなど、定期航路で運航されるものが多いので、日々の変動が小さいのは直感に合う。
変動が大きいのは小型船(50〜100m)で、195→154隻と41隻減少した。このサイズは内航船やフェリーが該当し、天候や曜日による変動を受けやすい。ただし、10m解像度ではこのサイズ帯の検知精度自体が限界域にあるため、実際の増減なのか検知誤差なのかは、この段階では判別できない。

6. この数字は妥当なのか — 公式統計との照合
検知された358隻、320隻という数字は信じていいのか。公式統計と照合してみた。
国土交通省関東地方整備局のデータによると、東京湾中央航路の通航量は1日あたり約500隻。東京湾内の6港(東京・横浜・川崎・千葉・横須賀・木更津)の入港数合計は約383隻/日(国交省港湾統計2023年)。日本海事新聞によれば、VTS(船舶通航サービス)監視範囲全体では1日平均約700隻が航行している。
ここで重要なのは「1日あたりの通航量」と「ある瞬間に湾内にいる船の数」は違うということだ。衛星画像は撮影の瞬間を切り取ったスナップショットなので、比較すべきは瞬間在湾数になる。
入港した船が平均4〜8時間滞在すると仮定すると、ある瞬間に東京湾内に存在する船舶数は270〜560隻と推定できる。
検知数の358隻、320隻はこの範囲内に収まっている。
ただし、これは「概ね妥当」という以上の意味はない。誤検知(沿岸構造物の残存ノイズ)と見逃し(小型船、10m解像度では検知困難な船舶)が相殺している可能性が高い。検知結果が「偶然正しそうな数字になっている」のか、「本当に正しく数えられている」のかは、AISデータとの突合で検証する必要がある。
7. 何がわかって、何がわからないか
今回の検証で確認できたことと、まだわからないことを整理する。
わかったこと:
10m解像度のSentinel-2で、100m以上の商用船舶は十分に検知できる。大型船は2日間とも安定して検知された
機械学習なしで、統計的な異常検知(水域のmean + 3σ)だけでも動作する。特別なGPUや学習データは不要
2日間の船舶数の変化を定量的に比較できる。時系列追跡の基盤になりうる
公式統計と照合した結果、検知数はオーダーとして妥当な範囲にある
まだわからないこと:
50m以下の船舶の検知精度。10m解像度では5ピクセル以下になり、形状判定が困難
誤検知率。エロージョンで沿岸ノイズは大幅に減ったが、完全には排除できていない
見逃し率。小型船や雲の下にいる船は検知できない
5日間の-10.6%が実際の船舶数の変化を反映しているのか、検知誤差なのか
次のステップは、AISデータとの突合だ。 AIS(船舶自動識別装置)は、一定サイズ以上の船舶が発信する位置・速度・船種情報のリアルタイムデータで、衛星画像とは全く別のソースになる。実際に東京湾のAISデータを5分間収集してみたところ、34隻のユニーク船舶を捕捉できた。衛星画像で検知した船の位置と、AISで取得した船の位置を照合すれば、検知精度を定量的に評価できる。
次回:「AISデータで東京湾の船を追跡する」
免責事項: この記事は衛星データの技術検証を目的とした実験の記録であり、特定の金融商品の売買を推奨するものではありません。投資に関する判断はご自身の責任において行ってください。
参考文献:
McFeeters, S. K. (1996). The Use of the Normalized Difference Water Index (NDWI) in the Delineation of Open Water Features. International Journal of Remote Sensing, 17(7), 1425-1432.
Global Fishing Watch. Expanded Vessel Detections with Sentinel-2 Optical Imagery.
国土交通省 関東地方整備局. 東京湾の海上交通概況.
国土交通省 港湾統計 (2023).
note: https://note.com/sat_lens
X: https://x.com/sat_lens
GitHub: https://github.com/satlens
