周暐倫 · Terry

Smart-Pedestrian-Navigation-via-Scene-Analysis-and-Traffic-Light-Detection

Showcase

整合街景語意分割、手勢辨識與手機導航的輔助駕駛專題,在單一即時管線中判斷可行駛區域並做語音提示。

專案概述

畢業專題,將三條獨立技術線整合成單一即時管線:以 FC-DenseNet103(InceptionV4 前端)在 TensorFlow 1.x 上做街景語意分割,以 MediaPipe 做手勢辨識,並透過 Java NIO Socket 從 Android 導航 App(改自 FancyNavi / HERE SDK)接收路線資訊。主程式 Main.py 逐幀擷取攝影機或影片,跑分割推論後,以 BFS 連通域分析判斷使用者是否位於可行區域(路面像素),並把導航距離、轉向角與箭頭疊加回畫面;偵測到揮手「Stop」手勢時以 playsound 觸發語音提示。整體偏研究/概念驗證,模型與資料前處理皆可重現。

關鍵亮點

  • 以 FC-DenseNet103 + InceptionV4 前端在 TensorFlow 1.x 上訓練街景語意分割,並採 CamVid 與自製補充資料集 1:1 混合,提升對在地街景的泛化能力;附帶資料集 label 顏色轉換工具讓兩套資料的標註對齊。
  • 在分割結果上以 BFS 連通域分析計算路面區塊的形心與面積,判斷使用者是否站在可行駛區域,並把距離、轉向角與導引箭頭即時疊加回原畫面,而不是只輸出一張遮罩。
  • 用 MediaPipe Hands 加上 keypoint / point-history 分類器辨識揮手「Stop」手勢,連續觸發時以語音(gTTS 預生成、playsound 播放)提示,作為人機互動的安全信號。
  • 跨平台整合:Android 端(改自 FancyNavi,基於 HERE SDK)做即時導航,透過自寫的 Java NIO 非阻塞 Socket 伺服器把路線資訊串到 Python 主程式,並刻意以 Java 取代較慢的 Python socket 版本以維持吞吐。

技術棧

PythonTensorFlow 1.xFC-DenseNet103OpenCVMediaPipeNumPyPillowAndroid (Java)HERE SDKJava NIO SocketgTTS / playsound

挑戰與取捨

最大的取捨是把三套來源各異的開源元件(語意分割套件、Android 導航 App、MediaPipe 手勢專案)整合成單一即時迴圈,且要在 TensorFlow 1.x 的舊式 session/placeholder API 下維持可用幀率——做法是每隔固定幀數才送一次分割推論。可行區域判斷沒有額外標註,而是用純像素級 BFS 連通域分析在分割輸出上即時計算,簡單但對分割品質與雜訊敏感。跨裝置通訊上,Python socket 版本太慢,因此改寫成 Java NIO 非阻塞伺服器接收手機端路線字串。需要誠實說明的限制:標題雖含「燈號辨識」,但整合後的執行管線中燈號分類僅以註解形式預留、尚未實際接上,實作完成的安全信號是「可行區域判斷 + 揮手 Stop 語音提示」;系統為桌面 Python + Android 的研究原型,綁定 TF1.x 與本機攝影機/socket,無法直接於瀏覽器執行。