據(jù)增強實戰(zhàn):基于概率圖引導 Copy-Pasting 的實例分割提升方案)
MMDetection 中 InstaBoost 數(shù)據(jù)增強實戰(zhàn)基于概率圖引導 Copy-Pasting 的實例分割提升方案【免費下載鏈接】mmdetectionOpenMMLab Detection Toolbox and Benchmark項目地址: https://gitcode.com/gh_mirrors/mm/mmdetectionInstaBoost 是一種基于概率圖引導 Copy-Pasting 的數(shù)據(jù)增強方法利用已有實例掩碼mask標注通過隨機抖動與局部外觀相似度引導的物體復制粘貼來擴充訓練集從而在不改變骨干網(wǎng)絡結(jié)構(gòu)、不增加推理開銷的前提下顯著提升實例分割精度。本文以 MMDetection 倉庫configs/instaboost/目錄下的官方配置為骨架結(jié)合mmdet/datasets/transforms/instaboost.py源碼與對應測試完整講解如何在 MMDetection 數(shù)據(jù)流水線中啟用 InstaBoost、逐參數(shù)調(diào)優(yōu)并給出基于 Mask R-CNN / Cascade Mask R-CNN 的 4x 訓練實踐與性能基準。1. InstaBoost 是什么方法背景與核心思想InstaBoost全稱InstaBoost: Boosting Instance Segmentation via Probability Map Guided Copy-Pasting是發(fā)表于 ICCV 2019 的數(shù)據(jù)增強方法論文作者即提供了本目錄下配置的實現(xiàn)。方法的核心觀察是實例分割需要大量訓練樣本而現(xiàn)有標注中的 mask 本身就蘊含著可以重復利用的監(jiān)督信息同時自然圖像背景區(qū)域存在大量像素冗余為復制粘貼提供了空間。整個方法由兩部分構(gòu)成基于 mask 標注的隨機抖動random jittering增強直接在實例 mask 上施加平移、縮放、旋轉(zhuǎn)、顏色擾動等隨機變換利用背景像素冗余把物體搬運到新位置。論文報告該方法僅憑隨機抖動即可在 COCO 上為 Mask R-CNN 帶來 1.7 mAP、在 Pascal VOC 上帶來 3.3 mAP 的提升。位置概率圖location probability map引導放置基于局部外觀相似度估計圖像上每個位置擺放物體的可行性在該概率圖引導下選擇復制粘貼的目標位置避免把物體放到語義不合理的位置。配合概率圖引導論文將 R101-Mask R-CNN 在實例分割上的成績從 35.7 mAP 提升到 37.9 mAP且沒有修改 backbone 或網(wǎng)絡結(jié)構(gòu)。從方法性質(zhì)上講InstaBoost 屬于典型的訓練期train-time數(shù)據(jù)增強它只影響訓練數(shù)據(jù)流水線不參與推理因此不會增加訓練之外的計算復雜度也不影響推理效率可以無縫集成到任意實例分割模型的訓練流程中。這也正是本目錄下所有配置都能直接套用在 Mask R-CNN、Cascade Mask R-CNN 等不同檢測器上的原因。2. 環(huán)境準備安裝 instaboostfastInstaBoost 的增強核心由 C/Python 加速庫instaboostfast提供MMDetection 側(cè)只負責數(shù)據(jù)格式轉(zhuǎn)換與流水線編排。使用前需要先安裝pip install instaboostfast該依賴是可選依賴只有真正啟用 InstaBoost 增強時才需要。如果未安裝就運行包含InstaBoost變換的訓練配置MMDetection 會在實例化變換時拋出ImportError提示先執(zhí)行上述安裝命令見 mmdet/datasets/transforms/instaboost.py。此外源碼中還做了一個細節(jié)處理instaboostfast在導入時會修改 matplotlib 的默認后端可能影響后續(xù)可視化因此 MMDetection 在導入后會將后端恢復為原值見 mmdet/datasets/transforms/instaboost.py。3. 在 MMDetection 數(shù)據(jù)流水線中啟用 InstaBoost3.1 流水線位置與最小配置MMDetection 已將 InstaBoost 完整集成進數(shù)據(jù)流水線pipeline啟用方式非常簡潔在LoadImageFromFile之后、LoadAnnotations之前插入一個InstaBoost變換。以官方提供的 mask-rcnn_r50_fpn_instaboost-4x_coco.py 為例train_pipeline [ dict(typeLoadImageFromFile, backend_args{{_base_.backend_args}}), dict( typeInstaBoost, action_candidate(normal, horizontal, skip), action_prob(1, 0, 0), scale(0.8, 1.2), dx15, dy15, theta(-1, 1), color_prob0.5, hflagFalse, aug_ratio0.5), dict(typeLoadAnnotations, with_bboxTrue, with_maskTrue), dict(typeResize, scale(1333, 800), keep_ratioTrue), dict(typeRandomFlip, prob0.5), dict(typePackDetInputs) ]放置位置是有講究的InstaBoost需要讀取原始圖像與實例標注所以必須放在LoadImageFromFile之后而LoadAnnotations尚未執(zhí)行因此它直接依賴上游已經(jīng)載入的instances字段由數(shù)據(jù)集的load annotations邏輯在流水線之前填充。在 mask-rcnn_r50_fpn_1x_coco.py 基礎配置中原流水線是LoadImageFromFile - LoadAnnotations - Resize - RandomFlip - PackDetInputsInstaBoost 變體僅將InstaBoost插在中間其余保持一致。3.2 InstaBoost 變換的參數(shù)全解以下參數(shù)直接透傳給instaboostfast的InstaBoostConfig其含義與取值范圍在 mmdet/datasets/transforms/instaboost.py 的 docstring 中有完整定義參數(shù)默認值含義與說明action_candidate(normal, horizontal, skip)候選動作集合支持normal常規(guī)復制粘貼、horizontal水平翻轉(zhuǎn)后粘貼、vertical垂直翻轉(zhuǎn)、skip跳過action_prob(1, 0, 0)與action_candidate一一對應的動作概率長度必須一致(1, 0, 0)表示只做常規(guī)復制粘貼scale(0.8, 1.2)復制粘貼時物體隨機縮放的最小比例, 最大比例范圍dx15允許的最大 x 軸偏移量 實例寬度 / dxdx 越小偏移幅度越大dy15允許的最大 y 軸偏移量 實例高度 / dydy 越小偏移幅度越大theta(-1, 1)允許的旋轉(zhuǎn)角度范圍最小角度, 最大角度單位為度color_prob0.5對圖像施加顏色增強color augmentation的概率hflagFalse是否啟用概率圖引導heatmap guided為False時退化為純隨機抖動復制粘貼aug_ratio0.5每個樣本實際應用 InstaBoost 增強的概率是 MMDetection 側(cè)單獨控制、不傳給底層庫的參數(shù)關鍵點解讀hflagFalse時走的是隨機抖動路線即論文中單獨即可帶來提升的第一部分hflagTrue時啟用位置概率圖引導第二部分代價是訓練時會額外計算概率圖。dx/dy與偏移量成反比關系調(diào)小數(shù)值會增大物體位移幅度增強強度隨之上升但過小可能導致物體粘貼位置明顯不合理。aug_ratio在 instaboost.py 中以np.random.choice([0, 1], p[1 - self.aug_ratio, self.aug_ratio])的方式對每個樣本隨機決定是否執(zhí)行增強起到以一定概率使用該變換的混合效果。3.3 變換內(nèi)部的數(shù)據(jù)流轉(zhuǎn)源碼級解讀InstaBoost繼承自mmcv.transforms.BaseTransform通過TRANSFORMS.register_module()注冊可被配置中的dict(typeInstaBoost)直接構(gòu)建。其transform方法的數(shù)據(jù)流如下見 mmdet/datasets/transforms/instaboost.py從results取出img與instances若當前樣本沒有實例直接原樣返回不做任何處理調(diào)用_load_anns把 MMDetection 內(nèi)部格式的標注bbox、bbox_label、mask、ignore_flag轉(zhuǎn)換為 instaboost 期望的輸入格式bbox 由[x1, y1, x2, y2]轉(zhuǎn)成[x1, y1, w, h]見 instaboost.py。其中ignore_flag ! 0的實例會被放入ignore_anns不參與增強按aug_ratio決定是否調(diào)用instaboost.get_new_data(anns, img, self.cfg, backgroundNone)執(zhí)行實際的復制粘貼調(diào)用_parse_anns將 instaboost 返回的新標注還原為 MMDetection 格式寬或高非正的異??驎贿^濾見 instaboost.py并把處理后的img與instances寫回results。對應地倉庫測試 tests/test_datasets/test_transforms/test_instaboost.py 驗證了三條行為經(jīng)變換后圖像 dtype 仍為np.uint8、instances字段依然存在、以及repr輸出為InstaBoost(aug_ratio0.5)——其中第三點說明__repr__只暴露aug_ratio作為該變換的摘要信息。4. 4x 訓練計劃為 InstaBoost 定制的調(diào)度與配置4.1 為什么是 48 Epochs增強帶來的免費樣本增加了每個 epoch 的有效數(shù)據(jù)量但論文作者與官方實驗共同的經(jīng)驗是為了在精度與訓練時間之間取得平衡使用 InstaBoost 的模型統(tǒng)一訓練 48 個 Epoch即 4x 計劃而不是常規(guī)的 1x12 epochs。本目錄所有發(fā)布模型均按此約定訓練其余訓練/測試配置則嚴格沿用原框架。4.2 學習率與訓練配置max_epochs 48配合如下學習率調(diào)度見 mask-rcnn_r50_fpn_instaboost-4x_coco.pyparam_scheduler [ dict( typeLinearLR, start_factor0.001, by_epochFalse, begin0, end500), dict( typeMultiStepLR, begin0, endmax_epochs, by_epochTrue, milestones[32, 44], gamma0.1) ] train_cfg dict(max_epochsmax_epochs)其中LinearLR負責前 500 iter 的線性 warmupMultiStepLR在第 32 和第 44 epoch 將學習率乘以 0.1相比 1x 計劃12/16 epoch 衰減整體拉長。4.3 顯存與檢查點管理由于訓練時長翻倍配置還額外做了兩點工程化處理# only keep latest 3 checkpoints default_hooks dict(checkpointdict(max_keep_ckpts3))只保留最近 3 個 checkpoint避免長訓練周期把磁盤寫滿。顯存方面官方基準顯示 R50-FPN Mask R-CNN 訓練占用約 4.4 GBX101-64x4d-FPN 約 10.7 GB詳見下文結(jié)果表與 metafile.yml。5. 訓練與評估命令與基準結(jié)果5.1 單機多卡訓練MMDetection 標準訓練入口是 tools/train.py配合 tools/dist_train.sh 進行多卡訓練bash tools/dist_train.sh configs/instaboost/mask-rcnn_r50_fpn_instaboost-4x_coco.py 8單卡直接運行python tools/train.py configs/instaboost/mask-rcnn_r50_fpn_instaboost-4x_coco.py注意模型基準在 COCO 數(shù)據(jù)集上訓練需要按 configs/base/datasets/coco_instance.py 中的約定準備好data/coco/數(shù)據(jù)目錄annotations/instances_train2017.json與train2017/圖像等。5.2 官方基準結(jié)果以下結(jié)果均使用coco_2017_train訓練、coco_2017_val測試論文原報告中為test-dev數(shù)據(jù)來自 configs/instaboost/README.md 與 metafile.yml網(wǎng)絡BackboneLr schd訓練顯存 (GB)Inf time (fps)box APmask AP配置文件Mask R-CNNR-50-FPN4x4.417.540.636.6mask-rcnn_r50_fpn_instaboost-4x_coco.pyMask R-CNNR-101-FPN4x6.4-42.538.0mask-rcnn_r101_fpn_instaboost-4x_coco.pyMask R-CNNX-101-64x4d-FPN4x10.7-44.739.7mask-rcnn_x101-64x4d_fpn_instaboost-4x_coco.pyCascade Mask R-CNNR-101-FPN4x6.012.043.738.0cascade-mask-rcnn_r101_fpn_instaboost-4x_coco.py各模型的權(quán)重文件.pth與訓練日志.log.json可從 OpenMMLab 官方模型庫下載具體 URL 見 metafile.yml 中每個模型的Weights字段如 R50 模型的mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth。需要說明的是表中的Inf time為 V100 單卡、FP32、分辨率 (800, 1333) 條件下的官方測速值R101 與 X101 兩行的 fps 在官方表格中未提供以-標注不做編造。6. 如何復用到自己的檢測器自定義接入指南InstaBoost 與具體檢測器解耦只依賴圖像 實例 mask 標注這一前提因此可以方便地移植到任意實例分割模型。接入步驟歸納如下基礎配置從對應模型的 1x 配置繼承例如 Cascade Mask R-CNN 變體以 cascade-mask-rcnn_r50_fpn_1x_coco.py 為_base_見 cascade-mask-rcnn_r50_fpn_instaboost-4x_coco.py改寫 train_pipeline在LoadImageFromFile與LoadAnnotations之間插入InstaBoost變換注意測試流水線test_pipeline不需要加增強只作用于訓練用train_dataloader dict(datasetdict(pipelinetrain_pipeline))覆蓋基礎配置的訓練流水線延長訓練計劃將max_epochs改為 48并同步調(diào)整MultiStepLR的milestones[32, 44]即上述第 4 節(jié)的完整套路安裝依賴并啟動訓練確認instaboostfast已安裝后按第 5 節(jié)的命令運行。7. 使用注意事項與調(diào)參建議前提條件InstaBoost 依賴實例 mask 標注純 bbox 目標檢測任務如只有with_bboxTrue的數(shù)據(jù)集無法獲得增強收益因為復制粘貼需要 mask 定義物體區(qū)域若流水線中LoadAnnotations未開啟with_maskTrue需先補充 mask 標注源。hflag的取舍追求論文完整方案概率圖引導時開啟hflagTrue并配套action_candidate/action_prob組合若只想要輕量隨機抖動保持默認False即可。官方發(fā)布模型默認使用hflagFalse的隨機抖動配置。增強強度控制aug_ratio控制應用比例scale、dx、dy、theta控制幾何變換幅度color_prob控制顏色擾動概率。小數(shù)據(jù)集或類別不平衡場景可適當調(diào)大aug_ratio如 0.81.0以放大增廣效果物體密集、相互遮擋嚴重的場景建議縮小dx/dy或調(diào)低aug_ratio避免產(chǎn)生過多遮擋重疊。忽略實例源碼中ignore_flag ! 0的實例會被跳過增強見 instaboost.py因此標注中標記為 ignore 的困難區(qū)域不會被意外搬運。與其他增強的配合InstaBoost 位于Resize、RandomFlip之前先完成基于原始分辨率的復制粘貼再做常規(guī)幾何變換這與官方 1x 基線中Resize - RandomFlip的順序保持兼容。8. 結(jié)論InstaBoost 提供了一條零網(wǎng)絡改動、零推理開銷的實例分割提精路徑在 MMDetection 中只需在LoadImageFromFile之后插入一個InstaBoost變換、安裝instaboostfast、并把訓練計劃延長至 48 epochs即可在 Mask R-CNN / Cascade Mask R-CNN 系列模型上獲得 box/mask AP 的穩(wěn)定提升。其底層實現(xiàn)mmdet/datasets/transforms/instaboost.py與測試用例tests/test_datasets/test_transforms/test_instaboost.py都已在當前倉庫中直接可用讀者可以基于本文的參數(shù)對照表與基準數(shù)據(jù)快速將其接入自己的實例分割訓練流程。引用若在論文或報告中引用 InstaBoost 方法官方給出的 BibTeX 如下源自 configs/instaboost/README.mdinproceedings{fang2019instaboost, title{Instaboost: Boosting instance segmentation via probability map guided copy-pasting}, author{Fang, Hao-Shu and Sun, Jianhua and Wang, Runzhong and Gou, Minghao and Li, Yong-Lu and Lu, Cewu}, booktitle{Proceedings of the IEEE International Conference on Computer Vision}, pages{682--691}, year{2019} }【免費下載鏈接】mmdetectionOpenMMLab Detection Toolbox and Benchmark項目地址: https://gitcode.com/gh_mirrors/mm/mmdetection創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考