利用MMDetection進行半監督目標檢測(僅供參考)

半監督目標檢測

  • 準備和拆分數據集
    • K則交叉驗證的解釋
  • 完整的半監督配置文件代碼
    • 修改繼承的數據流文件代碼
  • 多GPU訓練示范

參考 MMDetection半監督目標檢測,半監督目標檢測同時利用標簽數據和無標簽數據進行訓練,一方面可以減少模型對檢測框數量的依賴,另一方面也可以利用大量的未標記數據進一步提高模型。

準備和拆分數據集

我們提供了數據集下載腳本,默認下載 coco2017 數據集,并且自動解壓。

python tools/misc/download_dataset.py

在該代碼這一塊修改半監督數據集具體生成路徑和k則交叉驗證默認參數

def parse_args():parser = argparse.ArgumentParser()parser.add_argument('--data-root',type=str,help='The data root of coco dataset.',default='/data/miqi/coco/')parser.add_argument('--out-dir',type=str,help='The output directory of coco semi-supervised annotations.',default='/data/miqi/coco/semi_anns/')parser.add_argument('--labeled-percent',type=float,nargs='+',help='The percentage of labeled data in the training set.',default=[1, 2, 5, 10])parser.add_argument('--fold',type=int,help='K-fold cross validation for semi-supervised object detection.',default=5)args = parser.parse_args()return args

解壓后的數據集目錄如下:

mmdetection
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── image_info_unlabeled2017.json
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── test2017
│   │   ├── train2017
│   │   ├── unlabeled2017
│   │   ├── val2017

半監督目標檢測在 coco 數據集上有兩種比較通用的實驗設置:

(1)將 train2017 按照固定百分比(1%,2%,5% 和 10%)劃分出一部分數據作為標簽數據集,剩余的訓練集數據作為無標簽數據集,同時考慮劃分不同的訓練集數據作為標簽數據集對半監督訓練的結果影響較大,所以采用五折交叉驗證來評估算法性能。我們提供了數據集劃分腳本:

python tools/misc/split_coco.py

倘若不是指定的coco2017數據集,需要檢查annotations.json文件字段是否含有'info''licenses'等。

 def save_anns(name, images, annotations):sub_anns = dict()sub_anns['images'] = imagessub_anns['annotations'] = annotationssub_anns['licenses'] = anns['licenses']sub_anns['categories'] = anns['categories']# sub_anns['info'] = anns['info'] # 沒有就注釋掉mkdir_or_exist(out_dir)dump(sub_anns, f'{out_dir}/{name}.json')

該腳本默認會按照 1%,2%,5% 和 10% 的標簽數據占比劃分 train2017,每一種劃分會隨機重復 5 次,用于交叉驗證。生成的半監督標注文件名稱格式如下:

  • 標簽數據集標注名稱格式:instances_train2017.{fold}@{percent}.json
  • 無標簽數據集名稱標注:instances_train2017.{fold}@{percent}-unlabeled.json

其中,fold 用于交叉驗證,percent 表示標簽數據的占比。 劃分后的數據集目錄結構如下:

mmdetection
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── image_info_unlabeled2017.json
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── semi_anns
│   │   │   ├── instances_train2017.1@1.json
│   │   │   ├── instances_train2017.1@1-unlabeled.json
│   │   │   ├── instances_train2017.1@2.json
│   │   │   ├── instances_train2017.1@2-unlabeled.json
│   │   │   ├── instances_train2017.1@5.json
│   │   │   ├── instances_train2017.1@5-unlabeled.json
│   │   │   ├── instances_train2017.1@10.json
│   │   │   ├── instances_train2017.1@10-unlabeled.json
│   │   │   ├── instances_train2017.2@1.json
│   │   │   ├── instances_train2017.2@1-unlabeled.json
│   │   ├── test2017
│   │   ├── train2017
│   │   ├── unlabeled2017
│   │   ├── val2017

K則交叉驗證的解釋

在半監督學習的目標檢測任務中,COCO數據集通過特定的劃分方法被分為有標簽數據集和無標簽數據集,以供模型訓練使用。這種劃分是為了評估不同量級的有標簽數據對模型性能的影響,以及驗證模型在有限標注數據下的泛化能力。以下是詳細的解釋:

  1. 數據集劃分

    • 有標簽數據集:從原始的train2017數據集中,按照1%,2%,5%,和10%的比例選取部分樣本作為有標簽數據集。這些數據帶有完整的標注信息,包括物體類別、邊界框等,用于直接訓練模型。
    • 無標簽數據集:剩下的train2017數據則構成無標簽數據集。這部分數據雖然沒有標注信息,但在半監督學習場景下,可以用來提升模型的性能,例如通過自訓練、一致性正則化等策略。
  2. 交叉驗證

    • 由于數據集劃分的不同可能會影響最終模型的性能,為了減少偏差并提高評估的可靠性,采用了五折交叉驗證的方法。這意味著原始數據會被分成五個不同的子集,每個子集輪流作為驗證集,其余四份作為訓練集的一部分,這樣可以得到更穩定的性能估計。
  3. 數據集文件命名與存儲

    • 命名格式:有標簽數據集和無標簽數據集的標注文件遵循特定的命名規則。例如,instances_train2017.{fold}@{percent}.json表示第{fold}折的有標簽數據集,占總數據的{percent}%。而instances_train2017.{fold}@{percent}-unlabeled.json則是對應的無標簽數據集。
    • 目錄結構:數據集被組織在mmdetection/data/coco/semi_anns目錄下,這里存放了所有不同比例、不同折數的有標簽和無標簽數據集的標注文件。
  4. 數據集劃分腳本

    • 提供的split_coco.py腳本用于自動化地完成上述數據集劃分過程。通過運行此腳本,可以自動按照設定的比例生成所需的有標簽和無標簽數據集,以及對應的標注文件。

通過這樣的數據集劃分和組織方式,研究者能夠系統地探索不同規模的標注數據對模型性能的影響,以及評估半監督學習方法的有效性。

(2)將 train2017 作為標簽數據集,unlabeled2017 作為無標簽數據集。由于 image_info_unlabeled2017.json 沒有 categories 信息,無法初始化 CocoDataset ,所以需要將 instances_train2017.jsoncategories 寫入 image_info_unlabeled2017.json ,另存為 instances_unlabeled2017.json,相關腳本如下:

from mmengine.fileio import load, dumpanns_train = load('/data/miqi/coco/annotations/instances_train2017.json')
anns_unlabeled = load('/data/miqi/coco/annotations/image_info_unlabeled2017.json')
anns_unlabeled['categories'] = anns_train['categories']
dump(anns_unlabeled, '/data/miqi/coco/annotations/instances_unlabeled2017.json')

完整的半監督配置文件代碼

新建配置文件mmdetection/configs/_base_/models/semi-supervised/faster-rcnn_r50_fpn_semi.py

_base_ = ['/home/miqi/mmdetection/configs/_base_/models/faster-rcnn_r50_fpn.py', '/home/miqi/mmdetection/configs/_base_/default_runtime.py','/home/miqi/mmdetection/configs/_base_/schedules/schedule_1x.py', '/home/miqi/mmdetection/configs/_base_/datasets/semi_coco_detection.py'
]detector = _base_.model
detector.data_preprocessor = dict(type='DetDataPreprocessor',mean=[103.530, 116.280, 123.675],std=[1.0, 1.0, 1.0],bgr_to_rgb=False,pad_size_divisor=32)
detector.backbone = dict(type='ResNet',depth=50,num_stages=4,out_indices=(0, 1, 2, 3),frozen_stages=1,norm_cfg=dict(type='BN', requires_grad=False),norm_eval=True,style='caffe',init_cfg=dict(type='Pretrained',checkpoint='open-mmlab://detectron2/resnet50_caffe'))model = dict(_delete_=True,type='SoftTeacher',detector=detector,data_preprocessor=dict(type='MultiBranchDataPreprocessor',data_preprocessor=detector.data_preprocessor),semi_train_cfg=dict(freeze_teacher=True,sup_weight=1.0,unsup_weight=4.0,pseudo_label_initial_score_thr=0.5,rpn_pseudo_thr=0.9,cls_pseudo_thr=0.9,reg_pseudo_thr=0.02,jitter_times=10,jitter_scale=0.06,min_pseudo_bbox_wh=(1e-2, 1e-2)),semi_test_cfg=dict(predict_on='teacher'))custom_hooks = [dict(type='MeanTeacherHook')]
val_cfg = dict(type='TeacherStudentValLoop')load_from = 'checkpoints/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822-e10bd31c.pth'

修改繼承的數據流文件代碼

文件位于mmdetection/configs/_base_/datasets/semi_coco_detection.py

# dataset settings
dataset_type = 'CocoDataset'
data_root = '/data/miqi/coco/' # 自己的數據集根路徑
batch_size = 5 # GPU空閑內存相關
num_workers = 5 # CPU數據加載子進程數量相關

在PyTorch的數據加載器(DataLoader)配置中,num_workers參數用于指定在數據加載過程中使用的子線程或進程的數量。這個參數對于優化數據加載速度和并行處理能力至關重要。

num_workers設置為大于0的值時,PyTorch會使用多個工作進程來預加載和處理數據,這可以顯著提高數據加載的速度,特別是在數據處理較為復雜或者數據集較大的情況下。每個工作進程都會獨立地從磁盤讀取數據、應用數據轉換,并將數據發送到主進程中供模型訓練使用。

例如,如果你的計算機有足夠多的CPU核心,你可以將num_workers設為一個較大的值,比如4或8,這樣可以充分利用多核處理器的優勢,加快數據加載速度。但需要注意的是,過多的工作進程可能會消耗大量系統資源,導致其他操作變慢,因此需要根據你的硬件配置合理設置這個參數。

多GPU訓練示范

CUDA_VISIBLE_DEVICES=0, 4, 5, 9 ./tools/dist_train.sh \configs/_base_/models/semi-supervised/faster-rcnn_r50_fpn_semi.py \4 \--work-dir  work_dirs/faster-rcnn_r50_fpn_semi

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40858.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Swift 定制 Core Data 遷移

文章目錄 前言什么是 Core Data 遷移?示例更新模型創建一個新的模型版本創建映射模型編寫自定義遷移策略總結 前言 隨著應用程序和用戶群的增長,你需要添加新功能,刪除其他功能,并改變應用程序的工作方式。這是軟件開發生命周期的…

底層軟件 | 十分詳細,為了學習設備樹,我寫了5w字筆記!

0、設備樹是什么?1、DTS 1.1 dts簡介1.2 dts例子 2、DTC(Device Tree Compiler)3、DTB(Device Tree Blob)4、綁定(Binding)5、Bootloader compatible屬性 7、 #address-cells和#size-cells屬性8…

動態規劃入門,從簡單遞歸到記憶化搜索到動態規劃

動態規劃入門&#xff0c;從簡單遞歸到記憶化搜索到動態規劃 打家劫舍 class Solution {private int nums[];public int rob(int[] nums) {this.nums nums;return dfs(nums.length - 1);}public int dfs(int i){if (i < 0){return 0;}int res Math.max(dfs(i - 1), dfs(i…

127還是localhost....?

前幾天剛發現了一跨域問題&#xff0c;本來吧跨域問題也挺好解決的。 網上搜點教程&#xff0c;該怎么配置就怎么配置就完事了。 但是今天這個跨域問題有點棘手&#xff0c;問題就出在127.0.0.1還是localhost上面 先放一下一開始在127.0.0.1解決跨域的代碼 前端 HTML <…

Vim腳本編寫:自動化任務與自定義命令

Vim腳本&#xff08;Vim Script&#xff09;是一種強大的工具&#xff0c;用于擴展和自動化Vim編輯器的功能。通過編寫Vim腳本&#xff0c;你可以創建自定義命令、自動化常見任務、增強編輯器功能&#xff0c;以及提高你的工作效率。本文將介紹Vim腳本編寫的基礎知識和一些實用…

預制菜工廠MES系統:具體功能與應用場景

在現代化食品工業中&#xff0c;預制菜&#xff08;Ready-to-Eat, RTE&#xff09;因其方便快捷、衛生安全及營養均衡的特點&#xff0c;迅速在餐飲行業中占據重要地位。為了進一步提升預制菜工廠的生產效率、保障產品質量并降低生產成本&#xff0c;制造執行系統&#xff08;M…

代碼隨想錄訓練營第二十八天 122買賣股票的最佳時間II 55跳躍游戲 45跳躍游戲II 1005K次取反后最大化的數組和

第一題&#xff1a; 原題鏈接&#xff1a;122. 買賣股票的最佳時機 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 這題十分簡單&#xff0c;就是把相鄰天數的金額相減&#xff0c;如果發現大于0就加到res中&#xff0c;返回res即可 代碼如下&#xff1a; …

error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope 的參考解決方法

文章目錄 寫在前面一、問題描述二、解決方法參考鏈接 寫在前面 自己的測試環境&#xff1a; Ubuntu20.04&#xff0c;OpenCV 4.2.0 一、問題描述 編譯 OpenCV 的程序時&#xff0c;出現如下報錯 error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope二、解決…

MySQL中的可插拔身份驗證(Pluggable Authentication)(二)

Pluggable Authentication&#xff08;PAM&#xff0c;即可插拔式認證模塊&#xff09;是一種高效且靈活的用戶級別的認證方式&#xff0c;廣泛應用于現代操作系統&#xff0c;特別是Linux服務器中。它允許數據庫管理員&#xff08;DBAs&#xff09;為MySQL用戶帳戶選擇和更改不…

ffmpeg將多個yuv文件編碼為MP4視頻文件

一、編碼方案 在視頻錄制時&#xff0c;每一幀保存為一個yuv文件&#xff0c;便于糾錯和修改。在編碼為MP4文件時&#xff0c;我的方案是將所有yuv文件先轉碼為單個MP4文件&#xff0c;然后使用ffmpeg的concat功能拼接為完整的視頻。 二、shell腳本 #!/bin/bash# 檢查參數數量…

MYSQL8.0環境部署

創建用戶 groupadd mysql useradd -g mysql mysql 刪除原來的包 # rpm -qa|grep mysql # rpm -qa|grep mari mariadb-libs-5.5.68-1.el7.x86_64 # rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 解壓 cd /usr/local & mkdir mysql cd mysql # cp mysql-8…

Ubuntu 22.04 安裝中文字體

筆者在用OpenCV4.9處理圖片加水印時&#xff0c;中文亂碼。原來是Ubuntu 22.04發行版缺少中文字體支持&#xff0c;因此&#xff0c;筆者就找資料安裝了需要的中文字體&#xff0c;特此記錄&#xff0c;以備后查。 1、打開終端&#xff1a; 2、更新軟件包列表&#xff1a; su…

【LC刷題】DAY22:491 46 47 332 51 37

【LC刷題】DAY22&#xff1a;491 46 47 332 51 37 文章目錄 【LC刷題】DAY22&#xff1a;491 46 47 332 51 37491. 非遞減子序列 [link](https://leetcode.cn/problems/non-decreasing-subsequences/description/)46. 全排列 [link](https://leetcode.cn/problems/permutations…

水利行業的智慧化轉型實踐:結合具體案例,探討智慧水利在提升水資源利用效率、改善水生態環境方面的實際效果

目錄 一、引言 二、智慧水利的定義與意義 三、智慧水利在提升水資源利用效率方面的實踐 1. 智慧灌溉系統 2. 智慧供水系統 3. 智慧水務管理平臺 四、智慧水利在改善水生態環境方面的實踐 1. 智慧水質監測系統 2. 智慧水生態修復系統 3. 智慧防洪減災系統 五、具體案例…

如何在 Odoo 16 中添加計算字段的搜索過濾器

首先&#xff0c;了解 Odoo 使用計算字段的原因很重要。當我們需要從其他字段獲取計算值或計算值時&#xff0c;就會使用計算字段。換句話說&#xff0c;不是從數據庫中檢索值&#xff0c;而是可以使用函數計算字段的值。計算字段的一個例子是產品總金額&#xff0c;即通過將產…

EtherCAT通訊介紹

一、EtherCAT簡介 EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;是一種實時以太網技術&#xff0c;是由德國公司Beckhoff Automation在2003年首次推出的。它是一種開放的工業以太網標準&#xff0c;被設計用于滿足工業自動化應用中的高性能和低…

匯聚榮拼多多評價好不好?

匯聚榮拼多多評價好不好?在探討電商平臺的口碑時&#xff0c;用戶評價是衡量其服務質量和商品質量的重要指標。拼多多作為國內領先的電商平臺之一&#xff0c;其用戶評價自然成為消費者選擇購物平臺時的參考依據。針對“匯聚榮拼多多評價好不好?”這一問題&#xff0c;可以從…

Vue3 Hooks 用法 scrollTop, mousemoveHandler,useCountDown

三個實例來自 learn_vue: 【教學工程】學習vue2/vue3 (gitee.com) 目錄 1. 何為Hooks 2. 使用場景 3. 常見的 Hooks 函數 4. 實例 4.1簡易hook 例子 4.2 自定義scrolltop例子 4.3 mousemoveHandler例子 4.4 useCountDown例子 1. 何為Hooks Hooks 是一種函數&#xff0c;用于…

vue css 鏈式布局模式

<div class"pp-wrap"> <div class"pp-left"><!--跳活動反思--><div class"even-box" v-for"(item,index) in trackingPtoPLeftList" :key"index" click"jumpReview(item)"><div …

echarts柱狀選中shadow陰影背景寬度設置

使用line&#xff0c;寬度增大到所需要的寬度&#xff0c;設置下顏色透明度就行 tooltip: {trigger: axis,//把陰影的層級往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…