在计算机视觉领域,图像分类是一项基础且重要的任务。传统上,对于常见物体如水果的分类,需要训练一个定制的视觉模型,例如ResNet模型。然而,随着零样本分类模型的出现,可以在不训练模型的情况下对图像进行分类。
零样本分类模型是大型预训练模型,能够在没有针对特定用例进行训练的情况下对图像进行分类。其中最著名的零样本模型之一是由OpenAI开发的Contrastive Language-Image Pretraining(CLIP)模型。CLIP能够根据一系列提示(例如“猫”,“狗”)返回相似度分数,显示每个文本提示计算出的嵌入与图像嵌入的相似程度。然后,可以将最高置信度作为图像的标签。
CLIP在超过4亿对图像和文本上进行了训练。通过这种训练过程,CLIP发展出了理解文本与图像之间关系的能力。因此,可以要求CLIP通过常见物体(例如“猫”)或图像的特征(例如“公园”或“停车场”)来对图像进行分类。这两种能力之间存在许多可能性。
零样本分类模型可以直接用于分类常见场景,例如识别图像中是否包含人物、人物是否佩戴口罩,或者图像中是否包含广告牌,无需任何微调。这使得可以更快地将视觉功能集成到应用程序中;可以消除训练模型所需的时间和成本。
还可以在视频帧上使用CLIP。例如,可以使用CLIP来识别安全摄像头在夜间何时捕捉到人物,并使用这些信息向安全人员标记有人进入了场景。或者,可以使用CLIP来识别传送带上是否存在盒子。
在本文中,已经多次提到了CLIP。CLIP被用于许多零样本分类任务。话虽如此,还有其他模型可供选择。许多模型使用并改进了OpenAI在2021年开发的CLIP架构。例如,Meta AI Research在2023年9月发布了MetaCLIP,这是一个使用开放训练数据分布的CLIP版本,与用于训练CLIP的封闭源数据集不同。AltCLIP在多种语言上进行了训练,使用户能够提供多语言提示。
其他流行的零样本模型包括:
- DINOv2(Meta AI Research)
- BLIPv2(Salesforce)
- FastViT(Apple)
让通过一个示例来展示如何使用CLIP对图像进行分类。在本指南中,将使用Roboflow Inference的托管版本,这是一个工具,使能够运行大型基础视觉模型以及微调模型。
将构建一个应用程序,允许在图像上运行CLIP。将在托管的Roboflow CLIP端点上运行推理,这使能够在云端运行CLIP推理。
import requests
import base64
from PIL import Image
from io import BytesIO
import os
INFERENCE_ENDPOINT = "https://infer.roboflow.com"
API_KEY = "API_KEY"
prompts = [
"orange",
"apple",
"banana"
]
def classify_image(image: str) -> dict:
image_data = Image.open(image)
buffer = BytesIO()
image_data.save(buffer, format="JPEG")
image_data = base64.b64encode(buffer.getvalue()).decode("utf-8")
payload = {
"api_key": API_KEY,
"subject": {
"type": "base64",
"value": image_data
},
"prompt": prompts,
}
data = requests.post(INFERENCE_ENDPOINT + "/clip/compare?api_key=" + API_KEY, json=payload)
return data.json()
def get_highest_prediction(predictions: list) -> str:
highest_prediction = 0
highest_prediction_index = 0
for i, prediction in enumerate(predictions):
if prediction > highest_prediction:
highest_prediction = prediction
highest_prediction_index = i
return prompts[highest_prediction_index]
在上面的代码中,将API_KEY
替换为Roboflow API密钥。学习如何获取Roboflow API密钥。将prompts
替换为在预测中想要使用的提示。然后,添加以下代码:
image = "image.png"
predictions = classify_image(image)
print(get_highest_prediction(predictions["similarity"]), image)
让对以下衬衫图像使用提示“衬衫”和“运动衫”进行推理:
相似度最高的类别是“运动衫”。成功地使用CLIP对图像进行了分类。
还可以在视频帧上运行CLIP。了解更多关于如何使用CLIP分析视频的信息。
零样本分类模型在计算机视觉任务中扮演着关键角色。可以在应用程序中直接使用零样本分类模型,或者用于标记图像。还可以使用零样本分类模型来分析视频帧。许多应用程序使用CLIP作为起点,CLIP在广泛的任务中表现良好。