Векторное квантование с использованием KBinsDiscretizer

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии показано, как использовать KBinsDiscretizer из библиотеки Scikit-learn для выполнения векторной квантования на образце изображения浣熊 face. Векторное квантование - это техника уменьшения количества градаций серого, используемых для представления изображения. Мы будем использовать KBinsDiscretizer для выполнения векторного квантования на изображении浣熊 face. Мы будем использовать 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы сравним стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка и отображение исходного изображения

Начнем с загрузки изображения浣熊 face из Scipy. Отобразим изображение и проверим его размер, тип данных и использование памяти.

from scipy.misc import face
import matplotlib.pyplot as plt

raccoon_face = face(gray=True)

print(f"The dimension of the image is {raccoon_face.shape}")
print(f"The data used to encode the image is of type {raccoon_face.dtype}")
print(f"The number of bytes taken in RAM is {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("Original Image")
ax[1].hist(raccoon_face.ravel(), bins=256)
ax[1].set_xlabel("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Original Image of a Raccoon Face")

Векторное квантование с использованием KBinsDiscretizer

Теперь мы будем использовать KBinsDiscretizer для выполнения векторного квантования на изображении浣熊 face. Мы будем использовать 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы будем использовать стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого.

Стратегия равномерного выборки

Сначала мы будем использовать стратегию равномерного выборки для отображения значений пикселей на 8 градациях серого.

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("Uniform Sampling")
ax[1].hist(compressed_raccoon_uniform.ravel(), bins=256)
ax[1].set_xlabel("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Raccoon face compressed using 3 bits and a uniform strategy")
Стратегия k-средних кластеризации

Теперь мы будем использовать стратегию k-средних кластеризации для отображения значений пикселей на 8 градациях серого.

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("Pixel value")
ax[1].set_ylabel("Count of pixels")
ax[1].set_title("Distribution of the pixel values")
_ = fig.suptitle("Raccoon face compressed using 3 bits and a K-means strategy")

Затраты памяти

Теперь мы проверим использование памяти сжатых изображений. Мы ожидаем, что сжатое изображение займет в 8 раз меньше памяти, чем исходное.

print(f"The number of bytes taken in RAM is {compressed_raccoon_kmeans.nbytes}")
print(f"Compression ratio: {compressed_raccoon_kmeans.nbytes / raccoon_face.nbytes}")

Резюме

В этом практическом занятии мы использовали KBinsDiscretizer из библиотеки Scikit-learn для выполнения векторного квантования на образце изображения浣熊 face. Мы использовали 8 градаций серого для представления изображения, которое можно сжать до использования только 3 бит на пиксель. Мы сравнили стратегии равномерного и k-средних кластеризации для отображения значений пикселей на 8 градациях серого. Мы обнаружили, что стратегия k-средних кластеризации обеспечивает более сбалансированное распределение значений пикселей. Мы также проверили использование памяти сжатых изображений и обнаружили, что сжатое изображение занимает в 8 раз больше памяти, чем исходное, из-за использования 64-разрядного представления с плавающей запятой для сжатого изображения.

Резюме

Поздравляем! Вы завершили практическое занятие по векторному квантованию с использованием KBinsDiscretizer. Вы можете выполнить больше практических занятий в LabEx, чтобы улучшить свои навыки.