Skip to content

Latest commit

 

History

History
121 lines (88 loc) · 6.93 KB

DESIGN.md

File metadata and controls

121 lines (88 loc) · 6.93 KB

設計說明:為什麼要做「重建後」這一段

一、問題:三維重建完成之後,模型就只是模型

既有的重建工具(OOOSplat、Brush、COLMAP)已經把「一段環繞影片 → 高品質 3DGS 模型」做得很好。 但模型本身沒有回答:這棟建築叫什麼、屬於哪一類、能不能拿去訓練一個偵測器。

而要做建築辨識,最貴的資源從來不是模型,是標註:

做法 問題
人工框選 一張圖數十秒;一棟建築環繞一圈有 200300 張影格 → 每棟要 23 小時
開放詞彙偵測器自動框(YOLO-World 之類) 得到弱標註:位置大致對但不夠緊;同一個建築面在不同影格上框得鬆緊不一;難免漏框
用生成式模型合成資料 幾何不保證正確、域偏移更大

本專案觀察到:重建過程已經順帶產生了標註所需的全部資訊,只是沒有人把它接起來。

二、核心洞見

COLMAP 在重建時對每一張影格解出了相機位姿(旋轉 qvec 與平移 tvec), 並產生了一個稀疏三維點雲(每個點還記錄了它被哪些影格的哪些特徵點觀測到,也就是 track)。

於是:

只要在三維空間定義一次建築的包圍盒,就能把它投影到每一張影格, 得到幾何一致、零漏框、可稽核的二維標註。

性質 為什麼重要
幾何一致 同一個三維實體在所有影格上框的是同一件事,不會時鬆時緊
零漏框 只要該影格看得到這棟建築,就一定框得到(不需要模型「剛好」偵測到)
可稽核 每個框都能追溯回包圍盒與相機位姿,不是黑箱預測;爭議時可以重算
跨影格一致 相鄰影格的框平滑變化,適合做時序訓練(影片、多視角)

三、實作上的三個難題與解法

難題 1:COLMAP 的世界座標沒有重力方向

COLMAP 的世界座標由第一台相機定義,沒有任何人告訴我們哪個方向是「上」。 若硬把世界 Y 軸當成高度,遇到側拍、俯拍時包圍盒的高度就完全錯誤。

解法:由相機軌跡推定上軸。 拍攝建築時操作者通常繞著建築走,相機中心大致落在一個水平面上; 對相機中心做 PCA,變異最小的主方向即為上軸。若軌跡退化(原地旋轉、只有兩三個位置、 或三個方向的變異量接近),則退回世界 Y 軸並在輸出中標記 up_axis_estimated = true, 讓使用者知道這個盒子的高度不可信。

實測:一個室內掃描推得的高度為 3.54 m(房間高度),與實際相符,代表推定有效。

難題 2:角點落在相機後方時,投影框會低估輪廓

三維盒有 8 個角點。若某些角點在相機後方,它們無法投影,此時用「可見角點的投影範圍」 得到的二維框可能比物件本身小。

解法:明確區分兩種模式,並把資訊交給使用者。

  • 預設模式:只要 4 個角點可見就採用,並在每一影格記錄 visible_corners;
  • 嚴格模式(--require-all-corners):要求 8 個角點全部可見才採用,保證框不會低估輪廓。

影格數與正確性之間由使用者自行取捨,而不是由程式偷偷決定。

難題 3:怎麼自動判斷「這張影格拍得好不好」

不是每一張影格都適合當訓練樣本(太遠、太近、被遮擋)。本專案用三個客觀指標:

指標 來源 判斷
可見角點數 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 張被拒,原因為可見角點不足或框過大——因為該專案是室內掃描, 拍攝者在盒內,本來就看不到多數角點)

七、已知限制

  1. 適合「繞著物件拍」的掃描。若拍攝者在物件內部(室內掃描),可見角點天然偏少, 接受率會很低——這是幾何事實,不是 bug。
  2. 包圍盒擬合的是「整個重建場景」,不是自動挑出某一棟建築。多建築場景需要人工指定盒 (編輯 box.json 後重跑)或未來加入點雲分群。
  3. 遮擋只做粗判:用盒內觀測點數當代理指標,沒有做逐像素的可見性測試。
  4. 未實作由 3DGS 模型渲染新視角擴增資料(規劃中)。