Einführung
In diesem Lab wird gezeigt, wie man KBinsDiscretizer aus der Scikit-learn-Bibliothek verwendet, um die Vektorisierung auf einem Beispielbild eines Waschbärengesichts durchzuführen. Die Vektorisierung ist eine Technik, um die Anzahl der Graustufen zu reduzieren, die zum Darstellen eines Bildes verwendet werden. Wir werden KBinsDiscretizer verwenden, um die Vektorisierung auf dem Waschbärenbild durchzuführen. Wir werden 8 Graustufen verwenden, um das Bild zu repräsentieren, was auf nur 3 Bits pro Pixel komprimiert werden kann. Wir werden die einheitlichen und k-Means-Clustering-Strategien vergleichen, um die Pixelwerte auf die 8 Graustufen zuzuordnen.
Tipps für die VM
Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Originalbild laden und anzeigen
Wir beginnen mit dem Laden des Waschbärenbildes aus Scipy. Wir werden das Bild anzeigen und seine Form, den Datentyp und den Arbeitsspeicherbedarf überprüfen.
from scipy.misc import face
import matplotlib.pyplot as plt
raccoon_face = face(gray=True)
print(f"Die Dimension des Bildes ist {raccoon_face.shape}")
print(f"Die Daten, die zum Codieren des Bildes verwendet werden, sind vom Typ {raccoon_face.dtype}")
print(f"Die Anzahl der in RAM verwendeten Bytes beträgt {raccoon_face.nbytes}")
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(raccoon_face, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("Originalbild")
ax[1].hist(raccoon_face.ravel(), bins=256)
ax[1].set_xlabel("Pixelwert")
ax[1].set_ylabel("Anzahl der Pixel")
ax[1].set_title("Verteilung der Pixelwerte")
_ = fig.suptitle("Originalbild eines Waschbärenengesichts")
Vektorisierung mit KBinsDiscretizer
Wir werden nun KBinsDiscretizer verwenden, um die Vektorisierung auf dem Waschbärenbild durchzuführen. Wir werden 8 Graustufen verwenden, um das Bild zu repräsentieren, was auf nur 3 Bits pro Pixel komprimiert werden kann. Wir werden die einheitlichen und k-Means-Clustering-Strategien verwenden, um die Pixelwerte auf die 8 Graustufen zuzuordnen.
Einheitliche Stichprobenstrategie
Wir werden zunächst die einheitliche Stichprobenstrategie verwenden, um die Pixelwerte auf die 8 Graustufen zuzuordnen.
from sklearn.preprocessing import KBinsDiscretizer
n_bins = 8
encoder = KBinsDiscretizer(
n_bins=n_bins, encode="ordinal", strategy="uniform", random_state=0
)
compressed_raccoon_uniform = encoder.fit_transform(raccoon_face.reshape(-1, 1)).reshape(
raccoon_face.shape
)
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(compressed_raccoon_uniform, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("Einheitliche Stichprobe")
ax[1].hist(compressed_raccoon_uniform.ravel(), bins=256)
ax[1].set_xlabel("Pixelwert")
ax[1].set_ylabel("Anzahl der Pixel")
ax[1].set_title("Verteilung der Pixelwerte")
_ = fig.suptitle("Waschbärenbild, komprimiert mit 3 Bits und einer einheitlichen Strategie")
K-Means-Clustering-Strategie
Wir werden nun die k-Means-Clustering-Strategie verwenden, um die Pixelwerte auf die 8 Graustufen zuzuordnen.
encoder = KBinsDiscretizer(
n_bins=n_bins, encode="ordinal", strategy="kmeans", random_state=0
)
compressed_raccoon_kmeans = encoder.fit_transform(raccoon_face.reshape(-1, 1)).reshape(
raccoon_face.shape
)
fig, ax = plt.subplots(ncols=2, figsize=(12, 4))
ax[0].imshow(compressed_raccoon_kmeans, cmap=plt.cm.gray)
ax[0].axis("off")
ax[0].set_title("K-Means-Clustering")
ax[1].hist(compressed_raccoon_kmeans.ravel(), bins=256)
ax[1].set_xlabel("Pixelwert")
ax[1].set_ylabel("Anzahl der Pixel")
ax[1].set_title("Verteilung der Pixelwerte")
_ = fig.suptitle("Waschbärenbild, komprimiert mit 3 Bits und einer K-Means-Strategie")
Arbeitsspeicherbedarf
Wir werden nun den Arbeitsspeicherbedarf der komprimierten Bilder überprüfen. Wir erwarten, dass das komprimierte Bild 8-mal weniger Arbeitsspeicher benötigt als das Originalbild.
print(f"Die Anzahl der in RAM verwendeten Bytes beträgt {compressed_raccoon_kmeans.nbytes}")
print(f"Kompressionsverhältnis: {compressed_raccoon_kmeans.nbytes / raccoon_face.nbytes}")
Zusammenfassung
In diesem Lab haben wir KBinsDiscretizer aus der Scikit-learn-Bibliothek verwendet, um die Vektorisierung auf einem Beispielbild eines Waschbärenengesichts durchzuführen. Wir haben 8 Graustufen verwendet, um das Bild zu repräsentieren, was auf nur 3 Bits pro Pixel komprimiert werden kann. Wir haben die einheitlichen und k-Means-Clustering-Strategien verglichen, um die Pixelwerte auf die 8 Graustufen zuzuordnen. Wir haben festgestellt, dass die k-Means-Clustering-Strategie eine ausgewogenerere Verteilung der Pixelwerte liefert. Wir haben auch den Arbeitsspeicherbedarf der komprimierten Bilder überprüft und festgestellt, dass das komprimierte Bild aufgrund der Verwendung einer 64-Bit-Float-Darstellung für das komprimierte Bild 8-mal mehr Arbeitsspeicher benötigt als das Originalbild.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Lab zu Vektorisierung mit KBinsDiscretizer abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.