一文讀懂深度學習框架下的目標檢測(附數據集)

從簡單的圖像分類到3D位置估算,在機器視覺領域里從來都不乏有趣的問題。其中我們最感興趣的問題之一就是目標檢測


如同其他的機器視覺問題一樣,目標檢測目前為止還沒有公認最好的解決方法。在了解目標檢測之前,讓我們先快速地了解一下這個領域里普遍存在的一些問題。


目標檢測?vs 其他計算機視覺問題圖像分類


在計算機視覺領域中,最為人所知的問題便是圖像分類問題。


圖像分類是把一幅圖片分成多種類別中的一類。?


ImageNet是在學術界使用的最受歡迎的數據集之一,它由數百萬個已分類圖像組成,部分數據用于ImageNet大規模視覺識別挑戰賽(ILSVRC)。 最近幾年來,解決分類問題的模型已經有了超越人類的識別能力,所以分類問題實際上已經被解決了。


然而,圖像分類問題有許多挑戰,相伴隨著的是許多如何解決這些問題的文獻以及對還未被解決的問題的探討。?


35aec72ca2125d7cd47ccbe03a42bb2bfe2897e6圖像分類實例


1. 目標定位


同圖像分類類似,目標定位要找到單個目標在圖像中的位置。


e9691b7c1f4bbf823231d166e629eb9334a6c79f目標定位實例


目標定位在實際生活中的應用很廣泛,比如,智能剪切(通過定位目標所在的位置,識別需要圖片從哪里剪切) ,或者進行常規的目標提取以便進一步處理。結合圖像分類技術,它不僅僅可以定位目標,還能對該物體分類。


2. 實例分割


從目標檢測更進一步,我們不僅僅要找到圖片中的對象,更是要發現該檢測對象對應的像素碼。我們把這個問題稱為實例分割,或者是對象分割。


3. 目標檢測


在迭代處理定位和圖片分類問題時,我們最終還是需要對多個目標進行同時檢測和分類。目標檢測是在圖片中對可變數量的目標進行查找和分類。其中重要的區別是“可變”這一部分。


和圖像分類問題不同的是,由于每一張圖片待檢測目標的數量不一,目標檢測的輸出長度是可變的。在這篇文章中,我們將詳細地介紹一些實際應用,討論目標檢測作為機器學習問題的主要困難,以及在過去的幾年里如何應用深度學習處理目標檢測。


f79c5da3dfc2199f48f5406e32162c685595b4f4目標檢測實例


實際案例


在Tryolabs 中,我們專注于使用現有的機器學習方法解決商務問題,所以即使我們熱衷于機器學習的科研問題,但最終我們還是要回歸實際應用中。


雖然目標檢測從某種程度上在工業界還是一個很新的工具,但它已經有了很多實用和有趣的應用。


1. 人臉檢測


自20世紀中期以來,傻瓜相機開始通過更為高效的自動對焦來檢測人面。 雖然這是一種比較淺顯的目標檢測應用,但是這種方法同樣適用于其他類型的目標檢測,我們稍后將會介紹。


2. 計數


計數是一個簡單但是經常被忽略的目標檢測問題。統計人,車,花甚至是微生物數量是現實世界的需求,在大部分基于圖像的系統中都要使用。近幾年伴隨著監控視頻設備的不斷涌現,使用機器視覺將原圖像轉化為結構化數據的需求也越來越多。


3. 視覺搜索引擎


最后,我們比較喜歡的一個實例是Pinterest(圖片社交平臺)的視覺搜索引擎。?


他們將目標檢測作為索引圖像內容的處理流程之一。比如,你可以在不同的背景下找到某個特定的錢包。 這比Google Image的反向搜索引擎只是找到類似的圖像更強大。

a49b4468b72c9de0a04d642bec2954dc31cdd8e7相似查找:我們應用目標檢測方法定位包或鞋子這些產品。在這張圖片中, 用戶可以點擊圖片中的目標對象便可以查找類似的產品


4. 空中影像分析


在這個廉價無人機和衛星興起的年代,我們能在空中獲取空前多的關于地球的數據。 如今已經有越來越多的公司開始使用planet 或者descartes labs 公司提供的衛星圖片,應用目標檢測來計算汽車,樹,船的數量。這些舉措都為我們帶來了高質量的數據,這在從前是不可能實現的。


一些公司正在應用無人機攝像對人難以到達的地方進行自動監測(例如BetterView)或者使用物體檢測方法進行整體分析(例如TensorFlight)。 除此之外,一些公司實現了不需人為干預下的場景自動檢測和位置識別。


0e61416e7d8c3cd3947016f04c82f119b17a4be7使用TensorFlight實現汽車、樹和行人的識別


目標檢測存在的問題和挑戰


現在,讓我們開始深入了解目標檢測中的主要問題。


1. 對象數量不確定


我們在前面提到過對象數量可變,但是并沒有解釋為什么是個問題。當訓練機器學習模型的時候,你經常需要把數據表示成固定長度的向量。如果在訓練之前圖片中的對象數量是未知的,模型的輸出數量也就是未知的了。因此,一些增加模型復雜性的預處理是必要的。


在傳統的方法中,輸出的數量可以使用滑動窗函數來計算,給不同位置產生一個固定大小的特征窗。在做完了預測之后,有些預測會被丟棄,有些會被合并到最終結果里面。


a98be4bd74256cd867fc6fe35470698cb44f727d

滑動窗示例


2. 對象大小不同


另外一個挑戰是處理不同大小對象的問題。面對一個簡單的分類問題,你期望是盡可能將覆蓋圖片大部分面積的對象進行分類。而在有些情境中,你想識別的對象可能只有幾十個像素點大小(或者說是原圖片中占比很小的一部分)。以往人們通過使用不同大小的滑動窗來解決這個問題,這種方法雖然簡單,卻效率低下。


3. 建模


第三個挑戰是同時解決目標定位和圖像分類這兩個問題。 我們如何將這兩種不同類型的需求組合到一個模型里呢?


在進入深度學習和如何應對這些挑戰之前,讓我們先快速了解一些經典的檢測方法。


檢測方法


1. 傳統方法


在這里我們將集中介紹其中兩個最流行且目前依然被廣泛使用的模型。


第一個是2001年由Paul Viola和Michael Jones在論文《Robust Real-time Object Detection》里提出 的Viola-Jones框架。這個方法快速且相對簡單,使得低處理能力的傻瓜相機得以進行實時的面部識別。


我們不打算深入介紹它是如何工作和訓練的,但是總體來說,該算法是通過使用哈爾特征(Haar features)生成許多(可能幾千個)簡單的二元分類器來實現的。這些分類器通過一個多尺度級聯滑動窗進行評估,一旦遇到錯誤的分類結果則提前結束。


另一個傳統方法是使用方向梯度直方圖(HOG)特征和支持向量機來分類。這個方法依然需要一個多尺度滑動窗,盡管它比Viola-Jones表現優異,但速度卻慢了很多。


2. 深度學習方法


在機器學習領域,深度學習一直是個大boss,尤其在計算機視覺方面。在圖像分類的任務上,深度學習已經徹底擊敗了其他的傳統模型。同樣,在目標檢測方面,深度學習也代表了目前的最先進水平。


讀到這里,你應該對我們面臨的挑戰和對解決它們的辦法有了一定的了解,接下來我們將概述一下在過去的幾年深度學習方法的發展歷程。


  • OverFeat


2013年由NYU(紐約大學) 提出的OverFeat 是最早將深度學習用于目標檢測的方法之一。他們提出了一個使用卷積神經網絡(CNNs)來處理多尺度滑窗的算法。


  • R-CNN


OverFeat提出后不久,加州大學伯克利分校的Ross Girshick及其同事就發表了Regins with CNN features,簡稱R-CNN的方法,該方法在物體識別挑戰中有50%的效果提升。


他們提出了目標檢測分三步走的方法:

  • 使用候選區域方法(最流行的一個是’Selective Search’)提取可能的物體

  • 使用CNN從每一個區域提取特征

  • 使用支持向量機(SVM)分類每一個區域


9c130adf289893017e761b0a14bb08fa89dcd965R-CNN架構

Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." 2014.


盡管R-CNN能達到很好的識別效果,但是它在訓練中有很多的問題。


為了訓練模型,你首先要對訓練數據集產生候選區域,然后把CNN特征提取應用于每一個區域(對于Pascal 2012數據集通常需要處理200GB的數據),最后再訓練支持向量機分類器。


  • Fast R-CNN


R-CNN被提出不久后,它又延伸出了一個完全使用深度學習的版本——就在一年后,Ross Girshick(目前在微軟研究中心)發表了Fast R-CNN。?


和R-CNN類似,Fast R-CNN依然采用Selective Search生成候選區域,但是和之前的分別提取出所有的候選區域然后使用支持向量機分類器不同,Fast R-CNN 在完整的圖片上使用CNN然后使用集中了特征映射的興趣區域(Region of Interest, RoI),以及前向傳播網絡進行分類和回歸。這個方法不僅更快,而且有Rol集中層和全連接層,使得模型從頭到尾可求導,更容易訓練。


Fast R-CNN最大的不足是,這個模型依然依賴Selective Search(或者其他的區域候選算法),當用該方法進行推論時,這塊就成了一個瓶頸。


415cfbaa612771d82dac1712df097da74da427b2Fast R-CNN

Girshick, Ross. "Fast R-CNN" 2015.


  • YOLO


在Fast R-CNN被提出過后不久,Joseph Redmon(與Girshick等人合著)發表了You Only Look Once:Unified, Real-Time Object Detection(YOLO)這篇論文。


YOLO提出了一個兼具準確性和速度性的簡單的卷積神經網絡,首次實現了實時物體檢測。


f8af046075df620f6f8892e5ea523c5ba0ef7f00YOLO架構


Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." 2016.


  • Faster R-CNN


接著,Shaoqing Ren(依然與Girshick合著,目前在Fackbook研究中心)發表了Faster R-CNN,這是R-CNN的第三次迭代。


Faster R-CNN添加了候選區域網絡(Region Proposal Network, RPN),試圖取消對Selective Search 算法的依賴,這使得模型可以完全實現端到端訓練。


我們暫時不會詳細深入地介紹RPNs的運行原理,但抽象地說,它基于一個叫“物體性”(objectness)的分數輸出對象。這些物體被用在Rol集中層和全連接層,從而實現分類的目標。

a2747bf6869576acd535c2eb863802f26b6c2be8Faster R-CNN架構


Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." 2015.


  • SSD和R-FCN


最后,還有兩篇論文不得不提:Single Shot Detector(SSD) 和 Region-based Fully Convolutional Networks(R-FCN)。 前者在YOLO的基礎上使用多尺寸的卷積特征圖使得在結果和速度上都有提升。后者基于Faster R-CNN的架構,但是只使用了卷積網絡。


數據集的重要性


在研究中,數據集扮演了十分重要的角色,其重要性經常被低估。每一次新的數據集發布,都會有論文被發表,新的模型在此基礎上進行比對和提升,把不可能變成可能。


很可惜,對于目標檢測,我們還沒有足夠的數據集。數據很難產生,而且成本很高,具備優秀數據庫的公司一般不愿意公開他們的數據,而學校則無法接觸到優質的數據集。


話雖如此,我們還是有一些不錯的公開數據可以使用,下面的列表就是目前可用的主要數據集。


Name

# Images (trainval)

# Classes

Last updated

ImageNet

450k

200

2015

COCO

120K

80

2014

Pascal VOC

12k

20

2012

Oxford-IIIT Pet

7K

37

2012

KITTI Vision

7K

3

2014


結論


最后,在目標檢測領域,還有很多未知的領域值得我們探索,不論是業界應用還是新型算法。盡管這篇文章只對目標檢測作了簡單的概述,我們依然希望它能幫助你初步了解目標檢測這一領域,并為你更進一步的學習打下基礎。



原文發布時間為:2017-09-29

本文作者:及子龍,張禮俊,余志文,錢天培

本文來自云棲社區合作伙伴“數據派THU”,了解相關信息可以關注“數據派THU”微信公眾號


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540508.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載] Python-Strings

參考鏈接: Python成員資格和身份運算符 | in, not in, is, is not Strings 介紹 String是Python中最常用的類型。僅僅用引號括起字符就可以創建string變量。字符串使用單引號或雙引號對Python來說是一樣的。 var1 Hello World! var2 "Pyth…

aes-128算法加密_加密算法問題-人工智能中的一種約束滿意問題

aes-128算法加密The Crypt-Arithmetic problem in Artificial Intelligence is a type of encryption problem in which the written message in an alphabetical form which is easily readable and understandable is converted into a numeric form which is neither easily…

讀書筆記《集體智慧編程》Chapter 2 : Make Recommendations

本章概要本章主要介紹了兩種協同過濾(Collaborative Filtering)算法,用于個性化推薦:基于用戶的協同過濾(User-Based Collaborative Filtering,又稱 K-Nearest Neighbor Collaborative Filtering&#xff0…

[轉載] python中的for循環對象和循環退出

參考鏈接: Python中循環 流程控制-if條件 判斷條件,1位true,0是flesh,成立時true,不成立flesh,not取反 if 1; print hello python print true not取反,匹配取反,表示取非1…

設計一個應用程序,以在C#中的按鈕單擊事件上在MessageBox中顯示TextBox中的文本...

Here, we took two controls on windows form that are TextBox and Button, named txtInput and btnShow respectively. We have to write C# code to display TextBox’s text in the MessageBox on Button Click. 在這里,我們在Windows窗體上使用了兩個控件&…

Oracle優化器:星型轉換(Star Query Transformation )

Oracle優化器:星型轉換(Star Query Transformation )Star query是一個事實表(fact table)和一些維度表(dimension)的join。每個維度表都跟事實表通過主外鍵join,且每個維度表之間不j…

[轉載] python循環中break、continue 、exit() 、pass的區別

參考鏈接: Python中的循環和控制語句(continue, break and pass) 1、break:跳出循環,不再執行 用在while和for循環中 用來終止循環語句,即循環條件沒有False條件或者序列還沒被完全遞歸完,也會停止執行循環語句 如果…

JavaScript | 聲明數組并使用數組索引分配元素的代碼

Declare an array, assign elements by indexes and print all elements in JavaScript. 聲明一個數組&#xff0c;通過索引分配元素&#xff0c;并打印JavaScript中的所有元素。 Code: 碼&#xff1a; <html><head><script>var fruits [];fruits[0]"…

[轉載] Python入門(輸入/輸出、數據類型、條件/循環語句)

參考鏈接&#xff1a; Python中的循環技術 在介紹之前我們先來看看計算機的三個根本性基礎&#xff1a; 1.計算機是執行輸入、運算、輸出的機器 2.程序是指令和數據的集合 3.計算機的處理方式有時與人們的思維習慣不同 &#xff08;以上是引自《計算機是怎樣跑起來的》…

第5章 函數與函數式編程

第5章 函數與函數式編程 凡此變數中函彼變數者&#xff0c;則此為彼之函數。 ( 李善蘭《代數學》) 函數式編程語言最重要的基礎是λ演算&#xff08;lambda calculus&#xff09;&#xff0c;而且λ演算的函數可以傳入函數參數&#xff0c;也可以返回一個函數。函數式編程 (簡稱…

mcq 隊列_人工智能能力問答中的人工智能概率推理(MCQ)

mcq 隊列1) Which of the following correctly defines the use of probabilistic reasoning in AI systems? In situations of uncertainty, probabilistic theory can help us give an estimate of how much an event is likely to occur or happen.It helps to find the pr…

[轉載] Python中的xrange和range的區別

參考鏈接&#xff1a; Python中的range()和xrange() 在python2 中 range(start,end,step)返回一個列表&#xff0c;返回的結果是可迭代對象&#xff0c;但不是迭代器。iter()轉化為列表迭代器。xrange()返回的是一個序列&#xff0c;他也是可迭代對象&#xff0c;但不是迭代…

Kubernetes基礎組件概述

本文講的是Kubernetes基礎組件概述【編者的話】最近總有同學問Kubernetes中的各個組件的相關問題&#xff0c;其實這些概念內容在官方文檔中都有&#xff0c;奈何我們有些同學可能英文不好&#xff0c;又或者懶得去看&#xff0c;又或者沒有找到&#xff0c;今天有時間就專門寫…

c語言將鏈表寫入二進制文件_通過逐級遍歷將二進制樹轉換為單鏈表的C程序

c語言將鏈表寫入二進制文件Problem statement: Write a C program to convert a binary tree into a single linked list by traversing level-wise. 問題陳述&#xff1a;編寫一個C程序&#xff0c;通過逐級遍歷將二進制樹轉換為單個鏈表 。 Example: 例&#xff1a; The ab…

[轉載] C Primer Plus 第6章 C控制語句 6.16 編程練習及答案

參考鏈接&#xff1a; 用Python打印金字塔圖案的程序 2019獨角獸企業重金招聘Python工程師標準>>> 1、編寫一個程序&#xff0c;創建一個具有26個元素的數組&#xff0c;并在其中存儲26個小寫字母。并讓該程序顯示該數組的內容。 #include int main (void) { …

C# String和string的區別

C#中同時存在String與string MSDN中對string的說明&#xff1a; string is an alias for String in the .NET Framework。string是String的別名而已&#xff0c;string是c#中的類&#xff0c;String是Framework的類&#xff0c;C# string 映射為 Framework的 String。如果用str…

要求用戶在Python中輸入整數| 限制用戶僅輸入整數值

input() function can be used for the input, but it reads the value as a string, then we can use the int() function to convert string value to an integer. input()函數可用于輸入&#xff0c;但它將值讀取為字符串&#xff0c;然后可以使用int()函數將字符串值轉換為…

[轉載] python——if語句、邏輯運算符號

參考鏈接&#xff1a; 用Python鏈接比較運算符 1.if條件判斷語句&#xff1a; if 要判斷的條件(True): 條件成立的時候&#xff0c;要做的事情 elif 要判斷的條件(True): .... elif 要判斷的條件(True): .... else: 條件不成立的時候要做的事情 示例&#xff1a; 判斷學生…

洛谷 P2689 東南西北【模擬/搜索】

題目描述 給出起點和終點的坐標及接下來T個時刻的風向(東南西北)&#xff0c;每次可以選擇順風偏移1個單位或者停在原地。求到達終點的最少時間。 如果無法偏移至終點&#xff0c;輸出“-1”。 輸入輸出格式 輸入格式&#xff1a; 第一行兩個正整數x1,y1&#xff0c;表示小明所…

單鏈表遍歷_單鏈表及其遍歷實現的基本操作

單鏈表遍歷單鏈表 (Single linked list) Single linked list contains a number of nodes where each node has a data field and a pointer to next node. The link of the last node is to NULL, indicates end of list. 單個鏈表包含許多節點&#xff0c;其中每個節點都有一…