在第 14.3 節到第 14.6 節中,我們介紹了邊界框、錨框、多尺度目標檢測和目標檢測數據集。現在我們準備使用這些背景知識來設計一個目標檢測模型:單次多框檢測(SSD)(Liu et al. , 2016)。該模型簡單、快速、應用廣泛。雖然這只是大量目標檢測模型中的一種,但本節中的一些設計原則和實現細節也適用于其他模型。
14.7.1。模型
圖 14.7.1提供了單次多框檢測設計的概述。該模型主要由一個基礎網絡和幾個多尺度特征圖塊組成。基礎網絡用于從輸入圖像中提取特征,因此可以使用深度 CNN。例如,原始的單次多框檢測論文采用在分類層之前截斷的VGG網絡 (Liu et al. , 2016),而 ResNet 也被普遍使用。通過我們的設計,我們可以讓基礎網絡輸出更大的特征圖,從而生成更多的錨框來檢測更小的物體。隨后,每個多尺度特征圖塊從前一個塊減少(例如,減半)特征圖的高度和寬度,并使特征圖的每個單元增加其在輸入圖像上的感受野。
回想一下14.5 節中深度神經網絡通過圖像的分層表示進行多尺度目標檢測的設計 。由于靠近圖 14.7.1頂部的多尺度特征圖較小但具有較大的感受野,因此它們適用于檢測較少但較大的對象。
簡而言之,通過其基礎網絡和多個多尺度特征圖塊,單次多框檢測生成不同數量的不同大小的錨框,并通過預測這些錨框的類別和偏移量(因此邊界盒);因此,這是一個多尺度目標檢測模型。
下面,我們將描述圖14.7.1中不同塊的實現細節。首先,我們討論如何實現類和邊界框預測。
14.7.1.1。類別預測層
讓對象類的數量為q. 然后anchor boxes有 q+1類,其中類 0 是背景。在某種程度上,假設特征圖的高度和寬度是h和w, 分別。什么時候a以這些特征圖的每個空間位置為中心生成anchor boxes,一共 hwaanchor boxes需要分類。由于參數化成本可能很高,這通常會使完全連接層的分類變得不可行。回想一下我們在8.3 節中如何使用卷積層的通道來預測類別。單次多框檢測使用相同的技術來降低模型的復雜性。
具體來說,類預測層使用卷積層而不改變特征圖的寬度或高度。這樣,在特征圖的相同空間維度(寬度和高度)下,輸出和輸入之間可以存在一一對應關系。更具體地說,輸出特征映射的通道在任何空間位置(x, y) 表示以 (x,y) 輸入特征圖。為了產生有效的預測,必須有a(q+1)輸出通道,其中對于相同的空間位置,具有索引的輸出通道i(q+1)+j 代表類別的預測j (0≤j≤q) 對于錨框i (0≤i).
下面我們定義這樣一個類預測層,指定a和 q分別通過參數num_anchors
和num_classes
。該層使用了3×3填充為1的卷積層。該卷積層的輸入和輸出的寬度和高度保持不變。
14.7.1.2。邊界框預測層
邊界框預測層的設計與類預測層的設計類似。唯一的區別在于每個錨框的輸出數量:這里我們需要預測四個偏移量而不是q+1類。
14.7.1.3。連接多個尺度的預測
正如我們提到的,單次多框檢測使用多尺度特征圖來生成錨框并預測它們的類別和偏移量。在不同的尺度下,特征圖的形狀或以同一單元為中心的錨框數量可能會有所不同。因此,不同尺度的預測輸出的形狀可能會有所不同。
在下面的例子中,我們構建了兩種不同比例的特征圖,Y1
并且Y2
,對于同一個小批量,其中 的高度和寬度Y2
是 的一半Y1
。讓我們以類別預測為例。Y1
假設分別為和中的每個單元生成 5 個和 3 個錨框Y2
。進一步假設對象類的數量為 10。對于特征圖Y1
和Y2
類預測輸出中的通道數為5×(10+1)=55 和3×(10+1)=33,其中任一輸出形狀為(批量大小、通道數、高度、寬度)。
(torch.Size([2, 55, 20, 20]), torch.Size([2, 33, 10, 10]))
def forward(x, block):
block.initialize()
return block(x)
Y1 = forward(np.zeros((2, 8, 20, 20)), cls_predictor(5, 10))
Y2 = forward(np.zeros((2, 16, 10, 10)), cls_predictor(3, 10))
Y1.shape, Y2
評論
查看更多