CVPR 生存指南:发现您感兴趣的研究!

2024 年计算机视觉与模式识别会议(CVPR)收到了 11,532 份有效论文投稿,仅有 2,719 份被接受,总接受率约为 23.6%。
但要跟上今年 CVPR 上展示的大量研究可能颇具挑战性。CVPR 有一个很棒的网站列出了所有论文,但我想要的信息分散在各种链接和平台中。毋庸置疑,要对所展示的内容有个大致了解,既耗时(又有点杂乱无章)。
但是,如果您可以在一个方便的位置访问所有这些知识,从而轻松识别趋势并获得有价值的见解,那会怎么样?
我整理了一个数据集,托管在 Hugging Face 上并用 FiftyOne 构建,它正是为了帮助您探索今年的会议内容。我找到了/抓取了 2,719 篇被接受论文中的 2,389 篇,并将它们放入一个我们将一起探索的数据集中!
顺便说一下,这篇文章可以在 Google Colab 笔记本中找到这里
🧐 这个数据集里有什么?
该数据集包含论文首页图片、论文标题、作者列表、摘要、arXiv 上的论文直链、项目页面、根据 arXiv 分类法进行的类别细分,以及我从2024 年 CVPR 征稿通知中归类的关键词。
以下是字段
论文首页的图片
title
:论文标题authors_list
:作者列表abstract
:论文摘要arxiv_link
:论文在 arXiv 上的链接other_link
:项目页面链接(如果找到)category_name
:根据arXiv 分类法,该论文的主要类别all_categories
:根据 arXiv 分类法,该论文所属的所有类别keywords
:使用 GPT-4o 提取
这些信息应该足以让我们发现今年 CVPR 的一些有趣趋势!
附:您可以在我的 GitHub 仓库中查看我挑选的 CVPR 优秀论文。这里有一些关于我如何抓取 CVPR 数据的通用代码。
让我们从安装一些依赖项开始
%%capture
!pip install fiftyone sentence-transformers umap-learn lancedb scikit-learn==1.4.2
本教程将使用聚类插件。在此处查看所有可用插件:github.com/voxel51/fiftyone-plugins。
!fiftyone plugins download https://github.com/jacobmarks/clustering-plugin
import fiftyone as fo
import fiftyone.utils.huggingface as fouh
FiftyOne 原生集成了 Hugging Face 的数据集库。
您可以轻松地在 FiftyOne 数据集上加载、微调和运行 Transformers 模型推断。它还集成了 Hugging Face Hub,允许您将数据集推送到 Hub 并从 Hub 加载数据集。这是一个不错的集成,简化了与机器学习社区共享数据集以及访问流行视觉数据集的操作。您可以通过此集成从特定版本加载数据集,处理多个媒体字段,并配置高级设置——在此处查看 Hugging Face 组织页面https://huggingface.co/Voxel51以查看可用数据集。
我已将数据集发布到 Hugging Face——请随意点赞以帮助传播信息——您可以按以下方式访问它
dataset = fouh.load_from_hub("Voxel51/CVPR_2024_Papers")
您现在已将数据集加载到 FiftyOne 格式!
FiftyOne 数据集对象是 FiftyOne 库的核心组件。它是 FiftyOne 生态系统中管理和交互数据集的中心枢纽。它为您提供了一个高级接口,用于执行各种数据集相关任务,例如加载数据、应用转换、评估模型以及以不同格式导出数据集。
数据集对象表示样本集合以及字段(相关的元数据、标签和其他注释)。数据集对象提供了一种方便的方式来在 FiftyOne 中存储、操作和查询数据集。
FiftyOne 数据集对象的一些主要特点包括
支持各种数据类型:数据集对象可以处理不同类型的数据,例如图像、视频以及相关的注释,如边界框、分割掩码、任意文本和分类标签。
灵活的元数据:数据集中的每个样本都可以包含相关元数据,用于存储有关样本的额外信息,例如其来源、属性或自定义字段。
强大的查询: FiftyOne 提供了一种查询语言,允许您根据样本的元数据、标签或其他条件过滤和选择样本子集。
可视化:数据集对象与 FiftyOne 的可视化工具集成,使您能够直接在浏览器中可视化样本、注释和模型预测。
请看下面的应用程序。
有了它,您可以深入了解关键词、类别的分布,以及在今年的会议上,特定作者(或至少同名作者)的论文数量!
<video controls autoplay src="
">session = fo.launch_app(dataset, auto=False)
session.show()
您可以从这里进行更有趣的分析。首先,获取每篇论文标题和摘要的嵌入。为此,您可以使用gte-large-en-v1.5
。它体积小、速度快、效果好。
当然,您可以随意选择任何您喜欢的模型。
%%capture
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
'Alibaba-NLP/gte-large-en-v1.5',
trust_remote_code=True
)
以下代码将帮助生成文本嵌入并将其添加到 FiftyOne 数据集。
get_text_embeddings(数据集, 字段, 模型)
:此函数接受一个 FiftyOne 数据集、一个包含文本数据的字段名以及一个预训练的嵌入模型。
它从数据集的指定字段中检索文本数据。
它使用提供的嵌入模型为每个文本生成嵌入。
它返回一个嵌入列表。
add_embeddings_to_dataset(数据集, 字段, 嵌入)
:此函数接受一个 FiftyOne 数据集、一个用于存储嵌入的字段名以及一个嵌入列表。
它向数据集中添加一个新的样本字段以存储嵌入。
它将新添加字段的值设置为提供的嵌入。
基本上,它会
从 FiftyOne 数据集中的特定字段提取文本数据。
使用预训练的嵌入模型为每个文本生成嵌入。
将生成的嵌入作为新字段添加回数据集。
def get_text_embeddings(dataset, field, model):
"""
Returns the embeddings of the abstracts in the dataset.
Args:
dataset: A FiftyOne dataset object.
Returns:
A list of embeddings.
"""
texts = dataset.values(field)
text_embeddings = []
for text in texts:
embeddings = model.encode(text)
text_embeddings.append(embeddings)
return text_embeddings
def add_embeddings_to_dataset(dataset, field, embeddings):
"""
Adds the embeddings to the dataset.
Args:
dataset: A FiftyOne dataset object.
embeddings: A list of embeddings.
"""
dataset.add_sample_field(field, fo.VectorField)
dataset.set_values(field, embeddings)
现在,将嵌入添加到数据集!
abstract_embeddings = get_text_embeddings(
dataset = dataset,
field = "abstract",
model = model
)
add_embeddings_to_dataset(
dataset=dataset,
field="abstract_embeddings",
embeddings=abstract_embeddings
)
title_embeddings = get_text_embeddings(
dataset = dataset,
field = "title",
model = model
)
add_embeddings_to_dataset(
dataset=dataset,
field="title_embeddings",
embeddings=title_embeddings
)
使用嵌入
您可以使用FiftyOne Brain来对嵌入进行一些很酷的操作,例如:
在低维嵌入空间中可视化数据集,以揭示模式和聚类,这有助于识别故障模式、关键场景,并推荐新样本添加到您的训练集中
计算图像的独特性分数,以识别在机器学习工作流程的早期阶段对高效模型训练至关重要的最独特样本
通过相似性索引数据集,可以轻松找到与感兴趣的图像或对象相似的示例,这对于诊断模型问题或挖掘额外训练数据非常有用
可视化嵌入
以下是 Brain 中支持的降维方法:
UMAP (统一流形近似与投影)
UMAP 是一种降维技术,它利用黎曼几何和代数拓扑来寻找结构化数据的低维嵌入。
它特别适用于文本嵌入,因为它能够处理高维数据并保留数据的全局结构,这使其在可视化和聚类算法预处理方面都很有用。
t-SNE (t-分布随机近邻嵌入)
t-SNE 是一种非线性降维技术,也用于高维数据可视化。它类似于 UMAP,但通常速度较慢且可扩展性较差。
虽然它对于某些类型的数据可能有效,但对于大型数据集,其性能可能不如 UMAP。
PCA (主成分分析)
PCA 是一种线性降维技术,它将高维数据投影到低维子空间。它速度快且易于实现,但可能无法像 UMAP 或 t-SNE 那样有效地捕捉数据中的非线性关系。
PCA 通常用于线性假设合理的简单数据集。
手动
手动计算低维表示需要创建自定义方法来降低数据的维度。这种方法可能很耗时,并且需要对数据和所需结果有深入的理解。
import fiftyone.brain as fob
fob.compute_visualization(
dataset,
embeddings="abstract_embeddings",
num_dims=2,
method="umap",
brain_key="umap_abstract",
verbose=True,
seed=51
)
fob.compute_visualization(
dataset,
embeddings="title_embeddings",
num_dims=2,
method="umap",
brain_key="umap_title",
verbose=True,
seed=51
)
计算独特性
以下代码会为每个样本添加一个独特性字段,评分它相对于其他样本的独特性。这很有趣,因为您可以了解在数据集中所有论文中,哪些论文(根据其摘要)是最独特的。
fob.compute_uniqueness(
dataset,
embeddings="abstract_embeddings",
uniqueness_field="uniqueness_abstract",
)
fob.compute_uniqueness(
dataset,
embeddings="title_embeddings",
uniqueness_field="uniqueness_title",
)
计算相似性
以下代码将通过相似性对摘要嵌入进行索引,您可以轻松地查询和排序数据集以查找相似示例。一旦您通过相似性对数据集进行索引,您就可以使用 sort_by_similarity()
视图阶段以编程方式按摘要相似性对数据集进行排序!以下代码使用 LanceDB 作为后端(在此处阅读有关集成的更多信息:docs.voxel51.com/integrations/lancedb.html),但目前有多个后端可供选择:
• sklearn
(默认):一个 scikit-learn 后端
• qdrant
:一个 Qdrant 后端
• redis
:一个 Redis 后端
• pinecone
:一个 Pinecone 后端
• mongodb
:一个 MongoDB 后端
• milvus
:一个 Milvus 后端
该库是开源的,我们欢迎贡献,请随意为您最喜欢的向量数据库贡献集成。
sim_abstract = fob.compute_similarity(
dataset,
embeddings="abstract_embeddings",
brain_key="abstract_similarity",
backend="lancedb",
)
🔊 现在,让我们在应用程序中查看所有这些内容!请打开您的音频,我将解释我正在做什么!
<video controls autoplay src="
">用 FiftyOne 能做的远不止我在本博客中分享的这些。但是,我希望您能加入我的工作坊,我将在大约 90 分钟内教您如何使用 FiftyOne!请在此处注册:voxel51.com/computer-vision-events/getting-started-with-fiftyone-workshop-june-26-2024/!