python计算机视觉-图像检索和识别

article/2025/7/16 9:17:02

目录

一、原理解析

1.1计算机视觉领域的图像分类是什么意思?

1.2图像分类要如何实现?

1.3Bag-of-features算法和过程?

1)提取图像特征

2)训练字典( visual vocabulary )

3)图片直方图表示

4)训练分类器

1.4TF-IDF?

1.5当前图像分类中会遇到一些值得挑战的问题?

二、代码解析

2.1创建词汇

2.2 建立数据库

2.3在数据库中搜索图像

三、实验结果详细分析

3.1基于聚类维度k=10

3.11一些比较好的实验结果示例:

3.12值得一提的出现的一些结果:

3.2基于不同聚类维度的讨论:

四、实验过程中遇到的问题和解决方法以及自己的一些实验总结和思考

4.1遇到的问题以及解决方法:

4.2一些思考和值得改进和提升的地方:


一、原理解析

1.1计算机视觉领域的图像分类是什么意思?

图像分类,即通过图像内容的不同将图像划分为不同的类别
该技术二十世纪九十年代末提出,并命名为基于图像内容的图像分类(Content- Based ImageClassific- ation, CEIC)算法概念,
基于内容的图像分类技术不需要对图像的语义信息进行人工标注,
而是通过计算机提取图像中所包含的特征,并对特征进行处理和分析,得出分类结果。
常用的图像特征有 图像颜色、纹理、灰度等信息。而图像分类过程中,
提取的特征要求不容易受随机因素干扰,特征的有效提取可提高图像分类的精度。
特征提取完成后,选择合适的算法创建图像类型与视觉特征之间的关联度,对图像进行类别划分。
图像分类领域中,根据图像分类要求,一般可以分为 场景分类目标分类两类问题。
场景分类也可以称为事件分类,场景分类是对 整幅图像所代表的 整体信息进行分类,或者是对图像中 所发生事件的总体描述。
目标分类(又称为物体分类)是对图像中 出现的目标 (物体)进行识别或分类。



1.2图像分类要如何实现?

视觉词袋模型( Bag-of-features )是当前计算机视觉领域中较为常用的图像表示方法。
视觉词袋模型来源于词袋模型(Bag-of-words),词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定 对于一个文本,忽略其词序和语法、句法, 仅仅将其看做是一些词汇的集合, 而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子 (因为里面装的都是词汇,
所以称为词袋,Bag of words即因此而来)然后看这个袋子里装的都是些什么词汇,将其分类。
如果文档中猪、 马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些, 我们就倾向于判断它是一 篇描绘乡村的文档,而不是描述城镇的。
Bag of Feature也是借鉴了这种思路,只不过在图像中,我们抽出的不再是一个个word, 而是 图像的关键特征Feature,所以研究人员将它更名为Bag of Feature.Bag of Feature在检索中的算法流程和分类几乎完全一样,唯一的区别在于,对于原始的BOF特征,也就是直方图向量,我们引入TF_IDF权值。

 

1.3Bag-of-features算法和过程?

算法过程:
1)提取图像特征
2)对特征进行聚类,得到一部视觉字典( visual vocabulary )
3)根据字典将图片表示成向量(直方图)
4)把输入图片转化成视觉单词的频率直方图

1)提取图像特征

特征提取及描述主要是将一些 具有代表性区分性较强全局或局部特征从图像中进行抽取,并对这些特征进行描述。
这些特征一般是类别之间差距比较 明显的特征,可以将其与其他类别区分开,其次,这些特征还要求具有 较好的稳定性,能够最大限度的在光照、视角、尺度、噪声以及各种外在因素变化的情况下保持稳定,不受其影响。这样即使在非常复杂的情况下,计算机也能通过这些稳定的特征很好的检测与识别出这个物体。
特征提取最简单且有效的方法就是 规则网格方法
该方法采用均匀网格对图像进行划分,从而得到图像的局部区域特征。
兴趣点检测方法是另一个有效的特征提取方法,兴趣点检测的基本思想是:
在人为判断一幅图像的类别时,首先捕捉到物体的整体轮廓特征,然后聚焦于物体与其他物体具有显著特征区别的地方,最后判断出图像的类别。即通过该物体与其他物体 区别开的 显著特征,进而判断图像的类别。
在提取完图像的特征后,下一步就要应用特征描述子来对抽取的图像特征进行描述,特征描述子所表示的特征向量一般在处理算法时会作为输入数据,因此,如果描述子具有一定的判别性及可区分性,则该描述子会在后期的图像处理过程中起着很大的作用。
其中,SIFT描述子是近年比较经典且被广泛应用的一种描述子。
SIFT会从图片上提取出很多特征点,每个特征点都是128维的向量,因此,如果图片足够多的话,我们会提取出一个巨大的特征向量库。

 
 

2)训练字典( visual vocabulary )

在上面提取完SIFT特征的步骤后,利用K-means聚类算法将提取的SIFT特征聚类生成视觉词典。
K-means算法是度量样本间相似性的一种方法,该算法设置参数为K,把N个对象分成K个簇,簇内之间的相似度较高,而簇间的相似度较低。聚类中心有K个,视觉词典为K。构建视觉单词的过程如图所示。

提取完特征后,我们会采用一些 聚类算法对这些特征向量进行聚类。 最常用的聚类算法是k-means
至于k-means中的k如何取,要根据具体情况来确定。另外,由于特征的数量可能非常庞大,这个聚类的过程也会非常漫长。聚类完成后,我们就得到了这k个向量组成的字曲,这k个向量有一个通 用的表达,叫visual word.


3)图片直方图表示

利用视觉词典中的词汇表示待分类图像。计算每幅图像中的SIFT特征到这K个视觉单词的距离,
其中 距离最近的视觉单词为该SIFT特征对应的视觉单词
通过统计每个单词在图像中出现的次数,将图像表示成一个K维数值向量
如图所示,其中K=4,每幅图像用直方图进行描述。
 

4)训练分类器

当我们得到每幅图片的直方图向量后,剩下的这一步跟以往的步骤是一样的。
无非是数据库图片的向量以及图片的标签,训练分类器模型。然后对需要预测的图片,我们仍然按照上述方法,提取SIFT特征,再根据字典量化直方图向量,用分类器模型对直方图向量进行分类。当然,也可以直接根据 KNN 算法对直方图向量做相似性判断。

 

1.4TF-IDF?

TF-IDF(Term frequency-Inverse document frequency)是一种统计方法,用来评估特征词的重要程度。根据TF-IDF公式,特征词的权重与在 语料库中出现的频率有关,也与在文档里出现的频率有关。传统的TF-IDF公式如下:
 
TF-IDF用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。就目前来说,如果一个 关键词只在很少的网页中出现,我们通过它就 容易锁定搜索目标,它的 权重也就应该 。反之如果一个词在大量网页中出现,我们看到它仍然 不是很清楚要找什么内容,因此它应该

 


1.5当前图像分类中会遇到一些值得挑战的问题?

图像分类的目的是 通过图像内容对一幅未知图像进行分类
但人类自身进行观察时,由于人们对图像的理解不同,偏重不同,不同的人也会产生不同的结果,
而且人为判断一幅图像的类别时,具有一定的主观性。
而计算机是客观的,它会通过一定的数据信息来判断图像的类别。
因此图像分类是一个比较困难的问题,并且该问题很难达到完美,
现在的分类方法大多都是尽可能地将分类准确率继续提高。
图像分类过程中遇到的问题主要是由 图像的类内变化图像类间的语义差异语义鸿沟造成的。
1、类内差异。
所谓类内差异表示的是属于同一类的图像,由于各种原因,使图像的内容呈现出多种变化。
类内差异主要包括: 视角差异、目标形变、光照差异、尺度差异、部分遮挡、复杂背景、同类异形等。
2、类间差异。
所谓类间差异指的是不同类别含有相同的底层特征,导致不同类别图像分为同一类别。
3、语义鸿沟
长期的知识积累,人类可以通过对图像高层次的抽象理解进而对语义的相似性进行判断。
但计算机只能通过图像底层的统计特征来判断图像类别,不具备人类 对图像进行抽象和推理的能力,
导致计算机提取的图像底层视觉特征获取的图像类别信息和人类对图像的理解获取的图像类别信息不一致,造成“语义鸿沟”,
“语义鸿沟” 实际上就是图像的 底层视觉特征高层语义信息之间的 客观区别

 

二、代码解析

2.1创建词汇

对每张图片生成相应的sif文件,及视觉词汇,以便建立BOW模型。我所用的是图像集为37张。如果需要增加图像或减少只需要改代码里读取训练图像的数量。要得到不同维度的量级,需要修改数据集训练次数。

我的图像集(需要将图像裁剪成一致大小,这里我用了批处理工具,图像统一裁剪为640*480):
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])# 将所有的特征并在一起,以便后面进行 K-means 聚类descriptors = descr[0]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 = featurefilesdef project(self,descriptors):""" 将描述子投影到词汇上,以创建单词直方图  """# 图像单词直方图imhist = zeros((self.nbr_words))words,distance = vq(descriptors,self.voc)for w in words:imhist[w] += 1return imhist

示例代码:

# -*- codeing =utf-8 -*-
# @Time : 2021/6/1 14:25
# @Author : ArLin
# @File : demo1.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
import pickle
from PCV.imagesearch import vocabulary
from PCV.tools.imtools import get_imlist
from PCV.localdescriptors import sift# 获取图像列表
imlist = get_imlist('datasets/')
nbr_images = len(imlist)
# 获取特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# 提取文件夹下图像的sift特征
for i in range(nbr_images):sift.process_image(imlist[i], featlist[i])# 生成词汇
voc = vocabulary.Vocabulary('test77_test')
voc.train(featlist, 37, 10)# 保存词汇
# saving vocabulary
with open('BOW\\vocabulary.pkl', 'wb') as f:pickle.dump(voc, f)
print('vocabulary is:', voc.name, voc.nbr_words)

运行结果:

同时生成了数据模型vocabulary.pkl,如果数据模型为空,在后面存入数据库会出现报错,读入数据为空。判断.pkl是否为空可根据查看它的大小,如图所示,这里pkl为41KB,故不为空


2.2 建立数据库

将上面得到的数据模型存放数据库testImaAdd.db中,即运行下面代码会生成一个testImaAdd.db数据库文件。

示例代码:

# -*- codeing =utf-8 -*-
# @Time : 2021/6/1 14:52
# @Author : ArLin
# @File : demo2.py
# @Software: PyCharm
import pickle
from PCV.imagesearch import imagesearch
from PCV.localdescriptors import sift
import sqlite3
from PCV.tools.imtools import get_imlist# 获取图像列表
# imlist = get_imlist('E:/Python37_course/test7/first1000/')
imlist = get_imlist('datasets/')
nbr_images = len(imlist)
# 获取特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# load vocabulary
# 载入词汇
'''with open('E:/Python37_course/test7/first1000/vocabulary.pkl', 'rb') as f:voc = pickle.load(f)'''
with open('BOW\\vocabulary.pkl', 'rb') as f:voc = pickle.load(f)
# 创建索引
indx = imagesearch.Indexer('testImaAdd.db', voc)
indx.create_tables()# go through all images, project features on vocabulary and insert
# 遍历所有的图像,并将它们的特征投影到词汇上
for i in range(nbr_images)[:36]:locs, descr = sift.read_features_from_file(featlist[i])indx.add_to_index(imlist[i], descr)
# commit to database
# 提交到数据库
indx.db_commit()con = sqlite3.connect('testImaAdd.db')
print(con.execute('select count (filename) from imlist').fetchone())
print(con.execute('select * from imlist').fetchone())

运行结果:


2.3在数据库中搜索图像

利用索引获取候选图像 + 用一幅图像进行查询 + 确定对比基准并绘制结果
建立好图像的索引,就可以在数据库中搜索相似的图像了。这里,使用BoW(词袋模型)来表示整个图像,这是通用的,可以应用于寻找相似的物体、相似的脸、相似的颜色等,它完全取决于图像及所用的描述子。为了实现搜索,在Imagesearch.py中添加Searcher类。
Searcher 类:
class Searcher(object):def __init__(self,db,voc):""" Initialize with the name of the database. """self.con = sqlite3.connect(db)self.voc = vocdef __del__(self):self.con.close()def get_imhistogram(self,imname):""" Return the word histogram for an image. """im_id = self.con.execute("select rowid from imlist where filename='%s'" % imname).fetchone()s = self.con.execute("select histogram from imhistograms where rowid='%d'" % im_id).fetchone()# use pickle to decode NumPy arrays from stringreturn pickle.loads(s[0])def candidates_from_word(self,imword):""" Get list of images containing imword. """im_ids = self.con.execute("select distinct imid from imwords where wordid=%d" % imword).fetchall()return [i[0] for i in im_ids]def candidates_from_histogram(self,imwords):""" Get list of images with similar words. """# get the word idswords = imwords.nonzero()[0]# find candidatescandidates = []for word in words:c = self.candidates_from_word(word)candidates+=c# take all unique words and reverse sort on occurrencetmp = [(w,candidates.count(w)) for w in set(candidates)]tmp.sort(key=cmp_to_key(lambda x,y:operator.gt(x[1],y[1])))tmp.reverse()# return sorted list, best matches first    return [w[0] for w in tmp]def query(self,imname):""" Find a list of matching images for imname. """h = self.get_imhistogram(imname)candidates = self.candidates_from_histogram(h)matchscores = []for imid in candidates:# get the namecand_name = self.con.execute("select filename from imlist where rowid=%d" % imid).fetchone()cand_h = self.get_imhistogram(cand_name)cand_dist = sqrt( sum( self.voc.idf*(h-cand_h)**2 ) )matchscores.append( (cand_dist,imid) )# return a sorted list of distances and database idsmatchscores.sort()return matchscoresdef get_filename(self,imid):""" Return the filename for an image id. """s = self.con.execute("select filename from imlist where rowid='%d'" % imid).fetchone()return s[0]def tf_idf_dist(voc,v1,v2):v1 /= sum(v1)v2 /= sum(v2)return sqrt( sum( voc.idf*(v1-v2)**2 ) )def compute_ukbench_score(src,imlist):""" Returns the average number of correctimages on the top four results of queries. """nbr_images = len(imlist)pos = zeros((nbr_images,4))# get first four results for each imagefor i in range(nbr_images):pos[i] = [w[1]-1 for w in src.query(imlist[i])[:4]]# compute score and return averagescore = array([ (pos[i]//4)==(i//4) for i in range(nbr_images)])*1.0return sum(score) / (nbr_images)

Searcher 类中

  1.  init() 方法用于初始化数据库的名称。

  2. __ del__() 方法可以确保关闭数据库连接。

  3. candidates_from_word() 用于获得包含特定单词的所有图像id号。

  4. candidates_from_histogram() 方法从图像单词直方图的非零项创建单词id列表,检索每个单词获得候选集并将其合并到candidates列表中,然后创建一个元组列表每个元组由单词id和次数count构成,其中次数count是候选列表中每个单词出现的次数。同时,还以元组中的第二个元素为准,用sort()方法和一个自定义的比较函数对列表进行排序。该自定义比较函数进行用lambda函数内联声明,对于单行函数声明,使用lambda函数非常方便。最后结果返回一个包含图像id的列表,排在列表最前面的是最好的匹配图像。

  5. get_imhistogram() 用于返回一幅图像的单词直方图。query() 方法用于获取图像的文件名,检索其单词直方图及候选图像列表。对于每个候选图像,用标准的欧氏距离比较它和查询图像间的直方图,并返回一个经排序的包含距离及图像id的元组列表。

使用几何特性对结果排序
这是一种是常用BoW模型改进检索结果的常用方法。BoW模型的一个主要 缺点是在用视觉单词表示图像时 不包含图像特征的位置信息,这是为了 获取速度和可伸缩性而付出的 代价。最常用的方法是在查询图像与靠前图像的特征位置间拟合单应性。
# -*- codeing =utf-8 -*-
# @Time : 2021/6/1 15:29
# @Author : ArLin
# @File : demo3.py
# @Software: PyCharmimport pickle
from PCV.localdescriptors import sift
from PCV.imagesearch import imagesearch
from PCV.geometry import homography
from PCV.tools.imtools import get_imlist# load image list and vocabulary
# 载入图像列表
imlist = get_imlist('datasets/') # 存放数据集的路径
nbr_images = len(imlist)
# 载入特征列表
featlist = [imlist[i][:-3] + 'sift' for i in range(nbr_images)]# 载入词汇
with open('BOW\\vocabulary.pkl', 'rb') as f: # 存放模型的路径voc = pickle.load(f)
src = imagesearch.Searcher('testImaAdd.db', voc)# index of query image and number of results to return
# 查询图像索引和查询返回的图像数
q_ind =18
nbr_results = 5# regular query
# 常规查询(按欧式距离对结果排序)
res_reg = [w[1] for w in src.query(imlist[q_ind])[:nbr_results]]
print('top matches (regular):', res_reg)# load image features for query image
# 载入查询图像特征
q_locs, q_descr = sift.read_features_from_file(featlist[q_ind])
fp = homography.make_homog(q_locs[:, :2].T)# RANSAC model for homography fitting
# 用单应性进行拟合建立RANSAC模型
model = homography.RansacModel()
rank = {}# load image features for result
# 载入候选图像的特征
for ndx in res_reg[1:]:locs, descr = sift.read_features_from_file(featlist[ndx])  # because 'ndx' is a rowid of the DB that starts at 1# get matches# 获取匹配数 # get matches执行完后会出现两张图片matches = sift.match(q_descr, descr)ind = matches.nonzero()[0]ind2 = matches[ind]tp = homography.make_homog(locs[:, :2].T)# compute homography, count inliers. if not enough matches return empty list# 计算单应性,对内点技术。如果没有足够的匹配书则返回空列表try:H, inliers = homography.H_from_ransac(fp[:, ind], tp[:, ind2], model, match_theshold=4)except:inliers = []# store inlier countrank[ndx] = len(inliers)# sort dictionary to get the most inliers first
# 将字典排序,以首先获取最内层的内点数
sorted_rank = sorted(rank.items(), key=lambda t: t[1], reverse=True)
res_geom = [res_reg[0]] + [s[0] for s in sorted_rank]
print('top matches (homography):', res_geom)# 显示查询结果
imagesearch.plot_results(src, res_reg[:8])  # 常规查询
imagesearch.plot_results(src, res_geom[:8])  # 重排后的结果
运行结果:
查询图像在最左边,后面都是按图像列表检索的前5幅图像。
对输出的结果,首先是载入图像列表、特征列表及词汇。然后创建一个Searcher对象执行定期查询,并将结果保存在res_reg列表中,然后载入res_reg列表中每一幅图像特征,并和查询的图像进行匹配。通过计算匹配数和计数内点数得到,最终可通过减少内点数目对包含图像索引和内点数的字典进行排序。最后可视化检索靠前的匹配图像结果。

 

三、实验结果详细分析

3.1基于聚类维度k=10:

 

3.11一些比较好的实验结果示例:


3.12值得一提的出现的一些结果:

第一组:
排序前:
排序后:

最右是我们的查询图像,而后面是按图像列表检索的前几幅图像,

我们可以看到常规查询的结果和重排后的查询结果相比较后,

重排后的查询结果会比常规查询结果更为准确些,

重排用单应性进行拟合建立RANSAC模型,再导入候选图像特征进行排序查询

常规查询只是进行了简单的索引和查询,找到相似即可。

第二组:

原图片集合中我们可以看到冰淇淋这类的照片中只有四张,但是程序中要求返回的是5张最相似的,于是就会从照片集中再挑选出最为相似的作为第五张,因为冰淇淋是花的形状,所以这里自然就传回了这朵花的照片传回来了。

这是显著的类间差异的例子,冰淇淋和荷花是不同类别的图像,但在这里被归为同一类别,这是因为它们又比较相似的底层特征-花朵,外形和纹理较为相似,所以由底层特征推导出的中层语义特征和高层语义特征也具有一定的相似性,这就导致了不同类别的图像被归类为同一类别,出现了识别错误的情况

以及在我观察后发现在这些图片中荷花这组的匹配准确率是比较低的,相对于匹配准确性较高的音乐会而言,对此我有个大胆的推测,我认为是因为荷花这组图基本色调少,基本就是绿和白,而且也是近拍荷花,而常用的图像特征有图像颜色、纹理、灰度等信息,即图像特征不多,这就导致了特征得不到有效提取,则图像分类的精度大大降低。


 

3.2基于不同聚类维度的讨论:

生成不同维度词典和数据库:
对于同一张图片:
K=5(左为排序前,右为排序后)
K=10
k=100
K=200
k=500
分析:
按照正常的理论来说, 随着维度越大,生成视觉词典所需要的时间越长,视觉词典的大小也随之增加,但是由于可能是由于我的图像集不多,就37张,也可能是因为我的图像集对象差异其实蛮大的,在这里的实验中完全看不出维度对于实验结果的显著影响,我觉得可能这是老师所说的通用数据库和专用数据库的差距,我的图像集是偏向通用数据库,即就是各类对象都有放在一起,而参考了同学的博客有基本围绕花卉的专用数据库(而且图像集也足够的情况下),训练次数就会对实验结果有显著的影响。

四、实验过程中遇到的问题和解决方法以及自己的一些实验总结和思考

4.1遇到的问题以及解决方法:

 

问题1:

Traceback (most recent call last):File "<input>", line 1, in <module>File "C:\Program Files\JetBrains\PyCharm\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfilepydev_imports.execfile(filename, global_vars, local_vars)  # execute the scriptFile "C:\Program Files\JetBrains\PyCharm\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfileexec(compile(contents+"\n", file, 'exec'), glob, loc)File "D:/python/pytharm/demo/pythonProject/JsVision/实验五/demo1.py", line 32, in <module>with open('D:\python\pytharm\demo\pythonProject\JsVision\实验五\BOW\vocabulary.pkl', 'wb') as f:
OSError: [Errno 22] Invalid argument: 'D:\\python\\pytharm\\demo\\pythonProject\\JsVision\\实验五\\BOW\x0bocabulary.pkl'
回溯(最近一次呼叫):
文件“<input>”,第1行,在<module>
文件“C:\Program Files\JetBrains\PyCharm\plugins\python\helpers\pydev\\u pydev\u bundle\pydev\u umd.py”,第197行,在runfile中
pydev#imports.execfile(文件名,全局变量,本地变量)#执行脚本
文件“C:\Program Files\JetBrains\PyCharm\plugins\python\helpers\pydev\\u pydev\u imps\\u pydev\u execfile.py”,第18行,在execfile中
exec(compile(contents+“\n”,file,'exec'),glob,loc)
文件“D:/python/pytharm/demo/pythonProject/JsVision/实验五/demo1.py“,第32行,在<module>
打开('D:\python\pytharm\demo\pythonProject\JsVision\实验五\BOW\词汇表.pkl,','wb')作为f:
OSError:[Errno 22]无效参数:“D:\\python\\pytharm\\demo\\pythonProject\\JsVision”\\实验五\\弓\x0bocabulary.pkl'

原来是文件名路径的问题,根据之前的经验可能是\vocabulary.pkl这个地方出了问题,把斜杠换成双斜杠即可或者在读取路径前面加个r

问题2:

ModuleNotFoundError: No module named 'pysqlite2'

经过网上查阅,python3已经不支持pysqlite2这个库了

解决方法:

按照上面那个图找自己文件的所在的路径,把红线区域的修改为如图示,并且保证自己的settings已经成功安装了 pysqlite3

问题3

TypeError: %d format: a number is required, not NoneType

这里出现这种错误有三种可能性,

1.检查sift的路径是否存放正确

2.检查一下PCV中的imagesearch.py文件

检查一下这两个地方的代码,改成这个方式,主要是因为Python3和Python2的字符串兼容问题,因为数据文件是在Python2下序列化的,所以使用Python3读取时,需要将‘str’转化为'bytes'。

3查询图像的索引(下图2)是否超出了你在生成一个testImaAdd.db数据库文件的遍历图象数(下图1),即


4.2一些思考和值得改进和提升的地方:

1.本次的图像查询我是建立在原本的图像库里面取出的查询图像和图像匹配,而我觉得我应该深一步做到的是,输入自己的照片(非图像库内图像),然后再与图像库图像进行查询和匹配。

2.本次我的图像集其实并不多,就是30多张,都是取自于自己的手机相册,BOF的一个主要缺点是在用视觉单词表示图像时不包含图像特征的位置信息,而图像特征的位置信息在人眼识别图像时起到了很好的作用,而我本次的实验结果并没有体现出这个缺点。

3.由于图像集数目不足和通用数据库的影响其实我的聚类影响并没有体现出现,在我自己的通用数据库基础上,我应该增加每个类别的图像数量,感觉最好一个类别20-30张最佳,然后再设置一个专用的数据库(即对于同一个对象)也是有充足的图像数量,以此来进行聚类影响的体现。

4.通过在知网参考文献,我发现有许多的算法其实对于前面说的BOF的缺点有了改进的作用,进一步学习的时候可以考虑用改进算法查看一下准确率的差异


参考文献:

基于词袋模型的图像分类方法研究-王娜娜-兰州理工大学


http://chatgpt.dhexx.cn/article/dydrxBEo.shtml

相关文章

使用计算机视觉和深度学习创建现代 OCR 管道

文章目录 研究和原型设计字深网字检测器组合式端到端系统生产化性能调优优雅 在这篇文章中&#xff0c;我们将带您了解我们如何为[【移动文档扫描仪】构建最先进的光学字符识别&#xff08;OCR&#xff09;管道的幕后故事。我们使用了计算机视觉和深度学习的进步&#xff0c;如…

最流行的4个机器学习数据集

最流行的4个机器学习数据集 机器学习算法需要作用于数据&#xff0c;而数据的本质则决定了应用的机器学习算法是否合适&#xff0c;而数据的质量也会决定算法表现的好坏程度。所以会研究数据&#xff0c;会分析数据很重要。本文作为学习研究数据系列博文的开篇&#xff0c;列举…

机器学习——数据集预处理(数据查看和空值处理)

目录 前言 数据集查看 前言 目的&#xff1a;本数据集是为了分析炉丝功率和炉膛温度以及样品盒内部温度之间的关系&#xff0c;分析温场的分布等。 来源&#xff1a;本数据集的来源是实验获得的数据。 特点&#xff1a;特征维度高&#xff0c;数据量大。 数据集查看 1.查…

推荐收藏:50个最佳机器学习公共数据集

外国自媒体mlmemoirs根据github、福布斯、CMU官网等信息&#xff0c;整理了一张50个最佳机器学习公共数据集的榜单&#xff0c;为大家分享一下~ 作者&#xff1a;mlmemoirs 郭一璞 编译 外国自媒体mlmemoirs根据github、福布斯、CMU官网等信息&#xff0c;整理了一张50个最佳…

8种适用于不同机器学习问题的常用数据集

要找到一定特定的数据集可以解决各种机器学习问题&#xff0c;是一件很难的事情。越来越多企业或研究机构将自己的数据集公开&#xff0c;已经成为全球的趋势&#xff0c;这也将有助于大家进行更多研究。 近期&#xff0c;亚马逊高级技术顾问 Will Badr 分享了 8 种适用于不同…

【ML】机器学习数据集:sklearn中回归数据集介绍

目录 1. Boston房价预测数据集2. California房价预测数据集3. 糖尿病预测数据集 在机器学习的教程中&#xff0c;我们会看到很多的demo&#xff0c;这些demo都是基于python中自带的数据集。今天我们将介绍三个用于回归预测的数据集。 1. Boston房价预测数据集 该数据集将在sci…

浅谈机器学习之数据集构建

浅谈机器学习之数据集构建 ​ 正如大家现在知道的&#xff0c;深度学习模型(DL)和机器学习模型(ML)是数据驱动型任务&#xff0c;在近乎完美的数据集面前&#xff0c;模型间的细微差异可以忽略。但要获得覆盖目标场景所有特征的样本&#xff0c;不仅要耗费巨大的人力物力&…

机器学习经典开源数据集盘点

在机器学习任务实施前&#xff0c;如何快速寻找到可用数据集&#xff0c;是令每一位研究人员最头痛的事情。本文为大家列举了八大主流数据集来源&#xff0c;不仅包含大量的数据集信息&#xff0c;而且包含了描述、用法以及一些实施案例等。 01 Kaggle数据集 Kaggle数据集地址h…

免费的机器学习数据集网站(6300+数据集)

今天给大家分享一个免费获取机器学习数据集网站&#xff1a; Machine Learning Datasets | Papers With Code 有想法但没有数据集的同学的福音&#xff0c;网站届满很简洁&#xff0c;及本本上提供的了一般可用的各类数据集&#xff0c;我们可以进行各类影像、评论和点云等数…

学习机器学习算法过程中的常用数据集

文章目录 【数据集1】forge&#xff1a;小型模拟分类问题数据集【数据集2】wave&#xff1a;小型模拟回归问题数据集【数据集3】cancer&#xff1a;中型实际分类问题数据集【数据集4】boston&#xff1a;中型实际回归问题数据集 以下数据集为学习机器学习算法时&#xff0c;经常…

虚拟机系统iso镜像下载_如何下载正版系统镜像

许多网友想装系统&#xff0c;可是不会装(后期会推装系统的文章)&#xff0c;而且网上的系统有的装有全家桶&#xff0c;有的又有捆绑软件&#xff0c;严重的还有病毒。那么&#xff0c;在哪里去下载正版&#xff0c;安全的系统镜像呢 "MSDN&#xff0c;我告诉你"这个…

Win7下安装xp虚拟机

在win7下安装Oracle VM VirtualBox虚拟机&#xff0c;然后在安装xp程序。 准备工作&#xff1a; 1. Oracle VM VirtualBox虚拟机 2. 一张xp安装版的镜像盘&#xff08;这里一定是安装版而不是Ghost版&#xff0c;如果想知道ghost版的会出现什么问题&#xff0c;不妨自己试试。&…

虚拟机系统iso镜像下载_[原版镜像]macOS Mojave 10.14.1 原版 iso 镜像- 虚拟机专用

[原版镜像]macOS Mojave 10.14.1 原版 iso 镜像- 虚拟机专用 Notes: 1. 此镜像仅供用于虚拟机安装, 不能制作启动 u 盘. 2. 此镜像和专栏文章: macOS Mojave 10.14.2 原版镜像 皆可用于虚拟机安装 macOS. 另: 此镜像为苹果官方免费 macOS 镜像和工具制作而成, 没有任何第三方内…

微软官方提供的免费正版 Windows 8.1/Win10/7/XP/Vista 操作系统虚拟机镜像下载

微软官方提供的免费正版 Windows 8.1/Win10/7/XP/Vista 操作系统虚拟机镜像下载 https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ 相信做过网页开发/前端的同学都知道&#xff0c;测试各个浏览器的兼容性是最麻烦的事情之一&#xff0c;单单 IE 就有 N 个版…

基于snap7在vs上通信

这是个已有的snap7通信示例&#xff1a; 首先你得有visual studio&#xff0c;然后 1.在snap7官网上下载文件snap7-full-1.4.2 2.打开snap7-full-1.4.2\examples\dot.net\WinForm\CSharp\CSharp.sln 3.直接编译&#xff0c;它会报错 具体正确的解决方法不太懂&#xff0c;我就…

Snap7 西门子S7系列PLC的通信库 简介

目录 简介参考Snap7 简介Snap7 用途适用系统支持语言西门子S7通信介绍Snap7 组件Sanp7 API源码、手册、样例下载 简介 最近在开发一个项目&#xff0c;作为技术帝&#xff0c;已经完成工艺、机械设计的设计&#xff0c;项目过多&#xff0c;也是为了让自己更加?叉&#xff0c…

通过Snap7与 LOGO!8PLC通信

前言 因一项目需要web控制LOGO! PLC&#xff0c;利用西门子自带的免费LOGO!8.2 Web Editor工具可以很完美的做web页面开发。可以参考视频教程。此外西门子还提供数据导出到excel工具——LOGO8.2 Access Tool。 上面两款工具虽然使用起来非常便捷&#xff0c;但还是想结合Snap…

python使用Snap7读写西门子S7系列PLC

python使用Snap7读写西门子S7系列PLC 1.简介 Snap7 Snap7是一个基于s7通信协议的开源软件包&#xff0c;作者是Davide Nardella&#xff0c;该软件包封装了S7通信的底层协议&#xff0c;可使用普通电脑通过编程与西门子S7系列PLC进行通信 Snap7三大对象组件&#xff1a;客户…

jetson nano上编译与使用西门子PLC通讯库snap7

文章目录 一.西门子snap7介绍二.西门子S7通讯介绍三.jetson nano编译snap7库四.Qt Cmake导入snap7库五.snap7主要函数说明1.与PLC建立连接2.读写PA区变量3.读写MK区变量 六.通讯程序示例 一.西门子snap7介绍 官网&#xff1a;https://snap7.sourceforge.net/ Snap7 是一个基于…

Python-snap7 安装和测试

本文章记录Python-snap7零基础的安装和测试过程。 1 部件和软件 硬件&#xff1a; 1&#xff09;S7-1500 CUP 1511-1 PN&#xff08;6ES7511-1AK02-0AB0&#xff09; 2&#xff09;SD存储卡 4M&#xff08;6ES7 954-8LC03-0AA0&#xff09; 3&#xff09;220V AC 转 24V DC 电…