使用 CLIP 进行零样本图像分类¶
当您想将图像分类到不同的类别时,通常需要根据类别名称训练一个图像分类器。然而,收集训练数据很繁琐。而且,如果收集的数据太少或太不平衡,您可能无法获得一个像样的图像分类器。那么您可能会想,有没有一个足够强大的模型,无需训练即可处理这种情况?
确实有!OpenAI 推出了一个名为 CLIP 的模型,只需提供要识别的视觉类别名称,它就可以应用于任何视觉分类基准。而且它的准确率很高,例如,CLIP 在 ImageNet 上无需使用任何 128 万训练样本即可达到 76.2% 的 top-1 准确率。这一性能与 ImageNet 上原始的监督式 ResNet50 相匹配,对于一个包含 1000 个类别的分类任务来说,非常有前景!
因此,在本教程中,我们将深入探讨 CLIP。我们将向您展示如何在 AutoGluon 中使用 CLIP 模型进行零样本图像分类。
简单演示¶
在这里,我们提供一个简单的演示来分类下面图片中的狗狗是什么品种。
from IPython.display import Image, display
from autogluon.multimodal import download
url = "https://farm4.staticflickr.com/3445/3262471985_ed886bf61a_z.jpg"
dog_image = download(url)
pil_img = Image(filename=dog_image)
display(pil_img)
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
Cell In[2], line 2
1 from IPython.display import Image, display
----> 2 from autogluon.multimodal import download
4 url = "https://farm4.staticflickr.com/3445/3262471985_ed886bf61a_z.jpg"
5 dog_image = download(url)
ImportError: cannot import name 'download' from 'autogluon.multimodal' (/home/ci/autogluon/multimodal/src/autogluon/multimodal/__init__.py)
通常,要解决这个任务,您需要收集一些训练数据(例如,斯坦福狗狗数据集)并训练一个狗狗品种分类器。但是使用 CLIP,您只需提供一些潜在的视觉类别。CLIP 将为您处理其余的工作。
from autogluon.multimodal import MultiModalPredictor
predictor = MultiModalPredictor(problem_type="zero_shot_image_classification")
prob = predictor.predict_proba({"image": [dog_image]}, {"text": ['This is a Husky', 'This is a Golden Retriever', 'This is a German Sheperd', 'This is a Samoyed.']})
print("Label probs:", prob)
显然,根据概率,我们知道照片中有一只哈士奇(我认为这是正确的)!
让我们尝试一个更难的例子。下面是一张两辆 Segway 的照片。这个物体类别在大多数现有视觉数据集中并不常见。
url = "https://live.staticflickr.com/7236/7114602897_9cf00b2820_b.jpg"
segway_image = download(url)
pil_img = Image(filename=segway_image)
display(pil_img)
给出几个文本查询,CLIP 仍然可以以高置信度正确预测 Segway 类别。
prob = predictor.predict_proba({"image": [segway_image]}, {"text": ['segway', 'bicycle', 'wheel', 'car']})
print("Label probs:", prob)
这太神奇了,对吧?现在来了解一下 CLIP 的工作原理。CLIP 被称为对比语言-图像预训练(Contrastive Language-Image Pre-training)。它是在海量数据(4 亿对图像-文本对)上训练的。通过使用一个简单的损失目标,CLIP 试图预测在训练数据集中,从一组随机采样的文本中,哪个文本与给定的图像实际配对。因此,CLIP 模型可以应用于几乎任意的视觉分类任务,就像我们上面展示的例子一样。
关于 CLIP 的更多信息¶
CLIP 非常强大,它旨在解决标准深度学习方法在计算机视觉领域面临的许多主要问题,例如昂贵的数据集、封闭集预测和泛化性能差。CLIP 是解决许多问题的良好方案,然而,它并非终极解决方案。CLIP 也有其自身的局限性。例如,CLIP 容易受到文字攻击(typographic attacks),即如果您在图像中添加一些文本,CLIP 的预测很容易受到这些文本的影响。让我们来看一个来自 OpenAI 关于多模态神经元的博客文章中的例子。
假设我们有一张绿史密斯苹果的照片,
url = "https://cdn.openai.com/multimodal-neurons/assets/apple/apple-blank.jpg"
image_path = download(url)
pil_img = Image(filename=image_path)
display(pil_img)
然后我们尝试将此图像分类到几个类别中,例如 Granny Smith、iPod、library、pizza、toaster 和 dough。
prob = predictor.predict_proba({"image": [image_path]}, {"text": ['Granny Smith', 'iPod', 'library', 'pizza', 'toaster', 'dough']})
print("Label probs:", prob)
我们可以看到零样本分类效果很好,它以几乎 100% 的置信度预测出苹果。但是如果我们像这样在苹果上添加一些文本,
url = "https://cdn.openai.com/multimodal-neurons/assets/apple/apple-ipod.jpg"
image_path = download(url)
pil_img = Image(filename=image_path)
display(pil_img)
然后我们使用相同的类别名称进行零样本分类,
prob = predictor.predict_proba({"image": [image_path]}, {"text": ['Granny Smith', 'iPod', 'library', 'pizza', 'toaster', 'dough']})
print("Label probs:", prob)
突然间,苹果变成了 iPod。
CLIP 还有其他局限性。如果您感兴趣,可以阅读CLIP 论文了解更多详情。或者您可以留在这里,尝试您自己的例子!
其他示例¶
您可以前往AutoMM 示例,探索有关 AutoMM 的其他示例。
定制¶
要了解如何定制 AutoMM,请参考定制 AutoMM。