任务6 任务6 利用KNN 进行图像识别

BigCowPeking 2020-01-18

任务流程:

  1.读取图片文件

  2.用knn识别图片文件并用k折交叉验证调参

  3.用PCA对文件降维,用knn识别文件

  4.抽取图片特征然后交给knn训练

 

一、文件的读取、可视化、以及采样

数据的初始化及其读取:

from load_data import load_CIFAR10  
import numpy as np
import matplotlib.pyplot as plt
cifar10_dir = ‘cifar-10-batches-py‘  

try:#初始化
   del X_train, y_train
   del X_test, y_test

except:
   pass

X_train, y_train, X_test, y_test = load_CIFAR10(cifar10_dir)
View Code

采样与可视化(就是随机抽几(5)张出来显示一下):

classes = [‘plane‘, ‘car‘, ‘bird‘, ‘cat‘, ‘deer‘, ‘dog‘, ‘frog‘, ‘horse‘, ‘ship‘, ‘truck‘]
num_classes = len(classes)  # 样本种类的个数
samples_per_class = 5       # 每一个类随机选择5个样本

plt.figure(figsize=(5,5))
for i in range(num_classes)
    index = np.where(y_train==i)[0]
    random.shuffle(index)
    for j in range(sample_per_calss)
        ax = plt.subplot(7,10,10*j+i+1) #第7行第10列显示图片
        if j==0:
            as.set_title(classes[i])
        plt.axis(‘off‘)
        plt.imshow(X_train[index[j]]/255)
View Code

之后再统计一下出现的次数。

 

二、使用KNN算法识别图片。

  对于knn中的距离,引入新概念:Minkowski Distance,在Minkowski Distance中两向量的距离被认定为

任务6 任务6 利用KNN 进行图像识别

   我们常说的欧式距离就是p=2的时候的特例,所以对于两个向量的距离我们就可以拟合一个p参数,再加上knn里面的k参数,我们需要通过k折验证拟合两个参数。

跑可能的k和p(没运行,等笔记本修好就跑来试试):

#处理一下向量
X_train1 = np.reshape(X_train, (X_train.shape[0], -1))
X_test1 = np.reshape(X_test, (X_test.shape[0], -1))
print(X_train1.shape, X_test1.shape) # 确保维度正确

params_k = [1,3,5,7,9,11,13]  # 可以选择的K值,那如果有更好的k值没在这里出现怎么办?留作疑问
params_p = [1,2,3,4]                        # 可以选择的P值
knn = KNegiborsClassifier()
model1 = GridSearchCV(knn,params,cv=3,n_jobs=-1,verbose=1)

model1.fit(X_train,y_train)
print(model1.best._params_)

print("准确率是 %.3f" %(model1.score(X_test1,y_test)))

三、 抽取图片特征,再用KNN算法来识别图片

代码出现了lambda表达式,格式:lambda argument_list: expression,lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y。

lambda表达式参考:https://blog.csdn.net/zjuxsl/article/details/79437563

抽取特征代码:

from features import *

num_color_bins = 10 
#设定直方图的组距大小
feature_fns = [hog_feature, lambda img: color_histogram_hsv(img, nbin=num_color_bins)]
# hog_feature和color_histogram_hsv是两个特征抽取器


X_train2 = extract_features(X_train, feature_fns, verbose=True)
X_test2 = extract_features(X_test, feature_fns)

print (X_train2.shape, X_test2.shape)

 在任务4里面我们了解到在识别之前要做归一化,因为要减少维度计量单位的不同所带对多模型的影响。

 

 

reshape(x,y)意思是让它变成x*y的矩阵形式,当有一个为-1的时候,意思是我不关心那个维度

例如:reshape(-1,3) 变成三列

总结:

  代码跟着敲了下,但也是似懂非懂的状态,还要继续啃才行,color histogram和HOG还有pca的系数矩阵都要啃!

  

  

相关推荐