从零开始的目标检测和关键点检测(二):训练一个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.mzph.cn/news/126751.shtml

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

相关文章

领先实践|IDEO 最佳设计思维和策略框架

设计思维是一种以人为本的创新方法,它从人类的角度出发,考虑技术上可行和经济上可行的内容。框架可以成为实现设计思维、策略和系统设计的有用工具。本文由此展开阐述 IDEO 的最佳设计思维和策略框架。 01. 设计思维框架 1.1 设计思维过程 设计思维?是…

python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检 不确定pip能不能安装上,使用时候可以百度一下,脚本是可以使用的,没有问题的 太长时间了,pip安装依赖忘记那些了,使用科大星火询问了下,给了下面的,看看能不能使…

X64(64位)汇编指令与机器码转换原理

X64(64位)汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…

9.MySQL索引的操作

个人主页:Lei宝啊 愿所有美好如期而遇 目录 索引操作 查询索引 创建主键索引 唯一索引的创建 普通索引的创建 全文索引的创建 删除索引 索引创建原则 索引操作 查询索引 第一种方法: show keys from 表名\G 我们了解其中几个就好。 第二种方法…

双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

双目视觉检测的基本原理 利用相机测量宽度时,由于单个相机在成像时存在“近大远小”的现象,并且单靠摄入的图像无法知道被测物的距离,所以由被测物的跳动导致的被测物到工业相机之间距离变化,使测量精度难以提高。 因此测宽仪需…

项目综合实训,vrrp+bfd,以及策略路由的应用

目录 一. 项目需求 二. Visio设备画图 三. 设备选型 三.vlan规划 四.Ip地址规划 五.实验拓扑图 六.配置过程及结果 项目需求 1.S1作为VLAN10的主网关和根桥,S2作为v…

【C语法学习】5 - fputc()函数

文章目录 1 函数原型2 参数3 返回值4 示例4.1 示例14.2 示例24.3 示例3 1 函数原型 fputc():将一个字符发送至指定流stream,函数原型如下: int fputc(int c, FILE *stream);2 参数 fputc()函数有两个参数c和stream: 参数c是待…

Servlet

Servlet是运行在服务端的小型Java程序,是sun公司提供一套规范,用来处理客户端请求,响应给浏览器的动态资源。但servlet的实质就是Java代码,通过Java的API动态的向客户端输出内容(HTML) 一、使用servlet2.5实…

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…

虹科分享 | 太赫兹成像技术透视分层结构助力文物研究

文章来源:虹科光电Hophotonix 阅读链接:虹科分享 | 太赫兹成像技术透视分层结构助力文物研究 对于时间分辨成像方法来说,分层结构的无创检测具有挑战性,其中分辨率和对比度可能会因层间反射和色散的突出信号衰减而受到影响。在一…

【Java 进阶篇】Java Response 输出字符数据案例

在Java Web开发中,使用HTTP响应对象(Response)来向客户端发送数据是一项非常重要的任务。本篇博客将详细介绍如何使用Java中的Response对象来输出字符数据,并提供示例代码以帮助读者更好地理解和应用这一概念。不仅将讨论基础知识…

Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

redis过期策略 redis的过期策略可以通过配置文件进行配置 一、定期删除 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).…

MS3142电机驱动器可兼容LV8548M

MS3142/MS3142S 是一个双全桥电机驱动。可兼容LV8548M(功能基本一致,管脚不兼容)。电源电压供电范围 4V 到 18V,平均电流 1.1A,电流峰值 1.54A。如果需要更高的电流能力,可以将双全桥并联使用。 四个输入脚…

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了,学习效果事半功倍 有同感的同学 可以举举手🤚,点点赞💓 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

Spring中Bean的完整生命周期!(Bean实例化的流程,Spring后处理器,循环依赖解释及解决方法)附案例演示

Bean实例化的基本流程 加载xml配置文件&#xff0c;解析获取配置中的每个的信息&#xff0c;封装成一个个的BeanDefinition对象将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中ApplicationContext底层遍历beanDefinitionMap&#xff0c…

虚拟人运营系统介绍丨支持实时互动/直播/短视频创作,赋能元宇宙营销

2023年&#xff0c;以虚拟人为代表的元宇宙营销成为品牌营销黑马。 品牌通过虚拟人IP运营&#xff0c;形成具有一定影响力的品牌效应&#xff0c;围绕“内容持续输出——粉丝沉淀——优质运营——商业变现”的创新模式&#xff0c;打破同质化营销形式&#xff0c;利用虚拟人IP以…

Flask——接口路由技术

接口路由技术 一、Flask 简介1、环境安装&#xff1a;2、一个最小的应用3、两种运行方式 二、定义路由1、普通路由2、动态路由3、限定类型4、地址尾部的“/” 三、请求与响应-请求方法四、请求与响应-处理请求数据1、request的常用属性/方法2、get 请求参数3、json 请求4、表单…

c++实现策略模式

前言 看了一会儿大话设计模式&#xff0c;我感觉平常的话&#xff0c;策略模式还挺常用的&#xff0c;记录一下。个人理解策略模式&#xff0c;就是抽象一个算法&#xff0c;然后你可以有很多不同的实现&#xff0c;这些实现去重写抽象算法的虚方法。然后在一个上下文类中有一…

Java架构师数学与经济管理

目录 1 导学2 最小生成树3 最短路径4 网络与最大流量5 线性规划6 动态规划6.1 伏格尔法7 博弈论7.1 状态转移矩阵7.2 排队论8 决策论8.1 决策树9 数学建模想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学

Vue+element el-date-picker 时间日期选择器设置默认值,选择框不显示问题(已解决)

时间选择器默认值的问题 显示的时候如果用下面的方式赋值将不会显示出来&#xff1a; this.deviceFormData.time[0] that.$filterArray.formatDatehh(start);this.deviceFormData.time[1] that.$filterArray.formatDateEnd(end);实际上是有数据的&#xff0c;但是不会显示出…