python arange函数用法,Python中arange
词频反
超级软件
伏勒德
词频反
TF-IDF是信息检索中常用的一种加权技术。文本检索评估单词对文件数据库中的文件的重要性。单词的重要性与其在文件中的出现频率成正比增加,但与其在文件数据库中的出现频率成反比减少。常见的词,如055-79000,《的》,《我们》等。在所有文章中频繁出现,不能很好的表达一个文档的内容。
类似地,在图像检索中也引入IF-IDF权重,
词频(TF)一个视觉词在图像中出现的频率高,说明这个视觉词很好地代表了图像的内容。$$TF=\frac{单词在图像中出现的次数} {图像中单词的总数} $ $
逆文档频率(IDF)虽然有些常用词在每张图片中都频繁出现,但是这些词并不能很好的代表图片的内容,所以这部分会降低word的权重。IDF描述了一个词的普遍重要性。比如,当古欧这个词在很多图像中频繁出现时,它给出的权重较低。$$IDF=\log(FRAC)图片总数(包括该单词的1号图片)$ $
分母设为1是为了防止除数变成0。从上面的公式可以看出,包含当前单词的图像越多,IDF值越小,说明这个单词不太重要。相反,这个词越重要。
计算TF和IDF,结果如下
(\[TF-IDF=TF * IDF
() ) ) )。
根据TF和IDF的计算公式,对整个图像数据库进行训练后,可以计算一次IDF。TF需要对特定图像进行多次计算。
通过给BoW向量赋予TF-IDF权重并归一化它(\(L2)),我们可以获得可用于图像搜索的向量。
实施情况
voidcompute_IDF(constvectorbow,vector idf).
int img _ count=bow . size(;
int clu_count=bow[0]。大小(;
IDF=vector(clu_count,1.0);
for(intI=0;i img _ countI ) {
for(intj=0;j clu _ countj ) {
if(bow[I][j]!=0)IDF[j];
}
}
for(intI=0;I IDF . size(;I ) {
IDF[I]=log(img _ count/IDF[I]);
}
}
上面的代码是计算图像库的IDF。IDF适用于整个图像库。
对于一个图像,TF需要计算一次。TF的计算公式是\(TF=(FRAC)一个词在图像中出现的次数)(图像中的总字数),看起来像是图像的弓矢\(L1))被标准化了。
voidcompute_TF(constvectorbow,vector tf).
TF=vector(bow.size),0);
int sum=0;//图像中的所有单词
for(intI=0;我鞠躬。I ) {
sum=bow[I];
}
for(intI=0;我鞠躬。I ) {
TF[I]=(float)bow[I]/sum;
}
}
超级软件
在比较直方图时,使用热情热狗距离的性能通常比使用卡方距离或直升机核的性能差。为什么在使用sift特征点时要一直使用热情热狗距离?
无论是匹配sift特征点,聚类sift特征集得到视觉词汇,还是BoW编码一幅图像,都用到了热情的热狗距离。然而,sift特征描述符本质上也是直方图。为什么在比较sift特征描述符时要用热情的热狗距离?有没有更准确的对比方法?
sift描述符对关键点附近的梯度直方图进行计数。更详细的介绍请参考图像检索(一):基于sift-VLfeat。
齐泽曼认为,sift特征的相似性仅用暖热狗的距离来衡量,因为sift提出了暖热狗的距离度量方法,可以找到更准确的方法来度量暖热狗的距离。Arandjelovic和Ziserman提出了基于RootSift的sift特征扩展。
在提取sift(x)的描述向量之后,可以通过以下处理获得RootSift
1.特征向量(
X\)规格化\(l_1\)得到\(x\)。
2.求\(x\)的每个元素的平方根
3.继续\(L2-正常化\),可选
最后一步,是否规格化\(L2 \)有些不一致。论文没有指出需要\(L2 \)归一化,但在表象中有\(L2 \)归一化。还认为没有必要明确地执行L2归一化。通过采用L1规范,然后是平方根,已经有了L2标准化的特征向量,并且不需要进一步的标准化。
Python实现
#导入必要的包
将numpy作为np导入
导入cv2
类RootSIFT:
def __init__(self):
#初始化SIFT特征提取器
self.extractor=cv2。descriptor extractor _ create( SIFT )
定义计算(自身、图像、kps、eps=1e-7):
#计算SIFT描述符
(kps,descs)=self . extractor . compute(image,kps)
#如果没有关键点或描述符,则返回空元组
如果len(kps)==0:
返回([],无)
#应用Hellinger内核,首先进行L1归一化,然后将
#平方根
descs /=(descs.sum(axis=1,keepdims=True) eps)
descs=np.sqrt(descs)
#descs /=(np.linalg.norm(descs,axis=1,ord=2) eps)
#返回关键点和描述符的元组
返回(kps,descs)
实施情况
for(int I=0;i siftFeature.rowsi ){
//转换为浮点类型
mat f;
siftFeature.row(i)。convertTo(f,CV _ 32fc 1);
normalize(f,f,1,0,NORM _ L1);//l1正常化
sqrt(f,f);//sqrt-root root-sift
rootsift feature . push _ back(f);
}
伏勒德
局部聚集描述符的向量(VLAD)
前面介绍的BoW方法在图像检索和检索中有这种广泛的应用。BoW通过聚类对图像的局部特征进行重新编码,具有很强的表示能力。此外,使用SVM这种基于样本区间的分类器也能达到很好的分类效果。但是当图像规模比较大的时候,由于视觉词汇量大小的限制,BoW对图像的表示会越来越粗糙,编码后会丢失更多的图像信息,检索的准确率也会下降。
2010年,论文《将局部描述符聚合成紧凑的图像表示》提出了一种新的图像表示方法——VLAD。从三个方面改善:
VLAD用来表示图像的局部特征。
污染控制局(Pollution Control Agency)
构建索引ADC的方法
在BoW的表示方法中,统计图像中每个特征词的出现频率。VLAD就是求落在同一个聚类中心的特征的累积和以及聚类中心的残差。公式如下:
\[v_{i,j}=\ sum _ { x \ than \ NN(x)=c _ I } x _ j-c _ { I,j }
\]
\(x_j\)是图像的第\(j\)个特征点,\(c_i\)是最近的聚类中心,\(x_j-c_{i,j}\)表示特征点与其最近的聚类中心之差。如果使用sift特征,视觉词汇词表的大小为\(k\),则可以得到\(k\)个128维向量\(v_{i,j}\)。
然后把这些\(k*d\)向量(\(d\)是图像特征的长度,比如sift是128维)\(v_{i,j}\)拉伸成一个\(k*d\)长度的一维向量,然后做一个\ (l _)
由于VLAD是特征与其最近的聚类中心的残差和,所以这个向量的很多分量都是0,也就是说向量是稀疏的(稀疏的,少数分量占据了大部分能量),所以VLAD(例如PCA)的降维可以进一步降低向量的大小。
实现
void词汇:transform_vlad(const cv:Mat f,cv:Mat vlad)
{
//找到最近的中心
ptr matcher=flanbasedmatcher:create();
向量匹配;
matcher-match(f,m_voc,matches);
//计算vlad
Mat responseHist(m_voc.rows,f.cols,CV_32FC1,Scalar:all(0));
for(size _ t I=0;I matches . size();i ){
auto queryIdx=matches[i]。queryIdx
int trainIdx=matches[i]。trainIdx//簇索引
Mat残留;
subtract(f.row(queryIdx),m_voc.row(trainIdx),residual,no array());
add(responseHist.row(trainIdx),residual,responseHist.row(trainIdx),noArray(),response hist . type());
}
//L2-范数
auto l2=norm(responseHist,NORM _ L2);
response hist/=L2;
//normalize(responseHist,responseHist,1,0,NORM _ L2);
//Mat vec(1,m_voc.rows * f.cols,CV_32FC1,Scalar:all(0));
Vlad=response hist . shape(0,1);//将矩阵整形为1 x (k*d)向量
}
借助OpenCV实现起来相对简单。这里使用FlannBasedMatcher的match方法寻找特征最近的聚类中心(视觉词汇)。它可以分为以下三个步骤:
减法计算要素与其最近邻聚类中心之间的差值,加法计算同一聚类中心之间的差值。
对上面得到的矩阵的responseHist进行\(l_2\)归一化。
利用整形方法,将矩阵拉伸成一维向量VLAD(k * d(128))。
摘要
Bow通常和TF-IDF一起使用,但是因为词汇量的限制,VLAD是一个很好的替代。RootSift是原生Sift的扩展。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。