BOW图像检索corel数据集(多媒体实验三)

算术编码(多媒体实验一)
sklearn主成分分析pca用python实现(多媒体实验二)
BOW图像检索corel数据集(多媒体实验三)
手写数字识别(多媒体实验五)


如果想用基于python的sklearn库参考

  1. bag-of-words-
  2. 图像检索(3):BoW实现

代码基本都是参考网上PCV版本的,基本都是调库,没有实现sift,k-mean等。仅供在python3.8版本,sqlite3中下复现。
本来想用opencv处理,但版本和依赖库问题加上个人能力不足没有造过sift等轮子就不多说。
参考:

  1. Bag of Features (BOF)图像检索算法及其python实现(附代码):网上基本都是一个版本,原谅我找不到原文的代码。
  2. Python计算机视觉——基于BOW的图像检索学习:我遇到的大部分错误他也遇到了,只不过他的有些修改方式还是不适合py3.8版本。
  3. 计算机视觉8—基于BOW模型的图像检索和匹配:一模一样的代码,只不过不用手动查看内置源函数了,比如万恶的imagesearch.py文件,这个版本用的pysqlite2和python3是冲突的,所以造成了很多问题。

原理不多讲,先看针对corel数据集的图像处理。
imlist获取文件的jpg的路径,然后featlist是PCV的sift生成sift的路径名。

imlist = get_imlist("./corel/0/")
for i in range(1,10):
    tmpimlist = get_imlist("./corel/{}/".format(i))
    imlist.extend(tmpimlist)
nbr_images = len(imlist)
featlist = [imlist[i][:-3]+'sift' for i in range(nbr_images)]

其他基本和网上其他代码流程一样。主要是PCV是python2版本时期的东西,所以会有很多报错。以下详细讲讲具体报错解决方法:

  1. 首先需要手动安装PCV和配置vlfeat。pcv无法用pip3下载,所以下载完手动安装到conda环境里。PCV参考:python中PCV库安装的方法步骤。配置vlfeat参考Sift算法的原理描述以及对比Harris算法的特征匹配结果。vlfeat下载版本为window那个,安装32位再下载64位补丁即可。下载地址:VLFeat.org

  2. 配完后先跑createsift.py,会生成sift文件和plk数据包。报错No module named 'pysqlite2’,这是因为imagesearch.py文件是python2时期的代码,所以我们进入这个内置函数文件,把头文件pysqlite2改为sqlite3即可。

  3. 生成sift文件以及pkl数据包后运行import.py文件,第一次运行不会报错,之后报错sqlite3.OperationalError: table imlist already exists,是因为程序在之前运行过一次已经生成了table imlist.注释掉这一行即可。

  4. ‘cmp’ is an invalid keyword argument for sort():这是因为python3不支持cmp函数了,讲cmp函数改为cmp_to_key()即可。然后导入

 from functools import cmp_to_key
  1. 运行查询文件query.py会报错TypeError: a bytes-like object is required, not 'str’:因为python3和Python2在套接字返回值解码上有区别,我们不必改自己函数的imlist为str型,而是去改imagesearch的返回值,否则会在查询数据库时报错语法错误。在文件99行,即Searcher类的get_imhistogram函数返回return为str类型。
 # use pickle to decode NumPy arrays from string
        # return pickle.loads(str(s[0]))
        return pickle.loads(bytes(s[0]))
  1. 如果想手动查看db文件,需要下载sqlite3的应用包,我们可以看见其中表名,命令.table即可,然后可以进行增删改查等操作来判断python中对数据库操作是否符合语法。sqlite下载参考:使用SQLite打开本地*.db文件

vocabulary.py:帮助理解词组意思,以及调用k-mean的作用:

from numpy import *
from scipy.cluster.vq import *

from PCV.localdescriptors import sift


class Vocabulary(object):

    def __init__(self, name):
        self.name = name
        self.voc = []
        self.idf = []
        self.trainingdata = []
        self.nbr_words = 0

    def train(self, featurefiles, k=100, subsampling=10):
        """ 用含有k个单词的K-means列出在featurefiles中的特征文件训练出一个词汇。对训练数据下采样可以加快训练速度 """

        nbr_images = len(featurefiles)
        # 从文件中读取特征
        descr = []
        descr.append(sift.read_features_from_file(featurefiles[0])[1])
        descriptors = descr[0]  # 将所有的特征并在一起,以便后面进行K-means聚类
        for i in arange(1, nbr_images):
            descr.append(sift.read_features_from_file(featurefiles[i])[1])
            descriptors = vstack((descriptors, descr[i]))

        # k-means: 最后一个参数决定运行次数
        self.voc, distortion = kmeans(descriptors[::subsampling, :], k, 1)
        self.nbr_words = self.voc.shape[0]

        # 遍历所有的训练图像,并投影到词汇上
        imwords = zeros((nbr_images, self.nbr_words))
        for i in range(nbr_images):
            imwords[i] = self.project(descr[i])

        nbr_occurences = sum((imwords > 0) * 1, axis=0)

        self.idf = log((1.0 * nbr_images) / (1.0 * nbr_occurences + 1))
        self.trainingdata = featurefiles

    def project(self, descriptors):
        """ 将描述子投影到词汇上,以创建单词直方图 """

        # 图像单词直方图
        imhist = zeros((self.nbr_words))
        words, distance = vq(descriptors, self.voc)
        for w in words:
            imhist[w] += 1

        return imhist

    def get_words(self, descriptors):
        """ Convert descriptors to words. """
        return vq(descriptors, self.voc)[0]

源码及数据库corel集见Media_xdu/bof

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Corel数据集是一个包含10个类别、共600张图像的数据集,每个类别包含60张图像。对于图像特征提取,可以使用传统的特征提取方法,如SIFT、SURF、HOG等,也可以使用深度学习中的卷积神经网络(CNN)进行特征提取。其中,使用CNN进行特征提取的方法通常被称为“基于特征的图像检索”(Content-based Image Retrieval,CBIR)方法。 以下是一些常用的图像特征提取和检索方法: 1. SIFT特征提取 + Bag of Words(BoW)方法 该方法首先使用SIFT算法提取图像中的关键点和描述子。然后,将描述子转换为固定大小的向量,这些向量被称为“词袋”(BoW)。接着,使用聚类方法对所有描述子进行聚类,将它们分为不同的词袋中。最后,将图像表示为包含所有词袋的向量。在检索时,对查询图像进行相同的处理,并计算查询图像向量与每个图像向量之间的相似度。 2. SURF特征提取 + BoW方法 该方法与SIFT方法相似,只是使用的是SURF算法进行特征提取。 3. HOG特征提取 + SVM分类器 该方法使用HOG算法进行特征提取,然后使用支持向量机(SVM)分类器对图像进行分类。在检索时,对查询图像进行相同的处理,并使用SVM分类器对其进行分类。 4. CNN特征提取 + BoW方法 该方法使用预训练的CNN模型进行特征提取。首先,将每个图像输入CNN模型中,提取出最后一个全连接层的特征向量。然后,将这些特征向量转换为词袋,并使用聚类方法将其分为不同的词袋中。最后,将图像表示为包含所有词袋的向量。在检索时,对查询图像进行相同的处理,并计算查询图像向量与每个图像向量之间的相似度。 以上是一些常用的图像特征提取和检索方法,你可以根据自己的需求选择适合的方法进行实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值