VLAD局部特征聚合描述符

局部特征聚合描述符(vector of locally aggregated descriptors,VLAD) 



一、局部描述符聚合:非概率的Fisher Kernel

对于视频,每帧的局部描述符{x1,…,xi,…},在大规模视频搜索中不可能将他们一次都存在内存中,即使每个局部描述符都只需要几比特大小,但是一般来说,每帧都会有数百上千的局部描述符。
因此,我们将这些局部描述符聚合到一个单独的向量中去。我们利用由Perronnin[1]等人引进的Fisher Kernel对于图像表示的变形。得到的结果向量,叫做局部聚合描述符(VLAD),它提供了一种简洁有效的图像表达。假设利用k-means聚类已经学习得到的码本(codebook)和k个中心(c1,…,cj,…,ck),我们就获得一帧的VLAD描述符,记作u,具体过程如下:
(1)和词袋特征表达一样,帧的每个局部描述子xi赋给码本中离它最近的中心,然后得到量化后的索引 :
这里写图片描述

(2)将描述符集合指派给一个中心cj,向量uj通过这些描述符和他的中心的差的累积和获得。


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用C++实现二进制描述符的VL(Vector of Locally Aggregated Descriptors)构建的示例代码: ```cpp #include <iostream> #include <vector> #include <opencv2/core.hpp> #include <opencv2/opencv.hpp> // 计算VLAD向量 cv::Mat computeVLAD(const std::vector<cv::Mat>& descriptors, const cv::Mat& centers) { int numDescriptors = descriptors.size(); int numClusters = centers.rows; int descriptorSize = descriptors[0].cols; cv::Mat vladVector = cv::Mat::zeros(1, numClusters * descriptorSize, CV_32FC1); // 分配簇分配矩阵和簇中心矩阵 cv::Mat assignments = cv::Mat::zeros(numDescriptors, 1, CV_32SC1); cv::Mat distances = cv::Mat::zeros(numDescriptors, numClusters, CV_32FC1); // 计算每个描述符到每个簇中心的距离 for (int i = 0; i < numDescriptors; i++) { for (int j = 0; j < numClusters; j++) { distances.at<float>(i, j) = cv::norm(descriptors[i], centers.row(j), cv::NORM_L2); } } // 分配每个描述符到最近的簇中心 for (int i = 0; i < numDescriptors; i++) { cv::Point minLoc; cv::minMaxLoc(distances.row(i), nullptr, nullptr, &minLoc); assignments.at<int>(i) = minLoc.x; } // 计算VLAD向量 for (int i = 0; i < numDescriptors; i++) { cv::Mat residual = descriptors[i] - centers.row(assignments.at<int>(i)); cv::Mat descriptorDiff = residual.reshape(0, 1); cv::Mat vladComponent = descriptorDiff.clone(); vladComponent.convertTo(vladComponent, CV_32FC1); cv::normalize(vladComponent, vladComponent, 1.0, 0.0, cv::NORM_L2); vladVector += vladComponent; } // 归一化VLAD向量 cv::normalize(vladVector, vladVector, 1.0, 0.0, cv::NORM_L2); return vladVector; } int main() { // 假设有一组二进制描述符和簇中心 std::vector<cv::Mat> descriptors; cv::Mat centers; // 初始化描述符和簇中心 // ... // 计算VLAD向量 cv::Mat vladVector = computeVLAD(descriptors, centers); // 打印VLAD向量 std::cout << "VLAD Vector: " << vladVector << std::endl; return 0; } ``` 请注意,这只是一个示例代码,实际应用中需要根据具体的二进制描述符和簇中心的计算方法进行相应的修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值