<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于mmdetection框架算法可視化分析隨筆(上)

          共 7917字,需瀏覽 16分鐘

           ·

          2020-07-31 22:47


          AI編輯:深度眸

          0 摘要

          ?? mmdetection是一個(gè)非常優(yōu)秀的目標(biāo)檢測(cè)框架,不僅僅有出色的框架可擴(kuò)展性,而且默認(rèn)集成了幾乎目前最常用的各種sota目標(biāo)檢測(cè)算法,提供了超級(jí)多開(kāi)箱即用的特性,實(shí)在是良心框架。

          ????其對(duì)于不同的算法都提供了一套基于coco數(shù)據(jù)集上的默認(rèn)配置,比較好用,但是對(duì)于不同的實(shí)際數(shù)據(jù)集,這些參數(shù)就不一定適用了,故大部分時(shí)候都需要明白修改這些默認(rèn)參數(shù)帶來(lái)的影響,一個(gè)最快的途徑就是各種可視化分析。故結(jié)合一些我覺(jué)得非常重要的參數(shù)配合可視化分析,通??梢钥焖賹?duì)該參數(shù)有個(gè)感性上的理解。本文就是基于mmdetection框架代碼,加入一些可視化分析代碼,希望對(duì)大家理解框架流程和參數(shù)重要性有點(diǎn)幫助。

          ????由于本人水平有限,如果寫(xiě)的不好,望見(jiàn)諒。如果大家有好的想法我沒(méi)有涉及的可視化部分,歡迎留言。

          ????這一篇以最新的mmdetection v2,版本號(hào)是2.2.0+741b638,faster rcnn部分代碼為例進(jìn)行可視化分析。包括anchor可視化,正樣本數(shù)統(tǒng)計(jì)、正樣本anchor質(zhì)量可視化。

          1 anchor 可視化

          ????在基于anchor-base的算法中,anchor的重要性不言而喻,故第一個(gè)可視化就是對(duì)anchor進(jìn)行深入分析。其典型配置如下:

          Anchor_generator=dict(        type='AnchorGenerator',        scales=[8],        ratios=[0.5, 1.0, 2.0],        strides=[4, 8, 16, 32, 64]),

          ????可以看出,其類是AnchorGenerator,縮放系數(shù)是8,寬高比例有三種,基于原圖的下采樣strides是5個(gè)尺度,也就是5個(gè)輸出層,每個(gè)位置有3個(gè)anchor。以最大輸出特征圖即stride=4的層為例,可以發(fā)現(xiàn)其anchor的base size=4*8=32像素。

          ??? V2版本的AnchorGenerator的生成anchor過(guò)程非常好理解,比v1版本好理解很多。代碼在mmdet/core/anchor/anchor_generator.py,其核心流程是:

          (1) 先對(duì)單個(gè)位置(0,0)生成base anchors
          ????假設(shè)stride=4,ratios=[0.5, 1.0, 2.0],則首先利用ratio生成3種寬高比例的ratios,然后對(duì)base_size即stride乘以寬高比例和scale,然后轉(zhuǎn)換為x1y1x2y2坐標(biāo)格式輸出,此時(shí)(0,0)特征圖位置就可以得到3個(gè)x1y1x2y2的anchors。

          ????在V2版本中,center默認(rèn)是none,沒(méi)有刻意偏移0.5。即上述得到的anchor坐標(biāo)是基于左上角定義的。

          (2) 利用輸入的特征圖大小加上base anchors,得到每個(gè)特征圖位置的對(duì)于原圖的anchors

          可以看出就是簡(jiǎn)單的base_anchors[None, :, :] + shifts[:, None, :]而已。

          ????下面進(jìn)行可視化分析。首先舉一個(gè)非常簡(jiǎn)單的例子說(shuō)明:

          input_shape_hw = (10, 10, 3)stride = 5feature_map = [input_shape_hw[0] // stride, input_shape_hw[1] // stride]anchor_generator_cfg = dict(    type='AnchorGenerator',    scales=[1],  # 縮放系數(shù)    ratios=[1.0],  # 寬高比例    strides=[stride])  # 特征圖相對(duì)原圖下降比例

          假設(shè)輸入原圖是10x10,stride=5,也就是下采樣5倍,得到特征圖大小是2x2,假設(shè)scales=1,比例只有1種,則首先可以知道會(huì)生成:2x2x1=4個(gè)anchor。

          [[-2.5 -2.5  2.5  2.5] [ 2.5 -2.5  7.5  2.5] [-2.5  2.5  2.5  7.5] [ 2.5  2.5  7.5  7.5]]

          ????首先生成base anchor,base size=5,乘上寬高比例、scale,得到5,然后計(jì)算x1y1x2y2=[0-5/2,0-5/2,5/2,5/2]。然后得到4個(gè)offset,即[0,0,0,0]、[5,0,5,0]、[0,5,0,5]和[5,5,5,5],最后加起來(lái)即可得到上述。

          ????為了稍微好看一點(diǎn),我寫(xiě)了下可視化代碼,如下所示:

          前隨機(jī)選擇200個(gè)可視化如下所示:

          當(dāng)scale=8時(shí)候,隨機(jī)選擇50個(gè)anchor:

          ? ? 聯(lián)系具體faster rcnn算法,也可以把按照上述方式可視化出來(lái)。為了簡(jiǎn)單,我就直接在faster rcnn算法里面顯示出來(lái),具體為:在mmdet/models/dense_heads/anchor_head.py的loss函數(shù)的大概475行,也就是:

          anchor_list, valid_flag_list = self.get_anchors(        featmap_sizes, img_metas, device=device)

          代碼下面插入:

          代碼寫(xiě)的比較隨意,請(qǐng)見(jiàn)諒??梢缘玫饺缦嘛@示:

          2 RPN正樣本anchor相關(guān)分析

          ????前段時(shí)間,有位知乎友問(wèn)我一個(gè)問(wèn)題:請(qǐng)問(wèn)一下降低RPN、RCNN的IOU閾值會(huì)有什么影響嗎?這是一個(gè)非常好的問(wèn)題,我們一直習(xí)慣了用默認(rèn)值,所以我想通過(guò)可視化分析看下有沒(méi)有辦法基于不同項(xiàng)目確定該閾值?

          ????以RPN為例,RCNN也是一樣道理,其正樣本閾值的選擇會(huì)決定正樣本數(shù)量以及質(zhì)量,進(jìn)而會(huì)影響最終結(jié)果,在級(jí)聯(lián)rcnn里面分析的已經(jīng)蠻透徹了。

          ??? RPN層的配置如下:


          ? 其采用最大iou分配原則,其實(shí)現(xiàn)細(xì)節(jié)和原理具體參見(jiàn)微信公眾號(hào)或者知乎文章目標(biāo)檢測(cè)正負(fù)樣本區(qū)分策略和平衡策略總結(jié)(一)

          ????負(fù)樣本預(yù)測(cè)neg_iou_thr一般不用調(diào)整,主要是pos_iou_thr,默認(rèn)是0.7,比較高。注意這個(gè)默認(rèn)值是基于coco數(shù)據(jù)集確定的,換一個(gè)數(shù)據(jù)集不一定適合。我們來(lái)統(tǒng)計(jì)下正樣本個(gè)數(shù),由于mmdetection計(jì)算正樣本anchor都是基于單張圖片的,故我們分析也是對(duì)單張圖片分析。要統(tǒng)計(jì)正樣本數(shù)非常簡(jiǎn)單,僅僅在mmdet/models/dense_heads/anchor_head.py的_get_targets_single函數(shù)里面,大概231行即:

          assign_result = self.assigner.assign(        anchors, gt_bboxes, gt_bboxes_ignore,        None if self.sampling else gt_labels)

          下面加入如下代碼:

          ????就可以在訓(xùn)練過(guò)程中實(shí)時(shí)打印每張圖片的正樣本個(gè)數(shù)。self.count、self.sum_num_gtanchor和self.sum_num_gtbbox是初始化時(shí)候定義的兩個(gè)變量,初始化都是0,目的是每隔50張圖片計(jì)算一下平均正樣本個(gè)數(shù)和gt bbox數(shù)目。

          ????在coco數(shù)據(jù)集上,當(dāng)pos_iou_thr=0.7時(shí)候,每張圖片的大概數(shù)目是:

          21 5 47 7 10 5 114 42 60 68 7 13 6 50 41 96 59 127 358 70 5 13 7 13 7 27 57 19 16 71 10 3 11 66 3 17 4242 9 44 39 37 8 50 13 27 15 46 4

          平均數(shù)是:

          32.6  29.76  41.42  36.14 33.5 35.18 29.8

          當(dāng)pos_iou_thr=0.5時(shí)候,每張圖片的大概數(shù)目是:

          68 56 83 40 53 57 530 124 267 348 50 80 44 211 48353 336 264 27 91 118 51 13 78 52 48 193 134 41 83100 36 42 60 93 30 149 185 205 48 217 193 135 77 26631?115?48?308?44

          平均數(shù)是:

          126.46?120.68?160.3?155.48?136.78?137.18?114.42

          而gt bbox的平均數(shù)是:

          6.48  7.16 8.44 7.98  7.32  7.44 5.88 5.82

          ????當(dāng)閾值設(shè)置為0.7時(shí)候,gt bbox占據(jù)gt anchor比例大概是21.1% ,而閾值為0.5時(shí)候,比例為5.3%,通過(guò)這個(gè)比例大概可以估計(jì)每個(gè)gt bbox平均分配了幾個(gè)anchor,如果想更加精細(xì),則需要分別統(tǒng)計(jì)大小gt bbox的分配情況。可以明顯看出:當(dāng)閾值設(shè)置為0.5時(shí)候,正樣本數(shù)目急劇增加,幾乎是0.7的4倍了。

          ????在voc數(shù)據(jù)集上,當(dāng)pos_iou_thr=0.7時(shí)候,每張圖片的大概數(shù)目是:

          7 6 4 3 3 4 5 26 3 11 3 13 8 6 13 8 12 13 17 6 1813 6 14 5 19 5 2 10 8 10 10 16 41 5 27 5 2 8 9 834 10 53 14 6 6 2 7 4

          平均數(shù)是:

          10.96 8.1 9.08 8.88 8.02  9.08 8.38  9.38

          當(dāng)pos_iou_thr=0.5時(shí)候是:

          58 6 18 30 30 31 46 113 15 80 32 69 31 9 60 73 103 3854 6 30 77 71 130 32 112 43 26 84 62 64 89 24 124 27 28441 6 71 36 73 153 47 232 53 30 23 28 52 34

          平均數(shù)是:

          61.2 46.32 51.74 48.92 45.34 53.72 51.2 52.36

          而對(duì)應(yīng)的gt bbox的平均數(shù)是:

          2.66 2.06 2.22 2.06 1.84 2.36 2.2

          ????當(dāng)閾值設(shè)置為0.7時(shí)候,gt bbox占據(jù)gt anchor比例大概是21.7% ,而閾值為0.5時(shí)候,比例為3.8%。

          ?? 由于coco數(shù)據(jù)單張圖片中bbox數(shù)目比voc多很多,所以在閾值相同情況下,單張圖片coco的正樣本anchor個(gè)數(shù)會(huì)比voc多。這樣看起來(lái)好像voc閾值設(shè)置為0.7也是合適的。其實(shí)不一定,因?yàn)楹竺孢€有一個(gè)采樣參數(shù)256。

          ????每張圖片采樣256個(gè)樣本,并且正負(fù)比例是1:1,如果正樣本很多,則會(huì)隨機(jī)選擇128個(gè),由于正樣本增加了很多,導(dǎo)致隨機(jī)選擇的很可能是大量低質(zhì)量的anchor,故對(duì)學(xué)習(xí)是不利的,所以在coco上面閾值設(shè)置為0.5不太合適,但是我覺(jué)得voc上面設(shè)置0.7也不太合適,正樣本稍微有點(diǎn)少,可以適當(dāng)降低下。

          ????個(gè)人經(jīng)驗(yàn),實(shí)際上該閾值的選擇和很多參數(shù)都有聯(lián)系,例如圖片中g(shù)t bbox個(gè)數(shù)、anchor設(shè)置是否合理、后續(xù)采樣策略和match_low_quality。在大部分場(chǎng)景下,0.7應(yīng)該是該參數(shù)的最大值了,已經(jīng)非常高了,不同項(xiàng)目應(yīng)該是維持不變或者稍微下降,太高會(huì)導(dǎo)致明顯漏報(bào),太低會(huì)導(dǎo)致回歸質(zhì)量比較差。

          ????如果數(shù)據(jù)量不多,最好還是在0.5~0.7之間設(shè)置幾個(gè)參數(shù)跑幾次對(duì)比實(shí)驗(yàn),比較靠譜,或者從大數(shù)據(jù)里面挑選一些數(shù)據(jù)組成小數(shù)據(jù)集,進(jìn)行對(duì)比實(shí)驗(yàn)。在可視化方面,可以可視化所有正樣本的anchor,可以初步看下anchor質(zhì)量,其代碼非常簡(jiǎn)單,在上面的統(tǒng)計(jì)代碼后面增加:

          ????需要注意的是,我們希望得到輸入到網(wǎng)絡(luò)前的圖片,則需要在datasets配置文件里面,把img的key添加到meta_keys,如下所示:

          就是在原始的meta_keys后面新增'img'就可以了。

          ????選幾張典型圖片可視化如下。白色bbox是gtbbox 正樣本閾值為0.7時(shí)候,voc數(shù)據(jù):

          正樣本閾值為0.5時(shí)候,voc數(shù)據(jù):

          ????從這里來(lái)看,voc設(shè)置為0.7有點(diǎn)高,但是設(shè)置為0.5也是太低了,或許中間值可以。
          ??? coco數(shù)據(jù)集上面也是一樣,如下所示:

          ????如果還想看每個(gè)anchor和gt bbox的匹配iou,還可以把這個(gè)數(shù)值繪制在上方,更加好看一些。

          3?RPN預(yù)測(cè)輸出可視化

          ????通常我都會(huì)看下RPN預(yù)測(cè)的bbox都是張啥樣,故可以通過(guò)實(shí)時(shí)保存圖片或者采用tensorboard進(jìn)行存儲(chǔ)。我這里就簡(jiǎn)單看下RPN的預(yù)測(cè)輸出,方法非常多種,我的寫(xiě)法是:?
          ????在mmdet/models/detectors/two_stage.py的forward_train方法里面,在

          rpn_losses, proposal_list = self.rpn_head.forward_train(            x,            img_metas,            gt_bboxes,            gt_labels=None,            gt_bboxes_ignore=gt_bboxes_ignore,            proposal_cfg=proposal_cfg)

          代碼后面插入如下代碼即可:?

          和前面代碼幾乎差不多,只不過(guò)這里多了一個(gè)預(yù)測(cè)概率顯示。如果從頭訓(xùn)練coco數(shù)據(jù),那么剛開(kāi)始時(shí)候會(huì)顯示如下:

          可以看出,剛開(kāi)始訓(xùn)練時(shí)候RPN預(yù)測(cè)輸出其實(shí)就是相當(dāng)于隨機(jī)輸出。

          ????如果我采用mmdetection訓(xùn)練好的模型faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth進(jìn)行可視化,如下所示(如果可視化前1000個(gè),會(huì)太密集不好看,故我修改參數(shù)為300):?

          ????這個(gè)是mAP等于0.384的模型,實(shí)際上看RPN的預(yù)測(cè)結(jié)果也不是很好,正如GA論文里面提到的,很多預(yù)測(cè)框都是在沒(méi)有語(yǔ)義的地方,有些特別奇怪的超大預(yù)測(cè)框出現(xiàn),但是幸好gt bbox還是有蠻多roi框住了。

          4 RCNN正樣本anchor可視化

          ????其配置如下:?

          ??? RCNN部分可視化代碼和RPN代碼是完全相同的,只是位置不一樣而已,具體就是在mmdet/models/roi_heads/standard_roi_head.py的forward_train函數(shù)的:

          assign_result = self.bbox_assigner.assign(                proposal_list[i], gt_bboxes[i], gt_bboxes_ignore[i],                gt_labels[i])

          代碼下面加入和RPN一樣的正樣本分析和可視化代碼(我這里加的是簡(jiǎn)化版):?

          ????在mmdetection訓(xùn)練好的模型faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth上可視化如下:?

          1000個(gè)roi,正樣本有59個(gè)??雌饋?lái)還不錯(cuò)。?如果從頭訓(xùn)練,則開(kāi)始時(shí)候顯示如下:

          ????正樣本只有3個(gè),而gt bbox有4個(gè)??梢悦黠@看出,隨著rpn訓(xùn)練過(guò)程的不斷迭代,正樣本數(shù)目會(huì)慢慢增加。但是需要注意的是在RCNN后面的RandomSampler采樣類里面會(huì)開(kāi)啟參數(shù)add_gt_as_proposals=True,因?yàn)槲覀兛梢钥吹介_(kāi)始訓(xùn)練時(shí)候正樣本太少了,會(huì)導(dǎo)致收斂很慢,故會(huì)增加gt bbox,然后再進(jìn)行隨機(jī)采樣。

          ????同時(shí)在這里,大家也可以統(tǒng)計(jì)輸入的1000個(gè)roi和gt bbox的平均iou,并且結(jié)合極聯(lián)rcnn來(lái)分析看是否現(xiàn)象和論文一致。

          ????如果先看RCNN預(yù)測(cè)前后bbox變化,這個(gè)可視化的目的是可以最終每個(gè)正樣本anchor回歸情況,還是比較關(guān)鍵的。我這里暫時(shí)就是顯示而已,并沒(méi)有真正的追蹤(要追蹤比較容易,因?yàn)樗恼龢颖綼nchor順序并沒(méi)有改變),其具體做法是:?


          (1) 可視化正樣本anchor?
          ????在mmdet/models/roi_heads/standard_roi_head.py的forward_train函數(shù)里面,在如下代碼:

          sampling_result = self.bbox_sampler.sample(                assign_result,                proposal_list[i],                gt_bboxes[i],                gt_labels[i],                feats=[lvl_feat[i][None] for lvl_feat in x])

          后面新增預(yù)測(cè)前anchor的情況:?

          這里沒(méi)有直接顯示,而且把圖片臨時(shí)存儲(chǔ)起來(lái)了,方便后面用。

          (2) 解碼預(yù)測(cè)bbox和類別,并且暫時(shí)保存內(nèi)容?
          ????在mmdet/models/roi_heads/bbox_heads/bbox_head.py的loss函數(shù)的如下代碼:

          if pos_inds.any():

          后面追加:?

          ????由于rcnn的bbox預(yù)測(cè)輸出是80x4的,故還需要基于label或者預(yù)測(cè)類別切分出需要的bbox值。并且暫時(shí)保存起來(lái),注意key不要和框架代碼中已經(jīng)存在的key重復(fù),否則可能會(huì)出現(xiàn)一些莫名其妙的bug。?
          (3) 聯(lián)合顯示?
          ????由于前面已經(jīng)保存了可視化圖,故這里就直接讀取就行,具體操作是:?
          在mmdet/models/roi_heads/standard_roi_head.py的forward_train函數(shù)的如下代碼:

          bbox_results = self._bbox_forward_train(x, sampling_results,                                                gt_bboxes, gt_labels,                                                img_metas)

          后面追加如下:?

          白色的gt bbox,藍(lán)色的預(yù)測(cè)前anchor或者說(shuō)roi的bbox,綠色是預(yù)測(cè)后的基于anchor解碼后的bbox:?

          回歸效果蠻不錯(cuò)的。

          5 本文小結(jié)

          ????通過(guò)可視化分析,主要目的是熟悉代碼原理、框架實(shí)現(xiàn)過(guò)程和多超參的大概理解。這里我分析的還是比較淺陋,如果大家有更加深入的分析可視化,歡迎留言。


          推薦閱讀

          目標(biāo)檢測(cè)正負(fù)樣本區(qū)分策略和平衡策略總結(jié)(一)

          目標(biāo)檢測(cè)正負(fù)樣本區(qū)分策略和平衡策略總結(jié)(二)

          目標(biāo)檢測(cè)正負(fù)樣本區(qū)分策略和平衡策略總結(jié)(三)

          目標(biāo)檢測(cè)王者庫(kù)MMDetection迎來(lái)重大版本更新!




          機(jī)器學(xué)習(xí)算法工程師


          ? ??? ? ? ? ? ? ? ? ? ? ? ??????????????????一個(gè)用心的公眾號(hào)


          ?

          瀏覽 106
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久成人片免费观看蜜芽 | 黄色片在线免费观看视频 | 黄色录像一级片 | 日韩性爱小视频 | 免费毛片网站高清无码在线观看 |