影像是維度極高的資料:一張 224×224 的彩色照片就有超過 15 萬個數值。如果用第 7 章的全連接網路直接處理,第一個隱藏層只要有 1,000 個單元,就需要約 1.5 億個權重,不但難以訓練,也完全忽略了「相鄰像素彼此相關」的空間結構。卷積神經網路(Convolutional Neural Network, CNN)改用小型濾波器在影像上滑動,以很少的參數擷取局部特徵,再一層層組合成更抽象的表示,是電腦視覺的基礎架構。
本章前半整理 CNN 的基本元件、尺寸與參數的計算方式,以及幾個經典架構;後半進入物件偵測(object detection)。物件偵測的部分最初整理自一個車輛偵測(car detection)專案的學習筆記,以 YOLO 為主線,依序串起分類、定位、特徵點偵測、滑動視窗、交併比、非極大值抑制與錨框等概念,最後再補充兩階段偵測器 R-CNN 系列作為對照。
10.1為什麼用卷積Why Convolutions
卷積層相較於全連接層,有兩個關鍵的結構優勢:
- 參數共享(parameter sharing):一個濾波器(filter)就像一個滑動視窗,在整張影像上移動,每個位置都使用同一組權重。能偵測垂直邊緣的特徵偵測器,在影像左上角有用,在右下角通常也一樣有用,因此不需要為每個位置各學一份參數。
- 連接稀疏性(sparsity of connections):每一個輸出值只與輸入中的一小塊區域(感受野,receptive field)相連,而不是與所有輸入相連。
兩者合起來,使卷積層的參數量只取決於濾波器的大小與數量,與輸入影像的尺寸無關。以本章計算範例的第一層為例:把 32×32×3 的輸入轉換成 28×28×6 的輸出,卷積層只需要 456 個參數;若改用全連接層,則需要 3,072 × 4,704 ≈ 1,445 萬個權重。參數共享還帶來平移等變性(translation equivariance):物體在影像中平移,它在特徵圖上引起的反應也跟著平移,這正是辨識影像時需要的性質。
10.2卷積層Convolution Layer
濾波器與輸出深度
濾波器又稱卷積核(kernel),大小為
使用
嚴格來說,深度學習中的「卷積」是互相關(cross-correlation):數學上的卷積要先把核翻轉再滑動。由於濾波器的權重是學出來的,翻不翻轉沒有實質差別,各框架都直接實作互相關,但仍沿用「卷積」這個名稱。
步幅與填補
- 步幅(stride)
:濾波器每次移動的格數。 時,輸出的高與寬大約減半。 - 填補(padding)
:在輸入的四周補上 圈 0,稱為零填補(zero padding)。它有兩個作用:避免輸出隨層數增加而快速縮小,以及讓邊緣像素也能被濾波器充分使用。
兩種慣用的填補設定:
- valid:不填補,
,輸出會比輸入小。 - same:選擇
使輸出的高寬與輸入相同。在 、 為奇數時, ,例如 3×3 濾波器配 。
輸出尺寸
輸入的高(或寬)為
高與寬分別套用同一個公式。分數不能整除時代表濾波器最後一步會超出輸入邊界,這個位置直接捨棄,所以要向下取整。例如
參數數量
每個濾波器有
例如輸入有 64 個通道,使用 128 個 3×3 濾波器:
10.3池化層與全連接層Pooling and Fully Connected Layers
池化層
池化層(pooling layer)的目的是降採樣(downsampling):縮小特徵圖的高寬,減少後續的計算量,並讓表示對小幅平移較不敏感。常見的有兩種:
- 最大池化(max pooling):取視窗內的最大值,最常用。直覺上,只要某個特徵在視窗內任何位置出現過,就把它保留下來。
- 平均池化(average pooling):取視窗內的平均值。早期的 LeNet-5 使用它;現代網路多半只在最後用全域平均池化(global average pooling),把每張特徵圖平均成一個數值。
池化層有幾個固定的特性:
- 常見設定為
(高寬減半),或 (視窗互相重疊,AlexNet 採用)。 - 每個通道獨立處理,只改變高與寬,深度不變。
- 沒有可學習的參數,
與 都是事先決定的超參數。 - 很少使用填補,因為池化的目的本來就是縮小尺寸。輸出尺寸公式與卷積層相同,取
即為 。
全連接層
全連接層(fully connected layer, FC)中,每個單元都連接到前一層的所有輸出。CNN 通常在最後幾層把特徵圖攤平(flatten)成向量,接上全連接層與 softmax 輸出層。若第
前項是權重矩陣
全連接層是參數的大宗。AlexNet 與 VGG 的末端各有三層全連接層,佔了絕大部分參數:VGG-16 約 1.38 億個參數中,約 1.24 億個在全連接層,光是第一個全連接層(
1×1 卷積與 Inception 模組
1×1 卷積(1×1 convolution)看似只是把每個像素乘上一個常數,但濾波器的深度等於輸入的通道數,所以它其實是在每個像素位置上,對所有通道做加權組合,相當於「逐像素的全連接層」。它最主要的用途是調整通道數,例如把 28×28×192 壓縮成 28×28×16,同時多加一層非線性。
Inception 模組(Inception module)把 1×1、3×3、5×5 卷積與 3×3 最大池化平行排列,全部使用 same 填補以保持高寬一致,再沿深度方向串接(concatenate)輸出,讓網路自己學習哪一種尺度的特徵有用。為了避免 5×5 卷積的計算量過大,會先用 1×1 卷積作為瓶頸層(bottleneck layer)降低通道數。以 28×28×192 的輸入、產生 32 個通道的 5×5 卷積為例(
| 做法 | 乘法次數 | 約 |
|---|---|---|
| 直接 5×5 卷積(192 → 32) | 1.2 億 | |
| 先 1×1 卷積(192 → 16) | 240 萬 | |
| 再 5×5 卷積(16 → 32) | 1,000 萬 |
加入瓶頸層後合計約 1,240 萬次乘法,約為原本的十分之一,而且實驗上幾乎不影響表現。
10.4計算範例A Worked Example
以一個小型 CNN 為例,輸入為 32×32×3 的彩色影像,輸出 3 個類別。下表列出每一層的輸出形狀、激勵值數量與參數量:
| 層 | 輸出形狀 | 激勵值 | 參數量 |
|---|---|---|---|
| 輸入 | 32×32×3 | 3,072 | 0 |
| 卷積 5×5, |
28×28×6 | 4,704 | |
| 最大池化 2×2, |
14×14×6 | 1,176 | 0 |
| 全連接 64 | 64 | 64 | |
| 全連接 32 | 32 | 32 | |
| Softmax 3 | 3 | 3 |
逐層的計算如下:
- 卷積層:不填補(valid),輸出邊長為
;6 個濾波器使深度變成 6。每個濾波器有 個權重加 1 個偏差,共 76 個參數,6 個濾波器合計 456 個。 - 池化層:輸出邊長為
,深度維持 6,沒有參數。 - 第一個全連接層:先把 14×14×6 攤平成 1,176 維的向量,連接到 64 個單元,權重
個,加上 64 個偏差,共 75,328 個。 - 其餘全連接層:64 → 32 有
個參數;32 → 3 的 softmax 輸出層有 個。
全部參數合計
10.5經典架構Classic Architectures
CNN 架構的演進,很大程度是由 ImageNet 大規模視覺辨識挑戰賽(ILSVRC)推動的。下表整理幾個里程碑:
| 年份 | 架構 | 重點 |
|---|---|---|
| 1998 | LeNet-5 | 約 6 萬個參數;5×5 卷積搭配平均池化,用於手寫數字辨識 |
| 2012 | AlexNet | 約 6,000 萬個參數;8 層(5 層卷積 + 3 層全連接);ReLU、dropout、局部響應正規化(LRN);拆在 2 張 GPU 上訓練 |
| 2014 | VGG-16/19 | 約 1.38 億個參數(VGG-16);只用 3×3 same 卷積與 2×2 最大池化;以 4 張 GPU 訓練 2–3 週 |
| 2014 | GoogLeNet | 22 層;Inception 模組;以全域平均池化取代大型全連接層,參數僅約 500 萬–700 萬 |
| 2015 | ResNet | 殘差連接 |
AlexNet 與 VGG
AlexNet 在 2012 年大幅領先傳統方法,讓深度學習在電腦視覺領域受到全面關注。它的許多設計後來成為標準做法:以 ReLU 取代 sigmoid/tanh 加快訓練,以 dropout 抑制全連接層的過擬合(見第 9 章)。局部響應正規化則在之後的研究中被發現幫助有限,已少有人使用。
VGG 的設計哲學是「簡單而一致」:所有卷積都是 3×3、步幅 1、same 填補,每經過一次 2×2 最大池化就把高寬減半、通道數加倍。兩層 3×3 卷積的感受野等於一層 5×5,三層等於一層 7×7,但參數更少、非線性更多。名稱中的 16 與 19 指的是有權重的層數,包含末端的 3 層全連接層。VGG 的代價是龐大:前向傳播一張影像約產生 2,400 萬個激勵值,以 32 位元浮點數(4 bytes)計算約 96 MB,反向傳播還要再多約一倍。
GoogLeNet 與 ResNet
GoogLeNet 由多個 Inception 模組堆疊而成,雖有 22 層,參數卻遠少於 AlexNet。關鍵在於大量使用 1×1 瓶頸層,以及在最後以全域平均池化取代大型全連接層,只保留一層線性分類層。
ResNet 處理的是另一個問題:網路加深到一定程度後,連訓練集誤差都會上升。這不是過擬合,而是最佳化變得困難。殘差區塊(residual block)讓一組層學習的不是目標映射
這條跳躍連接(skip connection)帶來兩個好處:若恆等映射已經足夠好,網路只需要把
10.6物件偵測Object Detection
分類、定位與偵測
電腦視覺中有三個難度遞增的任務:
- 影像分類(image classification):判斷影像中是什麼,例如「這是一輛車」。
- 分類與定位(classification with localization):除了類別,還要用一個邊界框(bounding box)標出單一主要物體的位置。
- 物件偵測(object detection):影像中可能有多個、不同類別的物體,要全部找出並各自框出。
邊界框通常以中心座標
其中
特徵點偵測
特徵點偵測(landmark detection)把同樣的想法推廣:讓網路直接輸出若干個關鍵點的座標
滑動視窗與其卷積實作
最直觀的偵測方法是滑動視窗(sliding windows):先訓練一個能判斷「裁切後的小影像是不是車輛」的分類器,再用不同大小的視窗、以某個步幅滑過整張影像,逐一分類。問題在於計算成本:步幅小時視窗數量龐大,每個視窗都要跑一次 CNN;步幅大又會讓定位變得粗糙。
解法是把全連接層改寫成卷積層。一個作用在 5×5×16 特徵圖上、有 400 個單元的全連接層,等價於 400 個 5×5×16 的濾波器,輸出 1×1×400;之後的全連接層則等價於 1×1 卷積。改寫後,網路不再限制輸入尺寸。下表是一個在 14×14×3 視窗上訓練的網路,直接輸入 16×16×3 影像時的結果:
| 層 | 14×14×3 輸入 | 16×16×3 輸入 |
|---|---|---|
| 卷積 5×5,16 個濾波器 | 10×10×16 | 12×12×16 |
| 最大池化 2×2, |
5×5×16 | 6×6×16 |
| FC 400 → 5×5 卷積,400 個 | 1×1×400 | 2×2×400 |
| FC 400 → 1×1 卷積,400 個 | 1×1×400 | 2×2×400 |
| Softmax 4 → 1×1 卷積,4 個 | 1×1×4 | 2×2×4 |
輸出的 2×2 中每一格,恰好對應一個 14×14 視窗的分類結果(視窗步幅為 2,等於池化步幅)。四個視窗重疊部分的計算只做一次,這就是滑動視窗的卷積實作(OverFeat, Sermanet et al., 2014)。不過,邊界框的位置與大小仍受限於視窗的格點與尺寸,不夠精確。
YOLO
YOLO(You Only Look Once;Redmon et al.,CVPR 2016,arXiv 2015)把偵測視為一次前向傳播就完成的迴歸問題:
- 將影像切成
的網格(grid)。 - 每個物體只指派給「中心點所在的格子」負責。
- 每個格子同時預測邊界框(含
與座標)與類別機率,所有格子的結果在同一次前向傳播中算出。
座標是相對於格子定義的:
錨框
如果每個格子只輸出一組預測,就無法處理兩個中心點落在同一格的物體,例如站在車子前方的行人。錨框(anchor box)預先定義幾種不同形狀的參考框,例如瘦高的、扁寬的,每個格子對每一個錨框各輸出一組預測。訓練時,每個物體指派給「中心點所在的格子」與「形狀和它的 IoU 最高的錨框」這一組。
使用
YOLO 的完整推論流程是:前向傳播得到所有格子、所有錨框的預測 → 以
10.7交併比與非極大值抑制IoU and Non-Max Suppression
交併比
交併比(Intersection over Union, IoU)衡量兩個邊界框的重疊程度,定義為交集面積除以聯集面積:
IoU 介於 0(完全不重疊)與 1(完全重合)之間。在偵測中它有三個用途:評估預測框是否正確(IoU ≥ 0.5 常被視為「定位正確」,需要更精確時可提高門檻)、在非極大值抑制中判斷兩個框是否指向同一個物體,以及在訓練時把物體指派給錨框。常見的評估指標平均精確率均值(mean Average Precision, mAP)也建立在 IoU 門檻之上。
以左上角與右下角座標表示邊界框時,計算方式如下。注意交集的寬高可能為負(兩框不重疊),要取 0:
def iou(box_a, box_b):
"""box = (x1, y1, x2, y2),分別為左上角與右下角座標。"""
x1 = max(box_a[0], box_b[0])
y1 = max(box_a[1], box_b[1])
x2 = min(box_a[2], box_b[2])
y2 = min(box_a[3], box_b[3])
inter = max(0, x2 - x1) * max(0, y2 - y1)
area_a = (box_a[2] - box_a[0]) * (box_a[3] - box_a[1])
area_b = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1])
return inter / (area_a + area_b - inter)
非極大值抑制
一個物體往往被好幾個相鄰的格子或錨框同時偵測到,產生多個高度重疊的框。非極大值抑制(non-max suppression, NMS)的作用是對每個物體只保留最有把握的那一個框。對每個類別分別執行:
- 捨棄分數低於門檻(例如 0.6)的框。
- 在剩下的框中,選出分數最高的一個,列為輸出。
- 移除所有與它的 IoU 大於或等於門檻(例如 0.5)的其他框,因為它們很可能框的是同一個物體。
- 重複步驟 2 與 3,直到沒有剩餘的框。
兩個門檻都是需要依應用調整的超參數:IoU 門檻設得太低,彼此靠近的不同物體可能被誤刪;設得太高,則同一物體會留下重複的框。
10.8兩階段偵測器Two-Stage Detectors: the R-CNN Family
YOLO 屬於單階段(one-stage)偵測器。另一條路線先提出「可能有物體」的候選區域(region proposals),再對每個區域做分類與邊界框修正,稱為兩階段(two-stage)偵測器。R-CNN 系列的演進,可以濃縮成三個步驟:先提出區域、再改成一次卷積處理所有區域,最後連區域提議也由網路端到端完成。
- R-CNN(Girshick et al.,CVPR 2014,arXiv 2013):以選擇性搜尋(selective search)演算法提出約 2,000 個候選區域,把每個區域縮放成固定大小,各自通過 CNN 擷取特徵,再用 SVM 分類並以迴歸修正邊界框。準確度大幅提升,但非常慢:每個區域都要跑一次完整的 CNN,重疊區域被重複計算。
- Fast R-CNN(Girshick,ICCV 2015):整張影像只卷積一次,得到共用的特徵圖;再把候選區域投影到特徵圖上,以 RoI 池化(RoI pooling)切成固定大小(例如 7×7),接上全連接層,同時輸出類別與邊界框修正,兩者可以一起訓練。此時的瓶頸只剩下候選區域仍由選擇性搜尋產生。
- Faster R-CNN(Ren et al.,NIPS 2015):加入區域提議網路(Region Proposal Network, RPN),與偵測網路共用卷積特徵,在特徵圖的每個位置以多個錨框預測「是否有物體」與框的修正量。區域提議本身也由網路學習,整個流程成為端到端(end-to-end)的模型。
| 方法 | 候選區域 | 卷積計算 | 核心改進 |
|---|---|---|---|
| R-CNN | 選擇性搜尋 | 每個區域各做一次 | 以 CNN 特徵分類候選區域 |
| Fast R-CNN | 選擇性搜尋 | 整張影像一次 | RoI 池化、共用特徵圖 |
| Faster R-CNN | RPN(網路學習) | 整張影像一次 | 端到端,含區域提議 |
一般而言,兩階段偵測器的準確度較高,尤其在小物體上;單階段偵測器速度快,適合即時應用。兩條路線後來互相借鏡(例如 YOLO 引入錨框),差距已明顯縮小。
10.9參考資料References
- Goodfellow, Bengio & Courville, Deep Learning, MIT Press, 2016,第 9 章 Convolutional Networks。
- Stanford CS231n, Convolutional Neural Networks for Visual Recognition(課程講義)。
- deeplearning.ai, Convolutional Neural Networks(Coursera 深度學習專項課程第四門課)。
- LeCun, Bottou, Bengio & Haffner, "Gradient-Based Learning Applied to Document Recognition", Proceedings of the IEEE, 1998。
- Krizhevsky, Sutskever & Hinton, "ImageNet Classification with Deep Convolutional Neural Networks", NIPS 2012。
- Simonyan & Zisserman, "Very Deep Convolutional Networks for Large-Scale Image Recognition", ICLR 2015。
- Lin, Chen & Yan, "Network in Network", ICLR 2014;Szegedy et al., "Going Deeper with Convolutions", CVPR 2015。
- He, Zhang, Ren & Sun, "Deep Residual Learning for Image Recognition", CVPR 2016。
- Sermanet et al., "OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks", ICLR 2014。
- Redmon, Divvala, Girshick & Farhadi, "You Only Look Once: Unified, Real-Time Object Detection", CVPR 2016;Redmon & Farhadi, "YOLO9000: Better, Faster, Stronger", CVPR 2017。
- Girshick et al., "Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation", CVPR 2014;Girshick, "Fast R-CNN", ICCV 2015;Ren, He, Girshick & Sun, "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks", NIPS 2015。