日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

深入理解anchor

發(fā)布時(shí)間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解anchor 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在博客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ī)則:

  • 初始featuremap層的感受野是1
  • 每經(jīng)過一個(gè)convkxk s1(卷積核大小為k,步長(zhǎng)為1)的卷積層,感受野 r = r+ (k - 1),常用k=3感受野 r = r + 2,k=5感受野r= r + 4
  • 每經(jīng)過一個(gè)convkxk s2的卷積層或max/avg pooling層,感受野 r = (r x 2) + (k -2),常用卷積核k=3, s=2,感受野 r = r x 2 + 1,卷積核k=7, s=2, 感受野r = r x 2 + 5
  • 每經(jīng)過一個(gè)maxpool2x2 s2的max/avg pooling下采樣層,感受野 r = r x 2
  • 經(jīng)過conv1x1 s1,ReLU,BN,dropout等元素級(jí)操作不會(huì)改變感受野
  • 經(jīng)過FC層和GAP層,感受野就是整個(gè)輸入圖像
  • 全局步長(zhǎng)等于經(jīng)過所有層的步長(zhǎng)累乘
  • 具體在計(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)象:

  • anchor可以設(shè)置的范圍較大,從實(shí)驗(yàn)結(jié)果來看,0.05~1.0基本都可以收斂,這也解釋了為什么FasterRCNN中的RPN網(wǎng)絡(luò)anchor大小可以超過感受野。從loss來看,anchor太大或者大小收斂效果都不好,甚至?xí)霈F(xiàn)不收斂的情況。這一點(diǎn)也很好理解,如果anchor太大,導(dǎo)致目標(biāo)上下文信息較少,而如果anchor太小,又會(huì)導(dǎo)致沒有足夠多的信息。
  • 綜合AP的值以及l(fā)oss的大小,我們可以看出,anchor在0.2~0.7之間收斂效果較好,這個(gè)結(jié)論與SSD經(jīng)典網(wǎng)絡(luò)的設(shè)置基本一致。這個(gè)范圍既可以保證目標(biāo)有足夠多的上下文信息,也不會(huì)因?yàn)槟繕?biāo)太小沒有足夠多的信息。
  • 注:由于目前實(shí)驗(yàn)數(shù)據(jù)還不夠充分,這個(gè)范圍可能并不準(zhǔn)確,歡迎大家留言討論。


    滑動(dòng)窗口,感受野與anchor的關(guān)系

    首先區(qū)分一下這幾個(gè)比較容易混淆的概念:

  • 滑動(dòng)窗口:使得某一層輸出大小為1的輸入大小就是該層的滑動(dòng)窗口大小。比如MTCNN中PNet,滑動(dòng)窗口大小為12x12
  • 理論感受野:影響某個(gè)神經(jīng)元輸出的輸入?yún)^(qū)域,也就是該層能夠感知到的區(qū)域
  • 有效感受野:理論感受野中間對(duì)輸出有重要影響的區(qū)域
  • anchor:預(yù)先設(shè)置的每一層實(shí)際響應(yīng)的區(qū)域
  • 滑動(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。