<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>

          目標(biāo)檢測比賽中的tricks集錦

          共 36019字,需瀏覽 73分鐘

           ·

          2020-09-02 18:27

          ↑ 點擊藍(lán)字?關(guān)注極市平臺

          作者丨初識CV@知乎
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/102817180
          編輯丨極市平臺

          極市導(dǎo)讀

          ?

          本文總結(jié)了目標(biāo)檢測比賽中的8點技巧,包含數(shù)據(jù)增強、多尺度訓(xùn)練/測試、全局語境、預(yù)測框微調(diào)/投票法/模型融合、隨機權(quán)值平均、在線難例挖掘、軟化非極大抑制等,并附有代碼解析。

          1.數(shù)據(jù)增強

          可參考:

          初識CV:MMDetection中文文檔
          https://zhuanlan.zhihu.com/p/101222759

          數(shù)據(jù)增強是增加深度模型魯棒性和泛化性能的常用手段,隨機翻轉(zhuǎn)、隨機裁剪、添加噪聲等也被引入到檢測任務(wù)的訓(xùn)練中來,個人認(rèn)為數(shù)據(jù)(監(jiān)督信息)的適時傳入可能是更有潛力的方向。

          個人觀點:

          問題: 為什么圖像和Bbox需要進行數(shù)據(jù)增強呢?

          答: 因為數(shù)據(jù)多了就可以盡可能多的學(xué)習(xí)到圖像中的不變性,學(xué)習(xí)到的不變性越多那么模型的泛化能力越強。

          但是輸入到CNN中的圖像為什么不具有平移不變性?如何去解決?下面鏈接有專門的解析:

          初識CV:輸入到CNN中的圖像為什么不具有平移不變性?如何去解決?
          https://zhuanlan.zhihu.com/p/103342289

          MMDetection中,數(shù)據(jù)增強包括兩部分:(源碼解析)

          新版MMDetection新添加用Albu數(shù)據(jù)庫對圖像進行增強的代碼,位置在mmdetection/configs/albu_example/mask_rcnn_r50_fpn_1x.py,是基于圖像分割的,用于目標(biāo)檢測的代碼更新如下:

          初識CV:目標(biāo)檢測tricks:Ablu數(shù)據(jù)庫增強
          https://zhuanlan.zhihu.com/p/125036517

          1. 圖像增強。

          1.1 引入albumentations數(shù)據(jù)增強庫進行增強

          這部分代碼需要看開頭‘注意’部分解析,防止修改代碼后運行報錯。

          需要修改兩個部分代碼:

          • mmdet/datasets/pipelines/transforms.py,修改后的源碼如下:

          mmdet/datasets/pipelines/transforms.py
          https://zhuanlan.zhihu.com/p/107922611

          • mmdet/datasets/pipelines/__init__.py,修改后的源碼如下:

          mmdet/datasets/pipelines/__init__.py
          https://zhuanlan.zhihu.com/p/107922962

          具體修改方式如下:添加dict(type='Albu', transforms = [{"type": 'RandomRotate90'}]),其他的類似。

          train_pipeline = [    dict(type='LoadImageFromFile'),    dict(type='LoadAnnotations', with_bbox=True),    dict(type='Albu', transforms = [{"type": 'RandomRotate90'}]),# 數(shù)據(jù)增強    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),    dict(type='RandomFlip', flip_ratio=0.5),    dict(type='Normalize', **img_norm_cfg),    dict(type='Pad', size_divisor=32),    dict(type='DefaultFormatBundle'),    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),]

          1.2 MMDetection自帶數(shù)據(jù)增強:

          • 源碼在mmdet/datasets/extra_aug.py里面,包括RandomCrop、brightness、contrast、saturation、ExtraAugmentation等等圖像增強方法。
          • 添加位置是train_pipeline或test_pipeline這個地方(一般train進行增強而test不需要),例如數(shù)據(jù)增強RandomFlip,flip_ratio代表隨機翻轉(zhuǎn)的概率:
          train_pipeline = [    dict(type='LoadImageFromFile'),    dict(type='LoadAnnotations', with_bbox=True),    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),    dict(type='RandomFlip', flip_ratio=0.5),    dict(type='Normalize', **img_norm_cfg),    dict(type='Pad', size_divisor=32),    dict(type='DefaultFormatBundle'),    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),]test_pipeline = [    dict(type='LoadImageFromFile'),    dict(        type='MultiScaleFlipAug',        img_scale=(1333, 800),        flip=False,        transforms=[            dict(type='Resize', keep_ratio=True),            dict(type='RandomFlip'),            dict(type='Normalize', **img_norm_cfg),            dict(type='Pad', size_divisor=32),            dict(type='ImageToTensor', keys=['img']),            dict(type='Collect', keys=['img']),        ])]

          2. Bbox增強

          • albumentations數(shù)據(jù)增強(同上)
          • 源碼在mmdet/datasets/custom.py里面,增強源碼為:
           def pre_pipeline(self, results):        results['img_prefix'] = self.img_prefix        results['seg_prefix'] = self.seg_prefix        results['proposal_file'] = self.proposal_file        results['bbox_fields'] = []        results['mask_fields'] = []

          2.Multi-scale Training/Testing 多尺度訓(xùn)練/測試

          可參考:

          初識CV:MMDetection中文文檔—4.技術(shù)細(xì)節(jié)
          https://zhuanlan.zhihu.com/p/101222759

          輸入圖片的尺寸對檢測模型的性能影響相當(dāng)明顯,事實上,多尺度是提升精度最明顯的技巧之一。在基礎(chǔ)網(wǎng)絡(luò)部分常常會生成比原圖小數(shù)十倍的特征圖,導(dǎo)致小物體的特征描述不容易被檢測網(wǎng)絡(luò)捕捉。通過輸入更大、更多尺寸的圖片進行訓(xùn)練,能夠在一定程度上提高檢測模型對物體大小的魯棒性,僅在測試階段引入多尺度,也可享受大尺寸和多尺寸帶來的增益。

          multi-scale training/testing最早見于[1],訓(xùn)練時,預(yù)先定義幾個固定的尺度,每個epoch隨機選擇一個尺度進行訓(xùn)練。測試時,生成幾個不同尺度的feature map,對每個Region Proposal,在不同的feature map上也有不同的尺度,我們選擇最接近某一固定尺寸(即檢測頭部的輸入尺寸)的Region Proposal作為后續(xù)的輸入。在[2]中,選擇單一尺度的方式被Maxout(element-wise max,逐元素取最大)取代:隨機選兩個相鄰尺度,經(jīng)過Pooling后使用Maxout進行合并,如下圖所示。

          使用Maxout合并feature vector

          近期的工作如FPN等已經(jīng)嘗試在不同尺度的特征圖上進行檢測,但多尺度訓(xùn)練/測試仍作為一種提升性能的有效技巧被應(yīng)用在MS COCO等比賽中。

          問題:多尺度的選擇有什么規(guī)則和技巧嗎?

          答:如果模型不考慮時間開銷,尺寸往大的開。一般來說尺度越大效果越好,主要是因為檢測的小目標(biāo)越多效果越差。如果是新手那就按照默認(rèn)參數(shù)的比例擴大就行了,然后測試的時候取訓(xùn)練集的中間值。比如cascade50默認(rèn)尺度是(1333,800),多尺度可以按照默認(rèn)尺度的倍數(shù)擴大比如擴大兩倍(2666,1600),多尺度訓(xùn)練可以寫成[(1333, 800), (2666, 1600)],單尺度測試可以選擇(2000, 1200),多尺度測試可以選擇為多尺度訓(xùn)練的尺度加上他們的中間值[(1333, 800), (2000, 1200),(2666, 1600)]。keep_ratio=True,一般不考慮長邊。

          MMDetection中,多尺度訓(xùn)練/測試:(源碼解析)

          只需要修改train_pipeline 和test_pipeline中的img_scale部分即可(換成[(), ()]或者[(), (), ().....])。帶來的影響是:train達到擬合的時間增加、test的時間增加,一旦test的時間增加一定會影響比賽的分?jǐn)?shù),因為比賽都會將測試的時間作為評分標(biāo)準(zhǔn)之一:

          參數(shù)解析:

          • train_pipelinedict(type='Resize', img_scale=(1333, 800), keep_ratio=True)keep_ratio解析。假設(shè)原始圖像大小為(1500, 1000),ratio=長邊/短邊 = 1.5。

            • 當(dāng)keep_ratio=True時,img_scale的多尺度最多為兩個。假設(shè)多尺度為[(2000, 1200), (1333, 800)],則代表的含義為:首先將圖像的短邊固定到800到1200范圍中的某一個數(shù)值假設(shè)為1100,那么對應(yīng)的長邊應(yīng)該是短邊的ratio=1.5倍為?,且長邊的取值在1333到2000的范圍之內(nèi)。如果大于2000按照2000計算,小于1300按照1300計算。
            • 當(dāng)keep_ratio=False時,img_scale的多尺度可以為任意多個。假設(shè)多尺度為[(2000, 1200), (1666, 1000),(1333, 800)],則代表的含義為:隨機從三個尺度中選取一個作為圖像的尺寸進行訓(xùn)練。
          • test_pipelineimg_scale的尺度可以為任意多個,含義為對測試集進行多尺度測試(可以理解為TTA)。

          train_pipeline = [    dict(type='LoadImageFromFile'),    dict(type='LoadAnnotations', with_bbox=True),    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), #這里可以更換多尺度[(),()]    dict(type='RandomFlip', flip_ratio=0.5),    dict(type='Normalize', **img_norm_cfg),    dict(type='Pad', size_divisor=32),    dict(type='DefaultFormatBundle'),    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),]test_pipeline = [    dict(type='LoadImageFromFile'),    dict(        type='MultiScaleFlipAug',        img_scale=(1333, 800), #這里可以更換多尺度[(),()]        flip=False,        transforms=[            dict(type='Resize', keep_ratio=True),            dict(type='RandomFlip'),            dict(type='Normalize', **img_norm_cfg),            dict(type='Pad', size_divisor=32),            dict(type='ImageToTensor', keys=['img']),            dict(type='Collect', keys=['img']),        ])]

          3.Global Context 全局語境

          這一技巧在ResNet的工作[3]中提出,做法是把整張圖片作為一個RoI,對其進行RoI Pooling并將得到的feature vector拼接于每個RoI的feature vector上,作為一種輔助信息傳入之后的R-CNN子網(wǎng)絡(luò)。目前,也有把相鄰尺度上的RoI互相作為context共同傳入的做法。

          這一部分暫時沒有代碼解析。

          4.Box Refinement/Voting 預(yù)測框微調(diào)/投票法/模型融合

          微調(diào)法投票法由工作[4]提出,前者也被稱為Iterative Localization。

          微調(diào)法最初是在SS算法得到的Region Proposal基礎(chǔ)上用檢測頭部進行多次迭代得到一系列box,在ResNet的工作中,作者將輸入R-CNN子網(wǎng)絡(luò)的Region Proposal和R-CNN子網(wǎng)絡(luò)得到的預(yù)測框共同進行NMS(見下面小節(jié))后處理,最后,把跟NMS篩選所得預(yù)測框的IoU超過一定閾值的預(yù)測框進行按其分?jǐn)?shù)加權(quán)的平均,得到最后的預(yù)測結(jié)果。

          投票法可以理解為以頂尖篩選出一流,再用一流的結(jié)果進行加權(quán)投票決策。

          不同的訓(xùn)練策略,不同的 epoch 預(yù)測的結(jié)果,使用 NMS 來融合,或者soft_nms

          需要調(diào)整的參數(shù):

          • box voting 的閾值。
          • 不同的輸入中這個框至少出現(xiàn)了幾次來允許它輸出。
          • 得分的閾值,一個目標(biāo)框的得分低于這個閾值的時候,就刪掉這個目標(biāo)框。

          模型融合主要分為兩種情況:

          1. 單個模型的不同epoch進行融合

          這里主要是在nms之前,對于不同模型預(yù)測出來的結(jié)果,根據(jù)score來排序再做nms操作。

          2. 多個模型的融合

          這里是指不同的方法,比如說faster rcnn與retinanet的融合,可以有兩種情況:

          a) 取并集,防止漏檢。

          b) 取交集,防止誤檢,提高精度。

          5.隨機權(quán)值平均(Stochastic Weight Averaging,SWA)

          隨機權(quán)值平均只需快速集合集成的一小部分算力,就可以接近其表現(xiàn)。SWA 可以用在任意架構(gòu)和數(shù)據(jù)集上,都會有不錯的表現(xiàn)。根據(jù)論文中的實驗,SWA 可以得到我之前提到過的更寬的極小值。在經(jīng)典認(rèn)知下,SWA 不算集成,因為在訓(xùn)練的最終階段你只得到一個模型,但它的表現(xiàn)超過了快照集成,接近 FGE(多個模型取平均)。

          左圖:W1、W2、W3分別代表3個獨立訓(xùn)練的網(wǎng)絡(luò),Wswa為其平均值。中圖:WSWA 在測試集上的表現(xiàn)超越了SGD。右圖:WSWA 在訓(xùn)練時的損失比SGD要高。

          結(jié)合 WSWA 在測試集上優(yōu)于 SGD 的表現(xiàn),這意味著盡管 WSWA 訓(xùn)練時的損失較高,它的泛化性更好。

          SWA 的直覺來自以下由經(jīng)驗得到的觀察:每個學(xué)習(xí)率周期得到的局部極小值傾向于堆積在損失平面的低損失值區(qū)域的邊緣(上圖左側(cè)的圖形中,褐色區(qū)域誤差較低,點W1、W2、3分別表示3個獨立訓(xùn)練的網(wǎng)絡(luò),位于褐色區(qū)域的邊緣)。對這些點取平均值,可能得到一個寬闊的泛化解,其損失更低(上圖左側(cè)圖形中的 WSWA)。

          下面是 SWA 的工作原理。它只保存兩個模型,而不是許多模型的集成:

          1. 第一個模型保存模型權(quán)值的平均值(WSWA)。在訓(xùn)練結(jié)束后,它將是用于預(yù)測的最終模型。
          2. 第二個模型(W)將穿過權(quán)值空間,基于周期性學(xué)習(xí)率規(guī)劃探索權(quán)重空間。

          SWA權(quán)重更新公式

          在每個學(xué)習(xí)率周期的末尾,第二個模型的當(dāng)前權(quán)重將用來更新第一個模型的權(quán)重(公式如上)。因此,在訓(xùn)練階段,只需訓(xùn)練一個模型,并在內(nèi)存中儲存兩個模型。預(yù)測時只需要平均模型,基于其進行預(yù)測將比之前描述的集成快很多,因為在那種集成中,你需要使用多個模型進行預(yù)測,最后再進行平均。

          方法實現(xiàn):

          論文的作者自己提供了一份 PyTorch 的實現(xiàn) :

          timgaripov/swa
          https://github.com/timgaripov/swa

          此外,基于 fast.ai 庫的 SWA 可見 :

          Add Stochastic Weight Averaging by wdhorton · Pull Request #276 · fastai/fastai
          https://github.com/fastai/fastai/pull/276/commits

          6.OHEM 在線難例挖掘

          OHEM(Online Hard negative Example Mining,https://arxiv.org/pdf/1604.03540.pdf),在線難例挖掘)見于[5]。兩階段檢測模型中,提出的RoI Proposal在輸入R-CNN子網(wǎng)絡(luò)前,我們有機會對正負(fù)樣本(背景類和前景類)的比例進行調(diào)整。通常,背景類的RoI Proposal個數(shù)要遠(yuǎn)遠(yuǎn)多于前景類,F(xiàn)ast R-CNN的處理方式是隨機對兩種樣本進行上采樣和下采樣,以使每一batch的正負(fù)樣本比例保持在1:3,這一做法緩解了類別比例不均衡的問題,是兩階段方法相比單階段方法具有優(yōu)勢的地方,也被后來的大多數(shù)工作沿用。

          論文中把OHEM應(yīng)用在Fast R-CNN,是因為Fast R-CNN相當(dāng)于目標(biāo)檢測各大框架的母體,很多框架都是它的變形,所以作者在Fast R-CNN上應(yīng)用很有說明性。

          Fast R-CNN框架

          上圖是Fast R-CNN框架,簡單的說,F(xiàn)ast R-CNN框架是將224×224的圖片當(dāng)作輸入,經(jīng)過conv,pooling等操作輸出feature map,通過selective search 創(chuàng)建2000個region proposal,將其一起輸入ROI pooling層,接上全連接層與兩個損失層。

          OHEM圖解,應(yīng)用于Fast R-CNN

          作者將OHEM應(yīng)用在Fast R-CNN的網(wǎng)絡(luò)結(jié)構(gòu),如上圖,這里包含兩個RoI network,上面一個RoI network是只讀的,為所有的RoI 在前向傳遞的時候分配空間,下面一個RoI network則同時為前向和后向分配空間。在OHEM的工作中,作者提出用R-CNN子網(wǎng)絡(luò)對RoI Proposal預(yù)測的分?jǐn)?shù)來決定每個batch選用的樣本。這樣,輸入R-CNN子網(wǎng)絡(luò)的RoI Proposal總為其表現(xiàn)不好的樣本,提高了監(jiān)督學(xué)習(xí)的效率。

          首先,RoI 經(jīng)過RoI plooling層生成feature map,然后進入只讀的RoI network得到所有RoI 的loss;然后是hard RoI sampler結(jié)構(gòu)根據(jù)損失排序選出hard example,并把這些hard example作為下面那個RoI network的輸入。

          實際訓(xùn)練的時候,每個mini-batch包含N個圖像,共|R|個RoI ,也就是每張圖像包含|R|/N個RoI 。經(jīng)過hard RoI sampler篩選后得到B個hard example。作者在文中采用N=2,|R|=4000,B=128。另外關(guān)于正負(fù)樣本的選擇:當(dāng)一個RoI 和一個ground truth的IoU大于0.5,則為正樣本;當(dāng)一個RoI 和所有g(shù)round truth的IoU的最大值小于0.5時為負(fù)樣本。

          總結(jié)來說,對于給定圖像,經(jīng)過selective search RoIs,同樣計算出卷積特征圖。但是在綠色部分的(a)中,一個只讀的RoI網(wǎng)絡(luò)對特征圖和所有RoI進行前向傳播,然后Hard RoI module利用這些RoI的loss選擇B個樣本。在紅色部分(b)中,這些選擇出的樣本(hard examples)進入RoI網(wǎng)絡(luò),進一步進行前向和后向傳播。

          MMDetection中,OHEM(online hard example mining):(源碼解析)

          rcnn=[        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.4, # 更換                neg_iou_thr=0.4,                min_pos_iou=0.4,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.5,                neg_iou_thr=0.5,                min_pos_iou=0.5,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler', # 解決難易樣本,也解決了正負(fù)樣本比例問題。                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.6,                neg_iou_thr=0.6,                min_pos_iou=0.6,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False)    ],    stage_loss_weights=[1, 0.5, 0.25])

          7.Soft NMS 軟化非極大抑制

          NMS后處理圖示

          NMS(Non-Maximum Suppression,非極大抑制)是檢測模型的標(biāo)準(zhǔn)后處理操作,用于去除重合度(IoU)較高的預(yù)測框,只保留預(yù)測分?jǐn)?shù)最高的預(yù)測框作為檢測輸出。Soft NMS由[6]提出。在傳統(tǒng)的NMS中,跟最高預(yù)測分?jǐn)?shù)預(yù)測框重合度超出一定閾值的預(yù)測框會被直接舍棄,作者認(rèn)為這樣不利于相鄰物體的檢測。提出的改進方法是根據(jù)IoU將預(yù)測框的預(yù)測分?jǐn)?shù)進行懲罰,最后再按分?jǐn)?shù)過濾。配合Deformable Convnets(將在之后的文章介紹),Soft NMS在MS COCO上取得了當(dāng)時最佳的表現(xiàn)。算法改進如下:

          Soft-NMS算法改進

          上圖中的即為軟化函數(shù),通常取線性或高斯函數(shù),后者效果稍好一些。當(dāng)然,在享受這一增益的同時,Soft-NMS也引入了一些超參,對不同的數(shù)據(jù)集需要試探以確定最佳配置。

          解析Soft NMS論文的一個小知識點:Improving Object Detection With One Line of Code
          https://arxiv.org/pdf/1704.04503.pdf

          可以根據(jù)論文Table3中對應(yīng)AP@(置信度閾值)的?值設(shè)置iou_thr(nms的值:

          左邊一半(紅色框)是NMS,右邊一半(綠色框)是Soft NMS。在NMS部分,相同?(置信度閾值)條件下(較小的情況下),基本上?值越大,其AP值越小。這主要是因為值越大,有越多的重復(fù)框沒有過濾掉。

          左邊一半(紅色框)是NMS,右邊一半(綠色框)是Soft NMS。

          MMDetection中,Soft NMS 軟化非極大抑制:(源碼解析)

          test_cfg = dict(    rpn=dict(        nms_across_levels=False,        nms_pre=1000,        nms_post=1000,        max_num=1000,        nms_thr=0.7,        min_bbox_size=0),      rcnn=dict(        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=100)   # max_per_img表示最終輸出的det bbox數(shù)量    # soft-nms is also supported for rcnn testing    # e.g., nms=dict(type='soft_nms', iou_thr=0.5, min_score=0.001)            # soft_nms參數(shù))

          8.RoIAlign RoI對齊

          RoIAlign是Mask R-CNN([7])的工作中提出的,針對的問題是RoI在進行Pooling時有不同程度的取整,這影響了實例分割中mask損失的計算。文章采用雙線性插值的方法將RoI的表示精細(xì)化,并帶來了較為明顯的性能提升。這一技巧也被后來的一些工作(如light-head R-CNN)沿用。

          這一部分暫時沒有代碼解析。

          9.其他方法

          除去上面所列的技巧外,還有一些做法也值得注意:

          • 更好的先驗(YOLOv2):使用聚類方法統(tǒng)計數(shù)據(jù)中box標(biāo)注的大小和長寬比,以更好的設(shè)置anchor box的生成配置
          • 更好的pre-train模型:檢測模型的基礎(chǔ)網(wǎng)絡(luò)通常使用ImageNet(通常是ImageNet-1k)上訓(xùn)練好的模型進行初始化,使用更大的數(shù)據(jù)集(ImageNet-5k)預(yù)訓(xùn)練基礎(chǔ)網(wǎng)絡(luò)對精度的提升亦有幫助
          • 超參數(shù)的調(diào)整:部分工作也發(fā)現(xiàn)如NMS中IoU閾值的調(diào)整(從0.3到0.5)也有利于精度的提升,但這一方面尚無最佳配置參照

          最后,集成(Ensemble)作為通用的手段也被應(yīng)用在比賽中。

          代碼部分

          1.各部分代碼解析

          1.1 faster_rcnn_r50_fpn_1x.py:

          首先介紹一下這個配置文件所描述的框架,它是基于resnet50的backbone,有著5個fpn特征層的faster-RCNN目標(biāo)檢測網(wǎng)絡(luò),訓(xùn)練迭代次數(shù)為標(biāo)準(zhǔn)的12次epoch。

          # model settingsmodel = dict(  type='FasterRCNN',                         # model類型    pretrained='modelzoo://resnet50',          # 預(yù)訓(xùn)練模型:imagenet-resnet50    backbone=dict(        type='ResNet',                         # backbone類型        depth=50,                              # 網(wǎng)絡(luò)層數(shù)        num_stages=4,                          # resnet的stage數(shù)量        out_indices=(0, 1, 2, 3),              # 輸出的stage的序號        frozen_stages=1,                       # 凍結(jié)的stage數(shù)量,即該stage不更新參數(shù),-1表示所有的stage都更新參數(shù)        style='pytorch'),                      # 網(wǎng)絡(luò)風(fēng)格:如果設(shè)置pytorch,則stride為2的層是conv3x3的卷積層;如果設(shè)置caffe,則stride為2的層是第一個conv1x1的卷積層    neck=dict(        type='FPN',                            # neck類型        in_channels=[256, 512, 1024, 2048],    # 輸入的各個stage的通道數(shù)        out_channels=256,                      # 輸出的特征層的通道數(shù)        num_outs=5),                           # 輸出的特征層的數(shù)量    rpn_head=dict(        type='RPNHead',                        # RPN網(wǎng)絡(luò)類型        in_channels=256,                       # RPN網(wǎng)絡(luò)的輸入通道數(shù)        feat_channels=256,                     # 特征層的通道數(shù)        anchor_scales=[8],                     # 生成的anchor的baselen,baselen = sqrt(w*h),w和h為anchor的寬和高        anchor_ratios=[0.5, 1.0, 2.0],         # anchor的寬高比        anchor_strides=[4, 8, 16, 32, 64],     # 在每個特征層上的anchor的步長(對應(yīng)于原圖)        target_means=[.0, .0, .0, .0],         # 均值        target_stds=[1.0, 1.0, 1.0, 1.0],      # 方差        use_sigmoid_cls=True),                 # 是否使用sigmoid來進行分類,如果False則使用softmax來分類    bbox_roi_extractor=dict(        type='SingleRoIExtractor',                                   # RoIExtractor類型        roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),   # ROI具體參數(shù):ROI類型為ROIalign,輸出尺寸為7,sample數(shù)為2        out_channels=256,                                            # 輸出通道數(shù)        featmap_strides=[4, 8, 16, 32]),                             # 特征圖的步長    bbox_head=dict(        type='SharedFCBBoxHead',                     # 全連接層類型        num_fcs=2,                                   # 全連接層數(shù)量        in_channels=256,                             # 輸入通道數(shù)        fc_out_channels=1024,                        # 輸出通道數(shù)        roi_feat_size=7,                             # ROI特征層尺寸        num_classes=81,                              # 分類器的類別數(shù)量+1,+1是因為多了一個背景的類別        target_means=[0., 0., 0., 0.],               # 均值        target_stds=[0.1, 0.1, 0.2, 0.2],            # 方差        reg_class_agnostic=False))                   # 是否采用class_agnostic的方式來預(yù)測,class_agnostic表示輸出bbox時只考慮其是否為前景,后續(xù)分類的時候再根據(jù)該bbox在網(wǎng)絡(luò)中的類別得分來分類,也就是說一個框可以對應(yīng)多個類別# model training and testing settingstrain_cfg = dict(    rpn=dict(        assigner=dict(            type='MaxIoUAssigner',            # RPN網(wǎng)絡(luò)的正負(fù)樣本劃分            pos_iou_thr=0.7,                  # 正樣本的iou閾值            neg_iou_thr=0.3,                  # 負(fù)樣本的iou閾值            min_pos_iou=0.3,                  # 正樣本的iou最小值。如果assign給ground truth的anchors中最大的IOU低于0.3,則忽略所有的anchors,否則保留最大IOU的anchor            ignore_iof_thr=-1),               # 忽略bbox的閾值,當(dāng)ground truth中包含需要忽略的bbox時使用,-1表示不忽略        sampler=dict(            type='RandomSampler',             # 正負(fù)樣本提取器類型            num=256,                          # 需提取的正負(fù)樣本數(shù)量            pos_fraction=0.5,                 # 正樣本比例            neg_pos_ub=-1,                    # 最大負(fù)樣本比例,大于該比例的負(fù)樣本忽略,-1表示不忽略            add_gt_as_proposals=False),       # 把ground truth加入proposal作為正樣本        allowed_border=0,                     # 允許在bbox周圍外擴一定的像素        pos_weight=-1,                        # 正樣本權(quán)重,-1表示不改變原始的權(quán)重        smoothl1_beta=1 / 9.0,                # 平滑L1系數(shù)        debug=False),                         # debug模式    rcnn=dict(        assigner=dict(            type='MaxIoUAssigner',            # RCNN網(wǎng)絡(luò)正負(fù)樣本劃分            pos_iou_thr=0.5,                  # 正樣本的iou閾值            neg_iou_thr=0.5,                  # 負(fù)樣本的iou閾值            min_pos_iou=0.5,                  # 正樣本的iou最小值。如果assign給ground truth的anchors中最大的IOU低于0.3,則忽略所有的anchors,否則保留最大IOU的anchor            ignore_iof_thr=-1),               # 忽略bbox的閾值,當(dāng)ground truth中包含需要忽略的bbox時使用,-1表示不忽略        sampler=dict(            type='RandomSampler',             # 正負(fù)樣本提取器類型            num=512,                          # 需提取的正負(fù)樣本數(shù)量            pos_fraction=0.25,                # 正樣本比例            neg_pos_ub=-1,                    # 最大負(fù)樣本比例,大于該比例的負(fù)樣本忽略,-1表示不忽略            add_gt_as_proposals=True),        # 把ground truth加入proposal作為正樣本        pos_weight=-1,                        # 正樣本權(quán)重,-1表示不改變原始的權(quán)重        debug=False))                         # debug模式test_cfg = dict(    rpn=dict(                                 # 推斷時的RPN參數(shù)        nms_across_levels=False,              # 在所有的fpn層內(nèi)做nms        nms_pre=2000,                         # 在nms之前保留的的得分最高的proposal數(shù)量        nms_post=2000,                        # 在nms之后保留的的得分最高的proposal數(shù)量        max_num=2000,                         # 在后處理完成之后保留的proposal數(shù)量        nms_thr=0.7,                          # nms閾值        min_bbox_size=0),                     # 最小bbox尺寸    rcnn=dict(        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=100)   # max_per_img表示最終輸出的det bbox數(shù)量    # soft-nms is also supported for rcnn testing    # e.g., nms=dict(type='soft_nms', iou_thr=0.5, min_score=0.05)            # soft_nms參數(shù))# dataset settingsdataset_type = 'CocoDataset'                # 數(shù)據(jù)集類型data_root = 'data/coco/'                    # 數(shù)據(jù)集根目錄img_norm_cfg = dict(    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)   # 輸入圖像初始化,減去均值mean并處以方差std,to_rgb表示將bgr轉(zhuǎn)為rgbdata = dict(    imgs_per_gpu=2,                # 每個gpu計算的圖像數(shù)量    workers_per_gpu=2,             # 每個gpu分配的線程數(shù)    train=dict(        type=dataset_type,                                                 # 數(shù)據(jù)集類型        ann_file=data_root + 'annotations/instances_train2017.json',       # 數(shù)據(jù)集annotation路徑        img_prefix=data_root + 'train2017/',                               # 數(shù)據(jù)集的圖片路徑        img_scale=(1333, 800),                                             # 輸入圖像尺寸,最大邊1333,最小邊800        img_norm_cfg=img_norm_cfg,                                         # 圖像初始化參數(shù)        size_divisor=32,                                                   # 對圖像進行resize時的最小單位,32表示所有的圖像都會被resize成32的倍數(shù)        flip_ratio=0.5,                                                    # 圖像的隨機左右翻轉(zhuǎn)的概率        with_mask=False,                                                   # 訓(xùn)練時附帶mask        with_crowd=True,                                                   # 訓(xùn)練時附帶difficult的樣本        with_label=True),                                                  # 訓(xùn)練時附帶label    val=dict(        type=dataset_type,                                                 # 同上        ann_file=data_root + 'annotations/instances_val2017.json',         # 同上        img_prefix=data_root + 'val2017/',                                 # 同上        img_scale=(1333, 800),                                             # 同上        img_norm_cfg=img_norm_cfg,                                         # 同上        size_divisor=32,                                                   # 同上        flip_ratio=0,                                                      # 同上        with_mask=False,                                                   # 同上        with_crowd=True,                                                   # 同上        with_label=True),                                                  # 同上    test=dict(        type=dataset_type,                                                 # 同上        ann_file=data_root + 'annotations/instances_val2017.json',         # 同上        img_prefix=data_root + 'val2017/',                                 # 同上        img_scale=(1333, 800),                                             # 同上        img_norm_cfg=img_norm_cfg,                                         # 同上        size_divisor=32,                                                   # 同上        flip_ratio=0,                                                      # 同上        with_mask=False,                                                   # 同上        with_label=False,                                                  # 同上        test_mode=True))                                                   # 同上# optimizeroptimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)   # 優(yōu)化參數(shù),lr為學(xué)習(xí)率,momentum為動量因子,weight_decay為權(quán)重衰減因子optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))          # 梯度均衡參數(shù)# learning policylr_config = dict(    policy='step',                        # 優(yōu)化策略    warmup='linear',                      # 初始的學(xué)習(xí)率增加的策略,linear為線性增加    warmup_iters=500,                     # 在初始的500次迭代中學(xué)習(xí)率逐漸增加    warmup_ratio=1.0 / 3,                 # 起始的學(xué)習(xí)率    step=[8, 11])                         # 在第8和11個epoch時降低學(xué)習(xí)率checkpoint_config = dict(interval=1)      # 每1個epoch存儲一次模型# yapf:disablelog_config = dict(    interval=50,                          # 每50個batch輸出一次信息    hooks=[        dict(type='TextLoggerHook'),      # 控制臺輸出信息的風(fēng)格        # dict(type='TensorboardLoggerHook')    ])# yapf:enable# runtime settingstotal_epochs = 12                               # 最大epoch數(shù)dist_params = dict(backend='nccl')              # 分布式參數(shù)log_level = 'INFO'                              # 輸出信息的完整度級別work_dir = './work_dirs/faster_rcnn_r50_fpn_1x' # log文件和模型文件存儲路徑load_from = None                                # 加載模型的路徑,None表示從預(yù)訓(xùn)練模型加載resume_from = None                              # 恢復(fù)訓(xùn)練模型的路徑workflow = [('train', 1)]                       # 當(dāng)前工作區(qū)名稱

          1.2 cascade_rcnn_r50_fpn_1x.py

          cascade-RCNN是cvpr2018的文章,相比于faster-RCNN的改進主要在于其RCNN有三個stage,這三個stage逐級refine檢測的結(jié)果,使得結(jié)果達到更高的精度。下面逐條解釋其config的含義,與faster-RCNN相同的部分就不再贅述

          # model settingsmodel = dict(    type='CascadeRCNN',    num_stages=3,                     # RCNN網(wǎng)絡(luò)的stage數(shù)量,在faster-RCNN中為1    pretrained='modelzoo://resnet50',    backbone=dict(        type='ResNet',        depth=50,        num_stages=4,        out_indices=(0, 1, 2, 3),        frozen_stages=1,        style='pytorch'),    neck=dict(        type='FPN',        in_channels=[256, 512, 1024, 2048],        out_channels=256,        num_outs=5),    rpn_head=dict(        type='RPNHead',        in_channels=256,        feat_channels=256,        anchor_scales=[8],        anchor_ratios=[0.5, 1.0, 2.0],        anchor_strides=[4, 8, 16, 32, 64],        target_means=[.0, .0, .0, .0],        target_stds=[1.0, 1.0, 1.0, 1.0],        use_sigmoid_cls=True),    bbox_roi_extractor=dict(        type='SingleRoIExtractor',        roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),        out_channels=256,        featmap_strides=[4, 8, 16, 32]),    bbox_head=[        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=81,            target_means=[0., 0., 0., 0.],            target_stds=[0.1, 0.1, 0.2, 0.2],            reg_class_agnostic=True),        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=81,            target_means=[0., 0., 0., 0.],            target_stds=[0.05, 0.05, 0.1, 0.1],            reg_class_agnostic=True),        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=81,            target_means=[0., 0., 0., 0.],            target_stds=[0.033, 0.033, 0.067, 0.067],            reg_class_agnostic=True)    ])# model training and testing settingstrain_cfg = dict(    rpn=dict(        assigner=dict(            type='MaxIoUAssigner',            pos_iou_thr=0.7,            neg_iou_thr=0.3,            min_pos_iou=0.3,            ignore_iof_thr=-1),        sampler=dict(            type='RandomSampler',            num=256,            pos_fraction=0.5,            neg_pos_ub=-1,            add_gt_as_proposals=False),        allowed_border=0,        pos_weight=-1,        smoothl1_beta=1 / 9.0,        debug=False),    rcnn=[                    # 注意,這里有3個RCNN的模塊,對應(yīng)開頭的那個RCNN的stage數(shù)量        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.5,                neg_iou_thr=0.5,                min_pos_iou=0.5,                ignore_iof_thr=-1),            sampler=dict(                type='RandomSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.6,                neg_iou_thr=0.6,                min_pos_iou=0.6,                ignore_iof_thr=-1),            sampler=dict(                type='RandomSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.7,                neg_iou_thr=0.7,                min_pos_iou=0.7,                ignore_iof_thr=-1),            sampler=dict(                type='RandomSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False)    ],    stage_loss_weights=[1, 0.5, 0.25])     # 3個RCNN的stage的loss權(quán)重test_cfg = dict(    rpn=dict(        nms_across_levels=False,        nms_pre=2000,        nms_post=2000,        max_num=2000,        nms_thr=0.7,        min_bbox_size=0),    rcnn=dict(        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=100),    keep_all_stages=False)         # 是否保留所有stage的結(jié)果# dataset settingsdataset_type = 'CocoDataset'data_root = 'data/coco/'img_norm_cfg = dict(    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)data = dict(    imgs_per_gpu=2,    workers_per_gpu=2,    train=dict(        type=dataset_type,        ann_file=data_root + 'annotations/instances_train2017.json',        img_prefix=data_root + 'train2017/',        img_scale=(1333, 800),        img_norm_cfg=img_norm_cfg,        size_divisor=32,        flip_ratio=0.5,        with_mask=False,        with_crowd=True,        with_label=True),    val=dict(        type=dataset_type,        ann_file=data_root + 'annotations/instances_val2017.json',        img_prefix=data_root + 'val2017/',        img_scale=(1333, 800),        img_norm_cfg=img_norm_cfg,        size_divisor=32,        flip_ratio=0,        with_mask=False,        with_crowd=True,        with_label=True),    test=dict(        type=dataset_type,        ann_file=data_root + 'annotations/instances_val2017.json',        img_prefix=data_root + 'val2017/',        img_scale=(1333, 800),        img_norm_cfg=img_norm_cfg,        size_divisor=32,        flip_ratio=0,        with_mask=False,        with_label=False,        test_mode=True))# optimizeroptimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))# learning policylr_config = dict(    policy='step',    warmup='linear',    warmup_iters=500,    warmup_ratio=1.0 / 3,    step=[8, 11])checkpoint_config = dict(interval=1)# yapf:disablelog_config = dict(    interval=50,    hooks=[        dict(type='TextLoggerHook'),        # dict(type='TensorboardLoggerHook')    ])# yapf:enable# runtime settingstotal_epochs = 12dist_params = dict(backend='nccl')log_level = 'INFO'work_dir = './work_dirs/cascade_rcnn_r50_fpn_1x'load_from = Noneresume_from = Noneworkflow = [('train', 1)]

          2.trick部分代碼,cascade_rcnn_r50_fpn_1x.py:

          # fp16 settingsfp16 = dict(loss_scale=512.)# model settingsmodel = dict(    type='CascadeRCNN',    num_stages=3,    pretrained='torchvision://resnet50',    backbone=dict(        type='ResNet',        depth=50,        num_stages=4,        out_indices=(0, 1, 2, 3),        frozen_stages=1,        style='pytorch',        #dcn=dict( #在最后三個block加入可變形卷積          #   modulated=False, deformable_groups=1, fallback_on_stride=False),          #  stage_with_dcn=(False, True, True, True)        ),    neck=dict(        type='FPN',        in_channels=[256, 512, 1024, 2048],        out_channels=256,        num_outs=5),    rpn_head=dict(        type='RPNHead',        in_channels=256,        feat_channels=256,        anchor_scales=[8],        anchor_ratios=[0.2, 0.5, 1.0, 2.0, 5.0], # 添加了0.2,5,過兩天發(fā)圖        anchor_strides=[4, 8, 16, 32, 64],        target_means=[.0, .0, .0, .0],        target_stds=[1.0, 1.0, 1.0, 1.0],        loss_cls=dict(            type='FocalLoss', use_sigmoid=True, loss_weight=1.0), # 修改了loss,為了調(diào)控難易樣本與正負(fù)樣本比例        loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)),    bbox_roi_extractor=dict(        type='SingleRoIExtractor',        roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),        out_channels=256,        featmap_strides=[4, 8, 16, 32]),    bbox_head=[        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=11,            target_means=[0., 0., 0., 0.],            target_stds=[0.1, 0.1, 0.2, 0.2],            reg_class_agnostic=True,            loss_cls=dict(                type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),            loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)),        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=11,            target_means=[0., 0., 0., 0.],            target_stds=[0.05, 0.05, 0.1, 0.1],            reg_class_agnostic=True,            loss_cls=dict(                type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),            loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)),        dict(            type='SharedFCBBoxHead',            num_fcs=2,            in_channels=256,            fc_out_channels=1024,            roi_feat_size=7,            num_classes=11,            target_means=[0., 0., 0., 0.],            target_stds=[0.033, 0.033, 0.067, 0.067],            reg_class_agnostic=True,            loss_cls=dict(                type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),            loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))    ])# model training and testing settingstrain_cfg = dict(    rpn=dict(        assigner=dict(            type='MaxIoUAssigner',            pos_iou_thr=0.7,            neg_iou_thr=0.3,            min_pos_iou=0.3,            ignore_iof_thr=-1),        sampler=dict(            type='RandomSampler',             num=256,            pos_fraction=0.5,            neg_pos_ub=-1,            add_gt_as_proposals=False),        allowed_border=0,        pos_weight=-1,        debug=False),    rpn_proposal=dict(        nms_across_levels=False,        nms_pre=2000,        nms_post=2000,        max_num=2000,        nms_thr=0.7,        min_bbox_size=0),    rcnn=[        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.4, # 更換                neg_iou_thr=0.4,                min_pos_iou=0.4,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.5,                neg_iou_thr=0.5,                min_pos_iou=0.5,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler', # 解決難易樣本,也解決了正負(fù)樣本比例問題。                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False),        dict(            assigner=dict(                type='MaxIoUAssigner',                pos_iou_thr=0.6,                neg_iou_thr=0.6,                min_pos_iou=0.6,                ignore_iof_thr=-1),            sampler=dict(                type='OHEMSampler',                num=512,                pos_fraction=0.25,                neg_pos_ub=-1,                add_gt_as_proposals=True),            pos_weight=-1,            debug=False)    ],    stage_loss_weights=[1, 0.5, 0.25])test_cfg = dict(    rpn=dict(        nms_across_levels=False,        nms_pre=1000,        nms_post=1000,        max_num=1000,        nms_thr=0.7,        min_bbox_size=0),    rcnn=dict(        score_thr=0.05, nms=dict(type='nms', iou_thr=0.5), max_per_img=20)) # 這里可以換為soft_nms# dataset settingsdataset_type = 'CocoDataset'data_root = '../../data/chongqing1_round1_train1_20191223/'img_norm_cfg = dict(    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)train_pipeline = [    dict(type='LoadImageFromFile'),    dict(type='LoadAnnotations', with_bbox=True),    dict(type='Resize', img_scale=(492,658), keep_ratio=True), #這里可以更換多尺度[(),()]    dict(type='RandomFlip', flip_ratio=0.5),    dict(type='Normalize', **img_norm_cfg),    dict(type='Pad', size_divisor=32),    dict(type='DefaultFormatBundle'),    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),]test_pipeline = [    dict(type='LoadImageFromFile'),    dict(        type='MultiScaleFlipAug',        img_scale=(492,658),        flip=False,        transforms=[            dict(type='Resize', keep_ratio=True),            dict(type='RandomFlip'),            dict(type='Normalize', **img_norm_cfg),            dict(type='Pad', size_divisor=32),            dict(type='ImageToTensor', keys=['img']),            dict(type='Collect', keys=['img']),        ])]data = dict(    imgs_per_gpu=8, # 有的同學(xué)不知道batchsize在哪修改,其實就是修改這里,每個gpu同時處理的images數(shù)目。    workers_per_gpu=2,    train=dict(        type=dataset_type,        ann_file=data_root + 'fixed_annotations.json', # 更換自己的json文件        img_prefix=data_root + 'images/', # images目錄        pipeline=train_pipeline),    val=dict(        type=dataset_type,        ann_file=data_root + 'fixed_annotations.json',        img_prefix=data_root + 'images/',        pipeline=test_pipeline),    test=dict(        type=dataset_type,        ann_file=data_root + 'fixed_annotations.json',        img_prefix=data_root + 'images/',        pipeline=test_pipeline))# optimizeroptimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.0001) # lr = 0.00125*batch_size,不能過大,否則梯度爆炸。optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))# learning policylr_config = dict(    policy='step',    warmup='linear',    warmup_iters=500,    warmup_ratio=1.0 / 3,    step=[6, 12, 19])checkpoint_config = dict(interval=1)# yapf:disablelog_config = dict(    interval=64,    hooks=[        dict(type='TextLoggerHook'), # 控制臺輸出信息的風(fēng)格        # dict(type='TensorboardLoggerHook') # 需要安裝tensorflow and tensorboard才可以使用    ])# yapf:enable# runtime settingstotal_epochs = 20dist_params = dict(backend='nccl')log_level = 'INFO'work_dir = '../work_dirs/cascade_rcnn_r50_fpn_1x' # 日志目錄load_from = '../work_dirs/cascade_rcnn_r50_fpn_1x/latest.pth' # 模型加載目錄文件#load_from = '../work_dirs/cascade_rcnn_r50_fpn_1x/cascade_rcnn_r50_coco_pretrained_weights_classes_11.pth'resume_from = Noneworkflow = [('train', 1)]

          Reference
          [1]Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
          [2]Object Detection Networks on Convolutional Feature Maps
          [3]Deep Residual Learning for Image Classification
          [4]Object Detection via a Multi-region & Semantic Segmentatio-aware CNN Model
          [5]Training Region-based Object Detectors with Online Hard Example Mining
          [6]Improving Object Detection With One Line of Code
          [7]Mask R-CNN


          推薦閱讀


          添加極市小助手微信(ID : cvmart2),備注:姓名-學(xué)校/公司-目標(biāo)檢測-城市(如:小極-北大-目標(biāo)檢測-深圳),即可申請加入極市目標(biāo)檢測等技術(shù)交流群:月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

          △長按添加極市小助手

          △長按關(guān)注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 115
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  丝袜二区 | 色天堂导航 | 免费污污网站在线观看 | 大香蕉免费成人 | 日本精品一区 |