大多數人以為「目標偵測」只是把框畫出來, 用最新的預訓練模型跑一跑就算完成。 真正的工程挑戰是:在 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 trainCLI,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 的偏移量。
問題:
- 超參數敏感:anchor 的尺寸需要用 K-means 對資料集聚類,換資料集就要重調
- 正負樣本不平衡:每張圖可能有 10K+ anchor,只有幾十個是正樣本
- 小物件性能差: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.95 | RTX 3090 延遲 |
|---|---|---|---|---|---|
| YOLOv1 | 2016 | Custom CNN | 第一個端對端偵測 | ~63.4(VOC) | - |
| YOLOv3 | 2018 | Darknet-53 | FPN 多尺度輸出 | 33.0 | ~20ms |
| YOLOv5s | 2020 | CSPNet | 工程友善,易部署 | 37.4 | ~6ms |
| YOLOv8n | 2023 | C2f-CSPNet | Anchor-free,TAL | 37.3 | 6ms |
| YOLOv8x | 2023 | C2f-CSPNet | 最大變體 | 53.9 | 30ms |
| YOLOv11n | 2024 | C3k2 | 更小參數,更高精度 | 39.5 | 5.5ms |
| YOLOv11x | 2024 | C3k2 | SOTA 精度 | 54.7 | 28ms |
版本選型原則
需求矩陣:
精度要求
低 中 高
延遲 低 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-CNN | YOLOv8 |
|---|---|---|
| COCO mAP@0.5:0.95 | ~46(R50-FPN) | 53.9(v8x) |
| A100 延遲 | 150–200ms | 10–30ms |
| 小物件(< 32px)精度 | 較好(ROI Align 精細) | 略差 |
| 實作複雜度 | 高(RPN + ROI 兩段訓練) | 低(端對端) |
| 部署工具鏈 | detectron2 / mmdetection | Ultralytics |
結論:精度優先 + 延遲 > 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)計算流程
- 對每個類別,按信心分數從高到低排序所有預測框
- 計算 Precision-Recall 曲線
- 計算曲線下面積(AP = AUC of P-R curve)
- 所有類別 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:資源浪費,無法達到延遲 SLA | FP16 數值溢出(極端值輸入)時回退 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) |
|---|---|---|---|---|---|---|
| YOLOv8n | RTX 3060 | 37.3 mAP | 37.1 / 36.8 | 9ms | 6ms | 4ms |
| YOLOv8l | RTX 3060 | 52.9 mAP | 52.7 / 52.1 | 45ms | 18ms | 12ms |
| YOLOv8x | A100 | 53.9 mAP | 53.7 / 53.2 | 55ms | 10ms | 7ms |
| Faster R-CNN R50 | A100 | 46.0 mAP | 45.8 / 45.1 | 200ms | 80ms | 55ms |
| Mask R-CNN R101 | A100 | 38.8 mask AP | 38.5 / 37.9 | 220ms | 90ms | 65ms |
部署成本對比(50K 張/天,即 0.58 QPS)
| 方案 | 硬體 | 副本數 | 月成本 | p95 延遲 |
|---|---|---|---|---|
| YOLOv8n FP16 單副本 | T4 | 1 | $180 | 8ms |
| YOLOv8l FP16 | RTX 3090 | 1 | $290 | 20ms |
| YOLOv8x INT8 | A10G | 1 | $380 | 9ms |
| Faster R-CNN FP16 | A100 | 1 | $720 | 85ms |
資料飛輪效果(3 個月迭代)
| 迭代週期 | 訓練資料量 | COCO mAP | 領域 mAP(工廠瑕疵) | 漏報率 |
|---|---|---|---|---|
| 初始 | 5K(預訓練) | 37.3 | 51% | 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:
- 輸入解析度從 640 提升至 1280(mAP_s 提升 ~15%,延遲增 2.5×)
- 使用 SAHI(Slicing Aided Hyper Inference):將影像切成 512×512 重疊塊分別推論,再合併結果
- 確保標注框最小邊 ≥ 8px(低於此閾值卷積特徵圖無法捕捉)
Q:模型在夜間光線不足時精度驟降怎麼辦? A:
- 訓練時加入光線增強(albumentations:RandomBrightnessContrast、CLAHE)
- 收集不同光線條件樣本,確保訓練集多樣性
- 監控線上 OOD(Out-of-Distribution)分數(如 MaxSoftmax),自動觸發重標注
Q:如果客戶要求模型可解釋性? A:
- GradCAM 視覺化(標記哪個區域觸發偵測)
- 提供信心分數 + IoU 信心區間(ensemble 三個模型計算方差)
- 對高風險決策輸出「需人工審查」標籤而非強制自動判定
十一、系列導航
| 文章 | 主題 | |
|---|---|---|
| ← | Phase 4 Part 1:影像分類與卷積神經網路 | CNN 架構、Transfer Learning、EfficientNet |
| → | Phase 4 Part 3:視覺 Transformer 與多模態基礎模型 | ViT、CLIP、SAM、基礎模型工程化 |
系列總覽 → AI 工程從零開始 系列導覽
本文屬於「AI 工程從零開始」系列,以 RKK(Reasoning × Knowledge × Knowledge application)架構呈現,每篇均附有面試答題框架與可直接使用的工程數字。
