KBinsDiscretizer 를 이용한 벡터 양자화

Beginner

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

소개

이 실습에서는 Scikit-learn 라이브러리의 KBinsDiscretizer 를 사용하여 족제비 얼굴 이미지의 샘플에 대한 벡터 양자화를 수행하는 방법을 보여줍니다. 벡터 양자화는 이미지를 나타내는 데 사용되는 회색 레벨의 수를 줄이는 기술입니다. 족제비 얼굴 이미지에 KBinsDiscretizer 를 사용하여 벡터 양자화를 수행할 것입니다. 이미지를 나타내는 데 8 개의 회색 레벨을 사용할 것이며, 이는 각 픽셀당 3 비트만 사용하여 압축할 수 있습니다. 픽셀 값을 8 개의 회색 레벨로 매핑하기 위해 균일 및 k-평균 클러스터링 전략을 비교할 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

원본 이미지 로드 및 표시

먼저 Scipy 에서 족제비 얼굴 이미지를 로드합니다. 이미지를 표시하고 모양, 데이터 유형 및 메모리 사용량을 확인합니다.

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

raccoon_face = face(gray=True)

print(f"이미지의 차원은 {raccoon_face.shape}입니다.")
print(f"이미지 인코딩에 사용된 데이터 유형은 {raccoon_face.dtype}입니다.")
print(f"RAM 에서 차지하는 바이트 수는 {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("원본 이미지")
ax[1].hist(raccoon_face.ravel(), bins=256)
ax[1].set_xlabel("픽셀 값")
ax[1].set_ylabel("픽셀 개수")
ax[1].set_title("픽셀 값 분포")
_ = fig.suptitle("족제비 얼굴의 원본 이미지")

KBinsDiscretizer 를 이용한 벡터 양자화

이제 KBinsDiscretizer 를 사용하여 족제비 얼굴 이미지에 대한 벡터 양자화를 수행합니다. 이미지를 나타내는 데 8 개의 회색 레벨을 사용하며, 이는 각 픽셀당 3 비트만 사용하여 압축할 수 있습니다. 픽셀 값을 8 개의 회색 레벨로 매핑하기 위해 균일 및 k-평균 클러스터링 전략을 사용할 것입니다.

균일 샘플링 전략

먼저 균일 샘플링 전략을 사용하여 픽셀 값을 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("균일 샘플링")
ax[1].hist(compressed_raccoon_uniform.ravel(), bins=256)
ax[1].set_xlabel("픽셀 값")
ax[1].set_ylabel("픽셀 개수")
ax[1].set_title("픽셀 값 분포")
_ = fig.suptitle("균일 전략을 사용하여 3 비트로 압축된 족제비 얼굴 이미지")
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-평균 클러스터링")
ax[1].hist(compressed_raccoon_kmeans.ravel(), bins=256)
ax[1].set_xlabel("픽셀 값")
ax[1].set_ylabel("픽셀 개수")
ax[1].set_title("픽셀 값 분포")
_ = fig.suptitle("K-평균 전략을 사용하여 3 비트로 압축된 족제비 얼굴 이미지")

메모리 사용량

이제 압축된 이미지의 메모리 사용량을 확인합니다. 압축된 이미지는 원본 이미지보다 메모리를 8 배 적게 사용할 것으로 예상됩니다.

print(f"RAM 에서 차지하는 바이트 수는 {compressed_raccoon_kmeans.nbytes}입니다.")
print(f"압축률: {compressed_raccoon_kmeans.nbytes / raccoon_face.nbytes}")

요약

이 실험에서는 Scikit-learn 의 KBinsDiscretizer 를 사용하여 족제비 얼굴 이미지의 샘플에 대한 벡터 양자화를 수행했습니다. 이미지를 나타내기 위해 8 개의 회색 레벨을 사용했으며, 이는 각 픽셀당 3 비트만 사용하여 압축할 수 있습니다. 픽셀 값을 8 개의 회색 레벨로 매핑하기 위해 균일 및 k-평균 클러스터링 전략을 비교했습니다. 그 결과 k-평균 클러스터링 전략이 픽셀 값의 분포를 더욱 균형 있게 만드는 것을 확인했습니다. 또한 압축된 이미지의 메모리 사용량을 확인했는데, 압축된 이미지는 64 비트 부동소수점 표현을 사용했기 때문에 원본 이미지보다 메모리를 8 배 더 사용했습니다.

요약

KBinsDiscretizer 를 이용한 벡터 양자화 실험을 완료하셨습니다! LabEx 에서 더 많은 실험을 통해 기술을 향상시켜 보세요.