面試中的CV --- classification to detection

面試中的CV --- classification to detection

極盡所能。不能無所不包。

0. 前些日子兩場電話面試,都面的很不好,必須做一個階段性的總結。其實本身來講在計算機視覺的積累現在集中於前兩個方面:

  1. 圖像分類 而圖像分類中主要就是幾大模型,這幾個模型作為了很多任務的backbone,分別是如下幾個。這幾個模型考察範圍很局限,無非就是在論文中它們分別作出了哪些改變。要注意的是沒種模型都有特色的block,而這些block有可能是考察點。比如resent中的一個block里有兩個conv,為什麼,要講清楚。
  2. vgg16 vgg19 (主要就是3x3 conv和一些別的細節比對之類 vgg)
  3. inception v1 -v4 (inception進化史(從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet)小提一句:所謂的v4其實就是多加了resnet)
  4. resent 18 - 152 (首先構建了一個18層和一個34層的plain網路,即將所有層進行簡單的鋪疊,然後構建了一個18層和一個34層的residual網路,僅僅是在plain上插入了shortcut,而且這兩個網路的參數量、計算量相同,並且和之前有很好效果的VGG-19相比,計算量要小很多。(36億FLOPs VS 196億FLOPs,FLOPs即每秒浮點運算次數。)這也是作者反覆強調的地方,也是這個模型最大的優勢所在。 這裡我以前一直覺得resnet很簡單,沒太多注意細節的內容,面試後才知道自己欠缺的就是作者提出resnet的原因,以及做了什麼樣的實驗,以及後來的更多的優化,不僅僅是high way,building block 和 bottleneck。 H(x)=F(x)+x F(x)是一個關於恆等式殘差的映射。50層ResNet:我們用這種3層的bottleneck代替34層ResNet中的每個兩層block,構成50層ResNet。我們使用下圖(1)中的投影shortcut來增加維度。這個模型有38億FLOPs。101層和152層ResNet:我們通過使用更多的3層block構建101層和152層ResNet。儘管深度有了顯著的增加,152層ResNet(113億FLOPs)仍然比VGG-16/19(153億/196億FLOPs)複雜度更低。 ======>> resnet進化史 最好是讀一讀原作,這篇文章確實值得研究 後面還有diss renet的文章,認為resnet並不是加了深度,只是在寬度上做了文章,《Residual Networks are Exponential Ensembles of Relatively ShallowNetworks》NIPS上發表。 有一個鏈接很值得看一下:分析各種不同類型的resnet block)

(1)

(2)殘差塊變體

  1. ResNeXt(這個模型的改動真的很簡單,就是將resnet的block進行橫向複製,參數量減少了),Densenet(這個結構進一步使用了shortcut connections,將所有的層互相連接起來。在這個新架構中,每一層的輸入都包含了所有較早的層的feature maps)
  2. 單獨列一個研究 : 「線性衰減規律」 其實這也是resnet的部分,但是這部分內容也很多,就是diss resnet的那個,但其實也是在剖析原理。(鏈接) Deep Networks withStochastic Depth 一文的作者們提出了一個訓練一個深度網路的「反直覺」方法,即在訓練中任意地丟棄網路的層,並在測試中使用整個網路。Veit等人[12]介紹了一個更加「反直覺」的發現:我們可以刪除經過訓練後的ResNet中的部分層,同時保持相當不錯的網路性能。這樣一來ResNet架構就變得更加有趣了,因為在Veit等人的論文中,作者對VGG網路做了同樣的操作,移除了一個VGG網路的部分層,而VGG網路的性能出現了顯著的退化。

為了使訓練過程更清晰易懂,Veit等人首先介紹了一個ResNet的分解圖。當展開這個網路架構以後,我們就能很清楚地發現,一個有著i個殘差塊的ResNet架構有2**i個不同的路徑(因為每一殘差塊會提供兩個獨立的路徑)。

根據以上的分解圖,我們就能清晰地理解為什麼移除ResNet架構中的部分層不會降低其太多性能,這是因為ResNet架構有很多獨立有效路徑,而且大部分路徑在移除了部分層之後會保持完整無損。相反,VGG網路只有一個有效路徑,因此移除一個層都會對它的唯一路徑的性能產生極大的影響。

通過實驗,作者們還發現了ResNet中的路徑有著多模型集成的行為傾向。他們在測試時刪除不同數量的層,檢查網路性能與刪除層的數量是否相關。結果顯示,網路的表現確實有著整體聚集的傾向,具體如下圖所示:

最後,作者們研究了ResNet中路徑的特徵:

很明顯,所有可能路徑長度的分布都與一個Binomial分布相關,如下圖的(a)所示。大部分的路徑都流經了19到35個殘差塊。

為了得到路徑長度k的梯度幅度,作者們首先向網路輸入了一批數據,然後任意採樣了k個殘差塊。當反向傳遞梯度時,他們僅將採樣的殘差塊通過權重層進行傳遞。(b)圖表示隨著路徑長度的增加,梯度幅度會迅速下降。

我們現在可以將每一路徑長度與其期望的梯度大小相乘,看每一路徑長度在訓練中起到多大的作用,就像(c)圖。令人驚訝的是,大多分布都來自於9到18的路徑長度,但它們都只包含少量的總路徑,如(a)圖。這是一個非常有趣的發現,因為這暗示著ResNet無法解決過長路徑的梯度消失問題,ResNet的成功實際上源自於它縮短了它的有效路徑(effective path)的長度。

  • detection 目標檢測方面由於我在這一個項目都沒有,只是提到我。學習過這方面的內容,所以面試官基本就會抓著這方面不斷的仔細詢問。如果你是面試官的話,你當然也是照著簡歷上出現的字眼進行擴散性的思考然後提問。detection的發展歷史要很清楚,2012年, 基於深度學習CNN網路的AlexNet在ILSVRC競賽的ImageNet上大放異彩。 深深影響了做圖像目標檢測UC Berkeley的Jitendra Malik, 他鼓勵博士後Ross Girshick採用CNN技術到圖像目標檢測上。 Ross Girshick剛從他的博士導師Pedro Felipe Felzenszwalb那裡畢業, 讀博期間導師和他一起發明了DPM演算法, 改進了Navneet Dalal和Bill Triggs 提出的HoG特徵方法,成為當時的經典。 Ross Girshick不辱使命, 在2014年利用CNN成功取代了HOG、DPM等特徵提取, 結合Selective Search做區域推薦, 再結合SVM做分類演算法, 成功推出R-CNN,轟動世界。 開啟了深度學習上的圖像目標檢測。 隨後,何凱明也基於SPM推出了SPPNet。
  1. r-cnn (RCNN,fast RCNN,faster RCNN比較歸納總結)
  2. fast r-cnn (其實fast和faster很重要的一點是搞懂roi-pooling的概念 ===> ROI Pooling的意義)
  3. faster-rcnn(實現複雜 和同學討教了實現的具體步驟才明白理解一直有些偏差,主要在RPN網路訓練和主題Faster-rcnn網路訓練上。 Faster R-CNN 深入理解 && 改進方法匯總 我覺得在講到faster-rcnn這一系列的時候,很重要的是講的詳細,而且要發展的變化原因,之後最好可以提及OHEM,R-FCN等 由於看了源碼?faster-rcnn.pytorch,要講講為什麼RGB大神重寫了roi_pooling.cu等之類的以及nvcc的編譯及原理)
  4. yolo v1 v2 9000 以及新出的 v3 (當物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷 YOLO詳解 )
  5. ssd
  6. mask r-cnn(實現複雜)
  7. R-FCN(這個理解複雜)
  8. 一些代碼細節的演算法:iou計算,nms計算等等。(非極大值抑制(Non Maximum Suppression) 這個講的NMS算是比較清楚了,iou其實很簡單想想就行,包在了NMS裡面)一個看到的trick : Soft-NMS (detection結果提高了一點 Improving Object Detection with One line of Code)
  • 圖像分割 這一塊的內容我是基本沒有接觸了,但是由於mask-rcnn的關係多少懂一點,而且後來學到了反卷積,知道了fcn,以及別組同學做的deeplab的研究,多少懂了一點,在這方面,我覺得應該總結出一個項目來,寫到簡歷里才有的說。
  1. r-fcn
  2. mask r-cnn
  3. deeplab

1. 圖像方面其實還有很基礎的知識需要考察,因為這塊還包含了基礎的深度學習理論以及一些傳統圖像方面的只是,比如Adam,sgd,dilated conv,sift 等等,我在下面列出一個li?s?t在大概包括一下。

  1. 梯度下降的種類(數學原理)
  2. 一些技巧性較高conv(depwise seperable conv,dilated conv 之類)
  3. bp推導,bptt(這個一般不用)
  4. 各種初始化
  5. 各種激活函數
  6. BN詳細的數學原理,梯度消失,梯度爆炸等
  7. 全局平均池化層代替全聯接,high way(這一類的論文trick)
  8. 什麼是上採樣,下採樣等(upsampling)
  9. tranlation invariance,translation variance,SIFT等等
  10. OHEM,HED等(改進faster-rcnn的,別的識別模型的等等)
  11. 還有一系列等等,我暫時還想不到

再來就是工程方面的

其實我在工程方面積累了很多的知識,但是面試的時候會因為緊張,時間短等各種因素,你沒法表現出來你的能力,所以我覺得很重要的一點就是要去引導面試官去對你能力強的一方面面露喜色。我覺得在這方面講一定不能讓面試官覺得你就是用別人的源碼,做了調調參數的活,那樣就死定了。

  1. tensorflow的原生api,我一段時間是用的很熟了,但是久了難免會忘記很多實現細節,所以需要複習一遍tensorflow的整體框架,如果面試官提到項目具體實現,就在代碼細節中稍微體現一下,比如with scope 這種命名層格式,tfrecord怎麼處理,內存隊列機制。有時間最好去研究研究幾個函數源碼,好和面試官吹。
  2. pytorch是最好的前端了,所以一定要很熟悉,不管是寫代碼還是實現也好,現在和caffe2結合以後更加無敵了。
  3. caffe,面試官基本都會問caffe會用嗎。。。我就很無語,所以這玩意還是得學點。
  4. 各種深度網路trick的底層實現(conv,pool之類的,這個在吳恩達的deeplearning.ai里都做過,但是如果你不自己表現出來面試官是不知道的,比如談到卷積時就說說自己在實現卷積時遇到了什麼麻煩,比如計算公式,缺少對channel操作等等,總之要展現自己)
  5. keras這種高封裝的其實不用怎麼聊了,我覺得可以提到一點是這個其帶了很多現成model,實現遷移學習很快。

2. c++ 方面也是會考的,比如今天就問了我虛函數的用法以及為什麼,這一塊知識點很多,我覺得最好是c++ primier能搞定,再去搞定effective c++後會比較好,總結下我認為會考的(這些都是簡單的了)

  1. c++的內存管理機制(五大區)
  2. 多態,繼承,虛函數
  3. 類,結構體的內存存儲機制
  4. 指針的用法
  5. 基本語法(這種問的概率不大,因為太簡單)
  6. 模版
  7. 智能指針,單列出來,因為和指針還是有一定的區別的

3. python方面基本不考,我個人是認為在這方面可以去學一本書,流暢的python,積累一定的模式經驗感覺,別的不必了,畢竟平時都一直在用python。


推薦閱讀:

TAG:計算機視覺 | 面試 | 深度學習DeepLearning |