Chinese-CLIP icon indicating copy to clipboard operation
Chinese-CLIP copied to clipboard

计算得到的图文相关性分数如何处理才能使得最终呈现的相关性分数更加合理?

Open wjpstudy opened this issue 2 years ago • 0 comments

利用Chinese-CLIP实现自定义数据集上的文到图搜索的功能(类似官方示例MUGE功能),目前遇到的问题是: 虽然可以根据余弦距离之间的相对大小所反应出的图文相似性的高低,来排序出相关度从高到低的检索结果,但是经过验证官方示例MUGE数据集(以及Issues#42 中也提到),以及我自己的自定义数据集中计算得到的图文相关性分数分布在0.3-0.48之间,如何处理才能使得最终呈现的相关性分数展示的更加合理呢?(相关性分数分布在0-1之间且能够有较高的梯次感和区分度) 目前尝试的方法有: 1.参考快速使用API中model.get_similarity的计算过程对余弦距离先乘上logit_scale.exp(),与快速使用API中保持一致logit_scale.exp()设为了100.03,然后在候选项之间做softmax得到概率分布。问题是和快速使用API示例中的"皮卡丘"文本不同的是,当候选项很多比如有一万多个,那么这个softmax计算得到的分数就非常的低,可能在e-5到e-12量级,虽然能够有较为准确的排序检索结果却没有得到合理的相关性得分。 2.参考Chinese-CLIP-master/cn_clips/eval/make_topk_predictions.py中 score_tuples = [] text_feat_tensor = torch.tensor([text_feat], dtype=torch.float).cuda() # [1, feature_dim] idx = 0 while idx < len(image_ids): img_feats_tensor = torch.from_numpy(image_feats_array[idx : min(idx + args.eval_batch_size, len(image_ids))]).cuda() # [batch_size, feature_dim] batch_scores = text_feat_tensor @ img_feats_tensor.t() # [1, batch_size] for image_id, score in zip(image_ids[idx : min(idx + args.eval_batch_size, len(image_ids))], batch_scores.squeeze(0).tolist()): score_tuples.append((image_id, score)) idx += args.eval_batch_size top_k_predictions = sorted(score_tuples, key=lambda x:x[1], reverse=True)[:args.top_k] score_tuples中计算得到的图文相关性分数分布在0.3-0.48之间,最相似的前top1得分也只有0.4几,将0.4几映射到1上,同比例放大分数,再根据不断地尝试找寻合适的阈值,添加一些硬逻辑使相似度得分力求合理地规范到了0-1之间。这样做带来的问题是:阈值比较难确定 虽然确定阈值经过了不断尝试,但是这样得到的阈值依旧会出现顾此失彼的情况,使得打分在某些场景也显得不是很合理 请问计算得到的图文相关性分数究竟如何处理才能使得最终呈现的相关性分数更加合理呢?

wjpstudy avatar Sep 11 '23 10:09 wjpstudy