这就是神经网络 7:深度学习-目标检测-超详细图解Faster R-CNN
本文動(dòng)機(jī)
說(shuō)實(shí)話,介紹Faster R-CNN的文章我看了很多,論文的英文原文和翻譯都看過(guò),我知道two-statge和anchor的主要思想,可是我腦子里始終沒(méi)法建立一個(gè)完整的Faster R-CNN的框架,有太多的細(xì)節(jié)沒(méi)有搞清楚,每個(gè)步驟的tensor是什么維度?這些維度是什么含義?第二階段的坐標(biāo)回歸和第一階段一樣嗎?有太多的細(xì)節(jié)讓我疑惑不已。別人的文章講的都是別人建立了整體概念以后的細(xì)節(jié)分解,而我始終不能把所有的細(xì)節(jié)串聯(lián)起來(lái)。
為此我找了一個(gè)github上的tensorflow實(shí)現(xiàn)精讀代碼,希望把自己的理解畫下來(lái)、寫下來(lái),幫自己總結(jié)的同時(shí)也幫助像我一樣的人。
這篇文章主要是閱讀參考資料里‘tf-faster-rcnn代碼’對(duì)應(yīng)的代碼之后寫的總結(jié)。這個(gè)tensorflow版本的實(shí)現(xiàn)和作者公開的caffe版本的實(shí)現(xiàn)有些許不同,但是不耽誤理解原理,實(shí)現(xiàn)方面的不同我會(huì)在最后介紹。我對(duì)caffe不熟,所以就用這個(gè)tenorflow版本了。
本文側(cè)重對(duì)Faster R-CNN由上到下的理解,有些知識(shí)點(diǎn)不會(huì)講很細(xì),可以參考文末《參考資料》里的其它文章。
本文是以VGG為主干網(wǎng)絡(luò)的基礎(chǔ)上解讀的。換成其它的backbone也是可以的,但是本文未涉及。
本文解讀的代碼是以端到端的方法完成訓(xùn)練的,也就是說(shuō)不需要Faster R-CNN那樣分多個(gè)階段分別訓(xùn)練網(wǎng)絡(luò)的不同部分。
整體結(jié)構(gòu)
下面的圖片就是代碼整體的流程框圖:
注意上圖中我只畫出了我關(guān)心的部分tensor,很多不影響理解的tensor就沒(méi)有畫出來(lái)。
藍(lán)色的tensor是參與最終LOSS計(jì)算的。從上圖可以看出,之所以可以完成端到端的訓(xùn)練,是因?yàn)閮蓚€(gè)stage都參與了LOSS的計(jì)算。
細(xì)節(jié)分解
這一部分按照上面流程圖里的大致順序講解各個(gè)步驟的具體細(xì)節(jié)。
網(wǎng)絡(luò)輸入
網(wǎng)絡(luò)輸入需要三個(gè)tensor:gt_boxes、img和im_info。
- img :輸入圖片
代碼里每次固定輸入一張圖片進(jìn)行訓(xùn)練和測(cè)試,所以img的形狀是[1, H, W, C]。其中H、W代表寬高, C表示通道數(shù)。因?yàn)閎ackbone輸出的feature_map會(huì)被裁剪為相同的大小送到stage-2的回歸網(wǎng)絡(luò),所以Faster R-CNN對(duì)圖片大小沒(méi)有明確要求,多大的圖片都是可以的。
- im_info:圖片形狀
im_info的形狀是[3], 存儲(chǔ)是就是圖片的H、W、C。
- gt_boxes:ground truth的bbox坐標(biāo)
存儲(chǔ)的是訓(xùn)練集里的標(biāo)注的邊界框。形狀是[None, 5]。第二個(gè)維度的長(zhǎng)度為5,其格式為(x1, y1, x2, y2, cls_label),前四個(gè)數(shù)分別為左上角和右下角的這兩個(gè)點(diǎn)的坐標(biāo),單位是像素。第二維的最后一個(gè)成員cls_label是這個(gè)bbox所屬的分類,是一個(gè)int類型的值。
主干網(wǎng)絡(luò)
原則上來(lái)說(shuō),任何分類網(wǎng)絡(luò)都可以作為Faster R-CNN的主干網(wǎng)絡(luò),主干網(wǎng)絡(luò)的作用是提取圖片特征,為rpn和stage2提供原料。我看的代碼里支持好幾種分類網(wǎng)絡(luò),我選擇了VGG模式下進(jìn)行通讀代碼。
代碼里主干網(wǎng)絡(luò)輸出的特征圖名為net_conv,形狀是[1, H/16, W/16, 512]。也就是說(shuō),相對(duì)于原圖,寬高方向上縮放了16倍。注意這個(gè)16,后面要用很多次。
region_proposal網(wǎng)絡(luò)
從上面圖片中可以看到,net_conv和crop_proposal_layer右側(cè)的部分都屬于region_proposal網(wǎng)絡(luò)(簡(jiǎn)稱rpn)。這部分主要用于產(chǎn)生可能有物體的區(qū)域,交給stage2的網(wǎng)絡(luò)去進(jìn)一步定位和分類。這個(gè)部分產(chǎn)生的區(qū)域會(huì)比實(shí)際物體多。
net_conv后面緊接著一個(gè)3x3的卷積,卷積后特征圖的大小和通道數(shù)都不變。輸出的tensor名為rpn(這個(gè)rpn僅僅是一個(gè)tensor的名字,不表示整個(gè)region_proposal網(wǎng)絡(luò)), 然后分成兩個(gè)分支, 上面的分支接一個(gè)1x1的點(diǎn)卷積,用于為每個(gè)anchor框產(chǎn)生一個(gè)回歸系數(shù)。下面的分支同樣接一個(gè)1x1的點(diǎn)卷積,用于給每個(gè)anchor框做二分類(前景還是背景),前景就是可能有物體的,背景就是沒(méi)物體的。
rpn_cls_score
rpn_cls_score是預(yù)測(cè)背景和前景分類的tensor。其shape為[1, H/16, W/16, num_anchors * 2]。注意長(zhǎng)寬和前面的net_conv一樣,只是通道數(shù)變?yōu)閚um_anchors * 2。
由于Faster R-CNN使用3種縮放的3種長(zhǎng)寬比的anchor框,所以num_anchors為9。rpn_cls_score[:,:,:]的每個(gè)值對(duì)應(yīng)num_anchors個(gè)anchor框的二分類,長(zhǎng)度為為num_anchors * 2。
其中rpn_cls_score[:,:,:, 0:num_anchors]表示對(duì)應(yīng)位置上的9個(gè)anchor框?yàn)楸尘暗母怕?#xff08;此時(shí)還沒(méi)進(jìn)行softmax歸一化),rpn_cls_score[:,:,:, num_anchors:]表示對(duì)應(yīng)位置上的9個(gè)anchor框?yàn)榍熬?#xff08;也就是有物體)的概率。
rpn_cls_score_reshape
對(duì)rpn_cls_score進(jìn)行reshape之后得到rpn_cls_score_reshape,它的形狀是[1, num_anchors*H/16, W/16, 2],注意最后一維的長(zhǎng)度變成了2,這是為了好做softmax。
rpn_cls_prob
rpn_cls_prob是rpn_cls_score_reshape進(jìn)行完softmax運(yùn)算再做reshape操作得到的,它的形狀和rpn_cls_score一樣,都是[1, H/16, W/16, num_anchors * 2]。
需要強(qiáng)調(diào)的是,圖片中的softmax和reshape并不是對(duì)應(yīng)一個(gè)操作,而是好幾個(gè)操作的組合。
rpn_bbox_pred
Faster R-CNN的anchor機(jī)制相當(dāng)于一種變相的滑窗,只不過(guò)窗的位置和大小都是固定的。那怎么得到精確的bbox呢?方法就是回歸得到在anchor框的基礎(chǔ)上進(jìn)行平移和縮放的偏移系數(shù),對(duì)anchor框進(jìn)行變換就得到了更為精確的bbox。眾所周知,Faster R-CNN是屬于2-stage類型的目標(biāo)檢測(cè),所以這種回歸會(huì)做兩次。第一次就是得到上面圖片里的rpn_bbox_pred,第二次是得到上面圖片里的bbox_pred。
一個(gè)anchor的位置是四個(gè)數(shù)表示:x、y、h、w, 分辨表示方框中心點(diǎn)的坐標(biāo)和寬高。rpn_bbox_pred的形狀是[1, H/16, W/16, num_anchors * 4],最后一維之所以是num_anchors * 4,是因?yàn)槊總€(gè)anchor框?qū)?yīng)的4個(gè)回歸系數(shù)是tx、ty、th、tw,對(duì)應(yīng)anchor的4個(gè)坐標(biāo)信息的偏移系數(shù)。
下方帶*的符號(hào)是預(yù)測(cè)值,帶小寫a的符號(hào)是anchor框坐標(biāo)。t^*是rpn_bbox_pred內(nèi)的內(nèi)容,它和預(yù)測(cè)的bbox坐標(biāo)的關(guān)系對(duì)應(yīng)如下:
有了偏移系數(shù),求x*、y*、h*、w*只要做一個(gè)相反的運(yùn)算就可以了。
訓(xùn)練的時(shí)候,anchor坐標(biāo)和實(shí)際物體的bbox坐標(biāo)是已知的,那么這些anchor框?qū)?yīng)的修正系數(shù)就是:
這樣求出的偏移系數(shù),可以和rpn_bbox_pred的內(nèi)容做比較,作為訓(xùn)練的LOSS之一。
為何采用上面這種偏移系數(shù)而不是直接回歸得出偏移的坐標(biāo)值做加法,我們后面單獨(dú)討論。
proposal_layer
proposal_layer用于從前面預(yù)測(cè)的值里面用NMS挑選出最可能的區(qū)域傳給下一個(gè)階段。
proposal_layer的輸入有以下內(nèi)容:
- rpn_bbox_pred:對(duì)所有anchor框坐標(biāo)的偏移系數(shù)
- rpn_cls_prob::對(duì)所有anchor框做分類得到的softmax歸一化值,分類種類只有兩種:前景(包含目標(biāo))、背景(無(wú)目標(biāo))。
- anchors:所有anchor框的坐標(biāo)值,也是利用tensorflow的計(jì)算圖得到的,我在圖片里沒(méi)有畫出。anchor框的位置是四個(gè)數(shù)表示:x、y、h、w, 分辨表示方框中心點(diǎn)的坐標(biāo)和寬高。實(shí)際上我看的代碼里anchor框是用左上角和右下角坐標(biāo)表示的,計(jì)算的時(shí)候會(huì)先轉(zhuǎn)化為中心點(diǎn)坐標(biāo)的格式。
- RPN_POST_NMS_TOP_N:做nms運(yùn)算的時(shí)候,選取最終roi的個(gè)數(shù)
- RPN_NMS_THRESH:nms的閾值
注意,上面的RPN_POST_NMS_TOP_N和RPN_NMS_THRESH有兩套,可以看上面圖片左上角的內(nèi)容。訓(xùn)練和測(cè)試模式,采用不同的值。
由于前面的網(wǎng)絡(luò)結(jié)構(gòu)對(duì)每個(gè)anchor框都做了分類并產(chǎn)生了偏移系數(shù),實(shí)際上后面用不了這么多,RPN_POST_NMS_TOP_N用于指定做nms的時(shí)候輸出的roi個(gè)數(shù)。
訓(xùn)練模式下,RPN_POST_NMS_TOP_N為2000,測(cè)試模式下為300。也就是說(shuō)訓(xùn)練的時(shí)候產(chǎn)生更多的roi用于提高訓(xùn)練質(zhì)量,而測(cè)試的時(shí)候只產(chǎn)生300個(gè)roi,這樣可以減輕后面的計(jì)算壓力。
proposal_layer的輸出主要是兩個(gè)tensor:
- rois(test):選擇的roi,大小是[rois_num_test, 5],第二維每個(gè)值長(zhǎng)度為5,后四個(gè)數(shù)就是bbox的中心點(diǎn)坐標(biāo)及長(zhǎng)寬,第一個(gè)數(shù)表示屬于同一個(gè)batch里的第幾張圖片,由于網(wǎng)絡(luò)固定只輸入一張圖片,所以第一個(gè)數(shù)總為0。這里的bbox中心坐標(biāo)及長(zhǎng)寬就是用rpn_bbox_pred及anchor坐標(biāo)計(jì)算得到的。
- roi_scores: rois對(duì)應(yīng)的得分,其形狀為[rois_num_test, 1]。
rois_num_test等于RPN_POST_NMS_TOP_N。
注意,rois(test)的區(qū)域是經(jīng)過(guò)裁剪的,保證每個(gè)區(qū)域都在圖片內(nèi)部。同時(shí)上面所說(shuō)的所有坐標(biāo)都是針對(duì)原圖片的,不是針對(duì)conv_net這個(gè)feature map的。
另外這里rois(test)是測(cè)試模式下給stage2用的,訓(xùn)練模式下用的是圖片上面的rois(train),后面會(huì)講解。
anchor_target_layer
我總認(rèn)為很多文章之所以沒(méi)讓我明白Faster R-CNN是因?yàn)闆](méi)講清楚proposal_target_layer和anchor_target_layer。這兩部分之所以重要,是因?yàn)檫@兩個(gè)模塊會(huì)產(chǎn)生訓(xùn)練的標(biāo)準(zhǔn)答案,供計(jì)算LOSS的使用。
anchor_target_layer為stage1產(chǎn)生標(biāo)準(zhǔn)答案。proposal_target_layer這部分網(wǎng)絡(luò)為stage2產(chǎn)生標(biāo)準(zhǔn)答案。
本節(jié)主要講解anchor_target_layer。
anchor_target_layer主要功能
anchor_target_layer為stage1產(chǎn)生標(biāo)準(zhǔn)答案。它從所有的anchor里選出和實(shí)際的bbox有較大IOU的那部分作為正樣本,選出IOU較小的部分anchor作為負(fù)樣本,最多選出256個(gè)anchor框,正負(fù)樣本比例保持1:1,如果某種樣本太少,則會(huì)隨機(jī)刪除另一種保持比例。
注意,anchor_target_layer只保留全部區(qū)域范圍都在圖片內(nèi)部的anchor框,那些有部分范圍不在圖片內(nèi)部的anchor框?qū)⒈粧仐?#xff0c;永遠(yuǎn)不參與訓(xùn)練。但是proposal_layer會(huì)利用所有的anchor,最后僅僅把超出圖片部分的roi裁小,以保持roi在圖片內(nèi)部。這兩個(gè)地方的這點(diǎn)區(qū)別還是要注意的。
anchor_target_layer的輸入?yún)?shù)
- rpn_cls_score:這個(gè)tensor僅僅為anchor_target_layer提供feature map的寬高這兩個(gè)參數(shù),其內(nèi)容并不被anchor_target_layer需要。
- gt_boxes:包含物體的bbox,這個(gè)框是從訓(xùn)練集的標(biāo)注中來(lái)的,用于篩選優(yōu)質(zhì)的正負(fù)樣本
- anchors:所有anchor框的坐標(biāo)。其坐標(biāo)可以用于和gt_boxes計(jì)算IOU,有較大IOU的anchor框?qū)⒈贿x為正樣本,有較小IOU的被選為負(fù)樣本。
- RPN_POSITIVE_OVERLAP:超參,正樣本的IOU閾值,默認(rèn)為0.7。高于這個(gè)值作為正樣本。
- RPN_NEGATIVE_OVERLAP:超參,負(fù)樣本的IOU閾值,默認(rèn)為0.3。低于這個(gè)值作為負(fù)樣本。
- RPN_BATCHSIZE:超參,anchor_target_layer輸出的anchor框的上限個(gè)數(shù),默認(rèn)值為256。
- RPN_FG_FRACTION:超參,正樣本比例,默認(rèn)0.5。默認(rèn)情況下RPN_BATCHSIZE*RPN_FG_FRACTION=256 * 0.5=128,所以默認(rèn)情況下正負(fù)樣本各占一半。如果正樣本或者負(fù)樣本超過(guò)了128個(gè),則會(huì)隨機(jī)刪除部分,保持綜述為128。少了就沒(méi)辦法了。
anchor_target_layer的輸出參數(shù)
- rpn_labels:輸出正負(fù)樣本的標(biāo)簽。形狀是[1, 1, num_anchors*H/16, W/16],也就說(shuō)說(shuō)針對(duì)所有的anchor框都有一個(gè)標(biāo)準(zhǔn)值,其中正樣本標(biāo)注為1,負(fù)樣本標(biāo)注為0,其它不關(guān)心的樣本標(biāo)注為-1.
- rpn_bbox_targets:輸出所有正樣本的anchor框?qū)?yīng)的偏移系數(shù)。其形狀為[1, H/16, W/16, num_anchors * 4],每個(gè)anchor都有對(duì)應(yīng)的值,不過(guò)只有正樣本對(duì)應(yīng)的位置有有效值,負(fù)樣本和不關(guān)心的anchor都用全0填充。
- rpn_bbox_inside_weights和rpn_bbox_outside_weights:計(jì)算LOSS的掩碼。其形狀是[1, H/16, W/16, num_anchors * 4],可以看到其形狀和rpn_bbox_targets一致。被選中的作為正樣本的anchor對(duì)應(yīng)的位置其值為(1.0, 1.0, 1.0, 1.0)。 計(jì)算LOSS的時(shí)候用這兩個(gè)值作為過(guò)濾rpn_bbox_targets的掩碼。在代碼實(shí)現(xiàn)里,這兩個(gè)值是一樣的。
rpn_labels將和前面的rpn_cls_score_reshape一起計(jì)算交叉熵?fù)p失,rpn_bbox_targets將和前面的rpn_bbox_pred計(jì)算smooth_L1損失。
proposal_target_layer
proposal_target_layer這部分網(wǎng)絡(luò)為stage2產(chǎn)生標(biāo)準(zhǔn)答案。
輸入?yún)?shù)
輸入?yún)?shù)包括前面proposal_layer的兩個(gè)輸出tensor:rois(test)和roi_scores。還包括:
- gt_boxes:包含物體的bbox,這個(gè)框是從訓(xùn)練集的標(biāo)注中來(lái)的,用于篩選優(yōu)質(zhì)的正負(fù)樣本
- BATCH_SIZE:篩選出的roi的個(gè)數(shù),默認(rèn)值為128。
- FG_FRACTIONL:正樣本比例,默認(rèn)0.25。也就是說(shuō),默認(rèn)情況下正樣本做多取32個(gè)。
- FG_THRESH:和gt_box的IOU大于這個(gè)閾值會(huì)被作為正樣本,默認(rèn)為0.5
- BG_THRESH_HI, BG_THRESH_LO:和gt_box的IOU在這兩個(gè)閾值范圍內(nèi)的roi會(huì)被作為負(fù)樣本。默認(rèn)值是0.5和0.1
注意,proposal_target_layer輸出的樣本個(gè)數(shù)總是固定的,如果:
- 正負(fù)樣本個(gè)數(shù)都不為0:正樣本過(guò)多則去掉多余正樣本,少于BATCH_SIZExFG_FRACTION就保持原樣;負(fù)樣本進(jìn)行有放回隨機(jī)抽取,保證總個(gè)數(shù)是BATCH_SIZE個(gè)。
- 負(fù)樣本個(gè)數(shù)為0:正樣本個(gè)數(shù)大于BATCH_SIZE則進(jìn)行無(wú)放回隨機(jī)抽取, 否則對(duì)正樣本進(jìn)行有放回隨機(jī)抽取,保證總個(gè)數(shù)是BATCH_SIZE個(gè)。
- 正樣本個(gè)數(shù)為0:負(fù)樣本個(gè)數(shù)大于BATCH_SIZE則進(jìn)行無(wú)放回隨機(jī)抽取, 否則對(duì)負(fù)樣本進(jìn)行有放回隨機(jī)抽取,保證總個(gè)數(shù)是BATCH_SIZE個(gè)。
由此可見,無(wú)論如何,proposal_target_layer輸出的樣本個(gè)數(shù)都是BATCH_SIZE。
輸出參數(shù)
- bbox_targets:計(jì)算gt_boxes相對(duì)rois(test)的偏移系數(shù),注意前面stage1的回歸系數(shù)是相對(duì)anchor框的,這里是相對(duì)stage1的輸出rois(test)的。bbox_targets的形狀是[rois_num_train, num_classes * 4],num_classes是總的分類的個(gè)數(shù), rois_num_train等于BATCH_SIZE。最后一維表示對(duì)應(yīng)的roi在所有分類上的偏移系數(shù),長(zhǎng)度雖然是num_classes * 4,只有正確分類的對(duì)應(yīng)的位置有有效值,其余位置都是0.
- labels:輸出的分類值。一個(gè)roi的分類值等于與之有最大IOU的gt_box所屬的分類。labels的形狀是[rois_num_train, 1]。
- bbox_inside_weights和bbox_outside_weights:形狀都是[rois_num_train, num_classes * 4],作用就是計(jì)算LOSS的時(shí)候作為掩碼過(guò)濾bbox_targets中正確分類的偏移系數(shù)。前面bbox_targets的最后一維只在正確分類的對(duì)應(yīng)位置上有有效的偏移系數(shù),計(jì)算LOSS的使用需要掩碼屏蔽其它分類的影響。代碼中這兩個(gè)值是相等的。
- rois(train):形狀是[rois_num_train, 5],含義和rois(test)一致。
crop_proposal_layer
crop_proposal_layer的作用就是利用生成的roi的位置裁剪feature map。裁剪的時(shí)候先裁剪為14x14的大小,然后采用最大池化為7x7。這和官方直接裁剪為7x7是不同的。
注意crop_proposal_layer在訓(xùn)練模式和測(cè)試模式下的輸入源是不同的:訓(xùn)練模式下的輸入是proposal_target_layer產(chǎn)生的rois(train),測(cè)試模式下的輸入是proposal_layer產(chǎn)生的rois(test)。
crop_proposal_layer輸出的tensor名為pool5,其形狀是[rois_num, 7, 7, 512]。根據(jù)上面的講解我們知道,(使用默認(rèn)值)訓(xùn)練模式下產(chǎn)生128個(gè)roi, 測(cè)試模式下產(chǎn)生300個(gè)roi。所以訓(xùn)練模式下rois_num為128,測(cè)試模式下rois_num為300。
fc7
pool5的內(nèi)容會(huì)被拉成一維向量,經(jīng)過(guò)兩層4096的全連接節(jié)點(diǎn)生成fc7,fc7的形狀是[rois_num, 4096]。
cls_score和bbox_pred
整個(gè)網(wǎng)絡(luò)最終的輸出值是:
- cls_score:對(duì)應(yīng)每個(gè)roi在所有分類上的可能性(此時(shí)還沒(méi)做softmax歸一化),形狀是[rois_num, num_classes]
- bbox_pred:預(yù)測(cè)的目標(biāo)位置相對(duì)于roi的偏移系數(shù),形狀是[rois_num, num_classes*4]。roi和偏移系數(shù)計(jì)算bbox的方法和stage1是一樣的。
LOSS計(jì)算
代碼中的訓(xùn)練事端到端的,LOSS計(jì)算時(shí)使用了stage1和stage2兩個(gè)階段的輸出。最上方推按中藍(lán)色的tenor都參與了LOSS的計(jì)算。
代碼中LOSS共分為5部分:
- 權(quán)重正則化:利用slim的接口為所有的權(quán)重定義了衰減系數(shù)為0.0001的L2正則化損失,偏置沒(méi)有參與正則化
- stage1的分類損失:由rpn_bbox_pred和rpn_bbox_targets這兩個(gè)tenor計(jì)算交叉熵得到
- stage1的bbox損失:由rpn_cls_score_reshape和rpn_labels計(jì)算smooth_L1損失得到
- stage2的分類損失:由cls_score和labels計(jì)算交叉熵得到
- stage2的bbox損失:由bbox_pred和bbox_targets計(jì)算smooth_L1損失得到
代碼實(shí)現(xiàn)和官方的不同
我看的這份代碼專門寫了篇論文講解和官方代碼實(shí)現(xiàn)上的不同,文章位置在:
- 《An Implementation of Faster RCNN with Study for Region Sampling》:https://arxiv.org/pdf/1702.02138.pdf
文章提到實(shí)現(xiàn)上的差異包括:
- 原始實(shí)現(xiàn)中RoI pooling layer直接裁剪了一個(gè)7x7大小的特征圖,本代碼里用tf.image.crop_and_resize裁剪一個(gè)14x14的特征圖,然后用最大池化縮小為7x7大小。
- 原始實(shí)現(xiàn)每個(gè)batch兩張圖片,anchor_target_layer為每個(gè)圖片產(chǎn)生128個(gè)樣本,本代碼每個(gè)批次只有一張圖片,產(chǎn)生256個(gè)樣本
- 原始的實(shí)現(xiàn)里會(huì)刪除過(guò)小的區(qū)域(寬或高小于16像素)。本代碼發(fā)現(xiàn)這是多余的操作,會(huì)損害小目標(biāo)的檢測(cè)
當(dāng)然還有一些其他影響不大的小改動(dòng)。不再翻譯了。
作者在論文里還做了一組測(cè)試,那就是發(fā)現(xiàn)訓(xùn)練時(shí)讓proposal_layer用NMS算法,測(cè)試時(shí)讓proposal_layer直接選取得分最高的5000個(gè)框作為roi得到的map有略微的優(yōu)勢(shì),當(dāng)然時(shí)間會(huì)長(zhǎng)不少。
問(wèn)題探討
計(jì)算下共有多少anchor框
假設(shè)原圖的寬高是W和H,經(jīng)過(guò)backbone以后降為原來(lái)的1/16。再假設(shè)每個(gè)anchor點(diǎn)上有不同大小的anchor框共9個(gè)。
那么總公共的anchor框個(gè)數(shù)為w/16 x h/16 x 9。
為何用偏差系數(shù)而不是直接回歸得到偏差量
Faster R-CNN對(duì)bbox做回歸,并沒(méi)有直接回歸得到偏移量,而是學(xué)習(xí)偏移系數(shù)。那么為什么會(huì)這樣呢?
論文里說(shuō)Faster R-CNN的anchor回歸方法的一個(gè)重要特性是它具有平移不變性。
參考資料里的國(guó)外博客有張圖很能說(shuō)明問(wèn)題(做了縮放后偏移系數(shù)不變):
同時(shí)參考資料里面的《One Stage目標(biāo)檢測(cè)算法可以直接回歸目標(biāo)的坐標(biāo)是什么原理?》也提出了另外兩個(gè)角度:
- 正則化:視覺上相差很近的大物體和相差很遠(yuǎn)的小物體,偏差的像素?cái)?shù)可能是一樣的,這就不合理了。所以偏移系數(shù)加入了對(duì)anchor框大小的正則化。
- 防止出現(xiàn)負(fù)數(shù):寬和高不可能是負(fù)數(shù),進(jìn)行l(wèi)og/exp變換防止出現(xiàn)負(fù)數(shù)
smooth L1 loss
Faster R-CNN在求最后LOSS的時(shí)候,對(duì)偏移系數(shù)采用的是smooth L1 loss。那么這種算法和L1和L2 loss比有啥優(yōu)點(diǎn)呢?
L1及L2 loss的公式如下:
L2的問(wèn)題是對(duì)于異常點(diǎn)(outliers)和噪聲更敏感,容易梯度爆炸;L1倒是對(duì)異常點(diǎn)(outliers)和噪聲不敏感的,但是在0處不平滑,可能會(huì)在0附近震蕩,影響收斂。
smooth L1 loss結(jié)合兩者的優(yōu)點(diǎn)應(yīng)運(yùn)而生:
上圖來(lái)自知乎。
后記
說(shuō)老實(shí)話,從開始接觸這份代碼到現(xiàn)在有一個(gè)多月了,中間穿插了很多其它事,但是閱讀代碼的工作量還是超出我想象。但是不讀代碼我又有無(wú)數(shù)的疑問(wèn),讓我無(wú)法相信自己真的懂了Faster R-CNN。
寫完文章才發(fā)現(xiàn),我寫的還是給自己看的筆記而不是給別人看的教程。也許這就是我看不懂別人文章的原因吧,畢竟專門為別人寫博客的人不多,大家還都是為自己寫的。
參考資料1
這部分參考資料看的比較多
論文原文: Faster R-CNN: Towards Real-Time Object
Detection with Region Proposal Networks
知乎:Faster R-CNN譯文
tf-faster-rcnn代碼:https://github.com/endernewton/tf-faster-rcnn
代碼對(duì)應(yīng)的改動(dòng):An Implementation of Faster RCNN with Study for Region Sampling
國(guó)內(nèi)博客:一文讀懂Faster RCNN
國(guó)外介紹faster RCNN的文章:Object Detection and Classification using R-CNNs
One Stage目標(biāo)檢測(cè)算法可以直接回歸目標(biāo)的坐標(biāo)是什么原理?:
對(duì)x, y, w, h坐標(biāo)進(jìn)行l(wèi)og/exp變換防止出現(xiàn)負(fù)數(shù)。為何要學(xué)習(xí)變換系數(shù),而不直接學(xué)習(xí)坐標(biāo)差?為了正則化。
L1 loss 和 L2 loss
請(qǐng)問(wèn)faster rcnn和ssd 中為什么用smooth l1 loss,和l2有什么區(qū)別?
損失函數(shù):L1 loss, L2 loss, smooth L1 loss
參考資料2
這部分資料看的少,也放在這吧
從R-CNN到RFBNet,目標(biāo)檢測(cè)架構(gòu)5年演進(jìn)全盤點(diǎn)
對(duì)應(yīng)英文論文:Deep Learning for Generic Object Detection: A Survey
目標(biāo)檢測(cè)算法中檢測(cè)框合并策略技術(shù)綜述
基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法綜述
Faster R-CNN
原始圖片中的ROI如何映射到到feature map?
Faster R-CNN - 目標(biāo)檢測(cè)詳解
損失函數(shù):L1 loss, L2 loss, smooth L1 loss
總結(jié)
以上是生活随笔為你收集整理的这就是神经网络 7:深度学习-目标检测-超详细图解Faster R-CNN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [react] react是什么?它的主
- 下一篇: Github项目|几行代码即可实现人脸检