專案

Corner.X — 城市反射鏡數據網

用街景影像與事故開放資料,把散落在路口、沒人管的凸面反射鏡變成一份可派工、可排序的清冊。

為什麼是反射鏡

台灣的無號誌路口非常多,凸面反射鏡是最便宜的解法,也因此散落得到處都是——然後就沒有人管了。鏡面霧化、角度被撞歪、支架鏽蝕,這些狀態沒有任何系統在追蹤。

一面失效的反射鏡比沒有反射鏡更危險,因為用路人仍然會相信它。

兩個分數,不是一個

這是整個系統的核心設計。「哪裡該裝鏡子」和「哪面鏡子該修」是兩個不同的問題,輸入、動作、負責單位都不一樣,硬要塞進同一個分數只會兩邊都做不好。

設置需求維護需求
對象還沒有鏡子的路口已經有鏡子的點位
輸入事故資料、路口幾何、遮蔽、敏感設施街景影像判讀 × 點位風險
動作新設工程派工巡修

維護優先序的公式寫在 schema.sql 裡:

priority_score = condition_score × (0.5 + risk_score / 100)

同樣髒的兩面鏡子,在國小通學路口的那面要先修。這一行就是這個系統跟「純影像分類器」的差別——判斷鏡子髒不髒是電腦視覺問題,判斷該先修哪一面是風險排序問題。

沒有清冊,就自己長一份

我們一開始的假設是「先拿到各縣市的反射鏡開放資料」。查下去才發現多數縣市根本沒有這份資料。

所以 pipeline/detect.py 直接掃街景把鏡子找出來、寫成座標清冊。這不是退而求其次,反而變成整個專案最能講的地方:要治理一批資產,你得先有辦法在沒有人給你清單的情況下自己建出清單。

判讀分兩階段跑,因為一次到位的成本太高:

  1. Stage 1 detect.py — 街景廣角掃描,找出鏡子的座標
  2. Stage 2 inspection.py — 對每個座標拉變焦特寫,送進 Gemini 判讀鏡況

validate.py 另外跑 precision / recall,避免我們自己說了算。

系統長相

資料層是 BigQuery,兩個評分視圖 v_installation_needv_maintenance_priority 直接對應上面那兩個問題。API 跑在 Cloud Run,前端有兩個入口:管理者看的地圖,以及民眾用手機上傳鏡子照片與位置的回報頁。

民眾回報這一塊刻意不只是收照片——自由文字會被轉成結構化事實,同時當作模型判讀的校正訊號。

事故資料用的是台北市的死傷交通事故明細開放資料。

從一份專題提案長出來的

這個題目不是為了比賽才想的。2025 年 3 月我寫過一份「道路反射鏡設置輔助系統」的專題提案,當時的兩個方向是用視線分析算出最佳設置點與角度,以及結合開放資料與電腦視覺找出應該裝但還沒裝的路口。

2026 年 8 月接到 DevJam 的「Agent × 智慧城市」主題,才把維運與感測這兩層補上去,變成現在的 Corner.X。

專案進行中,內容會隨開發更新。