Scenic
Scenic是一个专注于计算机视觉注意力模型研究的代码库。Scenic已成功用于开发多种模态的分类、分割和检测模型,包括图像、视频、音频以及它们的多模态组合。
更具体地说,Scenic是(i)一套用于解决训练大规模(即多设备、多主机)视觉模型时常见任务的轻量级共享库集合;以及(ii)几个使用这些库的完整项目,包含特定问题的训练和评估循环。
内容
我们提供的功能
除其他外,Scenic提供:
- 用于启动实验、写入摘要、日志记录、性能分析等的样板代码;
- 优化的训练和评估循环、损失函数、指标、二分图匹配器等;
- 流行视觉数据集的输入管道;
- 基线模型, 包括强大的非注意力基线。
Scenic中的SOTA模型和基线
Scenic中有一些SOTA模型和基线,它们要么是使用Scenic开发的,要么已在Scenic中重新实现:
使用Scenic开发或用于实验的项目:
- ViViT:视频视觉Transformer
- OmniNet:Transformer的全方位表示
- 多模态融合的注意力瓶颈
- TokenLearner:8个学习的标记能为图像和视频做什么?
- 探索大规模预训练的极限
- 效率误称
- 离散表示增强视觉Transformer的鲁棒性
- 金字塔对抗训练提升ViT性能
- VUT:用于多模态多任务用户界面建模的通用UI Transformer
- CLAY:学习去噪原始移动UI布局以大规模改进数据集
- 使用Dream Fields进行零样本文本引导对象生成
- 用于视频识别的多视图Transformer
- PolyViT:在图像、视频和音频上共同训练视觉Transformer
- 使用视觉Transformer的简单开放词汇对象检测
- 噪声标签的邻居一致性学习
- Token图灵机
- Vid2Seq:密集视频描述的大规模视觉语言模型预训练
- AVATAR:无约束视听语音识别
- 具有弹性输入序列的自适应计算
- 用于语义分割的位置感知自监督Transformer
- 物体如何帮助动作识别?
- 行动中的动词:改进视频-语言模型中的动词理解
- 使用视觉和语言模型的统一视觉关系检测
- UnLoc:视频定位任务的统一框架
- REVEAL:具有多源多模态知识记忆的检索增强视觉语言预训练
- 视听掩码自编码器
- MatFormer:用于弹性推理的嵌套Transformer
- 像素对齐语言模型
- 维基百科规模视觉实体识别的生成方法
- 流式密集视频描述
- 从不相交监督中进行密集视频对象描述
更多信息可以在项目中找到。
在Scenic中重现的基线:
- (ViT) 一张图像值16x16个词:大规模图像识别的Transformer
- (DETR) 使用Transformer的端到端目标检测
- 可变形DETR:用于端到端目标检测的可变形Transformer
- (CLIP) 从自然语言监督中学习可迁移的视觉模型
- MLP-Mixer:全MLP视觉架构
- BERT:用于语言理解的深度双向Transformer预训练
- 如何训练你的ViT?视觉Transformer中的数据、增强和正则化
- Big Transfer (BiT):通用视觉表示学习
- 图像识别的深度残差学习
- U-Net:用于生物医学图像分割的卷积网络
- PCT:点云Transformer
- 通用Transformer
- PonderNet
- 掩码自编码器是可扩展的视觉学习器
- 用Performers重新思考注意力
- (CenterNet) 将物体视为点
- (SAM) 分割任何物体
更多信息可以在基线模型中找到。
理念
Scenic旨在促进大规模视觉模型的快速原型开发。为了保持代码简单易懂和易于扩展,我们更倾向于分叉和复制粘贴,而不是增加复杂性或提高抽象度。只有当功能被证明在许多模型和任务中广泛有用时,它才可能被上传到Scenic的共享库中。
入门
- 查看
projects/baselines/README.md
以了解基线模型的演练和如何运行代码的说明。 - 如果您想为Scenic做出贡献,请查看理念、代码结构和贡献部分。 如果您的贡献应该成为共享库的一部分,请向我们发送拉取请求!
快速入门
你需要 Python 3.9 或更高版本。从 GitHub 下载代码
$ git clone https://github.com/google-research/scenic.git
$ cd scenic
$ pip install .
然后在 ImageNet 上运行 ViT 训练:
$ python scenic/main.py -- \
--config=scenic/projects/baselines/configs/imagenet/imagenet_vit_config.py \
--workdir=./
请注意,对于特定项目和基线,你可能需要安装其 README.md
或 requirements.txt
文件中提到的额外包。
这里还有一个最小化的 colab,用于使用 Scenic 训练简单的前馈模型。
Scenic 组件设计
Scenic 旨在提供不同层次的抽象,以支持仅需通过定义配置文件来更改超参数的项目,到需要自定义输入流水线、模型架构、损失和指标以及训练循环的项目。为实现这一目标,Scenic 中的代码被组织为_项目级_代码(指特定项目或基线的自定义代码)或_库级_代码(指大多数项目采用的通用功能和一般模式)。项目级代码位于 projects
目录中。
库级代码
目标是保持库级代码简洁且经过充分测试,避免为支持次要用例引入额外抽象。Scenic 提供的共享库分为:
dataset_lib
:实现用于加载和预处理常见计算机视觉任务和基准数据的 IO 流水线(参见"任务和数据集"部分)。所有流水线都设计为可扩展,支持多主机和多设备设置,处理多主机间的数据划分、不完整批次、缓存、预取等。model_lib
:提供- 几个抽象模型接口(例如
model_lib.base_models
中的ClassificationModel
或SegmentationModel
),带有特定任务的损失和指标; model_lib.layers
中的神经网络层,专注于注意力和 transformer 层的高效实现;model_lib.matchers
中加速器友好的二分匹配算法实现。
- 几个抽象模型接口(例如
train_lib
:提供构建训练循环的工具,并实现了几个优化的训练器(分类训练器和分割训练器),可以进行自定义分叉。common_lib
:通用工具,如日志记录和调试模块、处理原始数据的功能等。
项目级代码
Scenic 通过"项目"概念支持为自定义任务和数据开发定制解决方案。对于一个项目应该重用多少代码,没有一刀切的方案。项目可以仅由配置组成,使用库级代码中的通用模型、训练器、任务/数据,也可以简单地分叉任何上述功能,重新定义层、损失、指标、日志记录方法、任务、架构以及训练和评估循环。库级代码的模块化使项目能够灵活地在"按原样运行"到"完全自定义"的范围内找到适合的位置。
ResNet 和 Vision Transformer (ViT) 等常见基线在 projects/baselines
项目中实现。分叉该目录中的模型是新项目的良好起点。
引用 Scenic
如果你使用 Scenic,可以引用我们的白皮书。 以下是一个 BibTeX 条目示例:
@InProceedings{dehghani2021scenic,
author = {Dehghani, Mostafa and Gritsenko, Alexey and Arnab, Anurag and Minderer, Matthias and Tay, Yi},
title = {Scenic: A JAX Library for Computer Vision Research and Beyond},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year = {2022},
pages = {21393-21398}
}
免责声明:这不是 Google 的官方产品。