任务6 任务6 利用KNN 进行图像识别
任务流程:
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中两向量的距离被认定为
我们常说的欧式距离就是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的系数矩阵都要啃!