
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
換句話說,首先,我們給出一些建議區域,然后,從中提取出特征,之后,再根據這些特征來對這些區域進行分類。本質而言,我們將目標檢測轉化成了圖像分類問題。R-CNN 模型雖然非常直觀,但是速度很慢。
直接承接 R-CNN 的是 Fast R-CNN。Fast R-CNN 在很多方面與 R-CNN 類似,但是,憑借兩項主要的增強手段,其檢測速度較 R-CNN 有所提高:
Fast?R-CNN?模型結構示意圖:
如圖所見,現在我們基于網絡最后的特征圖(而非原始圖像)創建了 region proposals。因此,我們對整幅圖只用訓練一個 CNN 就可以了。
此外,我們使用了一個 softmax 層來直接輸出類(class)的概率,而不是像之前一樣訓練很多不同的 SVM 去對每個目標類(object class)進行分類。現在,我們只用訓練一個神經網絡,而之前我們需要訓練一個神經網絡以及很多 SVM。
就速度而言,Fast R-CNN 提升了許多。
然而,存在一大未解決的瓶頸:用于生成 region proposal 的選擇搜索算法(selective search algorithm)。
到現在為止,我們完成了對?Faster?R-CNN?兩大早期模型的溯源。下面我們開始研究?Faster?R-CNN。Faster?R-CNN?的主要創新是,它用一個快速神經網絡代替了之前慢速的選擇搜索算法(selective?search?algorithm)。具體而言,它引入了一個?region?proposal?網絡(RPN)。
RPN 工作原理:
換句話說,我們會觀察我們最后特征圖上的每個位置,然后關注圍繞它的?k?個不同的?anchor?box:一個高的框、一個寬的框、一個大的框等等。對于每個這些框,不管我們是否認為它包含一個目標,以及不管這個框里的坐標是什么,我們都會進行輸出。下圖展示了在單個滑動框位置上發生的操作:
圖中 2k 分數代表了 k 中每一個邊界框正好覆蓋「目標」的 softmax 概率。這里注意到,盡管 RPN 輸出了邊界框的坐標,然而它并不會去對任何可能的目標進行分類:它惟一的工作仍然是給出對象區域。如果一個 anchor box 在特定閾值之上存在一個「objectness」分數,那么這個邊界框的坐標就會作為一個 region proposal 被向前傳遞。
一旦我們有了?region?proposal,我們就直接把他們輸入一個本質上是?Fast?R-CNN?的模型。我們再添加一個池化層、一些全連接層以及最后,一個?softmax?分類層和邊界框回歸器(bounding?box?regressor)。所以在某種意義上,Faster?R-CNN=RPN+Fast?R-CNN。
總體而言,Faster?R-CNN?較?Fast?R-CNN?在速度上有了大幅提升,而且其精確性也達到了最尖端的水平。值得一提的是,盡管未來的模型能夠在檢測速度上有所提升,但是幾乎沒有模型的表現能顯著超越?Faster?R-CNN。換句話說,Faster?R-CNN?也許不是目標檢測最簡單、最快的方法,但是其表現還是目前最佳的。例如,Tensorflow?應用?Inception?ResNet?打造的?Faster?R-CNN?就是他們速度最慢,但卻最精準的模型。
也許 Faster R-CNN 看起來可能會非常復雜,但是它的核心設計還是與最初的 R-CNN 一致:先假設對象區域,然后對其進行分類。目前,這是很多目標檢測模型使用的主要思路,包括我們接下來將要提到的這個模型。
還記得?Fast?R-CNN?是如何通過在所有?region?proposal?上共享同一個?CNN,來改善檢測速度的嗎?這也是設計?R-FCN?的一個動機:通過最大化共享計算來提升速度。
R-FCN,或稱 Region-based Fully Convolutional Net(基于區域的全卷積網絡),可以在每個輸出之間完全共享計算。作為全卷積網絡,它在模型設計過程中遇到了一個特殊的問題。
一方面,當對一個目標進行分類任務時,我們希望學到模型中的位置不變性(location invariance):無論這只貓出現在圖中的哪個位置,我們都想將它分類成一只貓。另一方面,當進行目標檢測任務時,我們希望學習到位置可變性(location variance):如果這只貓在左上角,那么我們希望在圖像左上角這個位置畫一個框。所以,問題出現了,如果想在網絡中 100% 共享卷積計算的話,我們應該如何在位置不變性(location invariance)和位置可變性(location variance)之間做出權衡呢?
R-FCN 的解決方案:位置敏感分數圖
每個位置敏感分數圖都代表了一個目標類(object class)的一個相關位置。例如,只要是在圖像右上角檢測到一只貓,就會激活一個分數圖(score map)。而當系統看見左下角出現一輛車時,另一個分數圖也將會被激活。本質上來講,這些分數圖都是卷積特征圖,它們被訓練來識別每個目標的特定部位。
以下是 R-FCN 的工作方式:
下面是?R-FCN?的示意圖,用?RPN?生成?RoI:
當然,即便有上述文字以及圖片的解釋,你可能仍然不太明白這個模型的工作方式。老實說,當你可以實際看到?R-FCN?的工作過程時,你會發現理解起來會更加簡單。下面就是一個在實踐中應用的?R-FCN,它正在從圖中檢測一個嬰兒:
我們只用簡單地讓 R-FCN 去處理每個 region proposal,然后將其切分成子區域,在子區域上反復詢問系統:「這看起來像是嬰兒的『上-左』部分嗎?」,「這看起來像是嬰兒的『上-中』部分嗎?」,「這看起來像是嬰兒的『上-右』部分嗎?」等等。系統會對所有類重復這個過程。如果有足夠的子區域表示「是的,我的確匹配嬰兒的這個部分!」那么 RoI 就會通過對所有類進行 softmax 回歸的方式被分類成一個嬰兒。」
借助這種設置,R-FCN 便能同時處理位置可變性(location variance)與位置不變性(location invariance)。它給出不同的目標區域來處理位置可變性,讓每個 region proposal 都參考同一個分數圖 score bank 來處理位置不變形。這些分數圖應該去學習將一只貓分類成貓,而不用管這只貓在在那個位置。最好的是,由于它是全卷積的,所以這意味著網絡中所有的計算都是共享的。
因此,R-FCN 比 Faster R-CNN 快了好幾倍,并且可以達到類似的準確率。
我們最后一個模型是?SSD,即?Single-Shot?Detector。和?R-FCN?一樣,它的速度比?Faster?R-CNN?要快很多,但其工作方式卻和?R-FCN?存在顯著不同。
我們前兩個模型分兩個步驟執行 region proposal 和 region classification。首先,它們使用一個 region proposal 網絡來生成感興趣區域(region of interest);然后,它們既可以用全連接層也可以用位置敏感卷積層來對那些區域進行分類。然而,SSD 可以在單個步驟中完成上述兩個步驟,并且在處理圖像的同時預測邊界框和類。
具體而言,給定一個輸入圖像以及一系列真值標簽,SSD 就會進行如下操作:
SSD 的工作方式聽上去很直接,但是訓練它卻會面臨一個不一般的挑戰。在之前那兩個模型那里,region proposal 網絡可以確保每個我們嘗試進行分類的對象都會有一個作為「目標」的最小概率值。然而,在 SSD 這里,我們跳過了這個篩選步驟。我們從圖像中每個單一位置那里進行分類并畫出形狀、大小不同的邊界框。通過這種辦法,我們可以生成比別的模型更多的邊界框,但是它們基本上全是負面樣本。
為了解決這個問題,SSD 進行了兩項處理。首先,它使用非極大值抑制(non maximum suppression,NMS)技術來將高度重疊的邊界框整合成一個。換句話說,如果有 4 個形狀、尺寸等類似的邊界框中有同一只狗,那么 NMS 就會保留信度最高的那個邊界框而拋棄掉其它的。第二,SSD 模型使用了一種被稱為 hard negative mining 的技術以在訓練過程中讓類保持平衡。在 hard negative mining 中,只有那些有最高訓練損失(training loss)的負面樣本(negative example)子集才會在每次訓練迭代中被使用。SSD 的「正負」比一直保持在 1:3。
下圖是?SSD?的架構示意圖:
如上所述,最終有可縮小尺寸的「額外特征層」。這些尺寸變化的特征圖有助于捕捉不同大小的目標。例如,下面是一個正在執行的?SSD。
在更小的特征圖中(比如 4×4),每一單元覆蓋圖像的一個更大區域,使其探測更大的目標。region proposal 與分類同時被執行:假設 p 為目標類別,每個邊界框與一個 (4+p)-維度向量相連接,其輸出 4 個框偏移坐標和 p 分類概率。在最后一步中,softmax 又一次被用來分類目標。
最終,SSD 與最初的兩個模型并無不同。它簡單跳過「region proposal」這一步,而不是同時考慮圖像每個位置的每個邊界及其分類。由于 SSD 一次性完成所有,它是三個模型中最快的,且相對而言依然表現出色。
Faster?R-CNN、R-FCN?和?SSD?是三種目前最優且應用最廣泛的目標檢測模型。其他流行的模型通常與這三者類似,都依賴于深度?CNN(如?ResNet、Inception?等)來進行網絡初始化,且大部分遵循同樣的?proposal/分類?pipeline。
但是,使用這些模型需要了解?Tensorflow?的?API。Tensorflow?有一份使用這些模型的初學者教程。
文章轉自微信公眾號@機器之心