PawAI
PawAI

物體辨識開發歷程總整理

物體偵測系統 (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_remark skill 與 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 定時器驅動,從儲存的影像開始:

  1. 前處理 (Letterbox):原圖縮放至 640640 並灰色填充,保持縱橫比
  2. YOLO 推理:透過 ONNX Runtime (TensorRT FP16 provider) 執行,延遲 4-6ms,輸出 (1,300,6) 張量
  3. 後處理:座標逆變換、信心度篩選、HSV 12 色分類
  4. 去重:per-class 5 秒冷卻,避免重複事件
  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 內。

On this page