如何计算图像与文本相似度?CLIP使用疑问及飞机检测方案咨询
问题解答
一、为什么softmax输出[[1.0]]
当你只传入单个文本标签['aircraft']时,softmax(dim=1)是对这唯一的维度做归一化,结果必然是1.0——因为softmax的作用是让所有候选类别的概率和为1,只有一个候选时自然就是100%,这和图片实际内容无关,是使用方式的问题。
二、如何用百分比表示图像与词汇的关联度
有两种可行方案:
1. 引入对比标签,用softmax计算相对概率
给模型传入多个文本标签(包含目标类别和其他常见类别),这样softmax会输出每个标签对应的概率百分比,反映图片与各标签的匹配程度。示例代码修改如下:
from PIL import Image from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") image = Image.open('image_4.jpg') # 传入多个对比标签 inputs = processor(text=['aircraft', 'human face', 'car'], images=image, return_tensors="pt", padding=True) outputs = model(**inputs) logits_per_image = outputs.logits_per_image # 对多个标签维度做softmax,得到每个标签的概率 probs = logits_per_image.softmax(dim=1) # 转换为百分比形式(保留两位小数) probs_percent = (probs * 100).tolist() print(probs_percent)
比如输出可能是[[1.2, 98.5, 0.3]],表示图片与"human face"的匹配度为98.5%,与"aircraft"仅1.2%。
2. 用sigmoid计算单标签的置信度
如果你只想针对"aircraft"这一个标签计算置信度,可以用sigmoid函数将logit转换为0-1之间的概率值(对应0%-100%),sigmoid适合单标签的二分类场景(判断图片是否匹配该标签):
from torch import sigmoid # 沿用之前的单标签输入 inputs = processor(text=['aircraft'], images=image, return_tensors="pt", padding=True) outputs = model(**inputs) logits_per_image = outputs.logits_per_image # 用sigmoid转换为概率 prob = sigmoid(logits_per_image).item() # 转换为百分比 prob_percent = prob * 100 print(f"与aircraft的关联度:{prob_percent:.2f}%")
这里的结果会直接反映图片与"aircraft"标签的匹配置信度,数值越高越匹配。
三、关于logits_per_image的理解
logits_per_image是CLIP输出的图像-文本原始相似度分数,没有经过归一化,数值越高表示图像与文本的匹配程度越高,但不能直接对应百分比。你得到的20.03只是这个原始分数,需要通过softmax或sigmoid转换后才能得到可解释的概率值。
四、能否用目标检测解决飞机存在性判断
完全可以,而且对于"判断图片中是否存在飞机"这个需求,目标检测是更直接的方案:
- 目标检测模型(如YOLOv8、Faster R-CNN等)专门用于识别图像中的物体类别并定位其位置,能直接输出图片中是否存在飞机,以及对应的置信度和 bounding box。
- 相比CLIP的图文匹配,目标检测更聚焦于物体本身的视觉特征,对于物体存在性的判断精度更高,尤其是当图片中有多个物体时,能精准定位目标是否存在。
内容的提问来源于stack exchange,提问作者Fateme Nazari
相关产品推荐
相关产品推荐

