论文阅读笔记《Revisiting Local Descriptor based Image-to-Class Measure for Few-shot Learning》

小样本学习&元学习经典论文整理||持续更新

核心思想

  本文采用基于度量学习的方式实现小样本学习任务,但与其他基于度量学习的方式不同,本文通过比较图像与类别之间的局部描述子(Local Descriptor),来寻找与输入图像最接近的类别。本文的灵感来自于朴素贝叶斯最近邻算法(Naive-Bayes Nearest-Neighbor,NBNN),根据这一算法作者有两点发现:一、如果将一幅图像的特征信息压缩到一个紧凑的图像级别的表征(换言之就是用一个特征向量或者特征图来表示一张图片),这将会损失许多有区分度的信息,而且这种损失在训练集较少的情况下是无法被恢复的。二、如果采用图片与图片之间的比较,直接使用局部特征进行分类是不可能的,这是因为即使是相同类别的两幅图片,他在局部区域上特征也有很大的差别(比如都是狗,但是不同狗的尾巴区别也很大)。基于这两点观察,作者提出了本文的算法深度最近邻神经网络(Deep Nearest Neighbor Neural Network ,DN4),首先对于图像特征描述,作者并没用采用图像级的特征向量,而是使用若干个局部描述子,每个局部描述子对应图片中的一个局部区域;其次,在分类时,作者同样采用了kNN算法,但是与比较两幅图之间的相似性的方法不同,作者比较输入图像与每个类别的局部描述子之间的相似程度,并借此进行分类,这是因为对于一个类别的物体,其公共的特征还是比较接近的。具体的实现方式如下图所示
在这里插入图片描述
  如图所示,整个网络分成两大部分:嵌入特征提取网络 ψ \psi ψ与最近邻分类器 ϕ \phi ϕ。首先对于嵌入特征提取网络 ψ \psi ψ采用全卷积神经网络,不带有全连接层,因此输出为 h × w × d h\times w\times d h×w×d维的张量,如果将“每一条”长度为 d d d的特征向量看做一个局部描述子 x i x_i xi(因为卷积神经网络中的卷积和池化操作,会将图像压缩,因此输出特征图中的一个像素,其实代表了原图中的一个局部图块),则一共可以得到 m = h w m=hw m=hw个长度为 d d d的局部描述子:
在这里插入图片描述
  然后对于支持集中每个类别中的每幅图像,都能够得到一个由 m m m个局部描述子构成的描述向量。得到查询图像 q q q的描述向量 [ x 1 , . . . , x m ] [x_1,...,x_m] [x1,...,xm],对于其中的每个局部描述子 x i x_i xi,在每一个类别 c c c中都寻找到与其距离最接近的 k k k个局部描述子 x ^ i j , j = 1 , . . . , k \hat{x}^j_i, j=1,...,k x^ij,j=1,...,k,则查询图像 q q q与类别 c c c之间的相似性可以通过对局部描述子之间的余弦相似性求和来得到
在这里插入图片描述
  最后选择相似程度最高的那一类别作为预测结果。

实现过程

网络结构

  特征提取网络采用4层卷积神经网络,最近邻分类器使用KNN搜索。

损失函数

  与常规的基于度量学习的算法相同。

训练策略

  与常规的基于度量学习的算法相同。

创新点

  • 将基于度量学习的小样本学习算法中的图像级别的特征向量,改为局部描述子
  • 将图像与图像之间的相似性度量,通过求和方式改为图像与类别之间的相似性度量

算法评价

  本文最重要的思想在于使用局部描述子取代简单的图像特征向量,虽然结构上并没有什么变化,只不过取消了全连接层,但是在思想上是有很大区别的。之前的特征向量是希望特征提取网络能够将图像特征高度抽象化,将其转化为一个对位置不敏感的向量,在进行比较时也是直接度量两个图像对应的特征向量之间的距离,这对于小样本学习来讲可能比较困难。而本文则这种特征描述要求放宽到局部区域上了,我不要求两张图片每个位置都很相似,但要求你最相似的k个区域是非常接近的,这就消除了类内差异和背景混淆的问题。这一思想其实与之前解读的一篇文章《Spot and Learn: A Maximum-Entropy Patch Sampler for Few-Shot Image Classification》非常接近,根据实验结果来看相对于其他的基于度量学习的算法,如Matching Network和Prototypical Network,效果都有明显的改善。

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。在这里插入图片描述

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
VLAD(Vector of Locally Aggregated Descriptors)是一种图像表示方法,常用于图像检索和计算机视觉任务中。它通过聚合局部特征描述符来生成图像的紧凑表示。 以下是一个简单的C++实现示例,展示了如何实现VLAD图像表示: ```cpp #include <iostream> #include <vector> #include <opencv2/opencv.hpp> // 聚类算法(这里使用K-means) cv::Mat kmeansClustering(const std::vector<cv::Mat>& descriptors, int numClusters) { cv::Mat allDescriptors; for (const cv::Mat& descriptor : descriptors) { allDescriptors.push_back(descriptor); } cv::Mat labels, centers; cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 100, 0.01); cv::kmeans(allDescriptors, numClusters, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers); return centers; } // 计算VLAD图像表示 cv::Mat computeVLAD(const std::vector<cv::Mat>& descriptors, const cv::Mat& visualWords) { int descriptorSize = descriptors[0].cols; cv::Mat vlad(visualWords.rows, descriptorSize, CV_32F, cv::Scalar(0)); for (const cv::Mat& descriptor : descriptors) { // 找到每个描述符最近的视觉词 cv::Mat difference = visualWords - descriptor; cv::Mat distances; cv::reduce(difference.mul(difference), distances, 1, cv::REDUCE_SUM); cv::Point minLoc; cv::minMaxLoc(distances, nullptr, nullptr, &minLoc); // 计算每个视觉词的残差 cv::Mat residual = descriptor - visualWords.row(minLoc.y); // 更新VLAD表示 for (int i = 0; i < descriptorSize; i++) { vlad.at<float>(minLoc.y, i) += residual.at<float>(0, i); } } // 归一化VLAD表示 cv::normalize(vlad, vlad, 1.0, 0.0, cv::NORM_L2); return vlad; } int main() { // 假设有一组局部特征描述符(使用OpenCV的Mat表示) std::vector<cv::Mat> descriptors = { (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), (cv::Mat_<float>(1, 128) << /* descriptor values */ ), // ... }; // 聚类算法,得到视觉词汇 int numClusters = 100; cv::Mat visualWords = kmeansClustering(descriptors, numClusters); // 计算VLAD图像表示 cv::Mat vlad = computeVLAD(descriptors, visualWords); // 输出VLAD表示结果 std::cout << "VLAD Representation:\n" << vlad << std::endl; return 0; } ``` 在这个示例中,`descriptors`是一组局部特征描述符,每个描述符用一个`cv::Mat`对象表示。首先,使用K-means聚类算法将所有描述符聚类成`numClusters`个视觉词汇,并得到`visualWords`矩阵。然后,根据每个描述符找到最近的视觉词,并计算每个视觉词的残差。将残差累加到VLAD表示中,并进行归一化处理。最后,输出VLAD图像表示结果。 请注意,这只是一个简单的VLAD图像表示的C++实现示例,供你参考。在实际应用中,你可能需要根据具体需求进行修改和扩展,例如使用更复杂的特征提取方法、改进聚类算法等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深视

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值