DN4:<Revisiting Local Descriptor based Image-to-Class Measure for Few-shot Learning>论文阅读笔记

小样本图像分类

1.什么是小样本图像分类?
小样本图像分类能够利用的少量样本, 即一个或者几个样本进行图像分类.
2.为什么要小样本图像分类?
一是数据量少. 比如在医疗领域, 医学影像的产生来源于病例,通常少量的病例并不能够辅助机器对医疗影像进行分析.
二是让机器学会以人类的方式进行学习.人类能够在获取少量样本的情况下, 对样本进行分类和识别, 并且具有快速理解新概念并将其泛化的能力。
3.小样本图像分类难点有哪些?
难点在于训练样本的数量太少,很容易过拟合
常用方法:Meta-learning(元学习):又称“学会学习“(Learning to learn), 即利用以往的知识经验来指导新任务的学习,使网络具备学会学习的能力。元学习的目标是利用已经学到的知识来解决新的问题。这也是基于人类学习的机制,我们学习都是基于已有知识的,而不像深度学习一样都是从 0 开始学习的。如果我们已有的先验知识来帮助我们解决新的问题,那么我们对于新的问题就可以不需要那么多的样本,从而解决小样本图像分类的问题。

网络结构

在这里插入图片描述
这张图是这篇论文的总体结构:主要包含两个模块,嵌入模块和图像到类的度量模块
第一个模块 :嵌入模块 ,采用的是一个全卷积神经网络(不带有全连接层)
输出是一个h x w x d维的一个张量,可以将长度为d的特征向量看作一个局部描述子Xi(因为卷积神经网络中的卷积核池化操作,会将图像压缩,其中输出的每一个像素,其实代表了原图中的一个局部块),所以一共可以得到m = h x w 个长度为d的局部描述子。
在这里插入图片描述
第二个模块:图像到类的模块,主要介绍的是图像到类是怎么计算的

比如:5 way 1shot
支持集:取5个类别,每个类别1个样本
查询集:从支持集中的5个类别中每个类别取15个样本,共75个样本
支持集和查询集中的都经过第一个模块,得到相应的局部描述子。然后对于查询集中的每一张图片来判断属于支持集中的哪一类
计算公式如下:
在这里插入图片描述

总结

本文的创新点主要有两个:
1.将基于度量学习的小样本学习算法的图像级别的特征向量改为局部描述子
2.将图像与图像之间的相似度量,通过求和改为图像到类的相似度量

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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++实现示例,供你参考。在实际应用中,你可能需要根据具体需求进行修改和扩展,例如使用更复杂的特征提取方法、改进聚类算法等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值