1. 程式人生 > >deeplearning筆記4:卷積神經網路

deeplearning筆記4:卷積神經網路

卷積神經網路

為什麼要用卷積神經網路-卷積神經網路的作用

防止model overfitting

在計算機視覺中,input vector往往維度很高,將其直接應用於neural network很有可能會造成overfitting,以下圖為例:
在“cat recognition”中,cat image為64643的vector,將其轉換到一維空間,則其維度為12288,如此高維的input直接輸入neural network會造成overfitting現象。

在“卷積神經網路”中,可以用convolution operation對原始input進行降維,從而防止neural network過擬合。

邊緣檢測

convolution operation除可用於“降維”,還可用於“邊緣檢測”,如下圖所示:
在人臉識別中,convolution operation可以識別人臉的區域性邊界——人臉區域性——整個人臉;
在object recognition中,convolution operation可以識別image中“垂直部分”和“水平部分”;
在這裡插入圖片描述
利用convolution operation進行邊緣檢測的原理如下:

  • 首先,先介紹一下什麼叫“convolution operation”:
    下圖中,最左邊的matrix為input,中間matrix為filter,最右邊matrix為output。convolution operation是指將filter matrix對映於input matrix,並且將他們的對應元素相乘後求和,將最終結果作為output,如:說先將filter matrix與input matrix在upper-left 元素上對齊:其convolution operation為:
    110+1
    10+110-110-110-110=0,則output[0][0]=0。將filter matrix在input matrix上依次移動,求convolution operation value作為相應位置的output。
  • 利用convolution operation進行邊緣檢測
    如下圖所示:
    我們首先定義在input matrix中,元素=10,表示“白色”,元素=0,表示“灰色”。灰色與白色之間的那個邊界即為我們要檢測的“邊界”。
    將filter在input上進行對映,得到output,可以看出,output為“中間白色,兩邊灰色”的image,其中間的那條白色條紋,即為我們要檢測的“邊界”。
    利用convolution operation進行邊界檢測的關鍵在於,選好filter,用其過濾出input的邊界。

值得一提的是,convolution operation除可進行“垂直檢測”以外,也可進行任何“角度的檢測”,具體方法如下圖所示:
將filter中的各個元素設為未知數w_i,利用backward propagation求解引數w_i,使得output為某個角度的“邊緣檢測”。

卷積神經網路的基本組成部分-convolution operation

在上一節中已經講了convolution operation的原理,本節主要講述一下convolution operation涉及的幾個過程:

  • padding
    利用原來的convolution operator有兩個缺點:1)shrink output from 66 to 44;2)throw away information from edge since the corner pixel in image use less compared to the center pixel;
    To solve this,we can use padding;
    Padding的目的是向image邊上加border,從而可以抵消上述兩個downside的負面影響;
    對於(nn) imgae 利用 (ff) filter進行convolution operation ,得到(n-f+1 * n-f+1) image;而如果使用Padding後,得到的imgae為( n+2p-f+1 * n+2p-f+1);
    padding具體操作如下圖所示:
    向最左邊的input matrix加入padding,實際上就是在其邊緣在加入幾層border,從而可以使output與input具有同樣的維度,且,可以使原input的邊緣value能夠得到更好的應用(如果不加padding,input邊緣元素只能被用一次,而加入padding後,在執行convolution operation時,input邊緣元素可以被用多次。)
  • stride
    在上一節(邊緣檢測)中執行的convolution operation,filter的移動步長為1,在實際應用中,我們可以讓filter在input matrix上一次移動n個步長,下圖為stride=2的情況:
  • summary of convolutions
    下圖為(n,n)的image經過filter=(f,f),padding=p,stride=s convolution operation後output的維度(note that:當計算出的output的dimension為小數時,向下取整):
  • convolution operation中的filter
    convolution operation中的filter有3種:CONV,pooling,FC,通過這3種filter分別可以得到對應的3中layer:CONV,pooling,FC:
    (1) conv filter:在這種filter中,會將filter與input對應元素相乘然後求和。
    (2) pooling filter:有兩種,分別為Max pooling和Average pooling,Max pooling中,是將filter對應的input部分的元素中的最大值作為output返回,如下圖所示:
    Max POOL之所以效果良好,是因為:假如將input看成feature,Max POOL可以將最顯著的feature留下,從而最大的保留Image的資訊。
    比起average pooling,max pooling使用更頻繁。
    在這裡插入圖片描述
    在Average booling中,是將filter對應的input部分的元素的mean作為output返回。如下圖所示(實際中,除了將其應用於image compression外,average pooling很少被使用):

    在pooling filter中,沒有引數weight,只有hyperparameter:filter size,filter stride,這些超引數可以通過cross-validation選出最優值,下圖為summary of pooling filter:

    (3) FC(fully connected) filter:它首先將input展開為一個1維向量(m,1),利用FC filter weight(n,m),可以將展開的input從(m,1)轉為(n,1)。它實際上就是一個linear model。
    note that:與FC相比,CONV filter具有更少的引數,能夠有效防止overfitting,如下圖所示:

    在這裡插入圖片描述
    上述3種filter中,pooling filter只有hyperparameter:stride,filter size,可以通過cross-validation獲得最優值。而另外兩種filter,FC,CONV,其引數的求解可以通過gradient descent(GD/Adam/RMS prop)進行。

卷積神經網路cost function

在convolution neural network中,其cost function為“最大似然函式”,如下圖所示:

convolution operation on volumes

前面講的convolution operation是在“二維空間”進行的,這節講的convolution operation是在“三維空間”進行的,它與前面所講的convolution operation操作相近,只是filter也從二維上升到了三維,如下圖所示:
對於一個(6,6,3)的input,其filter為(n,n,3),二者的convolution operation,即:將filter與input相應位置的元素相乘然後進行加法運算,得到最終的output。
下圖中,給input運用了2個filter(3,3,3),每個filter會得到一個output(4,4,1),將兩個output疊加,即為最終的輸出(4,4,2)。

單層卷積神經網路

  • 單層卷積神經網路
    卷積神經網路與普通的神經網路類似,每層hidden layer均包含以下幾個要素:weight,bias,input,z,acitve function g,a。
    z = w * x + b
    a = g(z)
    在卷積神經網路中,weight即為filter,如下圖所示:將input與filter進行convolution operation,得到z值,然後,將z值輸入active function(ReLu),獲得active value a。
  • summary of notation
    下面列出了 l 層layer的各個notation:

卷積神經網路示例

  • 簡單的ConvNet example
    以下PPT示例了一個簡單的convNet:(assuming network is a cat recognition classifier)
    Input matrix: 39393
    Output matrix:7740
    得到Output以後,將matrix展開, 為1維vector,利用該vector 擬合 logistic/softmax function,得到最終的一個輸出結果y;通過y即可判斷image的類別;
    Note that: softmax function is a generalization of logistic function;
  • 結合了CONV,FC,Pool 3種filter的卷積神經網路
    下述PPT為識別(0~9)的分類器:
    下述PPT是一個common 卷積神經網路,他結合了CONV,POOL,FC三種layers,最後用softmax作為output function,得到(10,1)的vector,每一個元素代表一個類別的概率值;
    Hyperparameter的選取,以及具體設定可檢視文獻 ,從別人的設定中吸取經驗;


    上述PPT為對此節中分類器的總結:
    Note that:If activation size drops too quickly ,it is not good for neural network performance;

Technical note on cross-correlation VS convolution

在前幾節中,我們所講的convolution operation,filter都不會進行mirring action(flipping),嚴格來講,在教科書中,這種操作叫做cross-correlation;
如果在進行convolution operation之前,首先將filter 翻轉,然後在用flipped filter進行convolution operation,則可以將這種操作嚴格定義為convolution operation。這種filter flipping使得convolution operation有以下性質:(AB)C=A(BC);這種操作在“訊號處理”中,可以取得better performance,但是In deep learning ,一般不需要刻意進行filter flipping,也可取得good performance;
filter flipping操作如下圖所示:
首先將fiter在“垂直和水平方向”進行flipping,然後,對input和flipped filter進行convolution operation。

深度卷積網路:例項探究

本節主要講解一些經典的“卷積神經網路”(如下圖所示),為讀者構建自己的“卷積神經網路”提供一些參考。

經典網路

  • LeNet - 5
    其結構為:input -[conv filter, average pool filter, conv filter, average pool filter, FC, FC] - output
    各個filter的size,stride,active function如下圖所示:
    在這裡插入圖片描述
  • AlexNet
    比起LeNet-5,AlexNet更加bigger,其具體結構如下圖所示:
    在這裡插入圖片描述
  • VGG -16
    VGG-16中16表示有16個Layer有weight;
    The number of channel goes up :64,128,256,512… by conv
    The height and width of input goes down:224,112,56,28,14…by POOL
    其parameter is up to 138 million;這樣龐大的network即便放在當代也是非常龐大的;
    VGG-16具體結構如下圖所示:
    在VGG-16中,conv filter size = 33,stride=1,padding使得convolution operation前後的input,output具有相同的維數。MAX-POOL size=22,stride=2;
    [CONV 64] *2表示:前2層layer都是利用conv filter進行convolution operation,且filter 的channel number=64;
    在這裡插入圖片描述

殘差網路

  • 殘差網路塊的構建
    在普通的神經網路(plain neural network)中,要訓練一個deep neural network是很難的,因為,deep neural network可能會導致weight exploding或weight vanishing的現象。"殘差網路"能夠很好的解決“deep neural network”中weight exploding or vanishing的現象。
    殘差網路:是由殘差網路塊 構成的,殘差網路塊 的構建如下:
    在普通的神經網路中,a[l]到a[l+2]的構建過程如下:
    z[l+1]=w[l+1]a[l]+b[l+1],a[l+1]=g(z[l+1]),
    z[l+2]=w[l+2]a[l+1]+b[l+2],a[l+2]=g(z[l+2]);
    在殘差網路中,a[l]到a[l+2]的構建過程如下:
    z[l+1]=w[l+1]a[l]+b[l+1],a[l+1]=g(z[l+1]),
    z[l+2]=w[l+2]a[l+1]+b[l+2],a[l+2]=g(z[l+2]+a[l]);
    可以看出,普通神經網路和殘差神經網路的主要區別在於a[l+2]的構建,這種差異,可以防止在構建深層神經網路時,發生weight exploding or vanishing現象。
    在這裡插入圖片描述
    上圖講解了殘差網路塊的構建方法,下圖中,給出了“普通神經網路(plain neural network)”和“殘差神經網路”,隨著layer 層數的增加,training error的變化情況:
    如圖所示:在plain neural network中,隨著layer數量的增加,training error是呈現“先降低後增加”的趨勢的,這與theory並不一致。而在ResNet中,隨著layer數量的增加,training error是一直呈現“降低”趨勢的。
    造成plain neural network中,training error先降後增趨勢的主要原因,是因為,構建“深層網路”的難度會逐漸加大。

  • 為什麼使用殘差網路能夠構建“深層神經網路”
    “殘差網路”之所以能夠構建“深層神經網路”,是因為,隨著layer數量的增加,對於plain neural network來說,為了不hurt neural network的performance,需要通過調節weight來使得a[l+2]與a[l]相同,這對於plain neural network來說,是很難辦到的。而在“殘差網路”中,為了使a[l+2]與a[l]相同,我們可以根據公式:a[l+2]=g(w[l+2]a[l+1]+b[l+2]+a[l]),使得w[l+2],b[l+2]都等於0,這樣:a[l+2]=g(a[l]),由於active function是一個ReLu,因此,a[l+2]=g(a[l])=a[l]。“殘差網路”利用這種辦法,可以防止在layer較多時,performance下降,從而可以構建一個“深層神經網路”。
    在上述公式:a[l+2]=g(z[l+2]+a[l])中,要保證z[l+2]和a[l]具有相同的維度,方法具體有如下兩種:
    1、可以利用ws矩陣來保證z[l+2]和ws*a[l]具有相同的維度,ws可以是未知數,用gradient descent求得;(ws中,多處的部分可以用0來填充,相當於0 padding)
    2、使用“same convolution(即:卷積前後,維度相同)”,來保證z[l+2]和a[l]具有相同的維度。

  • 將plain neural network變為ResNet
    將plain neural network轉化為ResNet,只需要每隔兩層,將a[l]新增與a[l+2]的計算中,即:a[l+2]=g(z[l+2]+a[l]);(需確保z[l+2]和a[l]具有相同的維度)

1*1 convolution(network in network)

11 convolution的實質,就是將一個number乘到各個input element上,並對channel方向上的各個“multiplication value”相加。
1
1 convolution的主要作用是控制output的channel dimension。
如下圖所示:對於一個 6632的input,可以通過1132的filter,將其output的dimension降維:661,從而降低“電腦計算量”。
在這裡插入圖片描述
如下圖所示,通過11 convolution可以給出任意channel的output。
下圖中:28
28192 input,與32個11192 filter,進行convolution operation之後,得到一個282832的output。
谷歌的inception network中便運用了1
1 convolution,具體看下節inception network。
在這裡插入圖片描述

inception network

inception neural network中,會利用11 convolution來降低input channel,從而減少計算量,如下圖示:
將28
28192 input,利用各種filter,得到output layer,最後將這些output layer 堆疊起來,便得到最終的output。在這個過程中,存在一個問題:input channel很大,因此,需要花費很多的計算量。為了降低計算量,我們可以通過引入11 convolution來解決。
(convolution operation中的各個數值如圖示)

下圖為引入11 convolution後,卷積神經網路的計算過程,從圖中可以看出,引入16個11*192 convolution後,可以將input channel降低至16,在這個基礎上,進行各種convolution operation,將極大的降低計算量。


上圖中,展示了一個inception network block,其具體由幾部分構成:1、利用11 convolution對input channel進行降維;2、對降維後的input進行各種convolution operation。
下圖展示了一個簡單的inception neural module:其convolution operation中,整合了很多的1
1 convolution的使用。

下圖中為一個完整的inception network:
該inception network是由上述inception network module組合而成的,在這個inception network中,很多hidden layer直接應用了FC filter — softmax(output可以用於預測input的label)。這種做法可以使得inception在不同的layer 深度進行label的預測,從而有效防止overfitting。

使用開源的實現方案

利用github中已訓練出的一些neural network,作為你訓練工作的“初始點”,可以,幫助你更快的得到fitted model。此外,利用github中的這些neural network,也可以展開“遷移學習”。

遷移學習

可以將github中的一些“開源network”,應用於“遷移學習”中:
1、“小型資料”的“遷移學習”
將softmax function的output設為現在的number of classification label ,保持其它的neural network 不變。
在進行transfer learning時,可將原input -> last layer of network 的計算值儲存在disk上,然後,根據最後一層Layer計算得出的feature vector,利用Gradient descent計算softmax function的引數。用於predict;
2、“中型資料”的“遷移學習”
可以凍結前幾層layer的weight,修改softmax function。然後,訓練後邊的network的引數:1)後邊network的訓練,其初始值可以選用原來的weight。
2)後邊network,可以使用自己自定義的network,然後,利用GD訓練weight。
3、“大型資料”的“遷移學習”
可以使用原訓練的weight,作為初始值,訓練network。
Ps:記得修改softmax function;

在computer vision中,可利用transfer learning ,利用別人的code去訓練自己的模型,往往能達到很好的效果;

資料擴充

在“計算機視覺”中,可用的training dataset往往較小,針對這種情況,可以用以下提及的“資料擴充方法”增加training dataset的size。

  • 對於一個Image,可以通過mirroring,cropping等手段,增加資料量,除此以外,還可利用right-hand of PPT 去增加資料量,但是這些方法在實際中應用較少,因為,比較複雜;
  • In practice,R,G,B are drawn from some distribution。(PCA color augmentation)。Color distorting make your algorithm more robust to color changes.
  • 如果你的資料量很大,且儲存在harddisk上,則“資料傳入CPU,進行distort”,以及“training”這兩個step,可以在不同的thread中進行,通常這兩個不同的step可以進行“平行計算”。

在data augmentation中,也有一些hyperparameter to tune,you can use open source ,but if you want to have more invariance in data augmentation ,you can also tune hyperparameter by yourself。

計算機視覺現狀

  • 計算機視覺現狀:
    缺少資料來進行training,特別是對於object detection而言,更是如此。在資料量非常有限的情況下,常常需要hand-engineering,來輔助training。
  • tips for doing well on benchmarks/winning competitions
    如果想做benchmark,或者win competition,以上兩個建議可採納:1)訓練多條神經網路,然後將其output平均,得到最終的output結果。這往往能夠提高準確率1%-2%。但是這樣,非常消耗computer memory,computation,因此,不適用於實際的生產系統。
    2)通過data augmentation 增加測試集數量(一種augmentation,形成一個測試集),平均各個測試集的結果,獲得最終的精確度。這個相比1)使用的計算資源和記憶體資源較少,可以用於實際的生產系統中。 (如下圖示)
  • use open source code
    在訓練自己的classifier,可以利用別人的code,architectures,pretrained models,open source implementations。(如下圖示)
    在這裡插入圖片描述

目標檢測

目標定位

利用image classification可以識別“image”中的object;
而classification with localization能夠鎖定要識別的object,進而用於“目標檢測”;

以下圖為例說明:
在目標檢測中:
首先將image中的object進行鎖定,如圖image中的red bound;
然後對鎖定的object 進行classification;
在下述例子中,object的類別有4中,pedestrian,car,motorcycle,background;
用於鎖定object的red bound可以用座標表示:bx(中心點x座標),by(中心點y座標),bh(red bound的高度),bw(red bound的寬度);
Pc用於表示image中是否有object。
將image input輸入 model,即可得到上述8個output的值,具體,見下一張PPT。

如下PPT中,展示了model的output{Pc,bx,by,bh,bw,C1,C2,C3},其中Pc={0:image中沒有object,1:image中有object},bx,by,bh,bw為紅框座標值,C1,C2,C3為1時,分別表示image中存在pedestrian,car,motorcycle。
在“目標檢測”中,cost function可以使用如下形式:
1)對於不同的output,其cost function的形式不同:
Pc:可以用logisitc/max likelihood;
bx,by,bw,bh:可以用“squared error”;
C1,C2,C3:可以用softmax/max likelihood;
將3種形式的cost function相加,即為model的cost function.
這種cost function在實際中比較常用;
2)除使用上述形式的cost function以外,對於不同的output,也可以統一使用“squared error cost function”。
在cost function計算中,如果:
Pc=1,則其他的output對於cost function比較重要,需要關注;
Pc=0,說明image中沒有object,其他的output don’t care。

特徵點檢測

目標檢測,可以應用於很多實際場景,如:
識別人的表情:通過標識人臉的關鍵部位(landmark)座標,來判斷一個人此時此刻的表情;
計算機圖形化:如給人的頭部加上一頂皇冠:同樣的,首先識別人臉landmark的座標,然後,根據該座標值,判斷皇冠的具體位置(座標);
判斷人現在的motion:標識人體關鍵部位的座標,如:肩,手臂關節等,通過landmark的座標值,判斷人此時此刻的動作。
具體操作步驟:
step1:構建trainingdata{X:image input,y:人工標記的image中各個landmark的座標}
step2:將training data投入“卷積神經網路”,訓練network的引數;
step3:將一個test sample input投入訓練好的“卷積神經網路”,即可得到test sample中各個landmark的座標值。進而可以根據這些座標值,判斷image中人的面部表情,進行計算機圖形繪製,人的motion等等。

目標檢測(sliding window detection)

我們執行目標檢測的步驟如下:
step1:利用一個定常的bounding box,在image中移動,形成一個個小的image(cropped image);
step2:將這些cropped image輸入已經訓練好的ConvNet,判斷其是否為object。
下圖為car detection task:將image 以指定體積 切成多個sub_image,然後,將這些sub_image送入訓練好的ConvNet,判斷其是否為car。

在實際工作中,我們要將不同size的bounding box在image中以不同的sliding stride移動,從而得到若干sub_image,將這些sub_image送入以訓練好的ConvNet,判定這些sub_image是否為object。
在實際應用中要注意,sliding stride不能太大,否則,可能會漏掉object。

由於要以不同size的bounding box遊走整個image,並且將這些sub_image送入ConvNet中進行預測,因此,即便只是預測一個image,也會花費很大的計算量。為了克服這個難點,學者提出了“卷積的滑動視窗實現”。

卷積的滑動視窗實現

在上一節中,我們提到,sliding window object detection的使用,會花費很多的計算量。為了解決這一問題,學者提出了“卷積的滑動視窗實現”,其核心思想是:將原input,利用ConvNet,進行降維預測,每一個output代表一個bounding box image的預測結果,通過這種方式,可以一次性的對image上的所有bounding box image進行object detection,從而大大降低了計算量。
具體實現,如下圖所示:

  • 首先,先介紹一下FC layer 向 convolutional layer的轉化:
    PPT中,upper ConvNet中最後的幾層layer是由FC實現的,below ConvNet中,將FC實現部分,改為通過CONV實現,具體講:
    第一個FC layer的CONV實現:是通過400個5516 filter實現的;
    第二個FC layer的CONV實現:是通過400個11400 filter實現的;
    最後的output:是通過4個11400 filter實現的;
  • 其次,介紹一下“卷積視窗的實現方式”
    下PPT中,FC layer的實現,均採用convolutional way。
    我們來看中間的那個ConvNet:
    首先,將image的bounding box設定為14*14,其sliding stride為:2,因此,在圖中image中,會獲得4個bounding box sub_image,如果按照“sliding window object detection”的做法,需要將這些sub_image投入訓練好的ConvNet,從而判定各個sub_image中是否有object。但是在“卷積視窗滑動”種,該ConvNet會直接輸出4個output,分別用來表示4個bounding box sub_image中的object檢測結果。圖(中)output中的upper left表示upper bounding box的object detection結果,upper right表示upper bounding box的object detection結果,below left表示below left bounding box object detection結果,below right表示below right bounding box object detection結果。
    縮小bounding box size,從而得到更多的sub_image,根據sub_image的數量n,將ConvNet的輸出設定為相應的n個output。這n個output即為對應的sub_image的object detection結果(如圖(下))。

    以car detection為例說明“卷積視窗實現”的應用:
    step1:將image用bounding box切分成n個sub_image。
    step2:以image為input,構建ConvNet結構,訓練ConvNet,使得其n個output分別代表n個sub_image的object detection結果。通過這個步驟,可以避免independently將sub_image輸入ConvNet,進行object detection,從而大大降低了演算法的計算量。

雖然“卷積視窗的實現”與“sliding window object detection”相比,能夠極大降低計算量,但是,他也有一個缺點,即:The position of bounding box is not that accurate(邊界框的位置無法精確定位)。針對這一問題,學者提出了一種解決演算法:YOLO algorithm。

Bounding box 預測

通過YOLO algorithm可以得到the accurate position of bounding box。
下面介紹YOLO的核心思想:
YOLO的核心思想是將image切分成nn份sub_image(下圖n=3),利用一個ConvNet同時預測nn個sub_image的label。
在下圖中,其label為81的vector(Px,bx,by,bh,bw,c1,c2,c3)。
因此,如果將image切分成3
3的grid,ConvNet的output將為338,每個118為一個sub_image的label的預測值。在上述預測過程中,整個image為ConvNet的input,ConvNet的output為338 matrix。
與“sliding widow object detection”相比,YOLO能夠更精確的定位bounding box的位置,而在"sliding window object detection"中,由於bounding box一直slide with a specific stride,因此無法準確定位某個bounding box的具體位置。除以以外,YOLO能夠一次性的預測出所有bounding box sub_image的output(like 卷積視窗實現),而sliding window object detection中,每個sub_image都需要單獨進行預測,計算量龐大。
在YOLO中,有以下幾個注意事項:
1)當object位於多個bounding box中,將object中心點所在bounding box作為其所在bounding box。
2)在YOLO演算法中,通過將切分粒度細化,可以防止同一個bounding box中,包含多個object。
在這裡插入圖片描述
上述例子中,bounding box中object的編碼方法如下:
假設每個bounding box的upper left point座標為(0,0),below right point座標為(1,1)。根據這個座標系來判斷object中心點的位置(bx,by),然後,根據object佔bounding box邊長的比例,來確定bw,bh。
其中,bx,by取值[0,1]。bw,bh取值可以>1,因為object的size可能大於bounding box edge size。

交併化 (IOU) intersection over union(used for evaluationg object algorithm or adding one element to make object detection algorithm work better)
  • IOU的計算公式如下PPT,為:兩個bounding box的intersection / 兩個bounding box的union;
  • IOU作用:
    1.判斷兩個bounding box的相似度;
    2.判斷一個bounding box是否正確覆蓋object(這種說法是假設我們知道一個image中object的正確的bounding box,然後估算algorithm中產生的bounding box是否能夠正確覆蓋object,當二者IOU>0.5時,被認為algorithm中的bounding box可以覆蓋object);
    在下一節“non-max suppression”中,我們將通過IOU去除多個覆蓋object的bounding box,具體做法參見下節。
    在這裡插入圖片描述
非極大值限值(non-max suppression)

在object detection中,可能存在這樣的現象,即:多個bounding box都覆蓋同一個object,為了避免overestimate object的數量,我們期望,每個object,只有一個bounding box,“非極大值限值”即可實現上述目的。
“非極大值限值”核心思想:
如下圖所示,image中的兩個car,均有很多bounding box覆蓋他們,以image中right-hand car為例說明:為了使car 只有一個bounding box我們可以進行下述操作:
step1:利用ConvNet獲得各個grid的probability;
step2:將probability<threshold的grid去除,剩下的grid組合成bounding box的形狀;(自己的理解)
step3:根據grid的probability預測這些bounding box的probability;(自己的理解)
step4:選出一個最大的probability作為car的bounding box(記為B);
step5:計算其他的bounding box與B的IOU,當IOU>0.5(認為設定)時,將其他的bounding box去除;
step6:剩下的bounding box即為各個object的bounding box;


下述PPT為car detection的non-max suppression algorithm:

如果想要同時對image中的car,motor,pedstrain進行檢測,則在進行Non-max suppression時,應該分開進行,即在上述algorithm的基礎上在加一個for loop: for e in [car,motor,pedestrain],使得non-max suppression algorithm每次只針對一個object進行。

上述的object detection中,每個grid只能detect only one object,為了使得grid能夠識別多個object,可以引入“anchor boxes”,如下節所示。

anchor boxes

anchor boxes的核心思想是:對於給定的grid,賦予其兩個預先定義好的(在本節例子中為2個,實際也可為>2個)anchor boxes。
如下圖所示:middle point所在的grid同時覆蓋兩個object, 為了能夠同時識別這兩個object,我們引入預先設定的anchor boxes{anchor box1:代表行人,anchor box2:代表car},並用這兩個anchor boxes去與grid的bounding box相比較,與anchor box1相似,說明有pedestrain,與anchor box2相似,說明有car。針對anchor box,將原output修改為(16,1),前8個output代表anchor box1的檢測結果,後8個output代表anchor box2的檢測結果。

上幾節中,我們所講的object detection與anchor box object detection區別如下PPT所示:

Note that:
當一個grid中包含3個object,或者2個object都全部覆蓋於一個grid時,又或者一個anchor box同時與2個object相符合時,anchor box object detection效果不好,需要採取一些機制,smooth這些problem。
anchor box可以人為設定(如上例中,認為設定表示“行人”和“車”的anchor box shape),也可以利用一些algorithm形成(自己查閱文獻)。

YOLO演算法
  • training
    在利用YOLO演算法訓練時,我們要得到的是將training data切分為332 slice(In pratical :19195)(其中2指2個anchor box)後,每個slice的預測結果。
    利用YOLO進行訓練的具體操作如下:
    step1:製作training data為:{X:1001003的image,y:人工標記好的332個slice的預測結果(3328)},target y包括每個grid下產生的bounding box的座標,這些座標由人工標註,用於training。
    step2:利用這個training data訓練一個ConvNet,使得輸入一個test sample,輸出為該image的3
    32個slice的預測結果3328;
    每一個111*8為一個grid cell(slice)的一個anchor box的預測結果;
    需要注意的是,在output y 中,如果pc<0.5,說明沒有object,則可不對其他的element進行預測;
    解析:各個grid的output可以通過一個ConvNet實現,這些output包括(Pc,bounding box座標,3個class的類別)。在每個grid上加入anchor box後,在進行人工標記時,會標註每個anchor box下的(Pc,bounding box,3個class的類別),note that,anchor box是人為設定的,給定一個grid時,其anchor box相當於是基於此grid的中心點,又設定了兩個固定長寬的box。
    根據上述的描述,每個grid的每個anchor box有一個bounding box,而object可能位於多個grid中,因而使得一個object可能有多個bounding box,為了解決這個問題,可以對每一類的object分別使用non-max suppression。
    Note that:每一個grid的每一個anchor box的output為(Pc,bx,by,bh,bw,c1,c2,c3),因此,每個anchor box都會形成一個bounding box。這裡bounding box也是output的一部分。
    在訓練階段,訓練樣本中的image中各個grid的各個anchor box的bounding box的座標是人工標註的。

  • prediction
    在獲得object detection的output之後,即可確定每個grid的probability,以及各個grid 的 bounding box,並且將概率值<threshold的bounding box去掉。在剩下的bounding box中,利用non-max suppression為每個object選出一個bounding box,具體步驟如下:
    在IOU>0.5的bounding box中,選出probability最大的bounding box作為object的bounding box,其他的bounding box去掉。
    上述解決方案為one object detection,對於multi object detection,在做non-max suppression時,需要對每一個object independently做,具體如下:
    For loop(每一類object (如:car)):
    在IOU>0.5的bounding boxes中,留下probability最大的那一個bounding box,去掉其他的bounding boxes,最終留下的bounding boxes即為各個car的bounding box。

  • output the non-max suppressed outputs
    在anchor object detection中,對於每個grid會獲得兩個bounding boxes。
    將image中所有的bounding box中probability<threshold的bounding box去掉。
    對於每一類object:採用non-max suppression,從而確保每一個object只有一個bounding box。

RPN網路

在“sliding window object detection”中,你需要花費很多時間對沒有object的blank grid進行預測,這顯然是非常低效的,為了改進這一downside,學者提出了“region proposals”的概念,如下圖(3)所示:
region proposals的核心思想是:切分出可能有object的區域,然後,對這些區域進行分別預測,判斷其是否為一個object,並且預測其bounding box的座標。

在上述的"region proposals"方法中,有幾個可以改進的點(如下圖所示):
普通的R-CNN步驟:1)切分出regions;2)依次對每個region進行分類,輸出label+bounding box;
Fast-R-CNN:1)切分出regions;2)用“卷積視窗實現”一次性對所有regions做出預測,輸出所有region的label+bounding box;
Faster R-CNN:上述Fast-R-CNN的一個limitation是,region segmentation耗時較長,為了解決這一limitation,學者提出“利用 ConvNet 來切分regions”;
Note that:即便是Faster R-CNN,其對test sample的預測依然需要分兩步進行,相比YOLO algorithm,其依然需要花費較高的時間複雜度。
AndrewNg personal view:比起R-CNN,“卷積視窗實現”在computer vision中更具前景,因為,他不需要分步進行,只用一個ConvNet便可對test sample進行預測。
在這裡插入圖片描述

特殊應用:人臉識別和神經風格轉換

什麼是人臉識別

下邊的PPT講述了“face verification”和“face recognition”的區別:
Face verification:
input image,name,algorithm會驗證所輸入的image是否是聲稱的人。
Face recognition:
輸入image,如果database中有這個人,algorithm將返回其name/ID。
與Face verification相比,Face recognition難度更大。在Face verification中,如果algorithm精確度為99%,可用。而在Face recognition中,如果algorithm精確度為99%,其對於Face recognition ,精確度依然太低,不可用。造成這種差別的原因是因為:在face verification中,input:comparision object=1:1,當algorithm精確度為99%時,其錯誤率僅為1%。而在face recognition中,input:comparision object=1:k,當algorithm精確度為99%時,其錯誤率為k%。k為face recognition中database的image數量。

One-shot學習
  • 什麼叫one-shot learning
    for most face recognitions, you need to recognize a person given just one single image, or given just one example of that person’s face。
    如下圖所示:
    在一個“人臉識別系統”中,database中每個人的image只有一張,要訓練一個ConvNet,使得輸入一張image,然後判斷該image是否與database中的某一張image相似,這種做法是非常不可取的,原因如下:1)本身擁有的training data size過小;2)如果新來一個同事,database將又增加一個image,那麼,我們將要重新訓練PPT所示的ConvNet,效率過低。
    在這裡插入圖片描述

  • One-shot learning的正確開啟方式
    一種學習One-shot learning的方式是:設計一個d(image1,image2)公式,計算像個image的距離,距離越小,說明相似度越大,越有可能是同一個人。
    如下圖所示:
    對於給定的input image,計算其與database中的image2的d(image1,image2),如果d<threshold,則說明input image即為database中的這個image2,否則,這兩個image不是同一個人。

Siamese network

Siamese network的主要工作是,對輸入的image重新編碼,使得該編碼最能代表image。其內在機理如下圖所示:
給定一個Siamese network,當輸入x(i)時,其輸出x(i)的編碼f(x(i))。則兩個image x(i),x(j)之間的距離可用 ||f(x(i))-f(x(j))||2 表示。
在這裡插入圖片描述

  • Siamese network引數求解方法
    Siamese network的引數求解主要是根據下述規則進行的:
    1、對於給定的兩個image,如果兩個image為同一個人,則使得:||f(x(i))-f(x(j))||2儘可能的小;
    2、如果這兩個image為不同的人時,則使得:||f(x(i))-f(x(j))||2儘可能的大;
    根據上述規則,利用backward propagation,即可求解Siamese network的parameter。

    現在,我們已經知道Siamese network 引數的大致求解思路,但是,在實際應用中,其“目標函式”如何定義呢?下一節將為你解開答案。
Triplet損失
  • Triplet 損失函式的定義
    在實際應用中,Siamese network的目標函式為Triplet 損失函式,他可用於訓練Siamese network的引數。Triplet損失函式的核心思想如下圖所示:
    在Triplet中,一個training sample包含3個image,分別為(anchor,positive,negative),其中anchor和positive為同一個人,anchor和negative為不同的人。假設anchor的編碼為f(A),positive的編碼為f§,negative的編碼為f(N)。Triplet的目標是使得:||f(A)-f§||2與||f(A)-f§||2之間的差值最大,其中||f(A)-f§||2代表兩個相同的image的距離,應儘可能的小,而||f(A)-f§||2代表兩個不同的image的距離,應儘可能的大。Triplet具體可表示為: ||f(A)-f§||2- ||f(A)-f§||2 <= 0,其中,由於當f(i)=0時,||f(A)-f§||2- ||f(A)-f§||2 = 0 ,但是,此時的Siamese network並不能得到一個有效的編碼,為了,避免這種訓練結果的發生,我們可以在上式 左端加入一個正數 alpha,從而防止||f(A)-f§||2- ||f(A)-f§||2 = 0 。
    此時,Triplet為: ||f(A)-f§||2- ||f(A)-f§||2 + alpha <= 0

    給定一個training dataset(A,P,N),Triplet損失函式可以定義如下:
    L(A,P,N) = max(||f(A)-f§||2 - ||f(A)-f(N)||2 + alpha , 0) ;
    J = sum(L(A(i), P(i), N(i))) ; 根據backward propagation,即可求得Siamese network的parameter。
    question:L(A,P,N) = max(||f(A)-f§||2 - ||f(A)-f(N)||2 + alpha , 0)在實際計算中,如何體現||f(A)-f§||2 - ||f(A)-f(N)||2 + alpha <= 0的思想?
    個人理解1:可以initialize L(A,P,N)=0,則||f(A)-f§||2 - ||f(A)-f(N)||2 = -alpha。根據||f(A)-f§||2 - ||f(A)-f(N)||2的初始值,求得一組weight,然後,利用backward propogation,在此weight的基礎上,繼續更新weight,從而使得L(A,P,N)不斷減小。
    個人理解2:或者直接初始化一組weight,然後利用backward propogation,不斷更新weight,直到L(A,P,N)達到一指定的threshold,停止iteration。
    在這裡插入圖片描述
  • Triplet中,training data的建立
    如果隨機選取training data(A,P,N),則 Triplet 損失函式,很容易就可以實現,這樣訓練出來的Siamese network 非常的鬆散,無法應對anchor和negative較為相近的情況,為了避免訓練出一個非常鬆散的Siamese network,需要認真挑選那些training data(A,P,N),其中A,N應該儘可能相近,從而使得訓練出的Siamese network具有較強的robust,能夠應對一些較為困難的face recognition任務。
面部驗證與二分類(alternative of Triplet loss , to compute the parameter of Siamese)
  • 將face recognition看成是一個二分類問題
    不同於上一節的Triplet loss function,本節中將face recognition看成是一個binary classification,利用logistic likelihood以及backward propogation來求解Siamese network parameter以及logistic中的parameter,具體過程如下所示:
    1、首先說明“該二分類任務”的工作過程:
    在model的前端為Siamese network,用來encode image,將2張image的編碼輸入到logistic regression(其公式為 g(w*d(image1,image2)+b)),求得logistic的預測值:{output=1 : 2個image為同一人,output=0 : 2個image為不同的人}。
    需要注意的是:d(image1,image2)可以使用不同的公式來表示,如下PPT所示,可以使用歐幾里得,也可以使用X2
    2、Siamese network和logistic 中引數的求解
    個人理解:可以將“最大似然函式”作為“目標函式”,通過backward propagation求解model中所有引數;
    3、face recognition 實際應用的一些技巧
    在實際的face recognition task中,可以利用已經訓練好的Siamese network將database中的image進行encode,並將其作為image的特徵儲存在database中(precomputed),這樣在進行一個face recognition task時,只需要計算input image的Siamese encoding,而不用在去計算database中的image code,可以節省face recognition時間。

  • 在該binary classification中,training data的建立方式
    在該binary classification(face recognition)中,一個training sample是有“2張image”構成,其對應的target y為{0:different person,1:same person},如下圖所示。

    總結,2種實現one-shot learning的方式:
    1、通過計算2個image的距離,判斷二者是否為同一個人:
    具體方法:利用Triplet loss訓練一個Siamese network,利用該network給image編碼,並將編碼看作image的特徵,利用該特徵計算2個image的距離。
    在Siamese network + Triplet loss中,為“unsupervised learning”,training data為(anchor,positive,negative);
    2、通過擬合binary classification model (logistic),將2個image輸入model中,利用output來預測2個image是否為同一個人:
    具體方法:首先利用Siamses network給2個image編碼,在將該編碼餵給logistic,使其根據公式g(w*d(image1,image2)+b)對2個image是否相同進行預測。
    個人理解:該model的目標函式為“最大似然估計”,求解方法為:backward propagation;
    在Siamese network + logistic 中,為“supervised learning”,training data為{X:(image1,image2),y:{1:same thing,0:different things}}

什麼是神經風格轉換

如下圖所示,我們將content和style作為input,可以output Generated image。這個過程稱為“神經風格轉換”。
在接下來的幾節中,將具體講述“神經風格轉換”的實現方式。
在這裡插入圖片描述

深度卷積網路在學什麼?

在每層layer中,學習到的每個image patch都會最大化active function value。如下圖所示:
在這裡插入圖片描述
在深度卷積網路中,shallow layer主要學習“small piece of image”,如:“邊、顏色陰影”的。而在deeper layer會學習“large image region”,如:“animal,people,car”等,如下圖所示:
在這裡插入圖片描述



代價函式概覽(neural style transform algorithm)

neural style tansfer algorithm的cost fucntion形式如下圖所示:
cost function :J(G)=alpha * Jcontent(content,generated) + beta * Jstyle(style,generated);我們要做的是,最小化J(G)的值,在cost function中,generated image vector為parameter。
generated image形成方式如下:
假設generated image為 1001003 的vector
step1:初始化generated image vector中各元素的值G;
step2:更新g的值:G := G - J’(G);
step3:重複step2直到