コンピュータの視覚的な学習(IX):のジェスチャー認識に基づくKNN分類

KNNアルゴリズムは動作します:

KNN(K最近傍)「は分類されるべきデータ」距離「カテゴリ既知の試料」を測定することにより試料を分類するための単純かつ古典的機械学習分類アルゴリズム(通常ユークリッド距離)です。 
この点は、いくつかの複雑だった、といくつかの打破するために: 
(1)分類(監督)問題を監督している、それはサンプルカテゴリの一定数が知られていると言うことです。 
(2)今、私たちは、ソートされたサンプルの数を持っていることを、次の自然な仕事は、(分類器のパラメータを調整することで、分類器が正しく学習サンプルを分類するために)分類器をトレーニングすることによって既知のサンプルである必要があり、分類器の訓練は、未知のサンプル(またはクラス予測)の将来の分類のために良いです。 
そのようなことのように見えた、重要な問題は、分類器を訓練することです。 
しかし、KNN分類器のために、物事はこのようにではありません。実際には、KNNはそれほど複雑ではありません。KNNパラメータを調整するものがないので、他の言葉で、KNNは実際に訓練を必要としません! 
最もシンプルかつ最高の感謝の分類器として、KNNは、ちょうど我々は、まさにこの空間に位置し、すべてのデータを知っている、そして、データはヨーロッパの特徴空間に(異なるサンプルの特徴的な空間特性値の座標)を分散していることを前提としてい前記データカテゴリの部分。だから今我々はそれそのデータのどの残りのカテゴリを決定する必要がありますか? 
実際には、進んで分類するために、ここでは前提としている:スペース近い距離より大きなクラスに属するポイントの可能性。 
物事がはるかに容易になると、この「公理」、と。私達はちょうどうまく既知のすべてのデータへのデータの各カテゴリに分類されるまでの距離を計算する必要があります。図: 

最後に私たちが知らない円形の中心は、三角形や四角形であれば二つの既知のクラスの正方形と三角形は、あります。言った以上によると、私たちは今、8人の子供は、他のすべての点までの距離を計算することができます。ここでは簡単にするために、我々は、我々はそれが三角形の一種に分類入れ、最近、先に行く三角形の隣に、それは視覚的な外観からであることがわかります。 
ここで我々は、未知のポイントとクラスに分類最も近い点を持っていることに注意してください。このような分類器、正確と呼ばれる最近傍分類器(最近傍、NN)。これは、特殊なケースであるKNN K = 1の場合です。 
だから、K最近傍は、定義により、基準点まで不明であるその最も近い最初のk個のクラスからは、ポイントまで、内部のk個のポイントを見て、ポイントされたカテゴリ、それがどのカテゴリ未知のポイントと考えてに属します。中心円として未知点以上又は〜図は、実線で描かれた円は、3 = kに対応する、からの二つの三角形、正方形最初の三つの最も近い点から選択されますそのため、不明な点は、三角形のクラスに起因します。しかし、破線、すなわちK = 5を考慮すると、3つの正方形、二つの三角形を見つけたので、この時クラスの正方形に正規化未知点。 
だから我々は、最近傍の異なる数は、多くの場合、異なる分類結果につながる見ることができ、一般的に、我々は実際の状況と経験の実用化にkの値を決定する必要があります。

自己参照セクションボーエンの原則:https://blog.csdn.net/weixin_41988628/article/details/80369850

KNN分類器は、単純な二次元の例の使用を分類します

次のように二次元の点コードセクションのセットを作成します。

ランダムクラス1とクラス2を設定された2つの異なる二次元ポイントを作成、生成、各セットは、それぞれ、2つの点を有し、リングの周りに正規分布の仕方によって、主なパラメータの正常範囲タグを調整することにより大きなパラメータ、さらにより分散したデータ点の広い範囲を達成します。

   リングの周り範囲分布は、外側リングの半径rは、濃度データセットの程度、大きいR、データのより大きな範囲、より多くの分散を決定します

# -*- coding: utf-8 -*-
#生成点的过程
from numpy.random import randn
import pickle
from pylab import *

# create sample data of 2D points
# 打印两百个点
n = 200
# two normal distributions
# 两百个二维的点并通过*0.6限制他们的范围
class_1 = 0.8 * randn(n,2)
class_2 = 1.0 * randn(n,2) + array([5,1])
# 给他们分标签
labels = hstack((ones(n),-ones(n)))
# save with Pickle
#with open('points_normal.pkl', 'w') as f:
# 把他们存进
with open('points_normal_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)
# normal distribution and ring around it
print ("save OK!")
# 环状的数据
class_1 = 0.3 * randn(n,2)
r = 0.5 * randn(n,1) + 5
angle = 2*pi * randn(n,1)
class_2 = hstack((r*cos(angle),r*sin(angle)))
labels = hstack((ones(n),-ones(n)))
# save with Pickle
#with open('points_ring.pkl', 'w') as f:
with open('points_ring_test.pkl', 'wb') as f:
    pickle.dump(class_1,f)
    pickle.dump(class_2,f)
    pickle.dump(labels,f)
    
print ("save OK!")

点ランダムに生成されたクラスコードの上記セットを使用してKNN分類器は、以下の通りであります:

可視化は、二次元アレイ及びソータのx、y座標を得るために、全ての試験データポイントを分類し、分類器は、2つの異なるクラスを分離する方法を示すために、二次関数の分類(X、Y、モデル=モデル)を作成するために必要そして1つの予測クラスは、タグ配列の配列を返します。その後、実際の関数に渡されるパラメータとしてplot_2D_boundary描画機能を分類します。

これは、マッピング関数の分類を必要とし、今予測関数meshgridにグリッド()関数は、グリッドの精度は0.1、コレクション毎に0.1ポイントです。輪郭識別境界がゼロのデフォルトの輪郭で、境界の位置を表示することがあります。Oドロー間違った分級点で正しいクラス分類*抽選で各カテゴリ、について

# -*- coding: utf-8 -*-
import pickle
from pylab import *
from PCV.classifiers import knn
from PCV.tools import imtools

pklist=['points_normal.pkl','points_ring.pkl']

figure()

# load 2D points using Pickle
# 枚举前面的两个元素
for i, pklfile in enumerate(pklist):
    with open(pklfile, 'rb') as f:
        class_1 = pickle.load(f)
        class_2 = pickle.load(f)
        labels = pickle.load(f)
    # load test data using Pickle
    with open(pklfile[:-4]+'_test.pkl', 'rb') as f:
        class_1 = pickle.load(f)
        class_2 = pickle.load(f)
        labels = pickle.load(f)

#knn分类器
    model = knn.KnnClassifier(labels,vstack((class_1,class_2)))
    # test on the first point
    print (model.classify(class_1[0]))

    #define function for plotting
    def classify(x,y,model=model):
        return array([model.classify([xx,yy]) for (xx,yy) in zip(x,y)])

    # lot the classification boundary
    subplot(1,2,i+1)
    # 画分界线
    imtools.plot_2D_boundary([-6,6,-6,6],[class_1,class_2],classify,[1,-1])
    titlename=pklfile[:-4]
    title(titlename)
show()

上記のコードを使用すると、良好な結果がデータセットを分類し、以下に示される結果が不足し、ない緻密なケース誤分類され

 

   範囲の形式を次のようにいくつかのより高密度の調整の正常範囲未満、通常の設定点コードが変更され

class_1 = 0.8 * randn(n,2)
class_2 = 1.0 * randn(n,2) + array([5,1])

分類結果は、丸で示す点の誤分類を誤分類のケースを発見しました。

(密)の実装密度の高い特徴画像をふるいにかけます

コードは以下の通りであります:

# -*- coding: utf-8 -*-
from PCV.localdescriptors import sift, dsift
from pylab import  *
from PIL import Image

dsift.process_image_dsift('gesture/wenwen.jpg','wenwen.dsift',90,40,True)
#读取dsif文件
l,d = sift.read_features_from_file('wenwen.dsift')
im = array(Image.open('gesture/wenwen.jpg'))
sift.plot_features(im,l,True)
title('dense SIFT')
show()

図の演算結果を次のように

コードdsift.process_image_dsift(「ジェスチャー/ wenwen.jpg」、「wenwen.dsift」、90,40、真の)40が同一の保持リングのサイズが、ステップになるステップを示し、円90の大きさを示します次のように素晴らしい結果図80は、次のとおりです。

これらの結果は、ステップを有する円の同じ大きさは、円の中心点との間のより大きな距離を増加させる場合に

画像分類 - ジェスチャー認識を実装

画像記述子とジェスチャーコード可視化以下の通りであります:

稠密SIFT記述子を用いてジェスチャ画像上、これらのテストを表し、データベースに設定されたテストデータを記録します。画像作成コードは、署名ファイルの接尾辞を指定します.dsift

# -*- coding: utf-8 -*-
import os
from PCV.localdescriptors import sift, dsift
from pylab import  *
from PIL import Image

imlist=['gesture/wen/C-uniform02.jpg','gesture/wen/B-uniform01.jpg',
        'gesture/wen/A-uniform01.jpg','gesture/wen/Five-uniform01.jpg',
        'gesture/wen/Point-uniform01.jpg','gesture/wen/V-uniform01.jpg']

figure()
for i, im in enumerate(imlist):
    print (im)
    dsift.process_image_dsift(im,im[:-3]+'dsift',40,20,True)
    l,d = sift.read_features_from_file(im[:-3]+'dsift')
    dirpath, filename=os.path.split(im)
    im = array(Image.open(im))
    #显示手势含义title
    titlename=filename[:-14]
    subplot(2,3,i+1)
    sift.plot_features(im,l,True)
    title(titlename)
show()

次のように業績は以下のとおりです。

ジェスチャーデータトレーニングコードによって認識は次のとおりです。

演算結果は、多くの画像が正しく分類されている方法を与えられた一連のテストの正解率を表示するために使用されますが、それは私たちに教えてくれないの後どのようなジェスチャーを分類するのが難しい、またはそのミス。この時点で、我々は混乱マトリックスにより誤分類された場合を表示することができます。混同行列は、行列の各カテゴリーに分かれてどのように多くのサンプルの各タイプの表示することができ、それは誤差分布を表示することができ、同様にクラスが頻繁にお互いがで「混乱」されています

# -*- coding: utf-8 -*-
from PCV.localdescriptors import dsift
import os
from PCV.localdescriptors import sift
from pylab import *
from PCV.classifiers import knn

def get_imagelist(path):
    """    Returns a list of filenames for
        all jpg images in a directory. """
#获取图片的路径
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]

def read_gesture_features_labels(path):
    # create list of all files ending in .dsift
    featlist = [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.dsift')]
    # read the features
    features = []
    for featfile in featlist:
        l,d = sift.read_features_from_file(featfile)
        features.append(d.flatten())
    features = array(features)
    # create labels
    labels = [featfile.split('/')[-1][0] for featfile in featlist]
    return features,array(labels)

def print_confusion(res,labels,classnames):
    n = len(classnames)
    # confusion matrix
    class_ind = dict([(classnames[i],i) for i in range(n)])
    confuse = zeros((n,n))
    for i in range(len(test_labels)):
        #是正确的类别就加一
        confuse[class_ind[res[i]],class_ind[test_labels[i]]] += 1
    print ('Confusion matrix for')
    print (classnames)
    print (confuse)

filelist_train = get_imagelist('gesture/train')
filelist_test = get_imagelist('gesture/test')
imlist=filelist_train+filelist_test

# process images at fixed size (50,50)
for filename in imlist:
    featfile = filename[:-3]+'dsift'
    dsift.process_image_dsift(filename,featfile,10,5,resize=(50,50))

features,labels = read_gesture_features_labels('gesture/train/')
test_features,test_labels = read_gesture_features_labels('gesture/test/')
classnames = unique(labels)

# test kNN
k = 1
knn_classifier = knn.KnnClassifier(labels,features)
res = array([knn_classifier.classify(test_features[i],k) for i in
range(len(test_labels))])
# accuracy
acc = sum(1.0*(res==test_labels)) / len(test_labels)
print ('Accuracy:', acc)

print_confusion(res,test_labels,classnames)
# 结果竖着看,其他数值表示错判的类别

次のように業績は以下のとおりです。

結果は、81.3パーセントの正しい分類率

混淆矩阵竖着看,比如A列,分类正确的有26,将A分错成V有三个

A、B、C、F、V的分类结果都比较好,错误率较低

而P类错分成V的概率很高

 

 

 

おすすめ

転載: blog.csdn.net/weixin_43955429/article/details/90346606