【OWOD论文】开放世界中OD代码_2_模型部分

简介

本文记录OWOD代码中的模型代码部分。数据部分可看我上一个博客【【OWOD论文】开放世界中OD代码_1_数据部分-CSDN博客】

模型代码

1 起步

在代码中找到 detectron2\engine\defaults.py  DefaultTrainer类 __init__方法

根据上述 build_model 回溯到 detectron2\modeling\meta_arch\build.py 时, 发现仅有下面的内容,明显 META_ARCH_REGISTRY 是关键:

根据代码,可发现 META_ARCH_REGISTRY 定义为

from detectron2.utils.registry import RegistryMETA_ARCH_REGISTRY = Registry("META_ARCH")  # noqa F401 isort:skip
META_ARCH_REGISTRY.__doc__ = """

 由此找到 detectron2/utils/registry.py 中的 Registry 可发现下面的代码:

# Keep this module for backward compatibility.
from fvcore.common.registry import Registry  # noqa__all__ = ["Registry"]

貌似还是没找到想要的,其实 detectron2 使用了 Registry 注解用于模型的注入。由此我们直接招到对应的模型部分,因为OWOD基于Faster RCNN,所以直接在 detectron2\modeling\meta_arch 中找到 rcnn.py

所以模型真正意义上在这里定义的,基于注解,将模型注入。

2 具体代码

GeneralizedRCNN的代码逻辑如下:
    Generalized R-CNN. Any models that contains the following three components:
    1. Per-image feature extraction (aka backbone)
    2. Region proposal generation
    3. Per-region feature extraction and prediction

当模型加载时,并不是直接执行 __init__ 方法,注意到 GeneralizadRCNN 中有个类方法,使用@classmethod 注解标明,方法初始化时,先加载这个静态方法进行了变量初始化。然后才是__init__ 方法。下面方法中的 cls 是个类占位符变量,这个可以看下 python 中的类注解方法定义。

@classmethod
def from_config(cls, cfg):backbone = build_backbone(cfg)return {"backbone": backbone,"proposal_generator": build_proposal_generator(cfg, backbone.output_shape()),"roi_heads": build_roi_heads(cfg, backbone.output_shape()),"input_format": cfg.INPUT.FORMAT,"vis_period": cfg.VIS_PERIOD,"pixel_mean": cfg.MODEL.PIXEL_MEAN,"pixel_std": cfg.MODEL.PIXEL_STD,}

这里面有这两个方法,一个是生成 Proposal boxes,一个为 roi_heads

"proposal_generator": build_proposal_generator(cfg, backbone.output_shape()),
"roi_heads": build_roi_heads(cfg, backbone.output_shape()),

2.1 build_proposal_generator

先来看 build_proposal_generator 部分,本质上为Faster RCNN的建议框生成过程,其初始化的代码部分为

#cfg 一些配置文件#input_shape:{"res4":[1024,16]}#即 input_shape 为RPN.IN_FEATURES #定义的Resnet输出的feature#该代码中使用的是仅输出 ['res4']    @classmethoddef from_config(cls, cfg, input_shape: Dict[str, ShapeSpec]):#res4in_features = cfg.MODEL.RPN.IN_FEATURESret = {"in_features": in_features,#0"min_box_size": cfg.MODEL.PROPOSAL_GENERATOR.MIN_SIZE,#0.7"nms_thresh": cfg.MODEL.RPN.NMS_THRESH,#256"batch_size_per_image": cfg.MODEL.RPN.BATCH_SIZE_PER_IMAGE,#0.5"positive_fraction": cfg.MODEL.RPN.POSITIVE_FRACTION,"loss_weight": {#loss_rpn_cls 1.0 loss_rpn_loc:1.0*1.0"loss_rpn_cls": cfg.MODEL.RPN.LOSS_WEIGHT,"loss_rpn_loc": cfg.MODEL.RPN.BBOX_REG_LOSS_WEIGHT * cfg.MODEL.RPN.LOSS_WEIGHT,},#-1 #Remove RPN anchors that #go outside the image by BOUNDARY_THRESH pixels"anchor_boundary_thresh": cfg.MODEL.RPN.BOUNDARY_THRESH,"box2box_transform": Box2BoxTransform(weights=cfg.MODEL.RPN.BBOX_REG_WEIGHTS),#smooth_l1"box_reg_loss_type": cfg.MODEL.RPN.BBOX_REG_LOSS_TYPE,#0.0"smooth_l1_beta": cfg.MODEL.RPN.SMOOTH_L1_BETA,}#12000 / 6000ret["pre_nms_topk"] = (cfg.MODEL.RPN.PRE_NMS_TOPK_TRAIN, cfg.MODEL.RPN.PRE_NMS_TOPK_TEST)#2000 / 1000ret["post_nms_topk"] = (cfg.MODEL.RPN.POST_NMS_TOPK_TRAIN, cfg.MODEL.RPN.POST_NMS_TOPK_TEST)ret["anchor_generator"] = build_anchor_generator(cfg, [input_shape[f] for f in in_features])ret["anchor_matcher"] = Matcher(cfg.MODEL.RPN.IOU_THRESHOLDS, cfg.MODEL.RPN.IOU_LABELS, allow_low_quality_matches=True)ret["head"] = build_rpn_head(cfg, [input_shape[f] for f in in_features])return ret

其中需要关注的是 下面的部分

ret["anchor_generator"] = build_anchor_generator(cfg, [input_shape[f] for f in in_features])
ret["anchor_matcher"] = Matcher(cfg.MODEL.RPN.IOU_THRESHOLDS, cfg.MODEL.RPN.IOU_LABELS, allow_low_quality_matches=True)
ret["head"] = build_rpn_head(cfg, [input_shape[f] for f in in_features])

build_anchor_generator 用于生成锚框,主要看 detectron2\modeling\anchor_generator.py 中的 DefaultAnchorGenerator 其 from_config 内容为

@classmethod
def from_config(cls, cfg, input_shape: List[ShapeSpec]):return {#[[32, 64, 128, 256, 512]]"sizes": cfg.MODEL.ANCHOR_GENERATOR.SIZES,#[[0.5, 1.0, 2.0]]"aspect_ratios": cfg.MODEL.ANCHOR_GENERATOR.ASPECT_RATIOS,#[16]"strides": [x.stride for x in input_shape],#0.0"offset": cfg.MODEL.ANCHOR_GENERATOR.OFFSET,}

Matcher 用于匹配正负和忽略样本,具体代码参看 detectron2\modeling\Matcher.py

Matcher 将 GT与Anchor框进行比较,对Anchor进行赋值 0 :背景,-1 忽略, 1 前景。为增加正类样本数,当某些GT与Anchor匹配度没有高于0.7阈值时,将与GT IOU最高(非0)的Anchor置

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

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

相关文章

无人机校企合作:组装、维修、研发全面提升学生技能方好就业

无人机校企合作在组装、维修、研发等方面全面提升学生技能,进而促进学生就业,是一个具有前瞻性和实践性的教育模式。以下是对该合作模式的详细分析: 一、合作背景与意义 随着无人机技术的快速发展和广泛应用,市场对无人机专业人…

叉车(工业车辆)安全管理系统,云端监管人车信息运营情况方案

近年来,国家和各地政府相继出台了多项政策法规,从政策层面推行叉车智慧监管,加大叉车安全监管力度。同时鼓励各地结合实际,积极探索智慧叉车建设,实现作业人员资格认证、车辆状态认证、安全操作提醒、行驶轨迹监控等&a…

react学习之useState和useEffect

useState useState 可以使函数组件像类组件一样拥有 state,函数组件通过 useState 可以让组件重新渲染,更新视图。 实际使用 setstate()中回调函数的返回值将会成为新的state值回调函数执行时, React会将最新的state值作为参数传递 const A…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性,其装饰的属性可作为一个UI结构的占位符,待创建该组件时,可通过参数为其传入具体的内容。参数必须满足俩个条件: 2.1 参数类型必须是个函数&#x…

windows安全软件之火绒杀毒的密码忘记后处理

一、问题描述 某次,想升级系统补丁,但多次尝试后都失败,排查杀毒软件影响过程中,发现火绒杀毒配置了密码保护,但因时间太久,密码已无从考证,那我们应该怎样处理这种情况呢? 二、处…

鸿蒙XComponent组件的认识

概述: XComponent组件作为一种渲染组件,通常用于满足开发者较为复杂的自定义渲染需求,例如相机预览流的显示、游戏画面的渲染、自定义视频播放器等等。其中Native API是其核心内容! 其可通过指定其type字段来实现不同的功能&…

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kubernetes,点击 安装,安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外,所以…

解决huggingface下载时Username/Password Authentication Failed.问题

项目场景: 使用huggingface 下载数据集。 问题描述 运行命令: wget https://huggingface.co/datasets/yangtaointernship/RealEstate10K-subset/resolve/main/google_scanned_objects.zip?downloadtrue 完整报错如下: --2024-08-30 15:…

Windows通过网线连接开发板共享网络

Windows端 打开更开适配器选项右键WLAN–属性–共享 右键以太网–属性–Internet协议版本4(TCP/IPv4) 记住IP地址 开发板端 查看网卡 ifconfig设置IP在同一网段 ifconfig eth0 192.168.137.2 netmask 255.255.255.0设置网关 route add default gw 192.168.137.1配置DNS su…

哪个牌子的电容笔好用又实惠?西圣、绿联、摩米士电容笔实测大比拼

​现在市面上的电容笔很多,在选择时会让人感到很纠结。那么多的选择,究竟哪个牌子的电容笔好用又实惠呢?一款优质的电容笔应考虑握持舒适度、笔尖材质、电池续航能力以及书写流畅度等因素。作为一位多年的数码爱好者,我今天将针对…

Android APK打包脚本

build.gradle版本 同目录创建config.gradle文件写入需要的信息入 config.gradle文件内容 ext { /*** 自定义APP运行环境* dev: 开发* test: 测试* pro: 生产*/ env "pro" /*** 动态参数配置,根据自己需要添加参数* APP_ID: 包名* VERSION_CODE: 版本号…

国产网卡品牌崛起,做好网络信息安全的“守门人”

在信息技术日新月异的时代背景下,信息安全不仅关乎个人隐私保护,更是国家安全与经济发展的基石。LR-LINK联瑞凭借其前瞻性的视野和深厚的研发实力,成功自主研发出全国产化的FPGA(现场可编程门阵列)网闸隔离卡方案&…

优质企业上网行为管理软件大盘点

员工在上班时间摸鱼,看似是一个小问题,但却会给企业带来诸多不良影响。首先,摸鱼会降低员工的工作效率,导致工作任务无法按时完成,影响项目进度。其次,摸鱼行为会破坏企业的工作氛围,影响其他员…

零基础学习Python(七)

1. 字符串常用方法 lower()、upper():转换为小写字符串、大写字符串 split(str):按照指定字符串str进行分割,结果为列表: email "123qq.com" print(email.split("")) [123, qq.com] count(str)&#xf…

Linux 安装Mysql保姆级教程

一、检查环境 我们登录服务器,查看之前是否安装过mysql rpm -qa | grep mysql 由于我之前安装过,所以这里是有数据的 如果需要删除重新下载,可以使用 rpm -e mysql57-community-release-el7-10.noarch.rpm 二、安装 1、下载 接下来下载安装…

Hive SQL

一、基本数据类型 tinyint 1byte 有符号整数 smallint 2byte 有符号整数 int 4byte 有符号整数 bigint 8byte 有符号整数 boolean 布尔类型,true或者false float 单精度浮点数 double 双精度浮点数 decim…

电脑C盘临时文件怎么清理?

在解决“C盘临时文件怎么清理?”的问题前,先来一起了解一下清理C盘临时文件的原因: 释放磁盘空间:临时文件可以占用大量磁盘空间,尤其是在长时间未清理的情况下,清理这些文件可以释放空间。提高系统性能&a…

sheng的学习笔记-AI-半监督聚类

AI目录:sheng的学习笔记-AI目录-CSDN博客 半监督学习:sheng的学习笔记-AI-半监督学习-CSDN博客 聚类:sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 均值算法:sheng的学习笔记-AI-K均值算法_k均值算法怎么算迭代两次后的最大…

突发!Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情?

突发!2024年8月29日Runway 从 HuggingFace 及 GitHub 上删库跑路,背后有何隐情? 🧐 今天我们来聊一聊科技圈一则爆炸性消息:Runway ML 从 HuggingFace 和 GitHub 上删库跑路,毫无预警!这个举动…

properties文件提示未引用

问题描述 以前用的好好的项目,今天突然打开就发现idea不识别spring配置信息显示未引用,如果config代码中引入的配置却可以高亮显示,然后输入spring相关的配置,文件是没有提示的。经过研究发现是spring相关的插件被关闭了。效果如下 解决方法 启用三个插件spring Boot,Sp…