【YOLO 物件偵測教學】#01 YOLO 是什麼?一次看完就懂的物件偵測入門

測驗:YOLO 是什麼?物件偵測入門

共 5 題,點選答案後會立即顯示結果

1. YOLO 的全名是什麼?

  • A. Your Object Locator Online
  • B. You Only Locate Once
  • C. You Only Look Once
  • D. Yield Object Learning Output

2. 物件偵測與圖像分類最大的差異是什麼?

  • A. 物件偵測只能處理黑白圖片
  • B. 物件偵測需要同時判斷物體的類別和位置
  • C. 物件偵測只能辨識一種物體
  • D. 物件偵測的準確度一定比較低

3. YOLO 相較於傳統兩階段偵測器(如 Faster R-CNN)的主要優勢是什麼?

  • A. 準確度更高
  • B. 需要更少的訓練資料
  • C. 可以偵測更多類別
  • D. 速度更快,適合即時處理

4. YOLO 的網格系統中,哪個網格負責偵測一個物體?

  • A. 物體佔據最多面積的網格
  • B. 物體左上角所在的網格
  • C. 物體中心點所在的網格
  • D. 所有與物體重疊的網格

5. NMS(Non-Maximum Suppression)的主要用途是什麼?

  • A. 提高模型的訓練速度
  • B. 移除重複的偵測框
  • C. 增加偵測的類別數量
  • D. 調整圖片的輸入大小

前言

當你在使用 AI 輔助開發時,是否曾遇過需要在影像中找出特定物體的需求?無論是自駕車偵測行人、監控系統辨識可疑行為,還是零售店的自動結帳系統,這些應用的背後都有一個共同的技術:物件偵測(Object Detection)

而在眾多物件偵測演算法中,YOLO(You Only Look Once) 因其驚人的速度和不錯的準確度,成為業界最受歡迎的選擇之一。本篇文章將帶你從零開始認識 YOLO,讓你在閱讀專案程式碼或使用相關 AI 工具時,能夠理解背後的運作原理。


物件偵測是什麼?

在深入 YOLO 之前,讓我們先釐清三個常被混淆的電腦視覺任務:

圖像分類 vs 物件偵測 vs 語義分割

任務 輸入 輸出 回答的問題
圖像分類 一張圖片 一個類別標籤 這張圖片「是什麼」?
物件偵測 一張圖片 多個邊界框 + 類別 圖片中「有什麼」、「在哪裡」?
語義分割 一張圖片 每個像素的類別 每個像素「屬於什麼」?

簡單來說:

  • 圖像分類:判斷整張圖片屬於哪一類(例如:這是一隻貓)
  • 物件偵測:找出圖片中所有物體的位置和類別(例如:左上角有一隻貓,右下角有一隻狗)
  • 語義分割:為圖片中每一個像素標記類別(例如:這些像素是天空,那些是建築物)

物件偵測在實際應用中最為常見,因為我們通常需要知道物體「在哪裡」才能做出對應的決策。


YOLO 的核心理念:You Only Look Once

YOLO 的全名是 You Only Look Once,中文可以理解為「只看一眼」。這個名字精準地描述了 YOLO 的設計哲學。

傳統方法:兩階段偵測器

在 YOLO 出現之前,主流的物件偵測方法是兩階段偵測器(Two-Stage Detector),最具代表性的就是 Faster R-CNN:

第一階段:區域提議網路(RPN)
├── 掃描整張圖片
├── 產生數千個「可能有物體」的候選區域
└── 輸出候選框(Region Proposals)

第二階段:分類與精修
├── 對每個候選區域進行分類
├── 精修邊界框座標
└── 輸出最終偵測結果

這種方法準確度高,但速度慢。想像一下:你要在一張圖片中找到所有的車輛,傳統方法是先標記出數千個「可能是車」的區域,然後逐一檢查每個區域是不是真的有車。

YOLO 的革新:單階段偵測器

YOLO 打破了這個範式,將整個偵測流程濃縮成一次前向傳播

YOLO 的處理流程
├── 輸入圖片
├── 通過單一卷積神經網路
└── 直接輸出所有物體的位置和類別

這就像是:一個經驗豐富的駕駛員只需要掃視一眼路況,就能同時注意到前方的車輛、行人、紅綠燈,而不需要逐一確認每個物體。


YOLO 如何運作?網格與邊界框

讓我們用一個簡化的例子來理解 YOLO 的運作原理:

步驟一:將圖片切成網格

YOLO 首先將輸入圖片劃分成 S x S 的網格(最初版本是 7×7):

┌───┬───┬───┬───┬───┬───┬───┐
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │ * │   │   │   │   │  ← 物體中心落在這個格子
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
├───┼───┼───┼───┼───┼───┼───┤
│   │   │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┘

關鍵規則:如果物體的中心點落在某個網格中,該網格就負責偵測這個物體。

步驟二:每個網格預測邊界框

每個網格會預測 B 個邊界框(Bounding Box),每個邊界框包含 5 個值:

# 邊界框的 5 個預測值
bounding_box = {
    'x': 0.5,        # 邊界框中心的 x 座標(相對於網格)
    'y': 0.3,        # 邊界框中心的 y 座標(相對於網格)
    'w': 0.4,        # 邊界框寬度(相對於整張圖)
    'h': 0.6,        # 邊界框高度(相對於整張圖)
    'confidence': 0.85  # 信心分數:這個框包含物體的機率
}
Code language: PHP (php)

步驟三:預測類別機率

除了邊界框,每個網格還會預測 C 個類別機率(C 是資料集中的類別數量):

# 假設有 3 個類別
class_probabilities = {
    'car': 0.8,
    'person': 0.1,
    'dog': 0.1
}
Code language: PHP (php)

步驟四:組合輸出

將以上資訊組合起來,YOLO 的輸出是一個形狀為 S x S x (B * 5 + C) 的張量:

對於 7x7 網格、2 個邊界框、20 個類別:
輸出形狀 = 7 x 7 x (2 * 5 + 20) = 7 x 7 x 30

步驟五:後處理(NMS)

由於多個網格可能偵測到同一個物體,YOLO 使用非極大值抑制(Non-Maximum Suppression, NMS) 來移除重複的偵測框:

NMS 流程:
1. 按信心分數排序所有偵測框
2. 選取信心最高的框
3. 移除與該框重疊度(IoU)過高的其他框
4. 重複步驟 2-3 直到處理完所有框

YOLO 版本演進:從 v1 到 v11

YOLO 自 2015 年問世以來,經歷了多次重大改版。以下是各版本的重要里程碑:

原始系列(Joseph Redmon)

版本 年份 主要特色
YOLOv1 2015 開創性的單階段偵測架構,使用 24 層 CNN
YOLOv2 2016 加入 Batch Normalization、Anchor Boxes、多尺度訓練
YOLOv3 2018 引入 Darknet-53 骨幹網路、多尺度預測

社群發展系列

版本 年份 主要特色
YOLOv4 2020 CSPDarknet53 骨幹、大量資料增強技巧
YOLOv5 2020 PyTorch 實作、輕量化設計、易於部署
YOLOv6 2022 全解耦頭部架構、RepVGG 風格設計
YOLOv7 2022 E-ELAN 架構、進階模型縮放
YOLOv8 2023 無錨點(Anchor-Free)設計、統一框架
YOLOv9 2024 GELAN 架構、可程式化梯度資訊
YOLOv10 2024 無 NMS 訓練、一致性雙重分配
YOLOv11 2024 C3k2 區塊、C2PSA 空間注意力機制

YOLOv11 的重要改進

作為 2024 年 Ultralytics 推出的最新版本,YOLOv11 帶來了幾項關鍵改進:

  1. 更高效的架構:使用 C3k2 區塊取代 C2f,提升推論速度
  2. 空間注意力機制:C2PSA 模組增強特徵提取能力
  3. 更少的參數:相比 YOLOv8m 減少 22% 的參數量
  4. 更快的推論:比 YOLOv10 快約 2%
YOLOv11 模型大小比較:
┌─────────┬────────────┬─────────┐
│ 模型    │ 參數量     │ mAP@50  │
├─────────┼────────────┼─────────┤
│ YOLO11n │ 2.6M       │ ~39.5%  │
│ YOLO11s │ 9.4M       │ ~47.0%  │
│ YOLO11m │ 20.1M      │ ~50.3%  │
└─────────┴────────────┴─────────┘
Code language: CSS (css)

為什麼 YOLO 這麼快?

YOLO 的速度優勢來自其架構設計:

速度比較

模型 速度(FPS) GPU 延遲
Faster R-CNN 5-7 ~54 ms
YOLOv1 45
YOLOv8 100+ ~1.3 ms

快速的原因

  1. 單次前向傳播:整張圖片只需經過網路一次
  2. 無區域提議:不需要生成候選區域
  3. 端到端訓練:整個網路同時優化
  4. 高效的骨幹網路:專為速度優化的卷積架構

準確度與速度的權衡

┌─────────────────────────────────────────────────┐
│                                                 │
│  高準確度                                        │
│     ▲                                           │
│     │           ┌───────────────┐               │
│     │           │ Faster R-CNN  │               │
│     │           └───────────────┘               │
│     │                                           │
│     │                    ┌───────────┐          │
│     │                    │ YOLOv8    │          │
│     │                    └───────────┘          │
│     │                                           │
│     │    ┌───────────┐                          │
│     │    │ YOLOv1    │                          │
│     │    └───────────┘                          │
│     │                                           │
│     └───────────────────────────────────► 高速度 │
│                                                 │
└─────────────────────────────────────────────────┘

YOLO 的限制

雖然 YOLO 很強大,但也有其限制:

1. 小物體偵測困難

由於每個網格只能偵測有限數量的物體,YOLO 在偵測密集的小物體時表現較差。例如:一群鳥、體育場中的人群。

2. 重疊物體的處理

當多個物體的中心落在同一個網格時,YOLO 可能無法正確偵測所有物體。

3. 泛化能力

對於訓練資料中沒有見過的物體形狀或比例,YOLO 可能會有較差的表現。


YOLO 的實際應用場景

自駕車

YOLO 被廣泛應用於自動駕駛系統,用於即時偵測:

  • 行人和自行車騎士
  • 其他車輛
  • 交通號誌和標誌
  • 路面障礙物

監控系統

在安防領域,YOLO 可用於:

  • 即時人員偵測
  • 入侵監測
  • 人流分析
  • 異常行為辨識

零售自動化

零售業使用 YOLO 實現:

  • 無人商店的商品辨識
  • 智慧結帳系統
  • 庫存管理
  • 顧客行為分析

讀懂 YOLO 程式碼的關鍵概念

當你在專案中遇到 YOLO 相關程式碼時,以下是需要理解的核心概念:

常見術語對照

術語 中文 說明
Backbone 骨幹網路 負責提取圖片特徵的主要網路
Neck 頸部網路 融合不同尺度特徵的中間層
Head 頭部網路 輸出最終偵測結果的層
Anchor Box 錨點框 預定義的參考邊界框
IoU 交併比 兩個框重疊程度的指標
NMS 非極大值抑制 移除重複偵測的後處理方法
mAP 平均精度均值 衡量偵測準確度的指標

典型的 YOLO 推論程式碼結構

from ultralytics import YOLO

# 載入模型
model = YOLO('yolo11n.pt')

# 執行推論
results = model('image.jpg')

# 解析結果
for result in results:
    boxes = result.boxes      # 邊界框資訊
    for box in boxes:
        xyxy = box.xyxy      # [x1, y1, x2, y2] 座標
        conf = box.conf      # 信心分數
        cls = box.cls        # 類別編號
Code language: PHP (php)

總結

本篇文章介紹了 YOLO 物件偵測的基本概念:

  1. 物件偵測不同於圖像分類和語義分割,它需要同時判斷物體的類別和位置
  2. YOLO 是單階段偵測器,將偵測濃縮成一次前向傳播,實現即時處理
  3. 網格系統是 YOLO 的核心設計,每個網格負責偵測中心落在其中的物體
  4. 版本演進從 v1 到 v11,持續在速度和準確度之間取得更好的平衡
  5. 實際應用涵蓋自駕車、監控、零售等多個領域

在下一篇文章中,我們將實際動手安裝 YOLO 環境,並執行第一個物件偵測範例。


參考資源

進階測驗:YOLO 是什麼?進階

共 5 題,需要深入理解文章內容才能作答

1. 若 YOLO 使用 7×7 網格、每個網格預測 2 個邊界框、且有 20 個類別,輸出張量的形狀是什麼?

  • A. 7 x 7 x 22
  • B. 7 x 7 x 25
  • C. 7 x 7 x 30
  • D. 7 x 7 x 50

2. YOLOv11 相較於 YOLOv8 的主要改進包括以下哪項?

  • A. 引入 Anchor Boxes 機制
  • B. 改用兩階段偵測架構
  • C. 使用 Darknet-53 骨幹網路
  • D. 使用 C3k2 區塊和 C2PSA 空間注意力機制

3. 邊界框的 5 個預測值中,x 和 y 座標是相對於什麼而言?w 和 h 又是相對於什麼?

  • A. x, y, w, h 都是相對於整張圖片
  • B. x, y 相對於網格;w, h 相對於整張圖片
  • C. x, y, w, h 都是相對於網格
  • D. x, y 相對於整張圖片;w, h 相對於網格

4. YOLO 在哪種場景下表現較差?

  • A. 偵測密集的小物體(如一群鳥)
  • B. 偵測單一大型物體
  • C. 即時影像串流處理
  • D. 自駕車的行人偵測

5. NMS 流程中,IoU(Intersection over Union)的作用是什麼?

  • A. 計算模型的整體準確度
  • B. 決定邊界框的類別
  • C. 衡量兩個偵測框的重疊程度,決定是否要移除
  • D. 計算網格的劃分方式

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *