既有的重建工具(OOOSplat、Brush、COLMAP)已經把「一段環繞影片 → 高品質 3DGS 模型」做得很好。 但模型本身沒有回答:這棟建築叫什麼、屬於哪一類、能不能拿去訓練一個偵測器。
而要做建築辨識,最貴的資源從來不是模型,是標註:
| 做法 | 問題 |
|---|---|
| 人工框選 | 一張圖數十秒;一棟建築環繞一圈有 200 |
| 開放詞彙偵測器自動框(YOLO-World 之類) | 得到弱標註:位置大致對但不夠緊;同一個建築面在不同影格上框得鬆緊不一;難免漏框 |
| 用生成式模型合成資料 | 幾何不保證正確、域偏移更大 |
本專案觀察到:重建過程已經順帶產生了標註所需的全部資訊,只是沒有人把它接起來。
COLMAP 在重建時對每一張影格解出了相機位姿(旋轉 qvec 與平移 tvec),
並產生了一個稀疏三維點雲(每個點還記錄了它被哪些影格的哪些特徵點觀測到,也就是 track)。
於是:
只要在三維空間定義一次建築的包圍盒,就能把它投影到每一張影格, 得到幾何一致、零漏框、可稽核的二維標註。
| 性質 | 為什麼重要 |
|---|---|
| 幾何一致 | 同一個三維實體在所有影格上框的是同一件事,不會時鬆時緊 |
| 零漏框 | 只要該影格看得到這棟建築,就一定框得到(不需要模型「剛好」偵測到) |
| 可稽核 | 每個框都能追溯回包圍盒與相機位姿,不是黑箱預測;爭議時可以重算 |
| 跨影格一致 | 相鄰影格的框平滑變化,適合做時序訓練(影片、多視角) |
COLMAP 的世界座標由第一台相機定義,沒有任何人告訴我們哪個方向是「上」。 若硬把世界 Y 軸當成高度,遇到側拍、俯拍時包圍盒的高度就完全錯誤。
解法:由相機軌跡推定上軸。 拍攝建築時操作者通常繞著建築走,相機中心大致落在一個水平面上;
對相機中心做 PCA,變異最小的主方向即為上軸。若軌跡退化(原地旋轉、只有兩三個位置、
或三個方向的變異量接近),則退回世界 Y 軸並在輸出中標記 up_axis_estimated = true,
讓使用者知道這個盒子的高度不可信。
實測:一個室內掃描推得的高度為 3.54 m(房間高度),與實際相符,代表推定有效。
三維盒有 8 個角點。若某些角點在相機後方,它們無法投影,此時用「可見角點的投影範圍」 得到的二維框可能比物件本身小。
解法:明確區分兩種模式,並把資訊交給使用者。
- 預設模式:只要 4 個角點可見就採用,並在每一影格記錄
visible_corners; - 嚴格模式(
--require-all-corners):要求 8 個角點全部可見才採用,保證框不會低估輪廓。
影格數與正確性之間由使用者自行取捨,而不是由程式偷偷決定。
不是每一張影格都適合當訓練樣本(太遠、太近、被遮擋)。本專案用三個客觀指標:
| 指標 | 來源 | 判斷 |
|---|---|---|
| 可見角點數 | 8 個角點投影後落在畫面內的比例 | 太少代表建築只有一角入鏡 |
| 投影面積佔比 | 二維框面積 / 畫面面積 | 太小(<1%)看不清;太大(>85%)相機貼太近 |
| 盒內觀測點數 | 用 COLMAP 的 track 反查:有多少落在盒內的三維點,其 track 包含這張影格 | 這是遮擋與視角的客觀代理指標——若某影格幾乎沒觀測到盒內的點,代表它其實看不到這棟建築 |
第三項是本設計的關鍵:它不需要任何額外的深度圖或語意分割,直接複用重建階段已經算好的資料。
OOOSplat 專案目錄
├─ final.ply 3DGS 模型(本階段不解析,保留給既有檢視器)
├─ project.json
└─ work/
├─ frames/ 抽取後的影格 ★ 標註對象
└─ colmap/
cameras.bin 相機內參(支援 PINHOLE / SIMPLE_RADIAL / OPENCV 等 11 種模型)
images.bin 每張影格的旋轉、平移、2D 特徵點
points3D.bin 稀疏三維點雲(含 track)
│
① inspect ─────┴─→ 影格數、註冊率、內參、點雲統計、可用性判斷
② fit-box ────────→ box.json(三維包圍盒,可人工編輯後重跑)
③ annotate ────────→ labels/*.txt(YOLO)、annotations.json、annotations.csv、qa.html
④ 人工複核 ────────→ 用 qa.html 看框對不對;必要時改 box.json 重跑
| 元件 | 來源 | 本專案是否修改 |
|---|---|---|
| FFmpeg 抽幀、COLMAP 重建、Brush 訓練 | 上游 OOOSplat 與其內建引擎 | 否 |
| 3DGS 檢視、編輯、動畫匯出 | 上游 OOOSplat | 否 |
| COLMAP 位姿讀取與投影數學 | 本專案新增 | 是 |
| 三維包圍盒擬合(含上軸推定) | 本專案新增 | 是 |
| 逐影格品質判斷與標註輸出 | 本專案新增 | 是 |
換句話說:重建是別人的,從重建到資料集這一段是我們的。 這段之所以有價值,是因為它是「小樣本建築辨識」的真正瓶頸所在,而既有的重建工具都沒做。
- 單元測試 23 項(解析往返、投影幾何、上軸推定、包圍盒擬合、離群修剪、品質判斷、標籤輸出)
- 真實資料驗證:以 8 個既有 OOOSplat 專案測試,二進位解析 100% 成功; 其中 3 個專案因註冊率過低(15%/2%/1%)被正確判為不可用
- 端到端:273 張影格的專案 → 包圍盒 12.70×12.27×3.54 m → 49 張影格產生 YOLO 標籤 (其餘 224 張被拒,原因為可見角點不足或框過大——因為該專案是室內掃描, 拍攝者在盒內,本來就看不到多數角點)
- 適合「繞著物件拍」的掃描。若拍攝者在物件內部(室內掃描),可見角點天然偏少, 接受率會很低——這是幾何事實,不是 bug。
- 包圍盒擬合的是「整個重建場景」,不是自動挑出某一棟建築。多建築場景需要人工指定盒
(編輯
box.json後重跑)或未來加入點雲分群。 - 遮擋只做粗判:用盒內觀測點數當代理指標,沒有做逐像素的可見性測試。
- 未實作由 3DGS 模型渲染新視角擴增資料(規劃中)。