1. 程式人生 > >乾貨 | 目標檢測入門,看這篇就夠了(上)

乾貨 | 目標檢測入門,看這篇就夠了(上)

作者 | 李家丞( 同濟大學數學系本科在讀,現格靈深瞳演算法部實習生)

近年來,深度學習模型逐漸取代傳統機器視覺方法而成為目標檢測領域的主流演算法,本系列文章將回顧早期的經典工作,並對較新的趨勢做一個全景式的介紹,幫助讀者對這一領域建立基本的認識。(營長注:因本文篇幅較長,營長將其分為上、下兩部分。)

導言:目標檢測的任務表述

如何從影象中解析出可供計算機理解的資訊,是機器視覺的中心問題。深度學習模型由於其強大的表示能力,加之資料量的積累和計算力的進步,成為機器視覺的熱點研究方向。

那麼,如何理解一張圖片?根據後續任務的需要,有三個主要的層次。

影象理解的三個層次

一是分類(Classification)

,即是將影象結構化為某一類別的資訊,用事先確定好的類別(string)或例項ID來描述圖片。這一任務是最簡單、最基礎的影象理解任務,也是深度學習模型最先取得突破和實現大規模應用的任務。其中,ImageNet是最權威的評測集,每年的ILSVRC催生了大量的優秀深度網路結構,為其他任務提供了基礎。在應用領域,人臉、場景的識別等都可以歸為分類任務。

二是檢測(Detection)。分類任務關心整體,給出的是整張圖片的內容描述,而檢測則關注特定的物體目標,要求同時獲得這一目標的類別資訊和位置資訊。相比分類,檢測給出的是對圖片前景和背景的理解,我們需要從背景中分離出感興趣的目標,並確定這一目標的描述(類別和位置),因而,檢測模型的輸出是一個列表,列表的每一項使用一個數據組給出檢出目標的類別和位置(常用矩形檢測框的座標表示)。

三是分割(Segmentation)。分割包括語義分割(semantic segmentation)和例項分割(instance segmentation),前者是對前背景分離的拓展,要求分離開具有不同語義的影象部分,而後者是檢測任務的拓展,要求描述出目標的輪廓(相比檢測框更為精細)。分割是對影象的畫素級描述,它賦予每個畫素類別(例項)意義,適用於理解要求較高的場景,如無人駕駛中對道路和非道路的分割。

本系列文章關注的領域是目標檢測,即影象理解的中層次。

目標檢測入門(一):目標檢測經典模型回顧

本文結構

兩階段(2-stage)檢測模型

兩階段模型因其對圖片的兩階段處理得名,也稱為基於區域(Region-based)的方法,我們選取R-CNN系列工作作為這一型別的代表。

R-CNN: R-CNN系列的開山之作

Rich feature hierarchies for accurate object detection and semantic segmentation

論文連結: 

https://arxiv.org/abs/1311.2524

本文的兩大貢獻:

1)CNN可用於基於區域的定位和分割物體;

2)監督訓練樣本數緊缺時,在額外的資料上預訓練的模型經過fine-tuning可以取得很好的效果。

第一個貢獻影響了之後幾乎所有2-stage方法,而第二個貢獻中用分類任務(Imagenet)中訓練好的模型作為基網路,在檢測問題上fine-tuning的做法也在之後的工作中一直沿用。

傳統的計算機視覺方法常用精心設計的手工特徵(如SIFT, HOG)描述影象,而深度學習的方法則倡導習得特徵,從影象分類任務的經驗來看,CNN網路自動習得的特徵取得的效果已經超出了手工設計的特徵。本篇在區域性區域應用卷積網路,以發揮卷積網路學習高質量特徵的能力。

R-CNN網路結構

R-CNN將檢測抽象為兩個過程,一是基於圖片提出若干可能包含物體的區域(即圖片的區域性裁剪,被稱為Region Proposal),文中使用的是Selective Search演算法;二是在提出的這些區域上運行當時表現最好的分類網路(AlexNet),得到每個區域內物體的類別。

另外,文章中的兩個做法值得注意。

IoU的計算

一是資料的準備。輸入CNN前,我們需要根據Ground Truth對提出的Region Proposal進行標記,這裡使用的指標是IoU(Intersection over Union,交併比)。IoU計算了兩個區域之交的面積跟它們之並的比,描述了兩個區域的重合程度。

文章中特別提到,IoU閾值的選擇對結果影響顯著,這裡要談兩個threshold,一個用來識別正樣本(如跟ground truth的IoU大於0.5),另一個用來標記負樣本(即背景類,如IoU小於0.1),而介於兩者之間的則為難例(Hard Negatives),若標為正類,則包含了過多的背景資訊,反之又包含了要檢測物體的特徵,因而這些Proposal便被忽略掉。

另一點是位置座標的迴歸(Bounding-Box Regression),這一過程是Region Proposal向Ground Truth調整,實現時加入了log/exp變換來使損失保持在合理的量級上,可以看做一種標準化(Normalization)操作。

小結

R-CNN的想法直接明瞭,即將檢測任務轉化為區域上的分類任務,是深度學習方法在檢測任務上的試水。模型本身存在的問題也很多,如需要訓練三個不同的模型(proposal, classification, regression)、重複計算過多導致的效能問題等。儘管如此,這篇論文的很多做法仍然廣泛地影響著檢測任務上的深度模型革命,後續的很多工作也都是針對改進這一工作而展開,此篇可以稱得上"The First Paper"。

Fast R-CNN: 共享卷積運算

Fast R-CNN

論文連結:

https://arxiv.org/abs/1504.08083

文章指出R-CNN耗時的原因是CNN是在每一個Proposal上單獨進行的,沒有共享計算,便提出將基礎網路在圖片整體上執行完畢後,再傳入R-CNN子網路,共享了大部分計算,故有Fast之名。

Fast R-CNN網路結構

上圖是Fast R-CNN的架構。圖片經過feature extractor得到feature map, 同時在原圖上執行Selective Search演算法並將RoI(Region of Interset,實為座標組,可與Region Proposal混用)對映到到feature map上,再對每個RoI進行RoI Pooling操作便得到等長的feature vector,將這些得到的feature vector進行正負樣本的整理(保持一定的正負樣本比例),分batch傳入並行的R-CNN子網路,同時進行分類和迴歸,並將兩者的損失統一起來。

RoI Pooling圖示,來源:https://blog.deepsense.ai/region-of-interest-pooling-explained/

RoI Pooling 是對輸入R-CNN子網路的資料進行準備的關鍵操作。我們得到的區域常常有不同的大小,在對映到feature map上之後,會得到不同大小的特徵張量。RoI Pooling先將RoI等分成目標個數的網格,再在每個網格上進行max pooling,就得到等長的RoI feature vector。

文章最後的討論也有一定的借鑑意義:

  • multi-loss traing相比單獨訓練classification確有提升

  • multi-scale相比single-scale精度略有提升,但帶來的時間開銷更大。一定程度上說明CNN結構可以內在地學習尺度不變性

  • 在更多的資料(VOC)上訓練後,精度是有進一步提升的

  • Softmax分類器比"one vs rest"型的SVM表現略好,引入了類間的競爭

  • 更多的Proposal並不一定帶來精度的提升

小結

Fast R-CNN的這一結構正是檢測任務主流2-stage方法所採用的元結構的雛形。

文章將Proposal, Feature Extractor, Object Classification&Localization統一在一個整體的結構中,並通過共享卷積計算提高特徵利用效率,是最有貢獻的地方。

Faster R-CNN: 兩階段模型的深度化

Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks

論文連結:

https://arxiv.org/abs/1506.01497

Faster R-CNN是2-stage方法的奠基性工作,提出的RPN網路取代Selective Search演算法使得檢測任務可以由神經網路端到端地完成。粗略的講,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷積計算的特性使得RPN引入的計算量很小,使得Faster R-CNN可以在單個GPU上以5fps的速度執行,而在精度方面達到SOTA(State of the Art,當前最佳)。

本文的主要貢獻是提出Regional Proposal Networks,替代之前的SS演算法。RPN網路將Proposal這一任務建模為二分類(是否為物體)的問題。

Faster R-CNN網路結構

第一步是在一個滑動視窗上生成不同大小和長寬比例的anchor box(如上圖右邊部分),取定IoU的閾值,按Ground Truth標定這些anchor box的正負。於是,傳入RPN網路的樣本資料被整理為anchor box(座標)和每個anchor box是否有物體(二分類標籤)。

RPN網路將每個樣本對映為一個概率值和四個座標值,概率值反應這個anchor box有物體的概率,四個座標值用於迴歸定義物體的位置。最後將二分類和座標迴歸的損失統一起來,作為RPN網路的目標訓練。

由RPN得到Region Proposal在根據概率值篩選後經過類似的標記過程,被傳入R-CNN子網路,進行多分類和座標迴歸,同樣用多工損失將二者的損失聯合。

小結

Faster R-CNN的成功之處在於用RPN網路完成了檢測任務的"深度化"。使用滑動視窗生成anchor box的思想也在後來的工作中越來越多地被採用(YOLO v2等)。這項工作奠定了"RPN+RCNN"的兩階段方法元結構,影響了大部分後續工作。

單階段(1-stage)檢測模型

單階段模型沒有中間的區域檢出過程,直接從圖片獲得預測結果,也被成為Region-free方法。

YOLO

You Only Look Once: Unified, Real-Time Object Detection

論文連結:

https://arxiv.org/abs/1506.02640

YOLO是單階段方法的開山之作。它將檢測任務表述成一個統一的、端到端的迴歸問題,並且以只處理一次圖片同時得到位置和分類而得名。

YOLO的主要優點:

  • 快。

  • 全域性處理使得背景錯誤相對少,相比基於區域性(區域)的方法, 如Fast RCNN。

  • 泛化效能好,在藝術作品上做檢測時,YOLO表現比Fast R-CNN好。

YOLO網路結構

YOLO的工作流程如下:

1.準備資料:將圖片縮放,劃分為等分的網格,每個網格按跟Ground Truth的IoU分配到所要預測的樣本。

2.卷積網路:由GoogLeNet更改而來,每個網格對每個類別預測一個條件概率值,並在網格基礎上生成B個box,每個box預測五個迴歸值,四個表徵位置,第五個表徵這個box含有物體(注意不是某一類物體)的概率和位置的準確程度(由IoU表示)。測試時,分數如下計算:

相關推薦

乾貨 | 目標檢測入門

作者 | 李家丞( 同濟大學數學系本科在讀,現格靈深瞳演算法部實習生)近年來,深度學習模型逐漸取

Python 3 入門

簡介 Python 是一種高層次的結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。Python 由 Guido van Rossum 於 1989 年底在荷蘭國家數學和電腦科學研究所發明,第一個公開發行版發行於 1991 年。 特點 易於學習:Pyt

Docker 入門

Docker是怎麼出現的 關於Docker的發展史,本文就不做介紹,有興趣的小夥伴們可以檢視這篇文章,挺有意思的。http://www.oschina.net/news/57838/docker-dotcloud 什麼是Docker? 在Docker

ES6入門

## ES6從入門到放棄 1.ES6是什麼,黑歷史,不講,自己百度去。 2.在瀏覽器中如何使用? ​1.babel babeljs.io線上編譯 ​2.traceur-----Google出的編譯器,把ES6編譯成ES5 ​traceur 編譯 ​bootsrap 載入程式

Lambda 表示式入門

說出來怕你們不相信,剛接到物業通知,疫情防控升級了,車輛只能出不能進,每戶家庭每天可指派 1 名成員上街採購生活用品。這不是謠言,截個圖自證清白,出自洛陽市湖北路街道處。 看來事態嚴峻,這樣看似好心,但不一定辦好事,去超時搶購的人會更多。不管了,只能窩在家做持久戰了。趁這段時間,多分享一些原創文章給你們—

搞定計算機網路面試補充版

相對與上一個版本的計算機網路面試知識總結,這個版本增加了 “TCP協議如何保證可靠傳輸”包括超時重傳、停止等待協議、滑動視窗、流量控制、擁塞控制等內容並且對一些已有內容做了補充。 一 OSI與TCP/IP各層的結構與功能,都有哪些協議 五層協議的體系

入門Webpack

ref ebp shu 走了 pack webp body 入門 ble 原文地址:https://www.jianshu.com/p/42e11515c10f一直以前對webpack不是很了解,通過看了原文,自己動手走了一邊,算是對webpack有了個入門。我把自己做了的

入門 Webpack

通過 位置 post 進行 參考 sets 想要 避免 pat 轉:https://segmentfault.com/a/1190000006178770 2018年8月25日更新,目前 webpack 已經更新值 4.17.1 ,本文所用到的各種庫或多或少有些過時,跟著代

webpack的入門實踐

# webpack的入門實踐 > 我會將所有的讀者概括為初學者,即使你可能有基礎,學習本節之前我希望你具有一定的JavaScript和node基礎 - 文中的 `... ...`代表省略掉部分程式碼,和上面的程式碼相同 - 文中的資料夾如果沒有說建立,並且專案預設沒有的是需要你手動增加的 - 不會特

學習Java JDBC

影響 數據庫中間件 project prepare 管理系 lba 分布 為我 vax JDBC (Java DB Connection)---Java數據庫連接 JDBC是一種可用於運行SQL語句的JAVA API(ApplicationProgramming

Map總結

java map 概要 學完了Map的全部內容,我們再回頭開開Map的框架圖。 第1部分 Map概括 (01) Map 是“鍵值對”映射的抽象接口。(02) AbstractMap 實現了Map中的絕大部分函數接口。它減少了“Map的實現類”的重復編碼。(03) SortedMap 有序的“鍵值對”映

Elasticsearch Query DSL 整理總結—— 要搞懂 Match Query

目錄 引言 構建示例 match operator 引數 analyzer lenient 引數 Fuzziness fuzzniess 引數 什麼是模糊搜尋? Levenshtein Edit Dist

Python Web怎麼學

Python目前應用領域實在太多,這也是他這麼火的原因吧。我認為目前Python作為應用領域來說幾個方向是值得肯定的:人工智慧、大資料分析、DevOps、Web、自動化測試、爬蟲。 在Python基礎方向,我認為必須掌握的技能有: 基本資料型別、內建資料結構 函式、高階函式、裝飾器 迭代器、

Python Web怎麽學

哪些 都是 這一 djang quest int 數據類型 簡單 dev Python目前應用領域實在太多,這也是他這麽火的原因吧。我認為目前Python作為應用領域來說幾個方向是值得肯定的:人工智能、大數據分析、DevOps、Web、自動化測試、爬蟲。 在Python基礎

繼萬字諫言後Python Web 怎麼學

  1. 之前那篇「萬字諫言,給那些想學Python的人,建議收藏後細看!」得到很多後臺讀者的留言,表示想再來點,甚至說萬字系?你知道萬字有多少麼?不要槓我根本沒有萬字!不叫萬字你能看到這篇良心嘛! 那憋了3天了,今天放個web好了,相信很多讀者都有關注web開發,那我們

Python 中的 orand 運算

問題出現: Python 中的 or,and 運算,可以寫出非常複雜的演算表示式; 看了一些大神的演算規則解釋,覺得不是很好理解,有些人甚至理解錯了規則。 這篇部落格聊一下自己的理解。 其他人是怎麼做的: 先看兩個例子熱下身: return 1 or 2 return

Python 中的 or and 運算

可能 參考答案 大神 cto 51cto 是不是 拆分 並且 情況 問題出現: Python 中的 or,and 運算,可以寫出非常復雜的演算表達式; 看了一些大神的演算規則解釋,覺得不是很好理解,有些人甚至理解錯了規則。 這裏聊一下自己的理解。 其他人是怎麽做的:

10大經典排序演算法動圖演示配相應程式碼

排序演算法是《資料結構與演算法》中最基本的演算法之一。 排序演算法可以分為內部排序和外部排序。 內部排序是資料記錄在記憶體中進行排序。 而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排

Java 動態代理

這篇文章需要用到 Java 的反射知識,如果對反射還不清楚的小夥伴,可以先移步到這裡 《Java進階-反射》。 程式設計思想都是來自於生活的,“代理” 在生活中很常見。比如我們買一個東西時,一般都不會是直接從工廠裡買的,而是去商店或者其他的商家買,這些商家做的事情就是代理。

mybatis 快取的使用

快取的重要性是不言而喻的。 使用快取, 我們可以避免頻繁的與資料庫進行互動, 尤其是在查詢越多、快取命中率越高的情況下, 使用快取對效能的提高更明顯。 mybatis 也提供了對快取的支援, 分為一級快取和二級快取。 但是在預設的情況下, 只開啟一級快取(一級快