【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,一经查实,立即删除!

相关文章

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

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

Maya云渲染平台哪个好,5家云渲染整理

Maya云渲染服务可以帮助用户利用云计算技术,通过互联网访问专业的渲染农场,利用大规模的服务器实现云渲染,比如单镜头同时安排50-300台机器渲染,从而大幅提升渲染效率和便捷性。当然,市面上的渲染农场参差不齐&#xf…

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

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

react学习之useState和useEffect

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

Linux基础 -- 网络工具之curl使用

curl 使用手册 curl 是一个强大的命令行工具,用于与服务器进行HTTP请求。本文档将介绍常见的请求方法和一些高级用法。 基础用法 1. GET 请求 GET 请求用于从服务器获取数据。 curl -X GET "http://example.com/api/resource"2. POST 请求 POST 请求…

【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…

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

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

Python中的列表:掌握数据操作的艺术

引言 列表是一种可变序列,它可以存储任意数量的不同类型的对象,并且支持添加、删除等操作。在实际开发中,列表被广泛应用于数据存储、临时计算结果保存、数据传输等多个场景。例如,在Web开发中,我们可以使用列表来存储…

atc 经典dp 26题 题型总结

题目链接 稍微记录下吧。主要想发现他 这个题单主人 是怎么去分类dp的类型的。借鉴 题目不一定要多难。但是题型的分类总结 感觉很重要。 某种dp的处理方式。。他是相似的。。 A B 数组 前面往i1 ,i2.。。这样的推 。 C 限制只能 交叉继承。。不能继承pre一样位置的…

CSS3动画——飞行的小精灵

CSS3动画——飞行的小精灵 今天的这段代码通过多层结构、渐变色、圆角、多种动画效果以及细节处理&#xff0c;成功地创造了一个充满活力和趣味性的飞行小精灵动画效果。 效果如下&#xff1a; 飞行的小精灵 源代码如下&#xff1a; <!DOCTYPE html> <html lang&quo…

探索Edge-TTS与WebSocket集成:打造实时语音交互系统

本文为实现 WebSocket 将文本转换为语音并返回 Base64 数据给 Vue 客户端【干货】 在本文中&#xff0c;我们将构建一个简单的系统&#xff0c;该系统能够接收文本输入&#xff0c;通过 Microsoft Edge 的文本到语音服务&#xff08;Edge TTS&#xff09;转换为语音&#xff0c…

【第十三届蓝桥杯单片机国赛满分代码】

其他相关文章&#xff1a; 【提分必看&#xff01;】蓝桥杯单片机提分技巧&#xff08;国一经验分享&#xff09; 【国一超全代码分享&#xff01;】蓝桥杯单片机各模块代码整合 【蓝桥杯单片机客观题知识点汇总】 本代码经过编译后生成的hex文件经过了4T测试平台的满分测试。读…

python从入门到精通:文件操作

目录 1、文件编码 2、文件的读取 open( )打开函数 3、文件的写入 4、文件的追加 5、文件的操作&#xff08;综合案例&#xff09; 1、文件编码 因为计算机只能识别0和1&#xff0c;所以我们是通过编码技术&#xff08;密码本&#xff09;将内容翻译成0和1存入&#xff0…

Clock skew

时钟偏差(有时称为时序偏差)是同步数字电路系统(如计算机系统)中的一种现象,其中由于门电路或更先进的半导体技术中导线信号传播延迟,源自同一源的时钟信号会在不同时间到达不同组件。任何两个时钟读数之间的瞬时差异被称为它们的偏差。 大多数数字电路的操作由一个周期…

C#——扩展方法

扩展方法 定义 扩展方法&#xff08;Extension Methods&#xff09;是C#中一种特殊的静态方法&#xff0c;它定义在一个静态类中&#xff0c;但是可以像实例方法一样被调用&#xff0c;使得代码更加简洁、易读。 设计目的 是为了给已有的类型添加新的行为&#xff0c;而不需要…