物體辨識開發歷程總整理
物體偵測系統 (Object Detection)
1. 現有功能
COCO 80 類實時偵測
系統支援完整 COCO 80 類別的實時物體偵測,可透過 class_whitelist 參數動態限制檢測類別。P0 子集包括 person、dog、bottle、cup、chair、dining_table 這 6 個生活場景最常見的物體,適合家庭互動場景。
偵測結果發布在 /event/object_detected 主題,格式為 JSON 字符串,包含:
class_name:物體類別名稱confidence:信心度 (0-1)bbox:邊界框座標 [x1, y1, x2, y2]color:HSV 12 色分類結果color_confidence:色彩識別信心度
白名單預設為空(偵測全 80 類),可在啟動時指定限制:
ros2 launch object_perception object_perception.launch.py \\
class_whitelist:='[0, 16, 39, 41, 56, 60]' # 限制 P0 6 類HSV 12 色分類
每個偵測框的 ROI(感興趣區域)會進行 HSV 色域分析,將色彩分為 12 個互斥的類別。分類採用優先級順序:首先判斷黑白灰(無色系),再判斷 brown 和 pink(特殊情況),最後判斷其他彩色。
12 色體系與判斷規則:
1-3 : black (V<50), white (S<40,V200), gray (S<40,50V<200) 4-5 : brown (5H25,V<130), pink (特例處理) 6-12 : red, orange, yellow, green, cyan, blue, purple
核心演算法 analyze_bbox_color() 執行 per-pixel mask 統計,計算每個顏色的佔比。若最大佔比小於 0.25,則標記為 "Unknown"(碎片化物體)。實測精度:咖啡色椅子 0.367、紅色杯子 0.89、藍色瓶子 0.74。
中文標籤與 TTS 整合
系統維護三層中文映射:COCO_CLASSES_ZH (80 類)、COLOR_ZH (12 色),避免跨 package 重複定義。Debug 影像使用 PIL ImageDraw 加 CJK 字型渲染中文標籤(cv2.putText 不支援 CJK),顯示格式為 {顏色} {類別名} {信心度},例如 咖啡色 椅子 0.88。
Brain 層 (interaction_executive_node) 訂閱 /event/object_detected 事件,觸發 object_remark skill 生成 TTS 回應。為避免與人臉識別衝突,Person 類別已靜音處理,改由 face_perception 專門處理。額外的去重策略包括:
- 類別級:同一類 5 秒內最多發一次(
class_cooldown_sec) - 顏色級:同一 (class, color) 組合 60 秒內只講一次
Debug 影像與可視化
系統實時發布 debug 影像到 /perception/object/debug_image 主題(8 Hz),內含彩色邊界框、中文標籤、FPS 與偵測計數。可在 Foxglove 新增 Image panel 訂閱此主題,即時檢視偵測結果與色彩分類。邊界框顏色由 class_id 決定,使用 HSV hue spread 確保視覺上的區分度。
技術亮點
YOLO26n NMS-free 架構:與傳統 YOLO 不同,YOLO26n 採用端到端 NMS-free 設計,模型直接輸出最終偵測結果,無需後處理,導致恆定推理延遲 4-6ms(不受場景複雜度影響)。
TensorRT FP16 加速:首次啟動時自動編譯 TensorRT engine(3-10 分鐘),快取至 /home/jetson/trt_cache/yolo26n.engine,後續啟動秒起。
Letterbox 前處理與座標變換:原始影像(D435 1280720)縮放至 640640 並進行灰色填充以保持縱橫比。逆變換時需要 clamp 座標至原圖邊界,避免浮點舍入誤差導致超邊界。
2. 系統現狀評估
已驗證穩定的功能
- COCO 80 類偵測:核心功能,推理穩定 15 FPS,精度 >0.85 (距離 < 1.5m)
- HSV 12 色分類:除強反射場景外,色彩辨識精度 >0.8
- Debug 影像與中文標籤:Foxglove 可視化正常,字型渲染無問題
- Brain 層整合:
object_remarkskill 與 TTS 全鏈路通暢,60s 去重機制有效
待改進的功能
- 小物件偵測(>2.5m 距離):精度下降至 0.5-0.65,awaiting yolo26s A/B 評估
- 色彩環境適應性:混光源、強反射導致色彩誤判,建議未來加白平衡前處理
- Person/Face 統一路徑:目前 person 已靜音避免衝突,但設計仍待優化
3. 功能限制與已知問題詳述
限制一:小物件偵測距離限制
現狀描述:YOLO26n 在訓練時採用 640640 輸入解析度,這對於距離超過 2.5m 的小物件(投影面積 < 30 像素)偵測精度較低。實測結果顯示,距離 < 1.5m 時精度 >0.85,距離 1.5-3m 時降至 0.65-0.75,距離 >3m 時僅 0.5。
影響場景:
- 遠距離杯子、瓶子、椅子等日常物體
- 細長物件(鉛筆、棍子)
- 部分遮蔽的物體
當前處理:系統可以偵測到,但信心度低。前端可根據 confidence 欄位對低信心度物體加警示標記。
限制二:色彩識別對光線環境敏感
現狀描述:HSV 12 色分類基於色彩空間統計,對光線變化敏感。強反射表面(鏡面、玻璃)會導致 HSV 値波動;混合光源(日光 + 台燈)會造成色溫偏移;背光場景會導致物體被判為黑色或灰色。
實測案例:
- 均勻室內光:咖啡色椅子精度 0.95
- 背光環境:識別為黑色或灰色(正確率 < 0.3)
- 玻璃表面:識別結果不穩定,可能倒映背景色
當前處理:使用中位數濾波耐雜訊;當 peak mask ratio < 0.25 時標記 "Unknown" 避免誤判。
限制三:Person 類別設計取捨
現狀描述:YOLO person 與 face_perception 的決策樹重疊。YOLO person 會偵測到全身,face_perception 會識別臉部並做陌生人警告,兩者同時觸發會導致 TTS 混亂(同時講「看到黑色的人」和「偵測到不認識的人」)。
設計決策:在 Brain 層將 person 類別靜音,完全交由人臉識別專用路徑處理。Frontend 仍顯示 person 的邊界框供視覺參考。
影響:Person 偵測有效,但沒有獨立的 TTS 回應。所有人物相關互動(陌生人警告、打招呼)由 face_perception 統一處理。
限制四:COCO 80 類 TTS 32 類限制
現狀描述:系統可偵測 80 個 COCO 類別,但 TTS 回應限制為 32 個(whitelist),以避免過度 babbling(喃喃自語)。超過 32 類的物體可偵測但無語音反應。
Whitelist 涵蓋:常見生活物體(杯子、椅子、書、手機、食物等)、動物(人、狗、貓、鳥)。
當前處理:Frontend 可視化與 debug 影像仍顯示完整 80 類,便於調試與增強視覺體驗;只有 TTS 部分受限。
限制五:深度整合尚未實裝
設計:RGB bounding box 配合 D435 aligned depth 可計算 3D 座標 (x, y, z)。有效範圍 0.3m3.0m(D435 規格)。
現況:設計文檔完成,ROS2 node 代碼未實裝,未納入主線 event schema。
4. 系統架構
完整資料流
系統的資料流從 D435 相機開始。D435 以 30 FPS 發布 RGB 影像(1280720),主 node 透過 ROS2 訂閱 (QoS: BEST_EFFORT + depth=1) 接收,在異步回調中儲存最新幀。主推理迴圈以 15 Hz 定時器驅動,從儲存的影像開始:
- 前處理 (Letterbox):原圖縮放至 640640 並灰色填充,保持縱橫比
- YOLO 推理:透過 ONNX Runtime (TensorRT FP16 provider) 執行,延遲 4-6ms,輸出 (1,300,6) 張量
- 後處理:座標逆變換、信心度篩選、HSV 12 色分類
- 去重:per-class 5 秒冷卻,避免重複事件
- 發布:
/event/object_detected(JSON) +/perception/object/debug_image(8 Hz)
應用層(Brain、Frontend、Foxglove)透過訂閱這兩個主題消費結果,特別是 interaction_executive_node 訂閱事件並觸發 TTS 回應。
D435 (1280x720) ↓ [Letterbox: 640x640] ↓ [YOLO26n TensorRT FP16: 4-6ms] ↓ [HSV 12 色分類 + Per-class 5s 去重] ↓ /event/object_detected (JSON) & /perception/object/debug_image (8 Hz) ↓ Brain: object_remark skill (per-(class,color) 60s 去重 + TTS)
時序與頻率
主推理迴圈 15 Hz,週期 67ms。相機訂閱 (depth=1) 確保只保留最新一幀,避免 buffer 堆積。事件發布限流至 8 Hz 以控制上層應用的負擔。Debug 影像也限流至 8 Hz(受限於圖像編碼與 PIL 字型渲染的開銷)。
5. 待改進點與優先級
P0 優先級(展示前必做)
P0-1:確認 launch 與實際配置一致
現狀:文件與代碼中存在參數定義不匹配的風險(如 confidence_threshold、class_whitelist 的實際預設值)。
行動:
- 檢查
object_perception/config/object_perception.yaml的預設值 - 驗證
object_perception.launch.py是否正確傳遞參數 - 若發現不一致,優先修改 YAML 為正確預設
預期成果:啟動時行為與文件說明一致。
P1 優先級(Demo 後評估)
P1-1:yolo26s A/B Benchmark
動機:YOLO26n 在小物件(>2.5m)精度有限,yolo26s 預期 mAP +7%(40.1% 47.1%)。
計畫:
- 構建 yolo26s ONNX 模型
- 在相同 Jetson 環境下測試 FPS、延遲、記憶體佔用
- 衡量小物件改善是否值得 FPS 下降 30%(15 8-10)
決策基準:若小物件精度升幅 >20% 且 FPS 仍在可接受範圍,考慮切換主線。
時程:5/12 demo 後開始,預計 2-3 天完成。
P1-2:色彩識別環境適應性改善
動機:混光源、強反射導致色彩誤判(如背光識別為黑色)。
可能方案:
- 動態白平衡前處理(LAB 色彩空間)
- HSV 閾值微調(特別是 brown/pink 邊界)
- 引入 confidence 加權投票
時程:post-demo,與 yolo26s benchmark 並行。
P1-3:Person/Face 統一決策路徑
現狀:Person 類靜音,face_perception 專門處理。但若有陌生人 + YOLO person,邏輯可能仍有洞。
改進方向:設計統一的人物識別層,融合 face_identity + YOLO person,避免重疊或遺漏。
時程:post-demo,低迫切性。
P2 優先級(長期優化)
P2-1:深度整合實裝
設計現況:RGB bbox + D435 aligned_depth 3D 座標已設計,待代碼實裝。
預期功能:對偵測物體提供 (x, y, z) 座標,支援更複雜的空間推理。
時程:未來版本。
P2-2:動態手勢延伸
現狀:系統架構主要針對靜態 COCO 類別,未來若需要動態物體追蹤(如飛行物、移動物體的軌跡預測),需另開架構。
時程:需求驅動。
已決策不做的項目
多人物體綁定:目前系統不區分「哪雙手拿著杯子」,只回報「看到杯子」。多人場景可能出現綁定錯誤。短期內不實裝,建議 demo 保持單人場景。
實時 3D 重建:RGB 物體辨識不足以做 3D 重建,需專門的 SfM/SLAM 模組。不在物體辨識 scope 內。