mmdetection使用未定义backbone训练

news2024/11/20 20:40:02

首先找到你需要用到的 backbone,一般有名的backbone 都会在github有相应的代码开源和预训练权重提供
本文以mobilenetv3 + fastercnn 作为举例,在mmdetection中并未提供 mobilenetv3,提供的仅有 mobilenetv2;
在github上找到 mobilenetv3 实现和权重,下载到本地;本文使用参考为:https://github.com/d-li14/mobilenetv3.pytorch

为了能够用在mmdetection体系中,我们要对代码进行修改,以适应mmdetection 配置式构建网络

增加 init_weigths函数

 def init_weights(self, pretrained=None):
     logger = get_root_logger()
     if self.init_cfg is None and pretrained is None:
         logger.warn(f'No pre-trained weights for '
                     f'{self.__class__.__name__}, '
                     f'training start from scratch')
         pass
     else:
         assert 'checkpoint' in self.init_cfg, f'Only support ' \
                                               f'specify `Pretrained` in ' \
                                               f'`init_cfg` in ' \
                                               f'{self.__class__.__name__} '
         if self.init_cfg is not None:
             ckpt_path = self.init_cfg['checkpoint']
         elif pretrained is not None:
             ckpt_path = pretrained

         ckpt = _load_checkpoint(
             ckpt_path, logger=logger, map_location='cpu')
         if 'state_dict' in ckpt:
             _state_dict = ckpt['state_dict']
         elif 'model' in ckpt:
             _state_dict = ckpt['model']
         else:
             _state_dict = ckpt

         state_dict = _state_dict
         missing_keys, unexpected_keys = \
             self.load_state_dict(state_dict, False)
         logger.info(f"Miss {missing_keys}")
         logger.info(f"Unexpected {unexpected_keys}")

修改 模型参数列表

可以看到上面用到了 self.init_cfg ,但原始模型并没有,因此需要
修改模型参数列表,添加 init_cfg,out_indices,等
并初始化

修改forward 【结合模型特点、网络结构 进行修改,将out_indices 对应的输出取出来】

def forward(self, x):
        outs = []
        # x = self.features(x)
        for i,f in enumerate(self.features):
            x = f(x)
            if i in self.out_indices:
                outs.append(x)
        assert (len(outs) == 4)
        return outs

有些网络的实现并不是直接使用,而是使用配置,来提供不同类型的网络模型,这里就有 small large 两种
由于我们上面的 模型类 修改了参数列表,因此也需要对 这种二次配置的函数 参数列表进行修改 添加 init_cfg,out_indices 等,原有参数尽量保持不变

def mobilenetv3_large(pretrained=False, num_classes = 1000, distillation=False, init_cfg=None, out_indices=[],**kwargs):
    # ...
    cfgs = []
    return MobileNetV3(cfgs, mode='large',init_cfg=init_cfg, out_indices=out_indices,**kwargs)

添加注解

然后,我们要将他们添加到 mmdet 中的 registry 中,
mmdet提供了一种 装饰器的模式 用于将我们自定义的模型 加入到其中

# 导入
from mmdet.models.builder import BACKBONES,MODELS,Necks # 这里定义了mmdetection 的各种组件

# 添加 注解
@BACKBONES.register_module()
def mobilenetv3_large():
    #...

@BACKBONES.register_module()
def mobilenetv3_small():
    #...

这个时候,我们的文件基本修改完成

注意事项

注意这个时候 其实只是配置完成,但在运行时 不会真正加载到 registry 中 ,运行就会发现报错

'mobilenetv3_large is not in the models registry'"

解决方法 就是运行时引入,在train.py 导入这个文件

import mobilenetv3

我在配置时就遇到了这样情况,感谢 https://blog.csdn.net/Kiki_soda/article/details/137491803 提醒

debug

image.png
可以看到 我们的模型已经被加载进去

其他方法

官方提供的方法

  1. 一种是 修改源码层中的 init 文件,这个也要求你的mobilenet文件也要定义在源码文件中
  2. 使用一种 custom_imports 【尝试未成功】

具体参考官方文档 https://mmdetection.readthedocs.io/zh-cn/v2.21.0/tutorials/customize_models.html

配置文件

然后配置文件,根据模型结构合理设置参数

_base_ = [
    './_base_/models/faster_rcnn_r50_fpn.py',
    './_base_/datasets/coco_detection.py',
    './_base_/schedules/schedule_1x.py', './_base_/default_runtime.py'
]


model = dict(
    backbone=dict(
        type='mobilenetv3_large',
        init_cfg=dict(
            type='Pretrained',
            checkpoint='pretrain/mobilenetv3-large-1cd25616.pth', # 预训练权重位置
        ),
        out_indices = [2, 5, 9, 14], # 根据模型来设置
    ),
    neck=dict(
        type='FPN',
        in_channels=[24, 40, 80, 160], # 根据模型来设置 和out_indices 对应
        out_channels=256, # 修改这个会牵动 下面很多配置; 如需修改 其他后续参数也需修改
        num_outs=5))
        

完成!就可以开始训练了

对于如何设置 out_indices,可以参考 timm 提供的模型 特征输出情况,进而设置

参考:

https://blog.csdn.net/Kiki_soda/article/details/137491803
https://mmdetection.readthedocs.io/zh-cn/v2.21.0/tutorials/customize_models.html
https://www.cnblogs.com/qiulinzhang/p/12252033.html

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

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

相关文章

【设计模式】结构型-桥接模式

当抽象与实现,各自独立, 桥接模式,如彩虹桥,连接两岸。 文章目录 一、类爆炸与代码重复二、桥接模式三、桥接模式的核心组成四、运用桥接模式五、桥接模式的应用场景六、小结推荐阅读 一、类爆炸与代码重复 场景假设&#xff1a…

C++第二十六弹---stack和queue的基本操作详解与模拟实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. stack的介绍和使用 1.1 stack的介绍 ​1.2 stack的使用 1.3 stack 模拟实现 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2…

5.31.15 使用图像到图像转换和 YOLO 技术对先前的乳房 X 光检查结果中的异常进行早期检测和分类

在本研究中,我们研究了基于 You-Only-Look-Once (YOLO) 架构的端到端融合模型的有效性,该模型可同时检测和分类数字乳房 X 光检查中的可疑乳腺病变。包括四类病例:肿块、钙化、结构扭曲和正常,这些病例来自包含 413 个病例的私人数…

一次曝 9 个大模型,「字节 AI」这一年都在做什么?

字节跳动的大模型家族,会长出下一个抖音吗? 整个 2023 年,字节并没有对外官宣其内部自研的大模型。外界一度认为,大模型这一技术变革,字节入场晚了。梁汝波在去年底的年会上也提到了这一点,他表示「字节对…

【全开源】露营地管理系统小程序源码(ThinkPHP+FastAdmin+UniApp)

专为露营业务设计开发小程序应用。平台拥有多角色管理,同时具有营位预定、门票购买等功能模块。 🔥露营地管理系统小程序:轻松掌控你的露营帝国🏕️ 📌一、引言:露营地管理的新时代 随着露营文化的兴起&a…

❤vue2项目webpack打包的优化策略

❤ vue2项目webpack打包的优化策略 (优化前) 现在我们的打包时间为: >打包体积大小为: 1、去除开发环境和生产环境提示以及日志 开发环境和生产环境的打印处理 生产环境去除console.log打印的两种方式 通过环境变量控制co…

知识图谱的应用---社交网络

文章目录 社交网络典型应用 社交网络 社交网络已成为发展最快的互联网应用,社交网络用户不仅仅是信息的接受者,也成为了信息的制造、加工和传播者,通过关注、被关注的方式形成了一张张庞杂繁复的用户关系网。随着社交网络中用户及信息急速增长…

数新网络签单国泰君安:利用数据服务平台提升金融业务用数能力

近日,数新网络与国泰君安证券股份有限公司(以下简称“国泰君安”)达成了数据服务平台升级项目的签约。这一项目的推进将更好地服务于国泰君安内部业务部门的数据需求,帮助数据平台更加有效地实现提升业务响应效率的目标&#xff0…

【Linux文件篇】系统文件、文件描述符与重定向的实用指南

W...Y的主页 😊 代码仓库分享💕 前言:相信大家对文件都不会太陌生、也不会太熟悉。在没有学习Linux操作系统时,我们在学习C或C时都学过如何去创建、打开、读写等待文件的操作,知道一些语言级别的一些接口与函数。但…

怎样把便签里的内容移到桌面?桌面便签软件使用方法

每次打开电脑,我总是被满屏的文件和图标弄得眼花缭乱。那些记录在各式各样便签里的重要事项,经常被埋没在这信息的海洋中,找起来真是头疼。想必很多人都有过这样的困扰:如何在繁杂的桌面环境中,一眼就看到自己需要提醒…

问题:以下被纳入代理资产风险分类管理的业务包括() #媒体#知识分享

问题:以下被纳入代理资产风险分类管理的业务包括() A.非标准化理财投资业务 B.特定债权投资业务 C.委托债权代理业务 D.非标准化代理销售业务 参考答案如图所示

HTML静态网页成品作业(HTML+CSS)—— 兰蔻化妆品网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

NAT

文章目录 1.NAT是什么2.NAT功能3.NAT优缺点4.NAT作用工作原理5.NAT 静态 动态5.1静态静态配置1.全局模式下设置静态NAT2.接口上设置静态NAT 5.2动态动态配置测试 6.PAT多路复用 PAT NAPT Easyip NAT server6.1PAT端口多路复用PAT作用 1.NAPT配置测试 2.EasyIp配置测试 3.NAT se…

Fegin如何传参form-data文件

Form-data传输file参数,这个大家都比较清楚,那么针对于Fegin参数file参数该如何操作呢!下面截图来找到对应的参数关系。 一、之前我们在postMan中是这种传参的,那么如果使用Feigin来传输文件File 二、在Fegin中传form-data参数&a…

Qt系统相关

本文目录 1.Qt事件事件的处理标签事件鼠标事件滚轮事件按键事件定时器事件窗口事件事件派发器 2.Qt文件操作QFile的基本使用 3.Qt多线程使用线程线程锁connect的第五个参数 条件变量和信号量 4.Qt网络编程UDP SocketTCP SocketQTcpServerQTcpSocket HTTP的编写 5.QT多媒体播放音…

【区块链】深入解析Proof of Work (PoW): 区块链技术的核心驱动力

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入解析 Proof of Work (PoW): 区块链技术的核心驱动力引言一、PoW基本概念1.1…

UNetMultiLane 多车道线、车道线类型识别

基于UNet 分割模型增加了检测头来识别车道线的类型(单实线、双黄线等10种),同时可以识别出"所在车道"和"车道线类型"。 训练代码【训练练手代码】 1 数据说明 基于开源数据集 VIL100。其中数据标注了所在的六个车道的车…

大福利!微信付费进群源码

微信付费进群源码 前言效果图搭建教程源码领取下期更新预报 前言 1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的,电脑…

苹果WWDC 2024速览

引言 2024年苹果全球开发者大会(WWDC)在充满科技感的苹果园区拉开帷幕,本次大会发布了众多令人振奋的软硬件更新,包括Vision OS 2、iOS 18、watchOS 11和macOS Sequoia的重大创新。本文将详细解读这些更新,为您展示它…

来自中国信通院的认可!上海斯歌受邀加入“EP-Link 智能流程推进计划”

5月30日,由中国信息通信研究院主办的“EP-Link 智能流程推进计划”周年产业研讨会在北京隆重召开。会上,在众多领袖专家、行业翘楚的见证下,上海斯歌被中国信息通信研究院授予“EP-Link 智能流程推进计划”成员单位证书,正式加入该…