M TUM-Facade・Semantic3D:点群データセットの概要とダウンロード用Pythonコード

1. エグゼクティブサマリー

本記事は,点群データセット2種(TUM-Facade,Semantic3D)の概要と,それぞれをダウンロードするPythonコードを掲載する。

TUM-FacadeはMLS(Mobile Laser Scanning,車載レーザースキャナ)により取得されたファサード点群データセット,Semantic3Dは静的地上レーザースキャナにより取得された屋外点群データセットであり,ファサードセグメンテーションおよびセマンティックセグメンテーションの研究・教育用途に用いることができる。総点数は約3億3,300万点(TUM-Facade)から40億点以上(Semantic3D)であり,クラス数・座標系・フォーマット・ライセンスはデータセットごとに異なる。

Pythonコードは,各データセットの公式配布元(TUM mediaTUM,ETH Zurichアーカイブサーバ)からファイルをダウンロードする。ダウンロード済みファイルのスキップ機能とファイルサイズ表示機能を備える。ダウンロード対象のファイル数・推定サイズ・必要ツールの一覧は第4章冒頭に掲載する。

2. 前準備(必要ソフトウェアの入手)

本記事のPythonコードは標準ライブラリ(ossubprocessurllib.request)で動作する。7-ZipはTUM-FacadeおよびSemantic3Dのアーカイブ展開に使用する。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合,この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには,Windowsキーまたはスタートメニューから「cmd」と入力し,表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
powershell -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; $m=[Environment]::GetEnvironmentVariable('Path','Machine'); if($m -notlike \"*$s*\") { [Environment]::SetEnvironmentVariable('Path', \"$p;$s;$m\", 'Machine') }"

--scope machine を指定することで,システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後,コマンドプロンプトを再起動するとPATHが反映される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし,「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する(このチェックを入れないと,コマンドプロンプトから python コマンドを実行できない)。
  4. 「Install Python 3.xx for all users」にチェックを入れ,「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストールは完了である。「'python' は,内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は,インストールが正常に完了していない。

AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]

Pythonプログラムの編集・実行用エディタとして,ここではWindsurfのインストール手順を示す。Windsurfがインストール済みの場合,この手順は不要である。

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには,Windowsキーまたはスタートメニューから「cmd」と入力し,表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --scope machine --id Codeium.Windsurf -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /DIR=""C:\Program Files\Windsurf"" /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force; windsurf --install-extension Codeium.windsurfPyright --force"

--scope machine を指定することで,システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後,コマンドプロンプトを再起動するとPATHが反映される。

関連する外部ページ

Windsurfの公式ページ: https://windsurf.com/

7-Zip のインストール [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには,Windowsキーまたはスタートメニューから「cmd」と入力し,表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

REM 7-Zip をシステム領域にインストール
winget install --scope machine --id 7zip.7zip -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements
REM 7-Zip のパス設定
powershell -NoProfile -Command "$p='C:\Program Files\7-Zip'; $c=[Environment]::GetEnvironmentVariable('Path','Machine'); if((Test-Path $p) -and $c -notlike \"*$p*\"){[Environment]::SetEnvironmentVariable('Path',\"$p;$c\",'Machine')}"

3. 実行のための準備とその確認手順(Windows 前提)

3.1 プログラムファイルの準備

第5章に掲載するソースコードをテキストエディタ(メモ帳,Windsurf 等)に貼り付け,文字コードUTF-8で保存して実行する。

3.2 動作確認チェックリスト

確認項目期待される結果
ダウンロード開始時「ダウンロード中...」または「ダウンロード中: (ファイル名)」と表示される
ダウンロード完了後「完了」と表示され,ファイルサイズ(GB単位)が出力される
再実行時(ファイル既存)「スキップ」を含むメッセージが表示され,再ダウンロードされない
保存先ディレクトリ./datasets/ 以下にファイルと展開済みデータが存在する

4. 概要・使い方・実行上の注意

各データセットの概要,属性,ライセンス,注意点を以下に記載する。ソースコードは第5章に掲載する。

4.0 ダウンロード一覧

以下の表は,第5章の各ソースコードがダウンロードするファイルの一覧である。データセット自体の総点数やクラス数ではなく,コードを実行した際に取得されるファイル数・推定サイズ・必要ツールをまとめる。

データセット ダウンロードファイル数 ダウンロード内容 推定合計サイズ(圧縮時) 展開後の形式 保存先 必要ツール
TUM-Facade 1 tum_facade.zip(TUM mediaTUM経由,内部に複数の点群ファイルを含む) 約16 GB .pcd ./datasets/tum_facade/ 7-Zip
Semantic3D 21 訓練データ15個(.7z),訓練ラベル1個(.7z),テストデータ4個(.7z),テストラベル1個(.zip) 約20 GB(ファイルにより0.2〜2.7 GB) ASCII テキスト(.txt + .labels) ./datasets/semantic3d/ 7-Zip

補足:

4.1 TUM-Facade

TUM-Facadeは,ミュンヘン工科大学(TUM)キャンパス周辺の建物ファサードを対象としたセグメンテーション用点群データセットである。MLS(Mobile Laser Scanning)により取得されており,窓,ドア,バルコニー,モールディング等のファサード要素にラベルが付与されている。

項目内容
取得方式MLS(Mobile Laser Scanning)
総点数約3億3,300万点(アノテーション済み)
対象33棟のアノテーション済みファサード,8棟の未アノテーションファサード
クラス数ファサード要素クラス(Wall, Window, Door, Balcony, Molding, Deco, Column, Arch, Stair, Ground surface, Terrain, Roof, Blinds, Outer ceiling surface, Interior, Other)
フォーマット.pcd
座標系ローカル座標系およびUTM座標系
ライセンスCC BY-NC-SA 4.0

4.2 Semantic3D

Semantic3Dは,ETH Zurichが提供する大規模点群分類ベンチマークである。静的地上レーザースキャナで取得された高密度点群で,教会,街路,鉄道,広場等のシーンを含む。2025年8月7日にベンチマークが終了し,テストラベルを含む全データが公開された。

項目内容
取得方式静的地上レーザースキャナ
総点数40億点以上
クラス数8(man-made terrain, natural terrain, high vegetation, low vegetation, buildings, hard scape, scanning artefacts, cars)+unlabeled
フォーマットASCII(x, y, z, intensity, r, g, b),7zip圧縮
ライセンスCC BY-NC-SA 3.0

第5章のコードは,reduced-8(縮小テストセット)の全ファイルをダウンロードする。展開には7-Zipが必要である。

5. ソースコード

5.1 TUM-Facade

"""TUM-Facade ダウンロード(TUM mediaTUM経由)"""
import os
import subprocess
import urllib.request

DOWNLOAD_DIR = "./datasets/tum_facade"
URL = "https://dataserv.ub.tum.de/index.php/s/m1636761.003/download"

os.makedirs(DOWNLOAD_DIR, exist_ok=True)
path = os.path.join(DOWNLOAD_DIR, "tum_facade.zip")
if not os.path.exists(path):
    print("ダウンロード中...")
    urllib.request.urlretrieve(URL, path)
    print(f"完了({os.path.getsize(path) / 1e9:.2f} GB)")
    subprocess.run(["7z", "x", path, f"-o{DOWNLOAD_DIR}", "-y"])
else:
    print("スキップ: tum_facade.zip(ダウンロード済み)")

5.2 Semantic3D

"""Semantic3D ダウンロード(reduced-8,ETH Zurich アーカイブ経由)"""
import os
import subprocess
import urllib.request

DOWNLOAD_DIR = "./datasets/semantic3d"
BASE = "https://share.phys.ethz.ch/~pf/semantic3d/data"
TRAIN = [
    "bildstein_station1_xyz_intensity_rgb",
    "bildstein_station3_xyz_intensity_rgb",
    "bildstein_station5_xyz_intensity_rgb",
    "domfountain_station1_xyz_intensity_rgb",
    "domfountain_station2_xyz_intensity_rgb",
    "domfountain_station3_xyz_intensity_rgb",
    "neugasse_station1_xyz_intensity_rgb",
    "sg27_station1_intensity_rgb",
    "sg27_station2_intensity_rgb",
    "sg27_station4_intensity_rgb",
    "sg27_station5_intensity_rgb",
    "sg27_station9_intensity_rgb",
    "sg28_station4_intensity_rgb",
    "untermaederbrunnen_station1_xyz_intensity_rgb",
    "untermaederbrunnen_station3_xyz_intensity_rgb",
]
TEST = [
    "MarketplaceFeldkirch_Station4_rgb_intensity-reduced.txt",
    "StGallenCathedral_station6_rgb_intensity-reduced.txt",
    "sg27_station10_rgb_intensity-reduced.txt",
    "sg28_Station2_rgb_intensity-reduced.txt",
]

os.makedirs(DOWNLOAD_DIR, exist_ok=True)

def dl(url, dest):
    if os.path.exists(dest):
        print(f"  スキップ: {os.path.basename(dest)}(ダウンロード済み)")
        return False
    print(f"  ダウンロード中: {os.path.basename(dest)}")
    urllib.request.urlretrieve(url, dest)
    print(f"  完了({os.path.getsize(dest) / 1e9:.2f} GB)")
    return True

print("訓練データ:")
for name in TRAIN:
    p = os.path.join(DOWNLOAD_DIR, f"{name}.7z")
    if dl(f"{BASE}/point-clouds/training1/{name}.7z", p):
        subprocess.run(["7z", "x", p, f"-o{DOWNLOAD_DIR}", "-y"])

print("訓練ラベル:")
p = os.path.join(DOWNLOAD_DIR, "sem8_labels_training.7z")
if dl(f"{BASE}/sem8_labels_training.7z", p):
    subprocess.run(["7z", "x", p, f"-o{DOWNLOAD_DIR}", "-y"])

print("テストデータ(reduced-8):")
for name in TEST:
    p = os.path.join(DOWNLOAD_DIR, f"{name}.7z")
    if dl(f"{BASE}/point-clouds/testing2/{name}.7z", p):
        subprocess.run(["7z", "x", p, f"-o{DOWNLOAD_DIR}", "-y"])

print("テストラベル:")
p = os.path.join(DOWNLOAD_DIR, "reduced-8-test.zip")
if dl(f"{BASE}/reduced-8-test.zip", p):
    subprocess.run(["7z", "x", p, f"-o{DOWNLOAD_DIR}", "-y"])

print("完了")

6. まとめ

6.1 取得方式と規模

本記事の2つのデータセットは,MLS(TUM-Facade)および静的地上レーザースキャナ(Semantic3D)により取得されており,総点数は約3億3,300万点(TUM-Facade)から40億点以上(Semantic3D)である。

6.2 セマンティックラベルとベンチマーク

各データセットには建物,植生,車両,ファサード要素等のクラスが付与されている。Semantic3Dでは2025年8月7日のベンチマーク終了に伴いテストラベルが公開された。

6.3 座標系

TUM-Facadeではローカル座標系とUTM座標系の両方が提供されている。

6.4 配布形式とダウンロード手段

配布元はTUM mediaTUM(TUM-Facade)およびETH Zurichアーカイブサーバ(Semantic3D)である。ダウンロード対象の一覧(ファイル数・推定サイズ・必要ツール)は第4章冒頭の表を参照されたい。

6.5 ライセンス

各データセットのライセンスはCC BY-NC-SA 4.0(TUM-Facade)およびCC BY-NC-SA 3.0(Semantic3D)であり,いずれも非商用条件が付されている。商用利用を検討する場合は個別に条件を確認する必要がある。