从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

从零开始的目标检测和关键点检测(二):训练一个Glue的RTMDet模型

  • 一、config文件解读
  • 二、开始训练
  • 三、数据集分析
  • 四、ncnn部署

从零开始的目标检测和关键点检测(一):用labelme标注数据集

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

[1]用labelme标注自己的数据集中已经标注好数据集(关键点和检测框),通过labelme2coco脚本将所有的labelme json文件集成为两个coco格式的json文件,即train_coco.json和val_coco.json。训练一个RTMDet模型,需要重写config文件。

一、config文件解读

1、数据集类型即coco格式的数据集,metainfo是指框的类别,因为这里只有一个glue的类,因此NUM_CLASSES为1,注意metainfo类别名后的逗号,

# 数据集类型及路径
dataset_type = 'CocoDataset'
data_root = 'data/glue_134_Keypoint/'
metainfo = {'classes': ('glue',)}
NUM_CLASSES = len(metainfo['classes'])

2、加载backnbone预训练权重和RTMDet-tiny预训练权重

# RTMDet-tiny
load_from = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_tiny_8xb32-300e_coco/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth'
backbone_pretrain = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth'
deepen_factor = 0.167
widen_factor = 0.375
in_channels = [96, 192, 384]
neck_out_channels = 96
num_csp_blocks = 1
exp_on_reg = False

3、训练参数设置,如epoch、batchsize…

MAX_EPOCHS = 200
TRAIN_BATCH_SIZE = 8
VAL_BATCH_SIZE = 4
stage2_num_epochs = 20
base_lr = 0.004
VAL_INTERVAL = 5  # 每隔多少轮评估保存一次模型权重

4、default_runtime,即默认设置,在config文件夹的default_runtime.py可看到。不同的MM-框架的默认设置不一样(如default_scope = 'mmdet'),可以包含这个.py也可以直接复制过来。

default_scope = 'mmdet'
default_hooks = dict(timer=dict(type='IterTimerHook'),logger=dict(type='LoggerHook', interval=1),param_scheduler=dict(type='ParamSchedulerHook'),checkpoint=dict(type='CheckpointHook', interval=10, max_keep_ckpts=2, save_best='coco/bbox_mAP'),# auto coco/bbox_mAP_50 coco/bbox_mAP_75 coco/bbox_mAP_ssampler_seed=dict(type='DistSamplerSeedHook'),visualization=dict(type='DetVisualizationHook'))
env_cfg = dict(cudnn_benchmark=False,mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),dist_cfg=dict(backend='nccl'))
vis_backends = [dict(type='LocalVisBackend')]
visualizer = dict(type='DetLocalVisualizer',vis_backends=[dict(type='LocalVisBackend')],name='visualizer')
log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True)
log_level = 'INFO'
load_from = None
resume = False

5、训练超参数配置

train_cfg = dict(type='EpochBasedTrainLoop',max_epochs=MAX_EPOCHS,val_interval=VAL_INTERVAL,dynamic_intervals=[(MAX_EPOCHS - stage2_num_epochs, 1)])val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')# 学习率
param_scheduler = [dict(type='LinearLR', start_factor=1e-05, by_epoch=False, begin=0,end=1000),dict(type='CosineAnnealingLR',eta_min=0.0002,begin=150,end=300,T_max=150,by_epoch=True,convert_to_iter_based=True)
]# 优化器
optim_wrapper = dict(type='OptimWrapper',optimizer=dict(type='AdamW', lr=base_lr, weight_decay=0.05),paramwise_cfg=dict(norm_decay_mult=0, bias_decay_mult=0, bypass_duplicate=True))
auto_scale_lr = dict(enable=False, base_batch_size=16)

6、数据处理pipeline,做数据预处理(数据增强)

# DataLoader
backend_args = None
train_pipeline = [dict(type='LoadImageFromFile', backend_args=None),dict(type='LoadAnnotations', with_bbox=True),dict(type='CachedMosaic',img_scale=(640, 640),pad_val=114.0,max_cached_images=20,random_pop=False),dict(type='RandomResize',scale=(1280, 1280),ratio_range=(0.5, 2.0),keep_ratio=True),dict(type='RandomCrop', crop_size=(640, 640)),dict(type='YOLOXHSVRandomAug'),dict(type='RandomFlip', prob=0.5),dict(type='Pad', size=(640, 640), pad_val=dict(img=(114, 114, 114))),dict(type='CachedMixUp',img_scale=(640, 640),ratio_range=(1.0, 1.0),max_cached_images=10,random_pop=False,pad_val=(114, 114, 114),prob=0.5),dict(type='PackDetInputs')
]
test_pipeline = [dict(type='LoadImageFromFile', backend_args=None),dict(type='Resize', scale=(640, 640), keep_ratio=True),dict(type='Pad', size=(640, 640), pad_val=dict(img=(114, 114, 114))),dict(type='PackDetInputs',meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape','scale_factor'))
]

7、加载数据和标注并用对应pipeliane做预处理

train_dataloader = dict(batch_size=TRAIN_BATCH_SIZE,num_workers=4,persistent_workers=True,sampler=dict(type='DefaultSampler', shuffle=True),batch_sampler=None,dataset=dict(type='CocoDataset',data_root=data_root,metainfo=metainfo,ann_file='train_coco.json',data_prefix=dict(img='images/'),filter_cfg=dict(filter_empty_gt=True, min_size=32),pipeline=train_pipeline,backend_args=None),pin_memory=True)
val_dataloader = dict(batch_size=VAL_BATCH_SIZE,num_workers=2,persistent_workers=True,drop_last=False,sampler=dict(type='DefaultSampler', shuffle=False),dataset=dict(type='CocoDataset',data_root=data_root,metainfo=metainfo,ann_file='val_coco.json',data_prefix=dict(img='images/'),test_mode=True,pipeline=test_pipeline,backend_args=None))
test_dataloader = val_dataloader

8、定义模型结构backbone + neck + head

# 模型结构
model = dict(type='RTMDet',data_preprocessor=dict(type='DetDataPreprocessor',mean=[103.53, 116.28, 123.675],std=[57.375, 57.12, 58.395],bgr_to_rgb=False,batch_augments=None),backbone=dict(type='CSPNeXt',arch='P5',expand_ratio=0.5,deepen_factor=deepen_factor,widen_factor=widen_factor,channel_attention=True,norm_cfg=dict(type='SyncBN'),act_cfg=dict(type='SiLU', inplace=True),init_cfg=dict(type='Pretrained',prefix='backbone.',checkpoint=backbone_pretrain)),neck=dict(type='CSPNeXtPAFPN',in_channels=in_channels,out_channels=neck_out_channels,num_csp_blocks=num_csp_blocks,expand_ratio=0.5,norm_cfg=dict(type='SyncBN'),act_cfg=dict(type='SiLU', inplace=True)),bbox_head=dict(type='RTMDetSepBNHead',num_classes=NUM_CLASSES,in_channels=neck_out_channels,stacked_convs=2,feat_channels=neck_out_channels,anchor_generator=dict(type='MlvlPointGenerator', offset=0, strides=[8, 16, 32]),bbox_coder=dict(type='DistancePointBBoxCoder'),loss_cls=dict(type='QualityFocalLoss',use_sigmoid=True,beta=2.0,loss_weight=1.0),loss_bbox=dict(type='GIoULoss', loss_weight=2.0),with_objectness=False,exp_on_reg=exp_on_reg,share_conv=True,pred_kernel_size=1,norm_cfg=dict(type='SyncBN'),act_cfg=dict(type='SiLU', inplace=True)),train_cfg=dict(assigner=dict(type='DynamicSoftLabelAssigner', topk=13),allowed_border=-1,pos_weight=-1,debug=False),test_cfg=dict(nms_pre=30000,min_bbox_size=0,score_thr=0.001,nms=dict(type='nms', iou_threshold=0.65),max_per_img=300))

二、开始训练

1、开始训练

python tools/train.py data/glue_134_Keypoint/rtmdet_tiny_glue.py

训练结果

 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.719Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.483Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.766Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.766Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = -1.000Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.766

2、测试一下训练结果

python demo/image_demo.py data/glue_134_Keypoint/test_image/test.png data/glue_134_Keypoint/rtmdet_tiny_glue.py --weights work_dirs/rtmdet_tiny_glue/best_coco_bbox_mAP_epoch_180.pth --device cpu

在这里插入图片描述

3、可视化训练过程

在这里插入图片描述
在这里插入图片描述

4、由于标注数据集的glue都是小目标的,因此大目标无法识别,如下:
在这里插入图片描述

三、数据集分析

1、可视化部分图像

在这里插入图片描述

框标注-框中心点位置分布

在这里插入图片描述

框标注-框宽高分布

显然都是小目标的检测

在这里插入图片描述

四、ncnn部署

在线模型转换:Deploee

上传文件完成在线转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[H5动画制作系列]坐标转化问题一次搞清,一了百了

前言: 本次演示的坐标包括三个坐标层: 1.舞台上的某位置相对于舞台的全局坐标的坐标(黑色)。 2.舞台上蓝色实例内部某位置相对于该蓝色实例内部局部坐标的坐标(蓝色)。 3.舞台上蓝色实例内部的红色实例内部某位置相对该红色实例内部局部坐标的坐标(红色)。 舞台…

Day18力扣打卡

打卡记录 寻找重复数(双指针) 链接 Floyd判圈法,先用快慢指针以不同速率进行移动,最终一定会出现相遇点,然后在使一指针从初始开始,两指针再以同步调移动,再次相遇的点一定为循环开始的点位。 …

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛

摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题,利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下,采购供应链数字化、协同化成为企业激烈竞争的优先选…

链表的介绍

链表的结构和定义 介绍 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表(linked list)是一种经典的线性数据结构,它可以用来存储一组具有顺序性…

执行npm install时老是安装不成功node-sass的原因和解决方案

相信你安装前端项目所需要的依赖包(npm install 或 yarn install)时,有可能会出现如下报错: D:\code\**project > yarn install ... [4/4] Building fresh packages... [-/6] ⠁ waiting... [-/6] ⠂ waiting... [-/6] ⠂ wai…

oracle (9)Storage Relationship Strut

目录 一、基础知识 1、数据库逻辑结构图 2、Types of Segments 段的类型 3、Storage Clause Precedence 存储条款的优先顺序 4、Extent Alloc & Dealloc 区的范围分配和取消分配 5、 Used and Free Extents 使用和自由区 6、Database Block 数据库块 7、Multiple B…

玻色量子签约移动云“五岳”量子云计算创新加速计划!

2023年4月24-26日,由中国移动通信集团主办的“云擎未来 智信天下”2023移动云大会在苏州圆满落幕。 中国移动在本次大会发布了“五岳”量子云计算创新加速计划。作为中国移动量子计算方向的战略伙伴,玻色量子创始人&CEO文凯博士代表北京玻色量子科技…

vue3+vite实现一个后台管理框架,毒蘑菇后台管理。

写后台管理的项目写了很多个了,虽说用的别人的模板,自己专注于自己的业务,保证自己的业务不出错就行了,但是自定义配置又不好去配置,大家用的模板都差不多,用模板自带的业务功能呢后台又得是模板自带的&…

k8s之亲和性、污点

目录 亲和性 键值运算关系 硬策略 软策略 Pod亲和性与反亲和性 污点(Taint) 和 容忍(Tolerations) 污点(Taint) 容忍(Tolerations) 维护操作 故障排除步骤 亲和性 官方介绍:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-nod…

玻色量子成功研制光量子计算专用光纤恒温控制设备——“量晷”

​近日,北京玻色量子科技有限公司(以下简称“玻色量子”)成功研制出一款高精度量子计算专用光纤恒温控制设备——“量晷”,该设备能将光纤的温度变化稳定在千分之一摄氏度量级,即能够做到0.001C的温度稳定维持&#xf…

推荐免费的文本转语音工具TTS-Vue【且开源】

标签: 文本转语音; 免费文本转语音软件; 网上有很多文本转语音的工具,但收费具多。 这里推荐一个免费的文本转语音工具。 不需要注册,下载安装就可以使用。且代码开源。 TTS-Vue 软件主页:https://loker…

什么是文件安全

文件安全就是通过实施严格的访问控制措施和完美的权限卫生来保护您的业务关键信息不被窥探,除了启用和监控安全访问控制外,整理数据存储在保护文件方面也起着重要作用。通过清除旧的、过时的和其他垃圾文件来定期优化文件存储,以专注于关键业…

基于OpenHarmony的启航开发板的基础操作

文章目录 前言一、前提准备二、基础操作1.hb set命令的使用2.hb build -f 命令的使用3.Hello World 案例 前言 在物联网(IoT)领域,开发板扮演着至关重要的角色,为开发人员提供了实验和原型设计的平台。而OpenHarmony作为一个开源…

《异常检测——从经典算法到深度学习》23 TimesNet: 用于常规时间序列分析的时间二维变化模型

zz# 《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Don…

node复制当前目录下的文件夹到另一层目录(包含多层文件夹嵌套)

前段时间在跟进node项目时有个node项目的需求,然后上线流程是把前端build后的文件夹放到后端仓库的静态资源目录下,再把后端代码发布上线。这样做的好处是在前端页面调用接口时,可以直接 /xxx来调用(浏览器会自动把域名补全&#…

MacOS安装homebrew

文章目录 官网脚本无法正常下载安装使用HomebrewCN国内安装脚本进行安装找到一份合适的安装脚步执行安装脚本 Homebrew自己的安装位置使用Homebrew安装tree指令验证安装是否成功Homebrew把软件程序都安装到哪里了 Homebrew安装需要依赖Git,请先确保Git已安装成功 Ho…

面试算法44:二叉树中每层的最大值

题目 输入一棵二叉树,请找出二叉树中每层的最大值。例如,输入图7.4中的二叉树,返回各层节点的最大值[3,4,9]。 分析:用一个队列实现二叉树的广度优先搜索 由于要找出二叉树中每层的最大值,因…

MFC网络通信-Udp服务端

目录 1、UI的布局 2、代码的实现: (1)、自定义的子类CServerSocket (2)、重写OnReceive事件 (3)、在CUdpServerDlg类中处理 (4)、在OnInitDialog函数中 &#xff0…

LeetCode算法题解|​ 669. 修剪二叉搜索树​、108. 将有序数组转换为二叉搜索树、​538. 把二叉搜索树转换为累加树​

一、LeetCode 669. 修剪二叉搜索树​ 题目链接:669. 修剪二叉搜索树 题目描述: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变…

042-第三代软件开发-485通信

第三代软件开发-485通信 文章目录 第三代软件开发-485通信项目介绍485通信RS-485 简介RS-232 简介RS-485 与 RS-232 区别Qt 中使用485 总结一下 关键字: Qt、 Qml、 QSerialPort、 QSerialPort、 QThread 项目介绍 欢迎来到我们的 QML & C 项目&#xff01…