【金猿技术展】模块注册机制——打造AI算法流水线

37d5d1e6a492bee2286638f2c6718b41.png

上海人工智能实验室&商汤科技技术

本项目由上海人工智能实验室&商汤科技投递并参与“数据猿年度金猿策划活动——2021大数据产业创新技术突破榜榜单及奖项”评选。

01292d6bac660d09bec69544b329578d.png




数据智能产业创新服务媒体

——聚焦数智 · 改变商业



模块注册机制基于注册器和构建器,可以轻松地进行模块拓展,而不需要在原有框架代码中进行改动。使用注册器管理字符串到类的映射,其中支持注册的模块类型包括但不限于模型结构、数据预处理模块、优化器。使用构建器可以将配置文件转换成对应的模块,其提供了灵活的构建方式,使得可以构建定制化的训练流水线。模块注册机制的另一特性是采用分层策略划分模块的注册域,不仅能够避免跨项目间同名模块的冲突,也能够支持跨项目间模块的相互调用。

技术说明

模块注册和跨项目调用机制

开发算法工具库以解决人工智能基础理论知识与商用业务落地工程经验间脱节的问题。OpenMMLab基于在学术研究和行业落地的经验,对 AI算法进行标准化模块工具开发,大大降低具体行业业务人员的算法学习成本,将以工业化的人工智能研究颠覆传统手工作坊式的研究方式,提供先进的研发工具,使人工智能研究进入快车道。

算法核心组件作为开放算法体系的基础,为算法提供公共的架构支持和模块实现。核心组件主要分为三个部分:基础支持库、通用算子和训练流程框架。基础支持库提供了友好的文件读写接口、图像视频处理接口、基础工具库等,通用算子提供了常用算子的高效的 GPU 实现,训练流程框架提供了通用的算法训练流程支持,使得体系内的算法能够在相同的架构中进行训练。

在 OpenMMLab 开源算法体系的整体架构中,突出两个特点:模块化和简洁化。模块化让用户可以更灵活地进行排列组合,以及开发新的方法和模块;简洁化让用户不用过多关注和核心逻辑无关的事情,将辅助功能交由框架自行处理。

OpenMMLab 开源算法体系通过配置文件、注册器和构建器实现模块化的基础支持,然后在模块层面将数据、模型等进行拆解和抽象,进行模块化的实现,在最顶层通过执行器来实现流程的简洁化。

ccf62efe085595368dacdb5b45f854c4.png

注册器提供了在不修改算法框架核心代码的前提下进行模块拓展的能力。通过管理字符串到类的映射,可以实现从配置文件直接构建模块。在开放算法体系中,不论是模型结构,数据预处理组件,还是优化器,甚至顶层的训练流程,都是通过这种方式来构建的,给用户提供了极大的拓展空间。

eae0d9a9cf310a083d9402444f608f24.png
图2-2 MMCV 中注册器的构建机制

基于注册器和构建器,可以轻松地进行模块拓展,而不需要在原有框架代码中进行改动,这也是OpenMMLab 推荐的进行算法开发的流程。

在 OpenMMLab 中,Registry 类可以提供一种完全相似的对外装饰函数来管理构建不同的组件,例如 backbones、head 和 necks 等等,Re

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,但我无法提供您所需的代码。我是一个AI助手,没有实际的代码运行环境。我可以为您提供有关FFANet算法中PA模块添加Transformer注意力机的解释和示例代码。请注意,以下示例代码仅用于说明目的,可能与实际实现有所不同。 在FFANet算法中,PA模块是指Part Attention模块,用于提取图像中不同部分的特征。添加Transformer注意力机可以增强PA模块的表示能力。 以下是一个简化的示例代码,展示了如何在PA模块中添加Transformer注意力机: ```python import torch import torch.nn as nn import torch.nn.functional as F class PA_Module(nn.Module): def __init__(self, in_channels): super(PA_Module, self).__init__() self.conv = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.softmax = nn.Softmax(dim=-1) self.transformer = nn.TransformerEncoderLayer(d_model=in_channels, nhead=8) def forward(self, x): b, c, h, w = x.size() query = self.conv(x).view(b, c, -1).permute(0, 2, 1) # query shape: (b, h*w, c) key = self.conv(x).view(b, c, -1) # key shape: (b, c, h*w) value = x.view(b, c, -1) # value shape: (b, c, h*w) attention_map = torch.bmm(query, key) # attention_map shape: (b, h*w, h*w) attention_map = self.softmax(attention_map) out = torch.bmm(value, attention_map.permute(0, 2, 1)) # out shape: (b, c, h*w) out = out.view(b, c, h, w) out = self.transformer(out) # apply Transformer attention mechanism return out ``` 在上述代码中,我们首先使用一个1x1的卷积层对输入特征进行变换,然后将变换后的特征作为query、key和value,通过计算query和key之间的点积得到注意力权重。接着,使用注意力权重对value进行加权求和得到输出特征。最后,我们将输出特征再次应用Transformer注意力机。 请注意,这只是一个简化的示例代码,实际实现中可能会有更多的细节和调整。此外,还需要根据实际应用场景进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值