画像認識の原理の詳細な説明

コンピューターは画像を直接認識できません。いくつかの前処理方法を使用して、画像をコンピューターが認識できるもの(0や1など)に変換する必要があります。このセクションでは、Pythonで画像を処理して、コンピューターが認識できるものにする方法について説明します。

1.画像のサイズ変更と表示

Pillowライブラリは、広く使用されている強力で使いやすいサードパーティの画像処理ライブラリです。ライブラリが利用できない場合は、「pipinstallpillow」コマンドを使用してインストールできます。デモコードは以下の通りです。

番号4.png

from PIL import Image
img = Image.open("数字4.png")
img = img.resize((32,32))
img.show()
复制代码

出力は次のとおりです。

image.png

2.画像​​のグレースケール処理

元の画像はカラー番号4であり、後で番号0と1に変換できるように、グレースケールして白黒の番号4に変換する必要があります。コードは次のとおりです。

img = img.convert("L")
img.show()
复制代码

出力は次のとおりです。

image.png

3.画像の2値化処理

白黒番号4を取得した後、キー画像の2値化処理を行う必要があります。コードは以下のとおりです。

import numpy as np
img_new = img.point(lambda x:0 if x > 128 else 1) 
arr = np.array(img_new)
复制代码
  • 1行目では、後で画像を2次元配列に変換する準備としてNumPyライブラリを紹介しています。

  • コードの2行目のpoint()関数は、各ピクセルを操作できます。point()関数で渡されるコンテンツは、パンダライブラリに記載されているラムダ無名関数です。これは、カラー値が128ピクセルより大きいことを意味します。割り当てが0の場合、割り当ては1です。画像がグレースケールで処理された後、各ピクセルは0〜255の範囲の数値で表されます。ここで、0は黒、255は白を表します。したがって、ここでは128が分割のしきい値として使用されます。つまり、元の白い領域が割り当てられます。 0の場合、元の黒い領域には1の値が割り当てられます。これで、色を0と1の数字に変換する作業が完了しました。

  • コードの3行目は、NumPyライブラリのarray()関数を使用して、数値0と1に変換された32×32ピクセルの画像を32×32の2次元配列に変換し、変数arrに割り当てます。

現時点では、print()関数を直接使用してarrを出力できますが、行と列が多いため、完全に表示されない場合があるため、次のコードを使用してarrの各行を順番に出力します。コードの最初の行のarr.shapeは、配列の行と列の数を取得します。arr.shape[0]は行の数に対応し、arr.shape [1]は列の数に対応するため、次のようになります。各行は、forループのコンテンツを介して印刷できます。

for i in range(arr.shape[0]):
    print(arr[i])
复制代码

image.png

4.2次元配列を1次元配列に変換します

上記で取得した32×32の2次元配列は、データモデリングには使用できないため、reshape(1、-1)関​​数を使用して行に変換する必要があります(reshape(-1,1)と記述した場合は、列に変換されます)、つまり、1×1024の1次元配列の場合、コードは次のようになります。

arr_new = arr.reshape(1,-1)
arr_new
复制代码

image.png

次のコードを使用して、1次元配列arr_newの行と列の数を出力します。

arr_new.shape
复制代码
(1, 1024)
复制代码

処理された1次元配列arr_newを以前にトレーニングされたknnモデルに渡します。コードは次のとおりです。

手書きフォントRecognition.xlsxをダウンロード

import pandas as pd
df = pd.read_excel("手写字体识别.xlsx")
x = df.drop(columns="对应数字")
y = df["对应数字"]
from sklearn.model_selection import train_test_split 
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=123)
from sklearn.neighbors import KNeighborsClassifier as KNN 
knn = KNN(n_neighbors=5) 
knn.fit(x_train,y_train)
answer = knn.predict(arr_new)
复制代码

出力は次のとおりです。

image.png

5.まとめ

一般に、K最近傍アルゴリズムは非常に古典的な機械学習アルゴリズムであり、その原理は明確で、単純で、理解しやすいものですが、いくつかの欠点もあります。たとえば、サンプルサイズが大きい場合、計算量はが大きく、フィッティング速度が遅い。

おすすめ

転載: juejin.im/post/7086364553109307423