1理论
理论部分见博客:SIFT+词袋+SVM的深入理解,感谢博主herr_kun,这个真是写的太好了,通俗易懂,尤其是那张自动笔画的图,真好https://blog.csdn.net/herr_kun/article/details/80220389
2代码
使用的代码来源于https://blog.csdn.net/Yan456jie/article/details/52313317
感谢博主Yan456jie
在跑代码的时候,发现该代码有一些函数在新版本的python上跑不通,有一些错误,所以调了一下
2.1debug记录
主要遇到的错误是
1前期报了一堆错,我查博客做了一堆,结果发现主要是改了文件读写的代码,结果读不到文件了,这个只能具体问题具体分析了,就不记录了。
2 路径中最好不要有中文!哪怕已经可以读取中文路径下的东西了,可是我在调用im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
时依然报错,而且是报说opencv 崩溃了。。。果真是玄学。
3 由于版本更新,sift特征的函数改变了,下列关键语句不能用了
#关键点检测对象
fea_det = cv2.FeatureDetector_create("SIFT")
#特征提取对象
des_ext = cv2.DescriptorExtractor_create("SIFT")
解决方法
参考该博客,使用新的函数提取sift,感谢博主
StevenGerrad,https://blog.csdn.net/qq_40690815/article/details/104946216
4由于版本更新,cross_validation
不能使用了
解决方法:参考该博客,感谢博主ronaldo2018
https://blog.csdn.net/sinat_17697111/article/details/84835873
代码中的cross_validation都改成model_selection
2.2代码
代码如下
#coding=utf-8
#-*- coding: utf-8 -*-
import argparse as ap
import cv2
import imutils
import numpy as np
import os
from sklearn.externals import joblib
from scipy.cluster.vq import *
from sklearn import preprocessing
import math
import sys
import numpy
from sklearn import metrics
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MultiLabelBinarizer, StandardScaler
from sklearn.svm import SVC
from sklearn.svm import LinearSVC
import codecs
from sklearn.feature_selection import SelectPercentile, f_classif
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# from sklearn import cross_validation #报错
#ImportError: cannot import name 'cross_validation' from 'sklearn' (C:\Users\wyh\Anaconda3\lib\site-packages\sklearn\__init__.py)
# cross_validation路径换了,现在放在model_selection,改成下面这句
from sklearn import model_selection
from sklearn.utils import shuffle
import sys
if sys.getdefaultencoding()!='utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
'''
使用词袋模型对图像进行分类:
1、数据格式,文件夹名即类别,每个文件夹下是一类图像
2、提取sift特征,将所有图像的sift特征放在一起,进行聚类,聚出n个视觉词
3、计算每幅图像有哪些视觉词,统计出词频矩阵
4、根据矩阵计算idf,进而得到tfidf矩阵,并对其进行L2归一化(向量中每个元素除以向量的L2范数->x/平方和开根号)
5、使用一般分类模型对其进行分类,计算P,R,F
'''
def load_data(path):
'''
每个文件夹下是一种图片
:param path:种类文件夹路径
:return: 图片路径列表和标签列表
'''
categories = os.listdir(path)
img_pathes = []
labels = []
for mypath, dirs, files in os.walk(path):
for file in files:
mypath1=mypath+'/'
mytmp = os.path.