Fast R-CNN
Fast R-CNN(Girshick,2015)是對 R-CNN 那致命冗餘的直接修正,建立在一個優雅的重新排序上:先對整張影像跑一次 CNN,再從那張共享特徵圖中為每個提議萃取特徵——而不是對每個裁切出來的提議各自跑一次 CNN。由於成千上萬的提議彼此重疊,共享卷積幾乎消除了所有重複工作,把推論從每張約 47 秒砍到約 0.3 秒,同時還提升了準確度。
讓特徵共享得以運作的機制是 RoI 池化(RoI pooling)。提議活在影像座標中,但特徵圖較小(被網路步幅下採樣)。RoI 池化把每個提議投影到特徵圖上,把該區域切成固定格網(例如 7×7),並在每個格內做最大池化,從而產生固定大小的特徵(7×7×C),無論提議原本多大。這個固定大小的特徵接著可餵入全連接層——解決了 R-CNN 必須在物理上扭曲影像裁切塊的需求。
Fast R-CNN 還把訓練統一成單一網路、配上多任務損失。每個 RoI 的池化特徵送往兩個並列的頭:一個對(K 個類別 + 背景)的 softmax 分類器,與一個逐類別的邊界框回歸器。兩者以一個損失共同訓練,L = L_cls + λ·L_loc,其中 L_cls 是交叉熵,L_loc 是只施加在正樣本 RoI 之真實類別上的 smooth-L1 框回歸損失。這取代了 R-CNN 那笨拙的、分開訓練 SVM 與回歸器的管線,而 smooth-L1 損失也讓框回歸對離群值更穩健。
有一件事 Fast R-CNN 沒解決:它仍依賴一個外部、非學習的提議生成器(Selective Search),而既然其他一切都變快了,這現在反而主宰了執行時間。網路很快,但提議很慢——這個瓶頸由 Faster R-CNN 透過在同一個網路內學習提議來移除。
在骨幹步幅為 16 時,影像座標 (32,48,160,208) 的提議映射到特徵座標 (2,3,10,13);RoI 池化把那塊 8×10 的特徵區域切成 7×7 格網並對每格做最大池化 → 為各頭部產生固定的 7×7×C 向量。
RoI 池化會量化兩次(把 RoI 投影到整數特徵座標、再把格網對齊到整數),在 RoI 與其特徵之間引入次像素的錯位。這個誤差對框偵測尚可容忍,但對需要像素級精準的遮罩有害——這正是 RoIAlign 的動機。