利用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.mzph.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,//…