1. 程式人生 > >論文:Sketch-a-Net that Beats Humans(附帶CNN的理解)

論文:Sketch-a-Net that Beats Humans(附帶CNN的理解)

這周看了一篇論文,是學校要求的,題目叫做Sketch-a-Net that Beats Humans,由QM的老師發表在BMVC 2015。 這篇論文我看了一下,感覺思路上還是很有趣的,而且解決的問題也比較有價值,但為什麼只發在了一個C類會議上,有點詫異。

論文是基於CNN做了一點improvement的。我也是借這個機會稍微瞭解了一下CNN, 之前看過neutral network,所以看CNN還是沒費什麼勁的。有關neural network和CNN。這裡有幾個比較好的連線分享一下

按我自己的理解,傳統的BP神經網路之所以沒有被用到影象識別上,是因為神經網路之間的連線太多了,而影象由一個個pixcel組成,一個pixel就是一個輸入資料,導致需要學習的引數過多,不僅容易造成overfitting的問題,電腦能不能做出efficient 的計算也是一個很大的問題。

CNN之所以牛逼,當然不僅僅是因為使得計算doable,還因為在卷積神經網路的第一層就是特徵提取層,也就是不需要我們自己做特徵提取的工作,而是直接把原始影象作為輸入,這帶來了很大的便利,歸根結底還是歸功於卷積運算的神奇。

結構上,CNN相當於在傳統的神經網路(在cnn裡貌似被稱作是全連線層?)之前加上了幾層卷積層和池化層(一般加到五層就能有很不錯的效果了)。
這裡寫圖片描述
所謂卷積,可以看做是共用的一組加權引數,從圖片中提取features,用於做卷積的引數矩陣可以被稱作卷積核或者filter。
當然往往只用一個卷積核是不夠的,這樣的特徵提取是不充分的,我們可以新增多個卷積核,比如32個卷積核,可以學習32種特徵。
這裡寫圖片描述

這裡寫圖片描述

而池化則是進一步的減少資料量,常用的池化方法是max-pooling, 也就是在卷積以後得到的matrix中,每相鄰的四個格子中挑選值最大的那個作為代表。

這裡寫圖片描述
經過了多層convolution 和 pooling以後得到的資料送入full-connected的神經網路進行學習。

回到sketch-a-Net 這篇論文,這篇文章主要要解決的問題就是識別人手在觸感devices上畫出的sketches,比如在pad上畫一個小飛機之類的。 文章根據sketches與傳統拍攝的照片的不同之處,在CNN上做出了一些改進:

  1. 這篇文章中用的filter比別人的大,現在比較popular的方法是取small filter,比如3*3的,按我自己的理解,為什麼這麼取是因為:由於是sketches,並不是所有地方都是有information的,比如你畫一個飛機,隨手畫都很簡略,有線條的地方還不一定比空白處多,用大一點的filter能保證在提取feature的時候都是有效的。

  2. 這篇文章沒有加上Local Response Normalization的一項(雖然我也不知道在傳統的CNN裡有這一項),文章中說 Local Response Normalization 是用來描述光照變化(brightness)的,而sketch是沒有這個特徵的,加上這一項不僅沒有用,還會增加運算的難度。

  3. 這篇文章用的pooling不是傳統的max-pooling,也就是2*2的格子以2為步長遊走, 而是採用3*3九個格子以2為步長,這樣雖然造成一點additional computation,但是效果會提升一點兒。(這個沒怎麼看懂)

  4. 他們還加入了人類在畫畫時候的ordering帶來的information,比如畫飛機的時候,是先畫一個外殼,再畫翅膀,再畫窗戶。 文章中實現這個想法的方法是: 先把飛機拆成了三個最基礎的單元,分別作為三張圖片,然後再組合兩部分成為第四章圖,在組合另外兩部分成為第五張圖片,最後把整體作為第六張圖片,這六張圖片作為六個channel輸入到CNN的第一層,再進行卷積,池化等操作。

  5. 他們還考慮到了不同人畫同一個物件的viration, 比如小孩畫飛機就比大人要少很多details。他們的做法是對同一張圖片用做不同的down sampling,得出不同size的圖片(高coarseness 的相當於少details)。認為一副圖片是由幾幅不同down sampling之後的圖片的均值加上方差得到的。
    然後通過Joint Beysian method的likelihood ratio test
    這裡寫圖片描述
    作為metric來優化 學習得到方差,最後的真實值就由均值和方差取樣得到。

整體流程如下: