Ausführliche Erklärung des Prinzips der Bilderkennung

Computer können ein Bild nicht direkt erkennen. Wir müssen das Bild durch einige Vorverarbeitungsmethoden in etwas umwandeln, das der Computer erkennen kann, wie zum Beispiel die Zahlen 0 und 1. In diesem Abschnitt wird erläutert, wie Sie ein Bild in Python einfach verarbeiten, um es zu etwas zu machen, das der Computer erkennen kann.

1. Größenänderung und Anzeige von Bildern

Die Pillow-Bibliothek ist eine leistungsstarke, einfach zu verwendende Bildverarbeitungsbibliothek von Drittanbietern, die weit verbreitet ist. Wenn die Bibliothek nicht verfügbar ist, kann sie über den Befehl "pip install Pillow" installiert werden. Der Democode lautet wie folgt.

Zahl 4.png

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

Die Ausgabe ist wie folgt:

Bild.png

2. Bildverarbeitung in Graustufen

Das Originalbild ist eine Farbnummer 4, wir müssen es graustufen, um es in eine Schwarzweißnummer 4 umzuwandeln, damit wir es später in die Nummern 0 und 1 umwandeln können, der Code ist unten.

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

Die Ausgabe ist wie folgt:

Bild.png

3. Bildbinarisierungsverarbeitung

Nach Erhalt der Schwarz-Weiß-Nummer 4 ist es notwendig, die Schlüsselbild-Binärisierungsverarbeitung auszuführen.Der Code ist wie folgt.

import numpy as np
img_new = img.point(lambda x:0 if x > 128 else 1) 
arr = np.array(img_new)
复制代码
  • Zeile 1 stellt die NumPy-Bibliothek als Vorbereitung für die spätere Konvertierung des Bildes in ein zweidimensionales Array vor.

  • Die Funktion point() in der zweiten Codezeile kann jedes Pixel manipulieren.Der Inhalt, der in der Funktion point() übergeben wird, ist die anonyme Lambda-Funktion, die in der Pandas-Bibliothek erwähnt wird, was bedeutet, dass der Farbwert größer als 128 Pixel ist.Die Zuweisung ist 0, ansonsten ist die Zuweisung 1. Nachdem das Bild in Graustufen verarbeitet wurde, wird jedes Pixel durch eine Zahl im Bereich von 0 bis 255 dargestellt, wobei 0 für Schwarz und 255 für Weiß steht, sodass hier 128 als Schwellenwert für die Teilung verwendet wird, d. h. der ursprüngliche weiße Bereich wird zugewiesen Wenn es 0 ist, wird dem ursprünglichen schwarzen Bereich der Wert 1 zugewiesen. Damit ist die Umwandlung der Farben in die Zahlen 0 und 1 abgeschlossen.

  • Die dritte Codezeile verwendet die Funktion array() der NumPy-Bibliothek, um das 32×32-Pixel-Bild, das in die Zahlen 0 und 1 umgewandelt wurde, in ein zweidimensionales 32×32-Array zu konvertieren und es der Variablen arr zuzuweisen.

Zu diesem Zeitpunkt können Sie die Funktion print() direkt verwenden, um arr auszudrucken, aber aufgrund der vielen Zeilen und Spalten wird es möglicherweise nicht vollständig angezeigt, also drucken wir jede Zeile von arr der Reihe nach durch den folgenden Code. Das arr.shape in der ersten Codezeile erhält die Anzahl der Zeilen und Spalten des Arrays, arr.shape[0] entspricht der Anzahl der Zeilen und arr.shape[1] entspricht der Anzahl der Spalten, so dass Jede Zeile kann über den Inhalt der for-Schleife gedruckt werden.

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

Bild.png

4. Konvertieren Sie ein zweidimensionales Array in ein eindimensionales Array

Das oben erhaltene zweidimensionale 32×32-Array kann nicht für die Datenmodellierung verwendet werden, daher muss es mit der Funktion reshape(1,-1) in eine Zeile konvertiert werden (wenn es als reshape(-1,1) geschrieben wird, wird es in eine Spalte umgewandelt werden), also ein eindimensionales Array von 1 × 1024, lautet der Code wie folgt.

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

Bild.png

Verwenden Sie den folgenden Code, um die Anzahl der Zeilen und Spalten des eindimensionalen Arrays arr_new auszugeben.

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

Übergeben Sie das verarbeitete eindimensionale Array arr_new an das zuvor trainierte knn-Modell.Der Code lautet wie folgt.

Laden Sie Handschrifterkennung.xlsx herunter

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)
复制代码

Die Ausgabe ist wie folgt:

Bild.png

5. Zusammenfassung

Im Allgemeinen ist der K-Nächste-Nachbar-Algorithmus ein sehr klassischer Machine-Learning-Algorithmus. Sein Prinzip ist klar, einfach und leicht verständlich. Allerdings hat er auch einige Nachteile. Zum Beispiel, wenn die Stichprobengröße groß ist, der Berechnungsaufwand groß ist und die Anpassungsgeschwindigkeit langsam ist.

Ich denke du magst

Origin juejin.im/post/7086364553109307423
Empfohlen
Rangfolge