AI 工程從零開始|Phase 4 Part 2:目標偵測與語義分割 — 讓機器看懂空間

大多數人以為「目標偵測」只是把框畫出來, 用最新的預訓練模型跑一跑就算完成。 真正的工程挑戰是:在 10ms 內偵測 20 個物件、 同時讓精度在邊緣設備上不低於雲端 80%。


面試情境

你負責一套工廠自動化視覺系統,需要在產線 conveyor belt 上即時偵測瑕疵零件(< 1cm² 小缺陷),相機 30fps,邊緣 GPU 只有 RTX 3060(12GB VRAM),允許誤報率 ≤ 2%,漏報率 ≤ 0.5%。請說明你會選擇什麼模型架構、訓練策略與部署優化方案。


一、核心問題:分類 vs 偵測 vs 分割的本質差異

影像理解有三個遞進的問題層次,每一層的工程複雜度都數量級地跳升:

分類(Classification):圖裡有什麼?

  • 輸出:一個類別標籤 + 信心分數
  • 代表模型:ResNet、EfficientNet
  • 瓶頸:無法回答「在哪裡」「有幾個」

偵測(Detection):圖裡有什麼、在哪裡?

  • 輸出:N 個邊界框(bounding box)+ 類別 + 信心分數
  • 代表模型:YOLO 系列、Faster R-CNN
  • 瓶頸:需處理多尺度、密集排列、遮擋問題

分割(Segmentation):每個像素屬於哪個類別/哪個實例?

  • 語義分割:每像素給類別標籤,不區分實例(FCN、U-Net)
  • 實例分割:每個物件實例有獨立 mask(Mask R-CNN)
  • 全景分割:語義 + 實例的聯集(Panoptic FPN)
  • 瓶頸:標注成本高(偵測框 30 秒/張 vs 多邊形分割 10 分鐘/張)

工程上選擇哪個任務,核心取捨在於:

任務標注成本推論延遲(A100)典型應用
分類低(1 秒/張)2–5ms內容稽核、產品分類
偵測中(30 秒/張)5–30ms車牌辨識、人流計數
語義分割高(5 分鐘/張)15–80ms自駕車道路解析
實例分割極高(10 分鐘/張)30–150ms機器人抓取、醫療影像

二、三個演進階段(POC → MVP → Scale)

╔══ Phase 1:POC / < 1K 張/天 ══╗

┌─────────────────────────────────────────────────┐
│  原始影像                                        │
│    │                                             │
│    ▼                                             │
│  ┌──────────────────────┐                        │
│  │  YOLOv8n pretrained  │  COCO 預訓練           │
│  │  (Ultralytics CLI)   │  直接 fine-tune        │
│  └──────────┬───────────┘                        │
│             │                                    │
│    ▼                                             │
│  JSON/CSV 結果輸出 → 人工審查                    │
└─────────────────────────────────────────────────┘
  • 工具:Ultralytics yolo train CLI,Roboflow 標注
  • 成本:單張 T4 GPU $0.35/hr,訓練 100 epoch ≈ 2hr ≈ $0.70
  • 精度:fine-tune 後 mAP@0.5 通常可達 70–80%
  • 限制:沒有版本控管、沒有 A/B 測試、沒有監控

╔══ Phase 2:MVP / 1K–50K 張/天 ══╗

┌──────────────┐     ┌─────────────────────────────────┐
│  Camera Feed │────▶│  Preprocessing Service           │
│  (RTSP/HTTP) │     │  resize → normalize → batch      │
└──────────────┘     └──────────────┬──────────────────┘
                                    │
                     ┌──────────────▼──────────────────┐
                     │  Inference Service               │
                     │  TorchServe / Triton             │
                     │  YOLOv8m (TensorRT FP16)         │
                     │  batch=4, latency p95 < 25ms     │
                     └──────────────┬──────────────────┘
                                    │
          ┌─────────────────────────┼───────────────┐
          │                         │               │
          ▼                         ▼               ▼
   ┌──────────────┐    ┌─────────────────┐  ┌───────────────┐
   │  Result DB   │    │  Alert Service  │  │  MLflow       │
   │  PostgreSQL  │    │  信心 < 0.5 觸發 │  │  實驗追蹤     │
   └──────────────┘    └─────────────────┘  └───────────────┘
  • 新增:TensorRT 量化(FP32→FP16),延遲從 30ms → 12ms
  • 新增:模型版本管理(MLflow Model Registry)
  • 新增:資料飛輪(低信心樣本自動入標注佇列)
  • 成本:RTX 3090 $0.80/hr,50K 張/天 ≈ 峰值 600 QPS,需 2 副本

╔══ Phase 3:Scale / 50K–1M+ 張/天 ══╗

┌─────────────────────────────────────────────────────────────┐
│                      Kubernetes Cluster                      │
│                                                              │
│  ┌──────────────┐    ┌──────────────────────────────────┐   │
│  │  Load        │    │  Inference Pods (auto-scale)     │   │
│  │  Balancer    │───▶│  YOLOv8x TRT-INT8  ×N replicas  │   │
│  └──────────────┘    │  Triton Ensemble Server          │   │
│                      └──────────────┬───────────────────┘   │
│                                     │                        │
│  ┌──────────────┐    ┌──────────────▼───────────────────┐   │
│  │  Feature     │    │  Post-processing Pipeline         │   │
│  │  Store       │◀───│  NMS → Track → Dedup → Enrich    │   │
│  │  (Redis)     │    └──────────────┬───────────────────┘   │
│  └──────────────┘                   │                        │
│                      ┌──────────────▼───────────────────┐   │
│  ┌──────────────┐    │  Streaming (Kafka)                │   │
│  │  Data Lake   │◀───│  下游:分析/告警/標注回流          │   │
│  │  (S3+Iceberg)│    └──────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
  • INT8 量化:mAP 損失 ≤ 1.5%,延遲再降 40%(12ms → 7ms)
  • 動態批次:將 latency SLA 轉換為 throughput 效益
  • 成本:A10G $1.20/hr × 8 副本 vs A100 $3.20/hr × 3 副本,前者更划算

三、目標偵測框架:Anchor-based vs Anchor-free

┌─────────────────────────────────────────────────────────────┐
│                   偵測框架分類樹                              │
│                                                              │
│  兩階段 (Two-stage)          單階段 (One-stage)              │
│  ┌───────────────────┐       ┌────────────────────────┐     │
│  │  R-CNN 家族        │       │  Anchor-based          │     │
│  │  ├── R-CNN         │       │  ├── SSD               │     │
│  │  ├── Fast R-CNN    │       │  ├── YOLOv2/v3/v4      │     │
│  │  └── Faster R-CNN  │       │  └── RetinaNet         │     │
│  │      精度↑ 速度↓   │       │                        │     │
│  └───────────────────┘       │  Anchor-free           │     │
│                               │  ├── FCOS              │     │
│                               │  ├── CenterNet         │     │
│                               │  └── YOLOv8/v11        │     │
│                               │      精度↑↑ 速度↑↑     │     │
│                               └────────────────────────┘     │
└─────────────────────────────────────────────────────────────┘

Anchor-based 的問題

Anchor 是預定義的一組長寬比框(例如 3 種尺度 × 3 種比例 = 9 個 anchors/位置),模型預測的是相對 anchor 的偏移量。

問題:

  1. 超參數敏感:anchor 的尺寸需要用 K-means 對資料集聚類,換資料集就要重調
  2. 正負樣本不平衡:每張圖可能有 10K+ anchor,只有幾十個是正樣本
  3. 小物件性能差:anchor 尺寸無法覆蓋所有場景

Anchor-free 的改進

FCOS(Fully Convolutional One-Stage)直接預測物件中心點距離四條邊的距離(l, r, t, b),並用 centerness score 過濾低品質框。

YOLOv8 起採用 anchor-free + TAL(Task Aligned Learning)動態分配正樣本,mAP 提升 2–3%,同時減少超參數。


四、YOLO 家族演進:v1 → v5 → v8 → v11

版本年份Backbone特色COCO mAP@0.5:0.95RTX 3090 延遲
YOLOv12016Custom CNN第一個端對端偵測~63.4(VOC)-
YOLOv32018Darknet-53FPN 多尺度輸出33.0~20ms
YOLOv5s2020CSPNet工程友善,易部署37.4~6ms
YOLOv8n2023C2f-CSPNetAnchor-free,TAL37.36ms
YOLOv8x2023C2f-CSPNet最大變體53.930ms
YOLOv11n2024C3k2更小參數,更高精度39.55.5ms
YOLOv11x2024C3k2SOTA 精度54.728ms

版本選型原則

需求矩陣:

         精度要求
         低        中         高
延遲  低  YOLOv8n   YOLOv8s    YOLOv8m
要求  中  YOLOv5s   YOLOv8m    YOLOv8l
     高  YOLOv8n   YOLOv8l    YOLOv8x/v11x
  • 邊緣部署(Jetson Nano,<15ms):YOLOv8n INT8,約 8–10ms
  • 工廠品管(RTX 3060,<30ms,高精度):YOLOv8l FP16,約 18ms
  • 雲端批次(A100,throughput 優先):YOLOv8x FP16,batch=16

五、兩階段偵測:Faster R-CNN 架構解析

┌──────────────────────────────────────────────────────────────┐
│                    Faster R-CNN 資料流                        │
│                                                              │
│  Input Image (H×W×3)                                        │
│       │                                                      │
│       ▼                                                      │
│  ┌─────────────────┐                                         │
│  │  Backbone CNN   │  ResNet-50 / ResNet-101                 │
│  │  Feature Maps   │  輸出 C1~C5 多尺度特徵                  │
│  └────────┬────────┘                                         │
│           │                                                  │
│           ▼                                                  │
│  ┌─────────────────┐                                         │
│  │  FPN (Feature   │  橫向連接,合併高低層語意               │
│  │  Pyramid Net)   │  輸出 P2~P5                             │
│  └────────┬────────┘                                         │
│           │                                                  │
│    ┌──────┴──────┐                                           │
│    │             │                                           │
│    ▼             ▼                                           │
│  ┌──────────┐  ┌─────────────────────────────┐              │
│  │  RPN     │  │  ROI Align                  │              │
│  │  生成約   │  │  將 2K 個提議框映射到固定尺  │              │
│  │  2000 個 │─▶│  寸特徵 → 分類頭 + 回歸頭   │              │
│  │  候選框  │  └──────────────┬──────────────┘              │
│  └──────────┘                 │                              │
│                               ▼                              │
│                    最終 N 個 (box, class, score)              │
└──────────────────────────────────────────────────────────────┘

RPN(Region Proposal Network)關鍵設計

RPN 在每個特徵圖位置預測 k 個 anchor 是否包含物件(objectness score)以及位置偏移量。訓練時 IoU > 0.7 為正樣本,IoU < 0.3 為負樣本。

兩階段 vs 單階段的工程取捨

維度Faster R-CNNYOLOv8
COCO mAP@0.5:0.95~46(R50-FPN)53.9(v8x)
A100 延遲150–200ms10–30ms
小物件(< 32px)精度較好(ROI Align 精細)略差
實作複雜度高(RPN + ROI 兩段訓練)低(端對端)
部署工具鏈detectron2 / mmdetectionUltralytics

結論:精度優先 + 延遲 > 100ms 可接受 → Faster R-CNN;延遲 < 30ms → YOLOv8。


六、語義與實例分割:FCN / U-Net / Mask R-CNN

FCN(Fully Convolutional Network)

最早的語義分割端對端框架。用轉置卷積(deconvolution)將分類網路的特徵圖上採樣回原始解析度,每個像素輸出類別預測。

限制:上採樣過於粗糙,邊界細節差。

U-Net:編碼器-解碼器 + Skip Connection

┌────────────────────────────────────────────────────┐
│                   U-Net 架構                        │
│                                                    │
│  Input          Skip Connections         Output    │
│  572×572  ──────────────────────────▶  388×388    │
│    │                                     ▲         │
│    ▼ encoder                    decoder  │         │
│  280×280  ─────────────────────▶ 392×392           │
│    │                                     ▲         │
│    ▼                                     │         │
│  136×136  ─────────────────────▶ 200×200           │
│    │                                     ▲         │
│    ▼                                     │         │
│   64×64   ─────────────────────▶  104×104          │
│    │                                     ▲         │
│    ▼                                     │         │
│   28×28  (bottleneck) ──────────▶  52×52           │
└────────────────────────────────────────────────────┘

Skip connection 將編碼器的細粒度特徵直接拼接到解碼器對應層,保留邊界資訊。U-Net 是醫療影像分割的標準基準,在小資料集(500–2000 張)也能有效訓練。

Mask R-CNN:實例分割的里程碑

在 Faster R-CNN 基礎上新增 mask head:對每個 ROI,除了預測類別和框,還預測一個 28×28 的二值 mask。

關鍵改進 ROI Align:替代 ROI Pooling 的整數取整,改用雙線性插值,消除特徵錯位,mask AP 提升 ~10%。

效能數字

  • COCO mask AP:Mask R-CNN R50-FPN = 34.6,R101-FPN = 36.1
  • A100 延遲:約 100–150ms(FP32),FP16 + TRT = 60–80ms
  • 適用場景:醫療病灶標注、工業零件抓取姿態估計

七、評估指標深度:IoU / mAP / FPS 的工程意義

IoU(Intersection over Union)

IoU = 交集面積 / 聯集面積

     ┌────────┐
     │  GT    │
     │   ┌────┼──┐
     │   │////│  │
     └───┼────┘  │
         │  Pred │
         └───────┘

IoU = //// 面積 / (GT + Pred - ////)

IoU 閾值的工程含義:

  • IoU = 0.5:允許框的中心偏移 ≤ 25% 物件寬度
  • IoU = 0.75:嚴格對齊,適合手術機器人等精密場景
  • IoU = 0.5:0.95(COCO 標準):多閾值平均,更全面

mAP(mean Average Precision)計算流程

  1. 對每個類別,按信心分數從高到低排序所有預測框
  2. 計算 Precision-Recall 曲線
  3. 計算曲線下面積(AP = AUC of P-R curve)
  4. 所有類別 AP 取平均 = mAP

工程陷阱:mAP 高不代表部署成功

場景mAP@0.5實際問題
訓練集分布82%測試集是工廠實際影像,mAP 掉到 61%
小物件整體 mAP 77%小物件 AP 只有 23%,剛好是客戶最關心的
類別不平衡整體 mAP 75%稀少類別 AP = 12%,平均被高頻類別稀釋

FPS vs Latency 的區別

  • FPS(Frames Per Second):批次吞吐量,batch=16 時 A100 跑 YOLOv8x 約 200 FPS
  • Latency(延遲):單張端對端時間,batch=1 時同樣模型只有 30ms = 33 FPS

即時應用(監控攝影機)看 latency p95;離線批次(夜間報告)看 FPS

工業場景特殊指標

精度(Precision)= TP / (TP + FP) → 誤報率控制
召回率(Recall)= TP / (TP + FN)  → 漏報率控制

工廠品管:漏報 >> 誤報(漏掉瑕疵品=客訴)
  → 設定低信心閾值(0.3),提高 Recall,接受更多誤報
  → 後接人工複驗流程消化誤報

自駕車:兩者都要求極高
  → mAP@0.75 > 70%,且小物件 AP > 40%

八、為什麼選 X 不選 Y

決策選 X 的理由不選 Y 的理由Flip 條件
YOLOv8 vs Faster R-CNN延遲 6–30ms,端對端訓練,Ultralytics 生態完整FRCNN:150ms,RPN 超參數多,部署複雜小物件精度要求極高(AP_s > 50%)時選 FRCNN
TensorRT FP16 vs PyTorch FP32延遲降 40–50%,VRAM 降一半,精度損失 < 1%FP32:資源浪費,無法達到延遲 SLAFP16 數值溢出(極端值輸入)時回退 FP32
Triton vs TorchServe動態批次(dynamic batching),支援多模型 ensemble,NVIDIA 最佳化TorchServe:Java overhead,批次效能差 20%團隊 Java 背景、已有 TorchServe 基礎設施時留 TorchServe
U-Net vs FCN(醫療分割)Skip connection 保留細節,小資料集友善,邊界 dice ↑15%FCN:上採樣粗糙,需大量標注2D/3D 語義分割任務,有充足標注(> 10K 張)時 FCN 夠用
Anchor-free vs Anchor-based省去 anchor 超參調整,換資料集無需重聚類,mAP 更高Anchor-based:需針對每個資料集重跑 K-means,正負樣本不平衡極稠密小物件(衛星影像計數)仍適合 anchor-based
INT8 量化 vs FP16延遲再降 40%,VRAM 再降 50%,Jetson 等邊緣裝置必要FP16:邊緣裝置 VRAM 不足,延遲還是太高量化後精度掉 > 3% 時,回 FP16 或做 QAT(量化感知訓練)

九、系統效應

推論延遲對比(batch=1,COCO 640×640)

模型硬體精度(FP32)精度(FP16/INT8)延遲(FP32)延遲(TRT FP16)延遲(TRT INT8)
YOLOv8nRTX 306037.3 mAP37.1 / 36.89ms6ms4ms
YOLOv8lRTX 306052.9 mAP52.7 / 52.145ms18ms12ms
YOLOv8xA10053.9 mAP53.7 / 53.255ms10ms7ms
Faster R-CNN R50A10046.0 mAP45.8 / 45.1200ms80ms55ms
Mask R-CNN R101A10038.8 mask AP38.5 / 37.9220ms90ms65ms

部署成本對比(50K 張/天,即 0.58 QPS)

方案硬體副本數月成本p95 延遲
YOLOv8n FP16 單副本T41$1808ms
YOLOv8l FP16RTX 30901$29020ms
YOLOv8x INT8A10G1$3809ms
Faster R-CNN FP16A1001$72085ms

資料飛輪效果(3 個月迭代)

迭代週期訓練資料量COCO mAP領域 mAP(工廠瑕疵)漏報率
初始5K(預訓練)37.351%4.2%
第 1 個月+2K 標注-67%2.1%
第 3 個月+8K 標注-78%0.8%
第 6 個月+20K 標注-84%0.4%

關鍵洞察:領域資料 > 模型選型。YOLOv8n + 20K 領域標注 > YOLOv8x + 5K 通用標注,且成本低 3 倍。


十、面試答題要點

「面對工廠瑕疵偵測的場景,我的方案分三層:模型選型用 YOLOv8l,因為它在 RTX 3060 上 FP16 TensorRT 推論延遲 18ms,遠低於 30fps 的 33ms 預算,同時 mAP > 52%;精度控制上,我會設低信心閾值(0.3)拉高 Recall 至 99.5%,後接信心介於 0.3–0.7 的樣本人工複驗,把漏報控制在 0.5% 以內;資料策略上,第一個月用 Roboflow 標注 2000 張,用低信心輸出的主動學習持續擴充,6 個月後領域 mAP 預計可從 51% 提升至 84%。不選 Faster R-CNN,因為 150ms 延遲超過即時需求,且小物件優勢在本場景標注精度提升後可被 YOLOv8l 追上。」

追問準備

Q:如何處理小物件(< 1cm²)偵測? A:

  1. 輸入解析度從 640 提升至 1280(mAP_s 提升 ~15%,延遲增 2.5×)
  2. 使用 SAHI(Slicing Aided Hyper Inference):將影像切成 512×512 重疊塊分別推論,再合併結果
  3. 確保標注框最小邊 ≥ 8px(低於此閾值卷積特徵圖無法捕捉)

Q:模型在夜間光線不足時精度驟降怎麼辦? A:

  1. 訓練時加入光線增強(albumentations:RandomBrightnessContrast、CLAHE)
  2. 收集不同光線條件樣本,確保訓練集多樣性
  3. 監控線上 OOD(Out-of-Distribution)分數(如 MaxSoftmax),自動觸發重標注

Q:如果客戶要求模型可解釋性? A:

  1. GradCAM 視覺化(標記哪個區域觸發偵測)
  2. 提供信心分數 + IoU 信心區間(ensemble 三個模型計算方差)
  3. 對高風險決策輸出「需人工審查」標籤而非強制自動判定

十一、系列導航

文章主題
Phase 4 Part 1:影像分類與卷積神經網路CNN 架構、Transfer Learning、EfficientNet
Phase 4 Part 3:視覺 Transformer 與多模態基礎模型ViT、CLIP、SAM、基礎模型工程化

系列總覽AI 工程從零開始 系列導覽


本文屬於「AI 工程從零開始」系列,以 RKK(Reasoning × Knowledge × Knowledge application)架構呈現,每篇均附有面試答題框架與可直接使用的工程數字。

Yen

Yen

Yen