深入理解anchor
在博客SSD原理解讀-從入門到精通中提到了anchor作用:通過anchor設(shè)置每一層實(shí)際響應(yīng)的區(qū)域,使得某一層對(duì)特定大小的目標(biāo)響應(yīng)。很多人肯定有這么一個(gè)疑問:那anchor到底可以設(shè)置到多大呢?,本文嘗試對(duì)anchor的大小進(jìn)行了一系列的探索,同時(shí)借鑒了SSD的anchor機(jī)制,提出了MTCNN中的anchor機(jī)制,能夠顯著提高M(jìn)TCNN的精度。
文章目錄
- 理論感受野大小的計(jì)算
- 經(jīng)典SSD網(wǎng)絡(luò)anchor的設(shè)置
- anchor大小的探索
- AP
- loss
- 實(shí)驗(yàn)分析
- 滑動(dòng)窗口,感受野與anchor的關(guān)系
- MTCNN中的anchor機(jī)制
- MTCNN訓(xùn)練機(jī)制的問題
- MTCNN中的anchor機(jī)制
- 實(shí)驗(yàn)結(jié)果與分析
- 結(jié)束語
理論感受野大小的計(jì)算
由于本文在討論anchor大小的時(shí)候,都是與理論感受野大小相關(guān)的,這里有必要說一下理論感受野大小的計(jì)算。關(guān)于理論感受野大小的計(jì)算,有一篇很好的文章:A guide to receptive field arithmetic for Convolutional Neural Networks,國(guó)內(nèi)也有這篇文章的翻譯,在網(wǎng)上都可以找到。關(guān)于這篇文章就不展開說了。這里直接給出我用的計(jì)算感受野大小的python代碼,直接修改網(wǎng)絡(luò)參數(shù)就可以計(jì)算理論感受野大小,非常方便。
def outFromIn(isz, net, layernum):totstride = 1insize = iszfor layer in range(layernum):fsize, stride, pad = net[layer]outsize = (insize - fsize + 2*pad) / stride + 1insize = outsizetotstride = totstride * stridereturn outsize, totstridedef inFromOut(net, layernum):RF = 1for layer in reversed(range(layernum)):fsize, stride, pad = net[layer]RF = ((RF -1)* stride) + fsizereturn RF# 計(jì)算感受野和步長(zhǎng),[11,4,0]:[卷積核大小,步長(zhǎng),pad] def ComputeReceptiveFieldAndStride():net_struct = {'PNet': {'net':[[3,2,0],[2,2,0],[3,1,0],[3,2,0],[1,1,0]],'name':['conv1','pool1','conv2','conv3','conv4-3']}}imsize = 512print ("layer output sizes given image = %dx%d" % (imsize, imsize))for net in net_struct.keys():print ('************net structrue name is %s**************'% net)for i in range(len(net_struct[net]['net'])):p = outFromIn(imsize,net_struct[net]['net'], i+1)rf = inFromOut(net_struct[net]['net'], i+1)print ("Layer Name = %s, Output size = %3d, Stride = %3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf))運(yùn)行結(jié)果如下
除了通過公式計(jì)算,還有一種更加方便的可以用于手工計(jì)算的方式。這里給出幾條規(guī)則:
具體在計(jì)算的時(shí)候,采用bottom-up的方式。
要計(jì)算哪一層的感受野,就將該層的輸出設(shè)置為1,然后依次向前計(jì)算,比如下圖中的網(wǎng)絡(luò)結(jié)構(gòu)中,要計(jì)算pool3的感受野,將pool3的輸出設(shè)置為1,就可以得到conv1的輸入大小為30x30,也就是P3的感受野大小為30。
按照這個(gè)算法,我們可以算出SSD300中conv4-3的理論感受野:
r =(((1 +2 +2+2+2 )x2 +2+2+2 )x2 +2+2 )x2 +2+2 = 108
注意:由于conv4-3后面接了3x3的卷積核做分類和回歸,所以在計(jì)算感受野大小的時(shí)候,需要將用于分類和回歸的3x3的卷積核也考慮進(jìn)去。
經(jīng)典SSD網(wǎng)絡(luò)anchor的設(shè)置
下面我們來看一下經(jīng)典網(wǎng)絡(luò)中anchor大小是如何設(shè)置的
其中( )中的數(shù)字表示:anchor/理論感受野,下文中使用該數(shù)值表示anchor的大小。
注:SFD:Single Shot Scale-invariant Face Detector
于老師開源的檢測(cè)器:ShiqiYu/libfacedetection中anchor的設(shè)置
觀察SSD,SFD,YuFace,RPN中的anchor設(shè)計(jì),我們可以看出anchor的大小基本在[0.1,0.7]之間。RPN網(wǎng)絡(luò)比較特別,anchor的大小超出了感受野大小。
anchor大小的探索
下面我做了一系列實(shí)驗(yàn)探索anchor大小的范圍,分別在數(shù)據(jù)集A和數(shù)據(jù)集B上,使用SFD_VGG16和SSD_YuFaceNet兩個(gè)模型,所有層的anchor大小分別設(shè)計(jì)為0.1~0.9,觀察模型的AP和loss大小。
注:SFD_VGG16和SSD_YuFaceNet分別使用的是SFD開源的網(wǎng)絡(luò)和ShiqiYu/libfacedetection開源的網(wǎng)絡(luò)
AP
數(shù)據(jù)集A:
數(shù)據(jù)集B:
loss
數(shù)據(jù)集A:
數(shù)據(jù)集B:
實(shí)驗(yàn)分析
通過對(duì)經(jīng)典網(wǎng)絡(luò)的分析,以及實(shí)驗(yàn)的結(jié)果,可以觀察到以下現(xiàn)象:
注:由于目前實(shí)驗(yàn)數(shù)據(jù)還不夠充分,這個(gè)范圍可能并不準(zhǔn)確,歡迎大家留言討論。
滑動(dòng)窗口,感受野與anchor的關(guān)系
首先區(qū)分一下這幾個(gè)比較容易混淆的概念:
滑動(dòng)窗口大小和理論感受野是一個(gè)網(wǎng)絡(luò)的固有屬性,一旦網(wǎng)絡(luò)結(jié)構(gòu)確定了,這兩個(gè)參數(shù)就確定了,有效感受野是可以通過訓(xùn)練改變的,anchor是通過人工手動(dòng)設(shè)置的。理論感受野,有效感受野,滑動(dòng)窗口是對(duì)齊的, anchor設(shè)置過程中也要與感受野對(duì)齊,否則會(huì)影響檢測(cè)效果。檢測(cè)層上每個(gè)像素點(diǎn)都會(huì)對(duì)應(yīng)一個(gè)理論感受野,滑動(dòng)窗口以及anchor。
MTCNN中的anchor機(jī)制
MTCNN訓(xùn)練機(jī)制的問題
熟悉MTCNN的朋友應(yīng)該都知道,訓(xùn)練MTCNN的時(shí)候需要事先生成三類樣本:positive,part,negative.這三類樣本是根據(jù)groundtruth的IOU來區(qū)分的,原論文中的設(shè)置是IOU<0.3的為negative,IOU>0.65的為positve,0.4<IOU<0.65的為part。
上圖中生成的positive樣本為,圖中紅色框?yàn)間roundtruth,藍(lán)色框?yàn)楹蜻x框
其中回歸任務(wù)回歸的就是兩者之間的offset
回歸的4個(gè)偏移量(公式不唯一):
(x1?x1’)/w(x1-x1’)/w(x1?x1’)/w
(y1?y1’)/h(y1-y1’)/h(y1?y1’)/h
(x2?x2’)/w(x2-x2’)/w(x2?x2’)/w
(y2?y2’)/h(y2-y2’)/h(y2?y2’)/h
對(duì)于小目標(biāo)或者類似頭肩這種目標(biāo),會(huì)出現(xiàn)一些問題
生成的positive樣本如下:
基本上是一塊黑色區(qū)域,沒有太多有效信息。
對(duì)于小目標(biāo):
生成的positive是
這樣的圖像,這些圖像是非常不利于訓(xùn)練的,而且MTCNN在訓(xùn)練的時(shí)候輸入分辨率都比較小(比如12,24,48),將這些生成的圖像resize到12,24或者48之后會(huì)導(dǎo)致有效信息更少,為了解決這個(gè)問題,我們需要包含目標(biāo)更多的上下文信息,會(huì)更加容易識(shí)別。
MTCNN中的anchor機(jī)制
借鑒SSD中anchor的思想,提出了MTCNN中的anchor
SSD在訓(xùn)練過程中通過anchor與groundtruth的匹配來確定每一個(gè)anchor的類別,具體匹配過程:計(jì)算與每個(gè)anchor的IOU最大(>閾值)的那個(gè)groundtruth,如果找到了,那么該anchor就匹配到了這個(gè)groundtruth,該anchor就是positive樣本,anchor的類別就是該groundtruth的類別,回歸的offset就是anchor與groundtruth之間的偏移量。由于SSD的anchor通常都比理論感受野小,所以SSD會(huì)包含較多的上下文信息,如下圖所示。
聯(lián)想到MTCNN,在生成訓(xùn)練樣本的時(shí)候,我們可以將候選框當(dāng)成anchor,生成positive的過程就是SSD中的匹配過程,由于需要包含更多上下文信息,最后會(huì)對(duì)anchor進(jìn)行擴(kuò)邊生成最后的訓(xùn)練樣本 。
紅色區(qū)域就是anchor也就是生成的positive樣本,整個(gè)黑色區(qū)域就是對(duì)anchor做擴(kuò)邊后生成的訓(xùn)練樣本,可以看到包含了更多的上下文信息。
實(shí)驗(yàn)結(jié)果與分析
在多種數(shù)據(jù)集上對(duì)anchor機(jī)制進(jìn)行了實(shí)驗(yàn)。
數(shù)據(jù)集1:
數(shù)據(jù)集2:
從實(shí)驗(yàn)結(jié)果我們可以看出,anchor機(jī)制可以顯著提高檢測(cè)器的精度。
結(jié)束語
關(guān)于anchor其實(shí)還有很多地方值得探索,本文只是總結(jié)了一下最近工作中對(duì)anchor的一些最新的認(rèn)識(shí),就當(dāng)拋磚引玉,大家如果有關(guān)于anchor更好的解讀歡迎一起討論。
非常感謝您的閱讀,如果您覺得這篇文章對(duì)您有幫助,歡迎掃碼進(jìn)行贊賞。
總結(jié)
以上是生活随笔為你收集整理的深入理解anchor的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlServer服务器名称
- 下一篇: 需要类型转换时请为模板定义非成员函数——