深度學習時代下的對象檢測 (Object Detection)

【寫在前面】
之前po了兩篇學習筆記吳恩達Coursera Deep Learning學習筆記 1 (上)吳恩達Coursera Deep Learning學習筆記 1 (下),感謝大家的支持與鼓勵。不過也有些非業內人士大哭看不太懂,所以打算弄點圈外人也能看懂的入門小文。最近看到一篇不錯的外文博客,找了一大圈發現國內貌似還沒有人翻譯過。我就當一回搬運工吧~原文地址~

本文僅供學習交流使用,侵權必刪,不用於商業目的,轉載須註明出處。

從簡單的圖像分類到三維姿勢預測 (3D-pose estimation),計算機視覺 (Computer Vision) 領域一直不缺乏有趣的問題,其中就包括對象/目標檢測 (Object Detection)。和許多其他的計算機視覺問題一樣,對象檢測仍然沒有一個顯而易見的最優方法,這意味着這個領域還有很多潛力。首先讓我們快速瞭解一下這個領域中最常見的問題。

對象檢測與其他計算機視覺問題

分類 (Classification)

分類問題是計算機視覺中最著名的問題,它是識別出圖像的類別,比如人、兔子、貓咪等等。在學術界使用的最流行的數據集之一是ImageNet,由數百萬個分類圖像組成,並在ImageNet大規模視覺識別挑戰 (ILSVRC) 的年度競賽中使用。近年來,分類模型的精確度已經超過了人類的肉眼,所以這個問題已算是基本解決了的。

圖像分類的例子(99%概率恐龍,1%的概率公雞)

定位 (Localization)

定位是在圖像中找到某個對象的位置,和分類有些類似。定位有很多實際應用。例如,智能裁剪 (Smart Cropping) ——基於對象所在的位置裁剪圖像,或者常規的對象提取之後再用其他方法做進一步處理。它可以與分類結合定位對象,然後將其分類爲多種可能的類別之一。

圖像定位的例子

實例/目標分割 (Instance/Object Segmentation)

實例分割不僅要在圖像中找到對象,而且要找到每個被檢測到的對象的像素掩碼。

對象檢測 (Object Detection)

定位和分類可以迭代起來,最終在一張圖片彙總對多個對象進行檢測和分類。對象檢測是在圖像上發現和分類一個變量的問題。對象檢測與定位、分類相比,重要的區別是這個“變量”。對象檢測的輸出長度是可變的,因爲檢測到的對象的數量會根據圖像的不同而變化。在本文中,我們將深入瞭解對象檢測的實際應用、作爲機器學習的對象檢測的主要問題是什麼、以及深度學習如何在這幾年裏解決這個問題。

對象檢測的例子(檢測到四個小恐龍寶寶)

對象檢測的實際運用

儘管對象檢測仍然是一個新工具,但是它已經有許多有用有趣的應用了——

人臉識別 (Face Detection)

自21世紀初以來,就出現了一些有人臉自動對焦功能的照相機。雖然這是一個較窄的對象檢測問題,但它的方法同樣適用於其他類型的對象,之後會詳述。

計數 (Counting)

計數是一個簡單但經常被忽略的對象檢測應用。現實中我們需要計算機具有計數人、汽車、花朵甚至是微生物的能力,並應用於不同類型的系統。隨着視頻監控設備的不斷涌現,利用計算機視覺將原始信息轉換成結構化數據的機會比以往任何時候都要多。

視覺搜索引擎 (Visual Search Engine)

一個很好的例子是Pinterest的視覺搜索引擎,它使用對象檢測構造數據通道從而對圖像不同部分建立索引。比如,當你搜索一個特定的錢包時,你可以找到不同情境下使用這個錢包的圖片。這比僅僅找到類似的圖像(如谷歌圖片的反向搜索引擎)要強大得多。

論文(Jing, Yushi, et al. "Visual Search at Pinterest.")中的Pinterest例子

航拍圖像分析 (Aerial Image Analysis)

在如今這個有着廉價無人機和(還算)廉價的衛星發射的時代,我們的世界擁有了前所未有之多的數據。現在已經有公司使用Planets和Descartes Labs等公司的衛星圖像,應用對象檢測來計算汽車、樹木和船隻的數量。這促使了從前不可能(或者非常昂貴)的高質量數據,現在有了普遍的應用。
一些公司使用無人機,自動探測難以到達的地方(BetterView),或者進行通用的對象檢測分析(TensorFlight)。還有一些公司在不需要人工干預的情況下,解決了對象檢測和定位的問題。

TensorFlight對汽車、樹木和行人檢測

對象檢測的困難與挑戰

這一部分,讓我們開始深入瞭解對象檢測的主要問題。

可變數量的對象 (Variable number of objects)

我們之前提到了關於對象數量可變的問題,但我們卻沒講它爲什麼是一個問題。在訓練機器學習模型時,通常需要將數據表示爲固定大小的向量。但是,由於圖片中對象的數量事先不知道,所以我們不知道正確的輸出維度。因此需要一些後期處理,這增加了模型的複雜性。
一般使用滑動窗口的方法來處理可變數量的對象,通過滑動固定大小的窗口,在所有的地方生成固定大小的特徵。在得到這些被過濾後的特徵之後,一些被丟棄,另一些被合併以生成最終的結果。
這裏有個滑動窗口的例子:滑動窗口的動圖

調整對象檢測窗口大小 (Resizing)

另一個巨大的挑戰是各種可能的對象大小,即在進行分類時,既希望佔圖片大部分的對象進行分類,又想要找到一些可能只有12個像素、或者是原始圖像一小部分的小對象。使用不同尺寸的滑動窗口可以解決這個問題,但效率很低。

建模

第三個挑戰是同時解決兩個問題——如何用一個簡單的模型解決兩種不同的需求,即定位和分類。


在瞭解深入學習如何應對這些挑戰之前,讓我們快速地回顧一下傳統的對象檢測方法。

傳統方法

儘管有很多不同類型的方法,我們關注兩個最流行並且仍然被廣泛使用的傳統方法。
第一個是由Paul Viola和Michael Jones在2001年的Robust Real-time Object Detection中提出的Viola-Jones框架。這種方法速度快且相對簡單,可以進行實時但粗略的人臉檢測,是在傻瓜相機中實現的一種算法。
我們不會詳細討論它是如何工作的或者其訓練過程。總的來說,它使用Haar特徵和上千個不同的簡單二分分類器。這些分類器採用逐級多尺度滑動窗口,並且極快地棄用不適用的分類器。
另一種類似的傳統方法是利用定向梯度 (Histogram of Oriented Gradients, HOG) 特徵和支持向量機 (Support Vector Machine, SVM) 進行分類。它仍然採用多尺度滑動窗口,和Viola-Jones框架相比,雖然這個方法表現更佳,但速度要慢得多。


深度學習方法

深度學習真正改變了機器學習的遊戲規則,尤其在計算機視覺領域。深度學習模型在圖像分類任務中碾壓了其他傳統方法。
現在大家可能對對象檢測的挑戰以及解決方法有了更好的直覺,接下來將概述在過去的幾年中深度學習方法是如何演變的。

OverFeat

第一個對象檢測的深度學習方法是2013年紐約大學發表的OverFeat。他們提出了一種使用卷積神經網絡的多尺度滑動窗口算法。

R-CNN (Regions with CNN features) 基於卷積神經網絡特徵的區域方法

加州大學伯克利分校 (UC Berkeley) 提出的R-CNN提高了對象檢測~50%,一個三階段的方法:
- 不同區域提出不同的提案,然後提取可能的對象(最常用的是選擇性搜索算法);
- 用CNN從區域提取特徵;
- 用SVM對區域進行分類。

R-CNN架構:Girshick, Ross, et al. "用於準確的目標檢測和語義分割的豐富特徵層次結構" 2014.

雖然它取得了很大的成績,但訓練R-CNN有很多問題。你必須爲訓練數據生成提案,再將CNN的特徵提取應用到每一個區域,最後訓練SVM分類器。

快速R-CNN (Fast R-CNN)

R-CNN很快就徹底升級成深度學習方法。一年後,Ross Girshick(現在在微軟)發表了快速R-CNN。和R-CNN相似,它使用選擇性搜索生成對象的提案。但是與R-CNN不同的是,R-CNN獨立地提取各區域的所有特徵,然後使用SVM分類器;Fast R-CNN在整個圖片上使用CNN,然後對特徵映射使用“興趣區域” (Region of Interest, RoI) 池化,最後使用前饋網絡進行分類和迴歸。這種方法不僅速度更快,而且具有RoI池化層和全連接層,這使模型具有端到端的可微性並且更容易訓練。Fast R-CNN最大的缺點是,模型仍然依賴於選擇性搜索(或其他區域方案算法),這使推斷成爲了它的瓶頸。

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

YOLO (You Only Look Once: Unified, Real-Time Object Detection) 只看一次:統一實時對象檢測

不久之後,Joseph Redmon發佈了統一實時對象檢測 (YOLO) 的論文。YOLO提出了一種簡單的卷積神經網絡方法,其結果和速度都很好,並且是第一次允許實時的對象檢測。

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

更快的R-CNN (Faster R-CNN)

隨後R-CNN系列迎來了第三次迭代:更快的R-CNN。它添加了區域提案網絡 (Region Proposal Network, RPN),擺脫了選擇性搜索算法,並可以做到端到端的訓練。RPNs的任務是基於objectness分數輸出對象,然後用RoI池化 (RoI Pooling) 和完全連接層分類。具體細節本文就先不涉及了。

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

SSD和R-FCN

最後,有兩篇著名的論文:單鏡頭探測器 (Single Shot Detector, SSD),它使用了YOLO和多尺寸的卷積功能地圖,達到了更好的結果和速度;以及基於區域的完全卷積網絡(Region-based Fully Convolutional Networks, R-FCN),它採用了Faster R-CNN結構中的卷積網絡部分。

數據的重要

正如我在對深度學習的一點看法中所寫的那樣,深度學習是非常依賴於海量的數據的。在對象檢測的研究中,數據同樣扮演着非常重要(有時卻被低估)的角色。每當一個新的數據集發佈後,就會有雨後春筍般的論文發佈和新的模型或模型改進。不幸的是,並沒有那麼多的數據集用於對象檢測。公司可能不願意免費捐贈它們擁有的數據,而大學也沒有這麼多的資源。

一些用於對象檢測的數據集

結論

綜上所述,很多對象檢測的新方法和新應用推動了深度學習最前沿的科技發展。本文只是對象檢測的概述,希望能給大家帶來一些新鮮有用的知識。
鄙人不是專業的翻譯官,很多地方可能翻譯得不夠信達雅,希望看官見諒。謝謝支持!



作者:數據女俠
鏈接:https://www.jianshu.com/p/e6f97a13dc86
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章