python arange函数用法,Python中arange

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: