測驗:YOLO 是什麼?物件偵測入門
共 5 題,點選答案後會立即顯示結果
1. YOLO 的全名是什麼?
2. 物件偵測與圖像分類最大的差異是什麼?
3. YOLO 相較於傳統兩階段偵測器(如 Faster R-CNN)的主要優勢是什麼?
4. YOLO 的網格系統中,哪個網格負責偵測一個物體?
5. NMS(Non-Maximum Suppression)的主要用途是什麼?
前言
當你在使用 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 帶來了幾項關鍵改進:
- 更高效的架構:使用 C3k2 區塊取代 C2f,提升推論速度
- 空間注意力機制:C2PSA 模組增強特徵提取能力
- 更少的參數:相比 YOLOv8m 減少 22% 的參數量
- 更快的推論:比 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 |
快速的原因
- 單次前向傳播:整張圖片只需經過網路一次
- 無區域提議:不需要生成候選區域
- 端到端訓練:整個網路同時優化
- 高效的骨幹網路:專為速度優化的卷積架構
準確度與速度的權衡
┌─────────────────────────────────────────────────┐
│ │
│ 高準確度 │
│ ▲ │
│ │ ┌───────────────┐ │
│ │ │ 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 物件偵測的基本概念:
- 物件偵測不同於圖像分類和語義分割,它需要同時判斷物體的類別和位置
- YOLO 是單階段偵測器,將偵測濃縮成一次前向傳播,實現即時處理
- 網格系統是 YOLO 的核心設計,每個網格負責偵測中心落在其中的物體
- 版本演進從 v1 到 v11,持續在速度和準確度之間取得更好的平衡
- 實際應用涵蓋自駕車、監控、零售等多個領域
在下一篇文章中,我們將實際動手安裝 YOLO 環境,並執行第一個物件偵測範例。
參考資源
- YOLO Evolution: Transforming Object Detection 2015-2024 (viso.ai)
- Ultralytics YOLO11 官方文件
- YOLO Algorithm for Object Detection Explained (V7Labs)
- YOLOv8 vs Faster R-CNN: A Comparative Analysis (Keylabs)
- YOLO advances to its genesis: A decadal review (Springer)
進階測驗:YOLO 是什麼?進階
共 5 題,需要深入理解文章內容才能作答