如何构建一个交互式HF Space来可视化图像数据集

Hugging Face 生态系统提供了丰富的各种数据集,包括图像、视频和音频等非结构化数据类型。这些数据集被广泛用于训练和验证 Hugging Face Hub 内外许多可用的模型。
许多非结构化数据集由于其庞大的规模而令人望而生畏,通常包含大量无法单独查看的图像。使用基础模型创建嵌入可以为这些数据带来结构。通过采用 t-SNE 或 UMAP 等降维技术,您可以生成相似性图,从而更容易地浏览数据。
本文提供了关于使用 Renumics Spotlight 创建一个带有图像数据集交互式可视化的 Hugging Face space 的教程。可视化包括相似性图、过滤器和统计信息以浏览数据,并能够详细查看每个图像。
1. 加载数据集
首先安装所需的依赖项
!pip install renumics-spotlight datasets
现在您可以加载希望创建可视化的图像数据集。作为示例,这里使用了 CIFAR-10 [1]。CIFAR-10 数据集是计算机视觉中用于图像分类的基准数据集。它包含 10 个不同的类别。该数据集包含 60,000 张 32x32 像素的小型彩色图像。在我们的分析中,我们将重点关注 10,000 张测试图像。您可以在此处选择自己的数据集或 Hugging Face 中的任何图像分类数据集。
import datasets
# load dataset containing raw data (images and labels)
ds = datasets.load_dataset("cifar10", split="test")
2. 为数据集创建嵌入
使用基础模型创建的嵌入为非结构化图像数据带来了结构。它们为数据探索、生成洞察和检测异常值等任务提供了语义信息。通过将图像转换为低维空间,这些嵌入允许通过 t-SNE 或 UMAP 等技术创建相似性图来探索数据中的相似性。
我们建议将您的嵌入直接存储在第二个 Hugging Face 数据集中,与原始图像数据集分开。您可以使用 transformers 库来计算嵌入,例如使用 google/vit-base-patch16-224-in21k [2] 模型。利用 infer 函数
# load model and define inference functions
import torch
import transformers
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model_name = "google/vit-base-patch16-224-in21k"
processor = transformers.ViTImageProcessor.from_pretrained(model_name)
cls_model = transformers.ViTForImageClassification.from_pretrained(model_name).to(
device
)
fe_model = transformers.ViTModel.from_pretrained(model_name).to(device)
def infer(batch):
images = [image.convert("RGB") for image in batch]
inputs = processor(images=images, return_tensors="pt").to(device)
with torch.no_grad():
outputs = cls_model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1).cpu().numpy()
embeddings = fe_model(**inputs).last_hidden_state[:, 0].cpu().numpy()
return {"embedding": embeddings}
提取嵌入。嵌入存储在新数据集 ds_enrichments 中,只有一个 embedding 列。
# enrich dataset with predictions and embeddings
ds_enrichments = ds.map(infer, input_columns="img", batched=True, batch_size=32).remove_columns(['img','label'])
3. 在本地尝试可视化
在发布嵌入之前,我们可以在 Spotlight 中查看结果。
from renumics import spotlight
ds_enriched = datasets.concatenate_datasets([ds, ds_enrichments], axis=1)
spotlight.show(ds_enriched, dtype={'embedding':spotlight.Embedding})
这将打开一个新的浏览器窗口。
在可视化部分,左上方显示一个表格,其中包含数据集中所有存在的字段。右上方,您可以看到 UMAP 表示法代表了从基础模型生成的嵌入。底部显示了选定的图像。
4. 将嵌入发布到 Hugging Face Hub
当您对结果满意时,可以将嵌入作为新数据集发布到 Hugging Face。
from huggingface_hub import login
login()
from huggingface_hub import create_repo
USERNAME = "YOUR_ACCOUNT"
create_repo(f"{USERNAME}/cifar10-enrichments", repo_type="dataset")
ds_enrichments.push_to_hub(f"{USERNAME}/cifar10-enrichments")
5. 创建 Hugging Face Space
要在 Hugging Face Hub 上展示您的数据集和嵌入,您可以使用 Hugging Face space 为其启动 Spotlight 可视化。您可以使用 Hub 上为 MNIST 图像数据集准备好的示例空间,复制它并在 HF_DATASET 和 HF_ENRICHMENT 变量中指定您的数据集。
几分钟后,Space 将准备就绪。
6. 总结
本文演示了基础模型如何使用嵌入来结构化大型非结构化图像数据集,例如 CIFAR-10。在 Hugging Face space 中使用 Renumics Spotlight 可以交互式地可视化图像数据集。这包括使用 t-SNE 或 UMAP 等降维技术创建相似性图,从而更轻松地分析和浏览数据。
在您自己的图像数据集上尝试此工作流程,并探索其可能性。应用这些技术后,欢迎与我们分享您的经验和反馈。
参考资料
[1] Alex Krizhevsky, 从微小图像中学习多层特征 (2009), 多伦多大学
[2] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby 一张图片胜过 16x16 个词:用于大规模图像识别的 Transformer (2020), arXiv