zoukankan      html  css  js  c++  java
  • 任务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)))
    View Code

    三、 抽取图片特征,再用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)
    View Code

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

     

     

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

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

    总结:

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

      

      

  • 相关阅读:
    java内部类
    接口与继承
    数据结构
    数据I/O流
    课程总结
    第六次实训作业异常处理
    常用类的课后作业
    窗口实训1
    实训作业4
    实训作业3
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/12209925.html
Copyright © 2011-2022 走看看