mmdetection使用未定义backbone训练

首先找到你需要用到的 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')passelse: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 = pretrainedckpt = _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 = ckptstate_dict = _state_dictmissing_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.rhkb.cn/news/346653.html

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

相关文章

高性能MySQL(第3版)电子书笔记

Mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/ 高性能MySQL(第3版):百度网盘,基于Mysql5.1和Mysql5.5 本机版本 mysql> select version(); ------------ | version() | ------------ | 5.7.32-log |…

Linux 网络设置

Linux 网络设置 查看及测试网络查看网络配置测试网络连接 设置网络地址参数使用网络配置命令修改网络配置文件 查看及测试网络 查看及测试网络配置是管理 Linux 网络服务的第一步,本节将学习 Linux 操作系统中的网络查看及测试命令。其中讲解的大多数命令以普通用户权限就可以…

【ppyoloe+】19届智能车完全模型组非官方基线

基于十九届智能车百度完全模型组线上赛baseline修改 调整参数最高能到0.989吧 一、环境准备 1.安装PaddleDetection In [1] # 解压PaddleDetection压缩包 %cd /home/aistudio/data/data267567 !unzip -q PaddleDetection-release-2.6.zip -d /home/aistudio /home/aistud…

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后,我们对迭代器的印象也是加深了许多,但是我们实现的都是正向迭代器,还没有实现反向迭代器,那么为什么迟迟不实现呢?因为难吗?实际上还好。…

stm32MP135裸机编程:修改官方GPIO例程在DDR中点亮第一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf 正点原子stm32mp135开发板&原理图 STM32Cube_FW_MP13_V1.1.0 STM32CubeIDE v1.151 需要修改那些地方 1.1 修改LED引脚 本例使用开发板的PI3引脚链接的LED作为我们点亮的第一颗LED灯,…

AC/DC电源模块的原理、特点以及其在实际应用中的重要性

BOSHIDA AC/DC电源模块的原理、特点以及其在实际应用中的重要性 AC/DC电源模块是一种用于将交流电转换为直流电的设备,广泛应用于各种电子设备中。这种电源模块可以有效地将电力从电网中提取出来,并将其转换为稳定的直流电源,供给各种不同功…

容器(Docker)安装

centos安装Docker sudo yum remove docker* sudo yum install -y yum-utils#配置docker的yum地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本 - 可以根据实际安装版本 sudo yum install -y docke…

12个精选Prompt框架,快速提升你写Prompt的能力,内附实例(上篇)

前言 想要熟练驾驭大模型,除了掌握Prompt的原则和技巧外,我们还可以参考一些成熟的Prompt框架,这样能快速提升我们写Prompt的能力,我从网上搜集到了12个精选Prompt框架,并为每一个框架附上一个实际的例子,…

何为屎山代码?

在编程界,有一种代码被称为"屎山代码"。这并非指某种编程语言或方法,而是对那些庞大而复杂的项目的一种形象称呼。屎山代码,也被称为"祖传代码",是历史遗留问题,是前人留给我们的"宝藏"…

性能测试2【搬代码】

1.性能测试脚本完善以及增强 2.jmeter插件安装以及监控使用 3.性能压测场景设置(基准、负载、压力、稳定性) 4. 无界面压测场景详解 一、性能测试脚本完善以及增强 使用控制器的目的是使我们的脚本更加接近真实的场景 1.逻辑控制器: 【事务控制器】&…

电商API接口接入||电商比价项目比价系统搭建需要注意哪些?

在搭建一个淘宝/京东比价系统时,需要注意以下几个方面,以确保系统的有效性、准确性和用户友好性: 确定平台和商品范围: 明确系统覆盖的电商平台,如淘宝、京东等。确定要比较的商品类别和范围,以确保数据的…

Maven环境搭建

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

【Vue】核心概念 - module

目标 掌握核心概念 module 模块的创建 问题 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。 这句话的意思是,如果把所有的状态都放在state中,当项目变得…

表的设计与查询

目录 一、表的设计 1.第一范式(一对一) 定义: 示例: 2.第二范式(一对多) 定义: 要求: 示例: 3.第三范式(多对多) 定义: 要求…

Selenium三种等待方式的使用!

UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作。但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1、有frame;2、没有设置等待。 因为代码运行速度和浏览器…

如何有效释放Docker占用的存储空间

随着Docker的广泛应用,我们经常会遇到Docker占用过多存储空间的问题。这可能是由于频繁的镜像拉取、容器创建和删除等操作导致的。本文将介绍几种方法来有效释放Docker占用的存储空间,特别是docker system prune命令的使用。 Docker的存储机制 Docker使…

体验SmartEDA:颠覆传统,设计流程更流畅,超越Multisim与Proteus!

在电子设计自动化(EDA)领域,传统软件如Multisim和Proteus一直是工程师们的得力助手。然而,随着科技的飞速发展和用户需求的不断升级,一个全新的EDA平台——SmartEDA正崭露头角,凭借其更为流畅的设计流程&am…

【验收支撑文档】软件验收计划书

软件系统验收计划书是确保新开发的软件系统符合预期要求并稳定运行的关键步骤。本计划书概述了验收过程的主要环节,包括系统功能的详细测试、性能评估、用户接受度测试以及文档完整性的核查。验收团队将依据项目需求规格说明书和合同要求,对系统进行全面…

网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业

很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。 算上从学校开始学习,已经在网安这条路上走…

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况,程序在执行过程中,数据导致程序不正常,最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分,比如我们比较熟悉的数组越…