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

news2024/11/15 11:49:08

简介

本文记录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 Registry

META_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']    
    @classmethod
    def from_config(cls, cfg, input_shape: Dict[str, ShapeSpec]):
        #res4
        in_features = cfg.MODEL.RPN.IN_FEATURES
        ret = {
            "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 / 6000
        ret["pre_nms_topk"] = (cfg.MODEL.RPN.PRE_NMS_TOPK_TRAIN, cfg.MODEL.RPN.PRE_NMS_TOPK_TEST)
        #2000 / 1000
        ret["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.coloradmin.cn/o/2089846.html

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

相关文章

OCC笔记:Windows下OCC的编译

一、源码下载 进OCC官网下载https://dev.opencascade.org/release即可,或直接Clone它的Git库https://dev.opencascade.org/resources/git_repository,本文用的源码库版本为7.4.0(我本机安装的VS2013,我又想用到AIS_ViewCube&…

使用Blender云渲染的好处是什么?

​Blender是一款功能强大的开源3D创作软件,用于包括建模、动画、仿真、渲染、合成和视频编辑在内的多种应用。然而,Blender的渲染过程有时可能非常耗费资源,特别是处理复杂的3D场景时。作为CG行业不可或缺的一部分,云渲染通过使用…

chat2DB体验

文章目录 Chat2DB体验的印象Chat2DB是什么?流水帐数据库示例新建数据表生成测试数据查询数据特殊查询 Chat2DB 体验的印象 主页是https://chat2db-ai.com/ 因为最近物理研究需要用到很多数据,所以试用了一个号称神级AI数据库系统。 首先, …

【论文解析】基于脉动阵列的层融合注意力模型加速器结构

作者及发刊详情 刘晓航, 姜晶菲, 许金伟. 基于脉动阵列的层融合注意力模型加速器结构[J]. Computer Engineering & Science/Jisuanji Gongcheng yu Kexue, 2023, 45(5). 摘要 正文 主要工作贡献 1))提出了硬件协同控制的注意力机制矩阵分块方法 2&#xf…

数据仓库系列14:数据清洗和转换的常见方法有哪些?

数据仓库的建立不仅仅是数据的简单存储,更是对数据的深度利用。而数据清洗和转换是确保数据质量和一致性的重要环节。在这篇文章中,我们将深入探讨数据清洗和转换的常见方法,帮助你在数据仓库中更高效地处理数据。 目录 为什么数据清洗和转换…

任务通知笔记

1、任务通知简介 任务通知 用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 任务通知与队列、信号量和时间标志组的区别 任务通知的优势及劣势 优势 效率更高:使用任务通知向任务发送事件或者数据比使用队列、事件标志…

C语言典型例题56

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.8 将范围为100~200的不能被3整除的数输出。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题4.8 将范围为100~200的不能被3整除的数输出。//#include <stdio.h>…

您下一款项目管理工具何必是它,10款软件推荐

国内外主流的 10 款项目管理系统对比&#xff1a;PingCode、Worktile、Teambition、明道云、泛微E-cology、Asana、Trello、Monday.com、ClickUp、Wrike。 在项目管理的世界里&#xff0c;选择合适的管理工具似乎是一个令人头疼的问题。你是否经常在众多选项中感到迷茫&#xf…

AI如何改变科学与数学领域:陶哲轩演讲解析

引言 在当今技术迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正逐步渗透到各个领域&#xff0c;其对科学与数学领域的影响尤为引人关注。菲尔茨奖获得者陶哲轩最近在一场演讲中深刻探讨了AI在科学与数学中的应用及其潜在的革命性影响。本文将基于陶哲轩的演…

Goby 漏洞发布|Nacos Jraft 服务文件读取漏洞【已复现】

漏洞名称&#xff1a;Nacos Jraft 服务文件读取漏洞 English Name&#xff1a;Nacos Jraft Services File Read Vulnerability CVSS core: 5.0 漏洞描述&#xff1a; NACOS 是阿里巴巴推出来的一个新开源项目&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管…

J.U.C Review - Java线程间的通信

文章目录 Java线程间的通信无锁的程序锁与同步等待/通知机制信号量管道 其它通信相关join方法join 方法概述底层实现细节小结 sleep方法1. Thread.sleep 方法详解2. sleep 和 wait 的主要区别3. 实际代码示例 ThreadLocal类ThreadLocal 的基本概念ThreadLocal 的主要方法Thread…

STM32——看门狗(独立/窗口)

程序运行的保障措施&#xff0c;需要在程序中定期喂狗实现&#xff0c;如果某次没有喂&#xff0c;表示程序出现卡死或者其他状态&#xff0c;此时看门狗就会自动复位电路&#xff0c;防止程序长时间卡死。相当于自动复位电路。 独立看门狗&#xff1a;有单独的时钟LSI 窗口看…

谷歌发布新AI GameNGen:AI也能实时生成游戏画面!

有关 GameNGen 的帖子 又有一则消息直接让全网为之狂欢&#xff01;Google 推出了一个实时AI生成的游戏引擎 GameNGen。目前 GameNGen 生成3D游戏的祖宗《BOOM》的视频已经火遍 X 平台&#xff0c;在视频中&#xff0c;游戏画面每一个画面都是由AI实时生成&#xff0c;可以说是…

应用层协议(下)Https加密Http的秘密(含逻辑图解 简单易学 通俗易懂!)

绪论​ “如今我努力奔跑&#xff0c;不过是为了追上那个曾经被寄予厚望的自己 —— 约翰丶利文斯顿”&#xff0c;本章承接上章Http&#xff0c;没看过强烈建议看后再看本章&#xff0c;本章主要就是学习Https是干什么的并且去底层的学习Http的原理&#xff0c;将会讲到Https的…

pdf转dwg怎么转换?5个软件教你轻松转换文件

pdf转dwg怎么转换&#xff1f;5个软件教你轻松转换文件 将PDF文件转换为DWG格式可以帮助你将静态的图像和矢量图形转换为可编辑的CAD图纸。这在建筑、工程和设计领域尤为重要&#xff0c;因为它可以让你在CAD软件中进一步编辑和利用这些图纸数据。以下是五款能够帮助你轻松将P…

查看显卡cuda版本

1.命令行窗口 打开cmd&#xff0c;输入下列语句 nvidia-smi 如下图红框所示&#xff1a; 2.查看cuda版本&#xff0c;打开英伟达控制面板&#xff0c;桌面右键或者系统右下角&#xff0c;然后点击系统信息&#xff0c;之后点击组件

锻炼思考力的有效实践

1. 意识觉醒 意识觉醒是提升思考力最重要的一个点&#xff0c;我认为。只要形成了这种意识&#xff0c;就已经成功了一半。 很多同学思维能力没有上去&#xff0c;是没有意识到思考力这个概念&#xff0c;只是机械地做事情&#xff0c;做事情&#xff0c;做事情……每次都在同…

C++ Vector容器操作

vector赋值操作 提供三种方式进行赋值 assign函数是STL中提供的一个成员函数&#xff0c;assign() 函数可以重新定义向量的内容&#xff0c;可以用于设置特定数量的重复元素&#xff0c;或者直接用另一个容器的元素来替换当前向量的元素。 //直接赋值&#xff0c;类似于拷贝 …

软考高级证书拿到手了,怎么评职称?

软考&#xff0c;是以考代评&#xff0c;以一个考试来代替提交若干材料的评职称的过程。 但是评聘是分开的。就是指评审或考试后取得软考证书之后&#xff0c;也需要你们单位聘任你&#xff0c;才可以享受相应职称工资待遇&#xff0c;担任相应专业技术职位。 也就是说&#…

【FPGA】入门学习路线

文章目录 编程语言语法RTL设计RTL验证学习方法仿真工具 基础知识&#xff08;1&#xff09;专业基础课&#xff08;2&#xff09;FPGA相关专业知识&#xff08;3&#xff09;FPGA开发流程 开发工具动手实验 编程语言 硬件描述语言HDL&#xff08;Hardware Description Languag…