将空间金字塔匹配(SPM)用于SIFT,然后在c++中输入到SVM中
Spatial pyramid matching (SPM) for SIFT then input to SVM in C++
我正在尝试使用c++和OpenCV对脑肿瘤的MRI图像进行良性和恶性分类。我计划在使用kmeans聚类SIFT描述符后使用词袋(BoW)方法。意思是,我将每个图像表示为直方图,整个"代码本"/字典为x轴,它们在图像中的出现次数为y轴。这些直方图将成为我的SVM(带有RBF核)分类器的输入。
但是,使用BoW的缺点是忽略了图像中描述符的空间信息。有人建议用SPM代替。我读了一下,看到了这个链接,给出了以下步骤:
- 从训练集中计算K个视觉词,并将所有局部特征映射到它的视觉词。
- 对于每张图像,初始化K个多分辨率坐标直方图为零。每个坐标直方图由L个级别和每个级别组成它有4^i个单元格,均匀地划分当前图像。
- 对于该图像中的每个局部特征(假设其视觉词ID为k),挑出第k个坐标直方图,然后累积1计数到这个直方图中L个对应的细胞,根据局部特征的坐标。L细胞是局部特征所在的单元格在L个不同的分辨率下。
- 连接K个多分辨率坐标直方图,形成最终的图像"长"直方图。当连接时,第k直方图由第k个视觉词的概率加权。
- 要计算两幅图像的核值,将它们的"长"直方图相交的所有单元相加。
现在,我有以下问题:
- 什么是坐标直方图?直方图不就是在x轴上显示每个分组的数量吗?它如何提供点坐标的信息?
- 我如何计算第k个视觉单词的概率?
- 我将得到的"内核值"的用途是什么?如何将它作为支持向量机的输入?如果我理解对了,核值是在测试阶段使用的,而不是在训练阶段?如果是,那么我将如何训练支持向量机?
- 或者你认为我不需要用空间信息来负担自己,只要坚持使用正常的BoW来处理我的情况(良性和恶性肿瘤)?
谁来帮帮这个可怜的小本科生。如果你这样做,我将永远感激你。如果您有什么需要说明的,请尽管提。
这是实际论文的链接,http://www.csd.uwo.ca/~olga/Courses/Fall2014/CS9840/Papers/lazebnikcvpr06b.pdf
MATLAB代码在这里提供http://web.engr.illinois.edu/~slazebni/research/SpatialPyramid.zip
坐标直方图(在你的帖子中提到)只是你计算直方图的图像中的子区域。这些幻灯片直观地解释了它,http://web.engr.illinois.edu/~slazebni/slides/ima_poster.pdf。
这里有多个直方图,每个直方图对应图像中的不同区域。概率(或项目数量将取决于该子区域的筛选点)。
我认为你需要像幻灯片中提到的那样定义你的金字塔内核。
如果你有足够的训练样本,卷积神经网络可能更适合你的任务。你可以看看Torch或者Caffe。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 如何正确地推回然后遍历堆中对象的向量?
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 将加密消息从 php 发送到 C++ 应用程序,然后使用 CryptoPP 进行解密
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?