BOT大賽計算機視覺賽題經驗分享:賽題詳解與思路分析

朱思穎發表於2017-01-20

歷時三個月的上海 BOT 大資料應用大賽完滿收官,其中「計算機視覺識別」子賽題吸引了來自世界各地的 100 支團隊參賽,賽後為了促進計算機視覺技術與創新應用交流與合作,BOT 大賽組委會聯合機器之心、清數 D-LAB,邀請大賽優勝團隊導師及成員,圍繞大賽解題思路和計算機視覺領域前沿技術及創新應用開展分享交流。


內容目錄:


Ⅰ 賽題解讀

Ⅱ 冠軍團隊指導教授王金橋:大資料時代的視覺智慧

Ⅲ 大唯團隊陶進:小樣本影象檢測深度學習演算法研究

Ⅳ DeeeeeeeeeepNet 團隊陳朝才:深度學習在目標檢測領域的應用

Ⅴ 現場精彩問答

<embed>

Ⅰ 賽題解讀


賽題好變態,這樣的賽題是怎麼來的?


BOT 大賽組委會賽題組組長尹相志:計算機視覺識別賽題的設計解讀


本次計算機識別初賽賽題的主題:基於機器視覺的認知情境理解 (CCRCV 2016, Congnitive Context Reasoning for Computer Vision)


賽題裡的每一個子賽題的設計其實都代表了我們在機器視覺領域裡的一次嘗試或者實驗。目前的機器視覺已經進入到深度學習階段,那麼機器視覺在當下人工智慧的實現過程中,有哪些需要過的「坎」?大賽組委會特意把這些坎找出來,融入到賽題的設計中。組委會希望通過這樣的方式,讓參賽的團隊聯手對付這些難坎並期待有新的突破。即使只有一點小小的推進,對於整個人工智慧來說都是很重要的突破。


具體到我們這次大賽的試題,我們的賽題來源於對現在機器視覺盲點的思考。雖然隨著深度學習技術的發展,單純的影象識別對於計算機來說已不是一件難事,甚至可以做得比人類更好,但前提是必須要給機器足夠的訓練圖片。然而這個訓練與人類的認知過程是背道而馳的,人類的小孩不會需要上萬張圖片才能夠理解什麼是狗,而且當他看到其他品種的狗,也許初期會叫錯,但是慢慢會理解狗這個物種的抽象特徵,進而理解狗——這一「概念」。因此未來不管是看到吉娃娃或是藏獒,都能認出這是「狗」。這正是現在機器視覺的盲點,人類可以對圖片進行理解,透過小資料去進行泛化的推論,而目前機器視覺則專注於如何從大量資料中抽取影象特徵,因此龐大的圖片標註以及計算力的考量成為現在計算機視覺識別商業應用落地的最大障礙。本次計算機視覺識別初賽與複賽分別從不同角度來考量這個問題。


1. 初賽題目設計


大資料和神經網路之下的機器視覺影象分類,在分類的實現方式上已經有了非常大的改進並且在識別的準確率上有很大的突破,但是我們認為目前的分類做法只是讓機器「識別」待分類物件,並不是「懂得」分類物件。即便今天機器認出了長頸鹿,但是長得像長頸鹿的其他物件並不在它的認知範圍內。所以對於這個「坎」,我們希望影象分類的做法能夠讓機器真正懂得分類物件,而不只是識別,比如看到了一個長頸鹿的皮毛或者是斑點就認為這是長頸鹿。


「我們在這次大賽的命題上,從一開始就有很清楚的規劃,我們希望參賽隊能做出的分類是基於認知場景的,是對待分類物件的真正認知和理解,而不只是單純的識別,這是我們在這次大賽賽題設計中的一個關鍵考慮點。」


如何透過認知解決無法窮舉的變體,用一個實體去推演其所有的衍生物。


我們今天看到一個「實實在在」的動物,我要知道哪些布娃娃,哪些雕塑,哪些繪畫,哪些抽象的形態都是來自於它,這個題目要求參賽選手要建立客觀存在的實體和與之相關的抽象形態之的連線,是一個理解並推論的過程。


初賽有 7 個隱藏題目這 7 個隱藏題目來自於我們機器視覺的實驗


第一個隱藏題目是扮演裝扮,在這張圖片裡大家可以看出來,這是一隻扮成長頸鹿的狗。所以機器需要有裡跟外的概念,誰是本體,誰是附屬,有了這樣一個概念才有辦法繼續進行後面的處理。

第二個隱藏題目是圖片裡有兩種動物,我們一開始就沒有跟他們說一張圖裡只有一種動物,我們有的在圖片裡面放兩隻,而且有的是抱在懷裡,幾乎是看不到的,兩隻的話就可以得到比較高的分數。

第三個隱藏題目是特殊品種,這個長得像拖把的其實是一隻天竺鼠,我們也是後來在收集圖片時才知道原來有這種物種。在狗的圖片集裡我們把全世界最醜的狗也都放進去了,甚至醜的都不具狗形了。其實這些都是個體的變異,怎樣去從這些個體的變異中識別出其中的差別是我們這個題目的考察點。

第四個隱藏題目是微小線索,我個人一直很好奇機器學習到底會怎樣去看待那些肉眼幾乎找不到動物在哪裡的圖片。我們人覺察到的微小線索跟機器的認知可能會有所不同,因為人不是從畫素層去看動物特徵的,而機器可以做到。這其實是一個很難的題目,不知道大家能不能看出,這張圖片中有隻貓,機器識別出來的概率有 15.7%,稍微差一點。由此看出,當圖片的背景變得複雜,卷積層網路從底層抽取特徵的時候會提取過度複雜的特徵,而真正有用的與動物相關的特徵所佔有的比例太小,都會使機器降低辨識出動物的可能性。

大家能看出來這張圖片裡面有動物什麼嗎?很奇怪,我拿給十個人看,有九個人看不出來,剩下一個人告訴我說有鱷魚。這是人跟機器的最大差別,人類的視覺成像會有錯覺影響,事實上在這張圖片裡很難找到好大一隻,右邊有隻長頸鹿,但是人可能就看不到。周圍環境的背景色跟它太像了,所以機器學習到的視覺特徵很容易與其他樹葉交疊所學習到的特徵產生誤判,這也是比較容出錯的地方。


第五個隱藏題目是高度抽象圖片的識別,這個題目也是大家覺得很可怕的,因為我們高度抽象的圖片選取了幾種不同型別的圖片,包括非洲十萬年前石壁上的原始壁畫,這是我們煞費苦心收集的而且還特別對應到本次考題範圍的動物中。另外,我們選取的剪紙和對聯也是高度抽象化的東西。

第六個是堆疊。我們在設計考題時,想到既然卷積神經網路是從畫素層級去提取特徵,那如果要給卷積神經網路一個最大的考驗該如何下手設計題目呢?我們的設想是,如果有一系列的東西,從畫素層級來看都是一模一樣的單元構建出來的,那麼卷積神經網路在處理時是不是就沒有畫素層級的特徵了?那有這樣的物體嗎?答案是樂高積木或者是遊戲我的世界。一個同樣的單元做出來的圖片,不會有畫素級的特徵。我們可以看到,機器在這裡面的表現也是稍微差一點點。

第七個是生成模型的圖片識別。第 7 個隱藏賽題的出題概念是源於什麼呢?中國有一個很古老的寓言是矛與盾,當一支最強的矛遇上一支最強的盾誰會贏?我們使用了強大的圖片生成模型來對抗選手們的影象理解模型。在決賽裡我們準備了許多風格遷移的圖片。也就是,通過風格遷移的方式,我們將圖片中的風格融合到既有的動物圖片裡去,這種融合可以做到無縫融合,對人來說分辨這樣的圖片也很勉強,但仍可以看出來原來的痕跡,對機器呢?在這些風格遷移圖片裡,我們不但做了圖片風格不是很強烈的圖片的遷移,還做了幾個風格極為強烈的日本現代藝術家的作品的風格遷移圖片,包括草間彌生和蜷川實花,他們的風格在人看來極為明顯。當這樣的遷移風格的照片出現的時候,所有的畫素細節都被替換掉了,機器能夠判斷出來的可能性微乎其微,也因此出現了這次大賽第一次發生的狀況。

這張圖片答對率是 0,沒有任何參賽選手的識別模型能識別出來,這張是融合了草間彌生作品的遷移圖片,圖中有兩種動物,一個是貓,一個是天竺鼠,當草間彌生的風格遷移到這張原圖的時候就會生成下圖這樣的圖片,對我們人來說依舊能認得出來,但對機器則是遇到一個難題。我認為對於機器的視覺模型來說,最難的不是其他,就是來自影象生成模型。我們知道現在有很多如 GAN(generative adversarial networks) 這樣的生成對抗模型,怎麼樣通過對抗的方式來讓模型不斷的進步,這也是未來視覺裡很有趣的一個主題。


初賽的一個整體思路其實是幫助我們去理解現代的機器視覺能做到什麼不能做到什麼限制在哪裡我們只有認清楚了這些限制才有可能讓大家變得更好。」


2. 複賽題目設計


複賽主題側重對機器視覺實際應用層面的考察 (初賽主要是基本理論的理解)。


有很多問題是抽象的,沒有一個絕對的操作型的定義。也就是說,沒有任何人可以告訴你什麼是標準答案,這在人的世界裡是很常見的,因為很多事情,一百個人有一百種看法,那麼在這樣的問題裡機器如何去得到一個相對精準的判別呢?這是挑戰之一,另外一個很重要的挑戰是行車記錄儀賽題中需要選手們預測行車標誌,但其中有幾個標誌在我們提供的訓練集照片裡一張都沒有出現過。這時候又該怎麼辦?


行車紀錄器影象評估駕車操作場景


在這個賽題裡面,我們希望要看到的是,當你去做端對端的學習時,你需要把整個複雜場景的轉換邏輯或者是整個思路全部都依次排列在裡面,你的模型得是一個泛用性的模型,否則你沒有辦法去處理這樣的問題。


如果能夠把問題做一個適度的化簡拆解,這個問題就沒有那麼難。例如讓許多選手們覺得困難的如何判斷壓線與逆向的問題,不直接讓機器從整張照片去理解有沒有壓線,而是先解決車跟線之間的關係,再從車跟線的關係往外延伸。這個賽題裡面主要是看大家能不能撇開對深度學習端到端實現的過度追求,有一些追求固然很好。但對於解決真實世界問題的時候,它不應該變成你的枷鎖。

 

接下來這個是最大的難題,行車標誌,我們當初附上了一張行車標誌全圖給選手,為什麼給了一份標誌全圖?因為在所有影象裡行車標誌是不會變的,都有固定的外形。唯一有影響的是你的視角,還有就是呈現的遠近。在這裡可以用兩個策略來解決,第一個策略,用深度學習方法來做,應該可以把這些圖做一些 3D 的旋轉、變形、色調的資料增強,從而來解決這一類的問題。第二可以不用深度學習,用傳統的機器視覺中的模版比對可能效果會更好一些。


「我一直覺得新舊方法都有它的各自優缺點,怎麼把新的去做新的擅長的,舊的去做舊的擅長的,資料量不夠的情況下,新的方法可以通過資料增強來解決,或者可以請舊的方法來幫忙。我認為把這些方法做一些融合,這是有助於機器更好的來理解這個任務的一個重要方法。」


賣場貨架自動計算產品貨架佔有率


貨架這個題目是我們花費最多心思的,除了拍照片之外,我們拍回來的 1600 張照片,將近 12 個人去標了 2 兩個多禮拜。這個題目的最大難點,其實在於要在給出的 1000 張訓練集照片中,去識別 240 種的商品。我們當時在設計這道題的時候還考慮題目會不會過難,因此給選手許多參考性的材料,包括將多邊形轉換為 Mask 以及提供裁切過後的商品碎片。當我們給出裁剪乾淨的商品之後,能夠對這些圖片做資料增強的方法就有很多了。


「我們在這裡其實考的是怎麼樣通過小樣本進行學習,因為我們認為現在深度學習最大的問題還是在於樣本數。」


3. 決賽題目設計


中文視覺智慧問答

 

選手在做這道題的時候不可以用電腦螢幕把任何一個照片投出來,一投出來就算喪失資格。因此是在完全不知道圖片內容的情況下,去回答這些中文的視覺智慧問答,這也是我們希望未來可以繼續的一個比較有意思的研究,希望有更多技術強大的團隊們可以一起在這個領域鑽研。未來的這種智慧的對答,以前都是隻注重在所謂的語料生成的方式來找到一些似人類的像鸚鵡學舌一樣的回答。但是我認為通過影象的理解來產生一個有意義的回答,這是一個更有趣的東西,這是我們的第一次嘗試,我也希望可以把它慢慢的擴充,包括一些有場景式的問答,也許下一次就是一個選單,或者是一張地圖。


Ⅱ冠軍團隊指導教授王金橋:大資料時代的視覺智慧


1. 研究背景:視訊語義理解


預計在 2020 年,網際網路資料裡大概 90.6% 的資料都是以視訊的方式進行呈現。第二就是在物流空間,監控視訊每年也以 20% 的速度在增長,在這種海量資料爆炸性增長下進行資料分析,為實現我們的需求帶來了很大的挑戰。


當前主要經歷了三個階段,從最初城市裡任何視訊監控都沒有到平安城市,安裝了一些普通模擬的攝像頭,有了數字化的資料,到現在我們基於大量資料以及大量積累的演算法,慢慢的可以把這些資料變成知識資料,進入到智慧計算的階段。

從認知的角度來講,人工智慧可以說是攝像頭的大腦。從人工智慧發展的角度來講,經歷了從看得見到看得清的過程,我們首先通過安裝各種各樣的攝像頭,現在每個縣,每個村都安裝了攝像頭。另外就是看得清,原來我們在 80 年代的時候,最初來做這種影象識別的時候,當時機器只有 586、486 這種設定,非常複雜,資料非常少,原來的攝像頭資料每個影象是 320、240 的解析度。在這個解析度下很難提出我們要識別的是內容,以及使用我們人眼的看法。現在隨著計算能力的提高以及 GPU 的出現,整個視訊發展到了一個大資料深度學習的時代,使大家通過一些專家系統,能夠使我們從視訊資料中得到更有價值,更加智慧的一些分析。

從技術發展的角度來看,當前的發展經歷了從規則式到大資料時代的,經過了目標檢測、車牌識別、人臉識別、文字識別到視訊檢索,通過模擬其他的特徵,都是通過人工設計的特徵,符合邊緣的某些特性或者是支援向量階的方式,來得到一個基本的演算法,能滿足一些規則的應用。這裡面最成功的是車牌識別以及一些文字的檢測,手寫的識別和人臉檢測。


慢慢我們的資料量在不斷增加,我們慢慢的支援向量級,整個在小資料的時代,基本上是知識向量統治機器學習的時代。而現在隨著 GPU 的出現,資料的海量增加,現在達到了一個全資料驅動與深度架構、智慧分析演算法三者深度結合的時代,是一個大資料的深度學習。包括現在各種成千上萬的分類識別,目前都是基於這種大資料的智慧視訊分析深度學習框架。

2. 研究專案節選


智慧物件識別的檢測


這個網路設計得非常複雜,包括卷積層、反摺積層、STN 的校正網路、空間變換校正網路、空間上下文描述的學習網路以及空間變換的隨機擾動、隨機定位,對不同尺度敏感的自動迴歸以及最後的 NMS 做的這種精細的目標分類和空間關係建模。它是一種由粗到細的一個精細的檢測分類融合的框架。目前我們主要是針對生鮮領域,包括蘋果、梨、蔬菜,以及各種牛奶,如光明的、蒙牛的。目前已經實現了 50 個大類,200 個子類精細的識別和檢測。目前在食物產品中基本上達到 90%,主要目標遮蓋小於三分之一,基本上就可以精確檢測到。

影象語義分割


這是一個畫素級的語義分割,包括人的場景,主要是做機器人的,就是服務型機器人,常見的床、桌子、椅子、茶杯、手機、水杯、電視、冰箱這種 3C 類的,還有服務類的,比如吃飯,家庭常見的這些目標,讓機器人來輔助人完成它所尋找的這個目標的功能。最後是基於服裝的解析,就是我們把人分成 22 個部分,包括他的頭髮長短、性別、年齡,有沒有拎包,他拉沒拉箱子,長褲短褲,長裙短裙。這是我們當前的一個效果,這是 22 類人的解析,我們可以把人大概在 10 到 20 個小米之內分割成 22 個區域,主要是面向公安的一些拍照購物搜尋做一些應用。網路視訊的錄影當中是沒有標籤的,我們通過這些錄影的區域之間的關係來判斷這個視訊的鏡頭和場景的分割,給它做一些視訊鏡頭和場景之間的標籤,以及做一些影象的區域和影象集,以及影象整體的一些水平,這個我們主要是用圖模型。這是我們從 2004 年做到現在,做了十幾年的一個工作,這個工作目前在很多場景下應用。這是基於圖的視訊影象標註,基本上是我們組一個標誌性的工作。

 

雜湊的大規模影象檢索


這是一個雜湊的大規模影象檢索,就是把一個影象通過各種變換,我們一個雜湊檢索做法是在 2014 年發表 fab,影響非常大,我們把這個程式碼已經開源了,已經被很多公司和企業應用,可以實現這種快速的三維重建以及快速的目標檢索,基本上可以實現在一秒內億級資料的海量查詢。

3. 研究經驗分享


基於影象視訊的處理工作,是一個科學和工程深度結合的一個事情。它的資料就是你必須要對這個方法理解得非常深刻,你才能夠針對這個方法去選取適合方法的資料,就是你的方法是解決哪個問題的,你根據這個問題去發現什麼樣的資料更適合它,你當前的這個方法對那些資料不適合。另外就是資料的清洗非常重要,你在準備資料的時候,這個需要大量經驗的積累,因為它也是一個實驗性的科學,就是說你在資料標註的時候,這個框是不是要標得特別緊湊,比如說你這個目標遮擋三分之一還是露出來一點,都是需要經驗積累的。所以說包括這次 BOT 比賽他們資料標註裡不是特別有經驗,我們都會對資料進行一個清洗。資料清洗對最後演算法效能的影響大概在 10% 到 20%。


從框架選取的角度來說,以不同的應用選取不同的框架。比如說你要用人臉的,ConvNet 的卷積方式更適合,你要想做簡單的分類,或者是做一些跨平臺的融合,TensorFlow 是大家關注最多的,而且我們現在每個框架基本上都用。另外 MX Net 本身的 Bug 比較多,大多數都是中國人,模型釋放的比較少,如果你自己選擇轉模型就會有大量的損失。所以我建議你以 TensorFlow 為主,或者你做 OCR 或者是語音相關的,你要做時序相關的,一般這種 Touch 的也很多,就看你的應用方向,還有你最後的釋出平臺。


Ⅲ大唯團隊陶進:小樣本影象檢測深度學習演算法研究


1. 影象檢測需要做一件什麼樣的事情


影象檢測顧名思義,就是模擬人看圖片,能夠判斷圖中有什麼物體以及這些物體在什麼位置。簡單來說,給一張有飛機的圖片,影象檢測需要做的事情是,首先要找出飛機所在的位置,然後對這些所在的位置進行判斷裡面的物體是什麼。傳統上做影象檢測會把它分三步來做:


第一步是區域選擇,這是為了支援目標位置的定位。


第二步是特徵提取,當你把目標的位置定位之後,就可以進行影象特徵提取,往往這一階段對整個檢測環境起到非常關鍵的作用。在特徵提取時,邊界資訊的提取很重要,也是容易忽略掉的資訊。


第三步是分類器分類,當我們獲取到了整個特徵的時候,最後一步會給分類器進行分類的操作。


2. 複賽賽題解析


超市商品分割分類的問題上,整個過程種最關鍵的難點是我們的訓練樣本量非常少,需要分類的種類非常多。我們把下面的資料統計出來,三大類裡面,主辦方給了我們 363 張圖片,其中只有 336 張圖片包含了有改進的圖片框,後面依此類推。我們要識別 239 個主類,分別對應每個類別我們需要時間的數目。最後是我們做檢測的人非常熟悉的一個詞,Bounding Box 就是檢測框,給了我們 1319 個。

 

總而言之,我們怎麼在這麼少的資料量之下識別這麼多的種類?可能很多人一開始就會說,我把所有的檢測框架跑一遍,去比對哪個效果最好。可是我想給到大家的一個小小的建議是,在跑框架之前,其實我們是可以對最需要的資料預測一個最直觀的分析。我們可以看到,這兩張圖片上面最大的特徵其實是一個叢集的物體,就是說某一個泡麵旁邊種類的泡麵和他是一個型別的,我們就通過去找相應的資料處理這個問題。在我們閱讀查詢文獻的時候,SSD 也就是一個檢測框架,論文作者提出這個框架的時候,他是基於另一個檢測框架選取特徵,對小物體和叢集物體無法很好識別的問題做了改進。


第二個是我們查到陳新鵬同學在自己的博文上展示了 SSD 模型在面對小規模資料集上的良好效果,他把這個 SSD 模型應用在了自然場景的文字檢測上。實際上我們一個單詞,或者一個成語也是相當於有點叢集的概念在裡面。這樣的話,就相當於我們可以省掉很多的時間去試一些我們不需要試的框架。但是還有一點是說,資料量實在真的非常少,我們可能還是會想到要做資料增廣,依然還是那個建議,你是根據你的資料性質進行適當有效的資料增廣。

 

我們這邊看超市物品的時候,我們可以想像,超市的物品出現在不同貨架的不同位置上,所以我們從位置的角度去實現增廣是一個合理的方式。同時超市傾向於將同一類別的物體擺放在一起供顧客選擇。也就是我們左邊的圖片,後面的會集中擺在一起,泡麵會不太常見的出現在一個超市上下貨架的兩層。所以我們最後依據這樣兩個假設,我們看到這個其實也驗證了我們中國的一個習慣,就是同一類別的物體基本上都放在同一貨架上。我們最後採用的增廣的方式,就是把一張訓練圖片進行上下左右三分之一切割,取其中三分之二上的圖片,這樣一張訓練集被變成五張。唯一需要注意的是,分割之後檢測目標要進行相應的量化。


ⅣDeeeeeeeeeepNet 團隊陳朝才:深度學習在目標檢測領域的應用


1. 檢測的應用


第一個是做人臉檢測,這個做完檢測之後還會有很多應用,比如人臉識別會先去檢測這個人臉,還有人臉的特徵點定位。就是檢測到人臉之後,再去點選鼻子,做一些美化或者是其他的特效,還有旁邊行人的檢測。下面是車行的檢測,這個在交通當中應用是很多的。比如說首先需要檢測到這些車,再去對這些車進行分類,看看這些車是什麼車。

2. 常用檢測框架


這些檢測的方法我大體上分為三類:一是 Cascade CNN,這是一個 CNN 的結構;二是 RCNN 相關的,這裡面我列了幾種,當然還有特別多的優化這裡沒有放出來。包括 RCNN,然後 FastRCNN、FasterRCNN 和 R-FCN、PVANet。三是 YOLO、SSD。

Cascade CNN


首先說一下 Cascade CNN,我們做目標檢測的時候有一種非常暴力的方法就是用一個框去辨別這個影象,做一些分類。比如第一個框我框出來了,用一個分類器去分類,比如我這裡檢測是人臉,我就去做分類,看看這個框裡面是不是人臉,我去掃一遍的話,掃到一個區域是人臉。如果我分類的概率大於某一個閾值的話,輸出這個地方是人臉,這是一種非常暴力的方法。針對這個方法我們有很多的改進,比如說這裡會有很多框,幾萬個框計算代價太高了,我會先初步的做一個篩選,比如先用一些大的框去掃,掃到某一個區域可能有人臉,我再對這個區域進行檢測。這樣的話,我通過一個極連的步驟,可以大大的減少計算的時間。更詳細的方法在下面,大家有興趣可以去看一下,它主要是針對暴力掃的話,這種極連不斷的去減少這種計算複雜度的方法。(附該結構的 Github 程式碼地址 https://github.com/anson0910/CNN_face_detection)

RCNN


RCNN 是目標檢測裡面的一個開放性的模組,其他的主要思想也和剛才的類似。剛才在掃這個區域的過程當中有三步:第一步去決定一些框,第二步要對這個框進行分類,第三步要根據我剛才得到的這些框好輸出最後的結果。這三步 CRNN 裡面做了相應的改進。第一步剛才我們的框是暴力的,RCNN 裡面會有一個 Region Proposal 的方法,先看哪些地方有物體,先把這些框作為候選的區域,大概只有 2000 個,比剛才要小特別多。得到這些候選框之後,第二步我們要對這個框進行分類,都有一個卷積神經網路,這個卷積神經網路針對這個框,比如我們常用的是 24×24 的,通過卷積神經網路最後的全連結,一般是 4.96,得到一個 4096 位的特徵。得到這個特徵之後,我們有些常見的特徵,對每一類進行訓練一個分類器,我們就可以判斷出來,比如提取這一項之後進行分類是機器還是人。這個改進了剛才的三步:第一步就是我們用 Region Proposal 的方法替代暴力掃的方法;第二步就是用 CNN 的特徵做分類,不是用傳統的一些特徵;第三步是用一個 SVM 的分類對候選區域進行分類。這裡面還有一個改進,就是我這個候選區域框的位置可能不對,這個人就提出來一個框的迴歸方法,就去糾正這個 Proposal 的位置,這樣的話也帶來一個檢測效果的提升。(附該結構的 Github 程式碼地址:https://github.com/rbgirshick/rcnn)

實際上在這裡還有一個改進就是,比如說在這個 CNN 的部分,我們一般是用這個模型直接去提這個 4096 位的特徵。這樣的話就會導致一個問題,就是說你的模型是在這個上面訓練的,但是應用在這個檢測的裡面,可能我的資料跟你原始資料的分佈是有一定差異的,它會把這個模型拿過來,在我的檢測資料上面進行一些微調。微調的意思就是說,比如這裡分類一般是 1000 類,我把這 1000 類,這個檢測只有 21 類的話,把這個全連結層換掉,把這個網路拿到我的資料下面訓練一下,會帶來很大的分類效果的提升。最後綜合這三步,RCNN 相對於傳統的目標檢測的方法效率、速度和精度上都有了特別大的提升。下面的工作基本上都是針對這三步分別進行改進。


FastRCNN


FastRCNN 部分,剛才在目標檢測的後兩步,要針對每個區域先提取特徵,然後再分類,FastRCNN 就是想把這兩步融合起來作為一步。這裡就提出來 ROI 的方法,其實就是剛才的這個候選時序。第二步就是設計了這一部分,實現了一個 End to End 的訓練。這個當中一個核心的 ROI 有一個解釋,這張圖片通過我的一些卷積層,比如任何一個網路,我會得到一個 Feature Map,這是 N×W,相當於一般的卷積神經網路最後的卷積層。針對我下面這個候選區域,我會把我的候選區域分為一些塊,比如說常用的我會分成 7×7 的一共 49 個,分成 49 個之後,我會把這個區域對映到對應的 Feature Map 這個區域當中。這裡有一個特殊的方法,一般的神經網路有四個值我取一個最大的。這裡是針對這個區域,比如左上角的區域是取一個值,針對大的或者小的輸入,都會生成一個特徵向量,這樣的話就會解決這個問題,雖然我的候選區域大小不同,但是我最後得到的特徵維數是一樣的,這樣的話就可以做一個批處理。最後通過這裡有一個分類的損失和合規的損失,就可以分配到這個序列。(附該結構的 Github 程式碼地址:https://github.com/rbgirshick/fast-rcnn)

FasterRCNN


FastRCNN 解決了剛才這三步當中的一步,還有一個部分沒有解決,要去提這個候選框,這個是非常耗時的。FasterRCNN 就解決這個問題,看能不能通過深度學習直接提出這些候選框。這裡有一個非常好的設計是 Anchors,比如剛才我通過一張圖得到一個 Feature Map 之後,比如這個是 H×W 的話,那麼我對於這個 Feature Map 上面,我認為這個點會預設的存在一些光。在 FasterRCNN 當中,我把這個原圖做了一個視覺化,比如我預設這個點大概存在 9 個不同的框,這個框我設計完之後就可以直接從圖片裡得到這些框,也會針對每一個框輸出。比如你預設設定一個 K 框的話,會預設得到一個分類的框,還有一個是座標 4。這裡只是分類物體,就相當於解決了剛才的提取框,哪些為了可能存在物體。通過 Region Proposal Network,用一個簡單的網路可以達到每秒 14 幀的處理速度。當然這裡面有很多訓練的細節,大家如果感興趣的話可以看一看。


我這裡給了一個 FasterRCNN 一個整體的結構。比如這裡是圖片的話,這裡是我們常用的卷積網路,在這裡得到我的 Feature Map,就是這個地方。通過這個 Feature Map 有兩個分支,通過這個 Feature Map 可以提剛才的候選區域,通過候選區域又對映回剛才得到的這個特徵,Feature Map 就相當於提取了某一個候選區域的特徵,這裡再加一些全連結層或者卷積層,直接得到它的結構。我們可以看到,整個就是一個端對端的訓練。這裡是 FasterRCNN 的一個介紹。(附該結構的 Github 程式碼地址:https://github.com/rbgirshick/py-faster-rcnn)

RFCN


下面是 RFCN 的結構。RFCN 解決了什麼問題呢?在剛才的這個圖當中,如果這裡得到了 2000 個的候選區域,每一個區域都要進行分類,這一部分要運算 2000 次,這個特別是在殘差網路,在執行過程當中,會把最後的做分類,這樣的話預算代價特別高,RFCN 的提出就是為了解決這個問題。這裡也是設計了一種特殊的呼應的方法,就是剛才通過這張圖得到了我的特徵圖之後,向大家強制輸出跟我的類別相關的一個特徵圖的數目,比如我一般是 256 個,我把這裡強制輸出是乘以類別數的 Feature Map。這裡有什麼好處呢?這個好處就是,我針對每一個類別,比如我輸出的是九個 Feature Map,,這裡是特徵圖,這是對應到特徵圖的區域,把這個分為九塊。做鋪列的時候,針對第一個 Feature Map 圖只舉左上的一小塊進行鋪列,得到第一個圖,第二個得到第二個圖,九個特徵圖最後得到九個小塊。這個是跟剛才 FasterRCNN 裡面是一樣的,我這裡也給了一個 RFCN 整體的架構,這一部分跟剛才不一樣,我如果得到特徵圖之後,這裡是一個新加的卷積層,這裡是讓大家強制輸出成和我類別數相關的一個卷積層,就是 Feature Map 的數目,這邊是一個分類,這邊是採用剛才這種鋪列的方法,最後也得到了檢測的結果。這裡是一個效果對比圖,FasterRCNN 的話速度是 420 毫秒一張圖,通過這個簡化之後,RFCN 是 170 毫秒一張圖,相當於提升了三倍的速度。對應的準確率比 FasterRCNN 要高。(附該結構的 Github 程式碼地址: https://github.com/daijifeng001/caffe-rfcn)

 

PVANET


這一部分介紹的是 PVANET。我們常用的這一部分,通過影象得到這個特徵圖的時候,我們一般常用的是這些網路,這個提特徵值的時候有沒有更好的網路設計?PVANET 對這一部分做了三步改進:第一步使用了 CReLU 的啟用方法,一般的卷積層比如有 200 個,會輸出 256 個 Feature Map,這相當於有一大部分是冗餘的,這個 CReLU 就可以讓輸出的數量變少,比如 256 個 Feature Map 變成 128 個,這樣的話就可以減少預算量。第二步是引入 Inception 網路,Inception 模組是有多個不同大小的卷積組合,得到下一層的 Feature Map。這樣有一個好處就是說,相當於做了一個特徵的融合,就是說我得到的特徵是有不同的特徵,不同大小的卷積得到的特徵。第三步是把卷積神經網路不同層的輸出進行結合,這裡有一個什麼好處呢?比如說一個網路有五層的話,第五層可能是結構化資訊非常高的。這樣的話,可能對一些小的物體,這些小的物體到高層的話損失特別大。這裡就把低層的 Feature Map 和高層的 Feature Map 進行融合,得到了最後的這個,這一層包含的資訊比傳統的資訊更多。而且更重要的是,這裡通過一些設計,讓卷積層 Feature Map 的數量變少,達到了很大速度的提升。下面這個圖可以看出來,PVANET 可以達到 46 毫秒一張圖,比剛才的 RFCN 還要快,剛才的 RFCN 是 133 毫秒,這樣就可以達到一個實時的效果,大約 120 幀 1 秒的速度,而且是不同的融合方法,最後檢測的準確率是非常高的。(附該結構的 Github 程式碼地址: https://github.com/lvchigo/PVANet_train)

YOLO


YOLO 的出發點是什麼呢?在剛才這個檢測流程當中,我通過這裡得到一個 Feature Map 之後,先要在這個 Feature Map 上面得到一些候選區域,又要針對這些候選區域,再從這個 Feature Map 上面提一遍特徵。這裡會造成對每一個候選區域要做兩次預算,這裡等於是不需要的。下面的方式就是直接從圖片得到最後分類檢測的框。YOLO 就是把一張圖分為很多的區域,對於一張圖有一個狗,怎麼對應呢?我的中心框如果對著這裡,這裡就負責解決這個問題,這裡得到最後的結果。這個自行車對應到這個點,轎車對應到這個點,最後直接通過這個網路得到一個輸出。這裡要注意的是,這個輸出可以看到是 7×7×30 的矩陣。首先要判斷是什麼物體,在這個檢測當中是 20 倍,在這裡有 20 維去表示是什麼物體。還有 8 維,要對這個框的位置進行修正,這 8 維是負責對這個框的區域進行修正。

下面是它的整個網路的設計圖,這裡一共有 24 層的卷積,這裡直接通過圖片,448×448,最後得到 7×7×30。通過這 30 維,就直接可以算出一個 49 個格子當中,每個格子可能包含什麼物體,在什麼位置。這樣的話,我一次運算就得到了最後的檢測結果。這裡訓練還有一些細節,就比如說這個網路的初始化,會先把一些卷積層在更大的範圍內預訓練一下,採用 RCNN 的方法,最後再拿到檢測訓練。這個後面還做一些改進,大家有興趣的話也可以關注一下。(附該結構的 Github 程式碼地址: https://github.com/xingwangsfu/caffe-yolo)

SSD


下面是 SSD 的結構,SSD 是這個比賽當中用的很多的一種方法。它解決的是什麼問題呢?剛才 YOLO 看上去是非常暴力的,一個圖片直接分為 49 個格子。這樣的話,如果是這種小的物體的話,可能檢測效果會更好。SSD 做了這個改進,比如說看這個網路當中,這裡前面是一個 16 層的,到這裡如果是 300×300 的話會輸出一個 38×38×512,針對這 38× 38 我們會在每一個點上預設一些預設的框,這個地方和前面 FasterRCNN 的 Anchors 有點像,YOLO 只在這個地方輸入了一個。SSD 是在網路當中不同的層都有輸出。這樣的話,其實也相當於一些特徵的磨合。當然這個 SSD 在實際的訓練當中還有非常多的訓練的策略,比如說一個圖片是 300×300,之前要做一些影象的增強,可以剪下一些區域去做訓練,如果大家對這個感興趣的話可以看一下這個論文。這裡是 SSD 的一個檢測效果。我們剛才把這個網路定位一致的話,都用 VGG16 的話 FPS 是 7。這個 SSD 做檢測的時候有一個地方,這裡是一個 Match 的檢測,每次可以處理 8 張圖片同時做檢測,如果大家去測這個速度的話可能會有損失。(附該結構的 Github 程式碼地址: https://github.com/zhreshold/mxnet-ssd)

3. 所述框架總結


Deep Learning 的運用 CNN 的方法去提取物體的特徵,比傳統手動設定的特徵更好,這樣帶來檢測的準確度更高。我們引入了迴歸的方法,對於檢測的位置做一些修正,這樣的話檢測的位置是更準的。剛才我介紹的這幾個框架都是端對端的,這樣的話,可以讓我的檢測速度非常快,而且可以用到 GPU 加度。


Ⅴ 現場精彩問答


1. 視訊檢測相關的內容問答


提問:您剛才提到了很多解決方案,我想問的是解決的過程是什麼樣子?以及在這個過程當中,比如申請資料集的時候,有訓練資料集、開發資料集和測試資料集,在選擇資料集的時候需要注意到什麼?還有就是在選取框架的時候需要注意什麼?以及在迭代的過程當中需要注意什麼?


王金橋:我覺得整個的基於影象視訊的模式,也是一個科學和工程深度結合的一個事情。它的資料就是你必須要對這個方法理解得非常深刻,你才能夠針對這個方法去選取適合方法的資料,就是你的方法是解決哪個問題的,你根據這個問題去發現什麼樣的資料更適合它,你當前的這個方法對那些資料不適合。另外就是資料的清洗非常重要,你在準備資料的時候,這個需要大量經驗的積累,因為它也是一個實驗性的科學,就是說你在資料標註的時候,這個框是不是要標得特別緊湊,比如說你這個目標遮擋三分之一還是露出來一點,這個都是需要經驗積累的。所以說包括這次 BOT 比賽他們資料標註裡不是特別有經驗,我們都會對資料進行一個清洗。資料清洗對最後演算法效能的影響大概在 10% 到 20%。


從框架選取的角度來說,以不同的應用選取不同的框架。比如說你要用人臉的,CoverNet 的卷積方式更適合,你要想做簡單的分類,或者是做一些跨平臺的融合,Test Flow 應該是大家關注更多的,而且我們現在每個框架基本上都用。另外 MX Net 本身的 Bug 比較多,大多數都是中國人,模型釋放的比較少,如果你自己選擇轉模型就會有大量的損失。所以我建議你以 Test Flow 為主,或者你做 OCR 或者是語音相關的,你要做時序相關的,一般這種 Touch 的也很多,就看你的應用方向,還有你最後的釋出平臺。


提問:剛才您有些例子是在手機端實現的,在手機端識別的話都有哪些技術要點?


王金橋:手機端識別就是多核多執行緒要解決的,我們的程式碼都是自己寫的,你要有一個很好的框架來解決這個問題。另外就是說你要把庫減少到最小,在 ARM 上做優化。另外就是網路要設計得非常淺,要做一些定點化,目前支援定點化的是 Test Flow,其他的都要你自己去更新,就是你是網路的壓縮,要設計一個網路,把計算的樣本控制到最小,多執行緒、多核的呼叫以及你最後效能的調優,最後程式碼的移植,目前這些公司應該都在做。


尹相志:我補充問一下,最近有些論文提出來說,可以把一些很複雜的網路通過一些 Training 的手法做縮減和壓縮,你認為這是一個比較重要的方向嗎?還是說先從比較淺層的規則來做?


王金橋:網路的剪枝、裁減和網路的壓縮一般是同時來做的,一般是裁減,我們先用一個非常深的網路,要布這些核心資料,要讓它效能最優,我們會減某些層。減了之後,我發現效能損失在 2% 左右,我不能再減了,再減效能損失就下來了。我們要壓縮,包括小網路擬合大網路,這種訓練的方式的話就要特別依賴你的資料,這種就是進行網路訓練不是特別的敏感,目前大部分的方法還是通過剪枝的方式,一般的通過訓練的方式得到這種剪枝或者層級量化,不但工作量比較大,而且目前一般的能做 MPGA 或者晶片的,目前傾向於這種方式。


提問:我比較外行,我問一個問題。深度網路輸入的應該是一些圖片,最後得到的特徵,比如說人臉是什麼臉形或者什麼頭髮,或者是他揹包沒有,就是你輸出的一些特徵。中間層會是一些什麼東西呢?是一些小的圖片還是一些有意義的標籤之類的東西?


王金橋:它輸入的都是影象,是一個完整的人,他在訓練的時候有兩種方式,一個是全域性的屬性,就是這個人的年齡、性別、男女,是整個人體的框直接做一個全域性的分類。第二個就是說區域性的,是否揹包,是否拉著箱子,是什麼發形,穿的衣服是什麼顏色,基於這些標籤,我們輸出的是這個序列的標籤,和標註是一樣的。


提問:中間層是一些什麼?


王金橋:中間層次就是對這些區域的一些響應,神經網路做一些視覺化,通過卷積層,Cover1、Cover2、Cover3 都是和我們的人臉一樣,看上去之後都是一些簡單的紋理特徵,看不出什麼差別,他們在 Cover4 和 Cover5 這幾層,有結構的特徵,比如人臉的話有眼的特徵、鼻子,Cover5 就有很明確的特徵,比如裙子,這個裙子的輪廓就出來了,響應度很高,別的響應度很低。就是低層到高層的抽象機制,但是這個理解跟我們人並不一致。


2. 深度學習框架的內容問答


提問:你剛才介紹了這麼多檢測的框架,大概會分為 RCN 系列、SSD 和 YOLO。我想問一下,針對不同的問題,我們選擇哪一個框架比較好?SSD 和 FasterRCNN 會有什麼優點?


陳朝才:我覺得針對不同的問題需要對應用場景做配置。SSD 這裡的設計就是導致你可以一下子可以檢測 8 張圖,FasterRCNN 一下子只能檢測 1 張圖片,這樣的話會導致會有 8 張圖片的延遲。但是我覺得如果你用 FasterRCNN 的話,你可以優化前面的這個,在實際使用的時候可以把這個網路簡化一下。YOLO 做了這樣一些設計,在做 3×3×256 的運算之前先有一個 1×1×128 的卷積層,這樣的話,它會讓你下一層的運算量減少一半。就是說前面一層輸出的維數變為一半,下一層再做大卷積和的時候,這樣的運算更小了。也可以針對這個做一個相同的優化,讓這個網路結構變得更小。這樣的話,也可以讓這個檢測速度提升得更快。


還有另外一點,SSD 的輸入是 300×300,其實這個圖片的大小和處理速度也是有很大的影響。比如說如果你要檢測一個很大的物體的話,我們覺得在計算的時候並不需要像 FasterRCNN 那樣有成就感。如果你去看卷積的運算過程的話,這個圖片大小是和運算量有一個關係的。就是你實際做檢測的話,可以儘量的去壓縮輸入的大小,得到速度的提升,另外一方面就是這種網路結構。最近谷歌有專門講檢測的速度和精度的平衡。


提問:如果只考慮精度的話,是不是 FasterRCNN 比 SSD 要好一些?


陳朝才:我覺得這個問題和場景有關係。因為 SSD 很多訓練的策略是非常有效的,因為 FasterRCNN 已經出得非常久了,這個檢測效果我覺得可以針對實際場景去看一下這幾個框架在做訓練的時候採用了一些資料增強的方法,包括一些訓練之類的,我覺得這個對於檢測效果影響也非常大。像 SSD 最開始其實效果並沒有這麼好,並沒有這麼高。但是它通過一些策略,讓它訓練的精度達到了這個效果。


提問:剛才看到 FasterRCNN 有兩個改進,其中一個改進是 Feature Map 的改進,有沒有一種方法是這兩個改進的融合?


陳朝才:也可以,這個論文裡面針對的,你去做論文的話是針對一個主要的點。我覺得你個人做實驗的話,你可以去嘗試把這兩種方法結合,這個也很方便,因為這兩種方法並沒有衝突。


提問:有人做過這兩種方法的融合嗎?


陳朝才:目前沒有。但是我個人認為,這兩種方法,RFCN 側重的是用殘差網路,後者是得到了檢索的,服務的提升也是很大的。


提問:選擇這些的依據是什麼?是計算量嗎?


陳朝才:這是很基礎的,殘差網路分類的效果是非常好的,我覺得你在世及應用當中,可能並不會用到殘差網路這種特別強大的網路,這種網路還是非常複雜的。在這個論文當中是為了做標準的對比,所以採用的是相同的網路做對比。


提問:你的意見主要還是從計算量來考慮選擇分類器是嗎?


陳朝才:我覺得如果你追求精度的話,像 SSD 裡面做了非常多的資料增強,包括一些針對這種特別小的物體的優化,這都是非常細的,我這裡沒有涉及到。


提問:這次競賽當中好多人都選擇 SSD 是為什麼?


陳朝才:因為 SSD 的話,我個人認為其實是 RFCN,因為 SSD 的效果我覺得可能在訓練的過程當中根據輸入的圖片做了一些取樣。給出的解析度都是非常大的,3000×200,他是隨機採一些小塊做的。我在訓練 RFCN 的時候並沒有採用這種方法。


提問:是不是 SSD 相對來說是做好訓練的?其他的這些網路訓練難度有什麼區別?


陳朝才:這個我覺得區別並不大,是兩種不同的思想。如果應用在你的場景當中可以都去看一下,測試一下。


提問:還有一個問題就是,如果我想檢測,比如針對一個現有的,增加一個新的內部檢測,從原理上直接是重新訓練分類器再訓練網路?還是說整個都是你自己寫的?


陳朝才:像一般的標準資料,如果你自己想加一個的話,我覺得可以這樣做,先在上面訓練一個 20 倍的檢測器,針對你的圖片,先把 FasterRCNN 的檢測結果標在你的資料上面,我就把這個檢測出來的框當做我的標準方式去訓練,這樣相當於做一個檢測的遷移。然後你再用這種標出來的結果去訓練另外一個 FasterRCNN 的網路,這樣的效果是很好的。

相關文章