TF-IDF
RootSift
VLAD
TF-IDF
TF-IDF是一种用于信息检索的常用加权技术,在文本检索中,用以评估词语对于一个文件数据库中的其中一份文件的重要程度。词语的重要性随着它在文件中出现的频率成正比增加,但同时会随着它在文件数据库中出现的频率成反比下降。像‘的’,‘我们’,‘地’等这些常用词在所有文章中出现的频率会很高,并不能很好的表征一个文档的内容。
同样的在图像检索中也引入了IF-IDF权重,
词频(Term Frequency,TF) 一个visual word在一个图像中出现的频率的很高,则说明该visual word 能够很好的代表图像的内容。 $$TF = \frac{图像中某个word出现的次数}{图像word的总的个数}$$
逆文档词频(Inverse Document Frequency,IDF) 一些常见的word,会在每一图像出现的频率都很高,但是这些word并不能很好的表示图像的内容,所以要给这一部分word低一些的权重。IDF,描述一个word的普遍重要性,如古欧word在很多的图像中出现的频率都很高,则给予其较低的权重。$$IDF = \log(\frac{图像的总个数}{含有该word的图像数 + 1})$$
将分母+1是为了防止除数为0的情况出现。从上式中可以看出,包含当前word的图像个数越多,IDF的值越小,说明该词越不重要。反之,该词越重要。
计算得到了TF和IDF,则有
\[TF-IDF = TF * IDF
\]
从TF和IDF的计算公式可以看出,IDF是针对整个图像数据库而言的,可以在训练完成后计算一次得到。而TF则是针对具体的某张图像来说的,需要多次计算。
将TF-IDF权值赋给BoW向量,再进行\(l_2\)的归一化,即可得到一个可用于图像检索的向量。
C++实现
void compute_idf(const vector<> &bow,vector &idf){
int img_count = bow.size();
int clu_count = bow[0].size();
idf = vector(clu_count,1.0);
for(int i = 0; i < img_count; i ++){
for(int j = 0;