내맘대로 공부기록.

[ STUDY ]

[이미지 분류] K-Means 클러스터 알고리즘 사용해보기.

fwanggus 2022. 4. 23. 22:47

K-Means 알고리즘 개념

 

K-Means 이론과 고찰 :

  • 이미지의 픽셀 분포를 수학적 계산하여 세그멘테이션 분류를 할 수 있다.
  • 그야말로 수학적인 알고리즘으로 픽셀을 분류한다.(머신러닝의 훈련과정은 없다. 다만 범주로 나누고자 하면, 비지도 학습 부분이라고 한다.)
  • 클러스터 그룹을 나누는 과정은 거리 기반의 그룹 간 비유사도 (dissimilarity)와 같은 비용 함수 (cost function)을 최소화하는 방식으로 이루어진다(출처 : 위키피디아) 
  • (위키피디아에 자세한 설명있음) 한계점으로, 각 클러스터의 초기 중심값 및 유저가 설정하는 클러스터 개수에 의존성이 높으며 클러스터를 잘못 분류할 수 있는 가능성이 다소 높다.
  • 하지만, 이미지를 분류하는 알고리즘 중에 가장 간단하고 빠르게 구현해볼 수 있는 장점이 있어서 이미지 세그멘테이션을 공부하는 소스로 좋은 것 같다.

 

 

k-평균 알고리즘 - 위키백과, 우리 모두의 백과사전

k-평균 알고리즘(K-means clustering algorithm)은 주어진 데이터를 k개의 클러스터로 묶는 알고리즘으로, 각 클러스터와 거리 차이의 분산을 최소화하는 방식으로 동작한다. 이 알고리즘은 자율 학습의

ko.wikipedia.org

 

참고한 블로그

 

Image Segmentation | Types Of Image Segmentation

Image segmentation tutorial to learn about types of image segmentation and its techniques. A step by step guide for how to implement them in Python.

www.analyticsvidhya.com

 

데모 및 사용법(code@kaggle)

(각종 라이브러리 import는 생략함. 상세 캐글 노트북)

*이미지 읽기 및 shape 변경

# make pixel values from 0 to 1
pic = plt.imread("../input/imgfile/1.jpeg")/255

# change img shape.
pic_1d = pic.reshape(pic.shape[0]*pic.shape[1], pic.shape[2]) # shape[2] is the number of channel.

 

원본 이미지.

 

*K-Means 분류기 적용하기

(공식문서)

 

sklearn.cluster.KMeans

Examples using sklearn.cluster.KMeans: Release Highlights for scikit-learn 0.23 Release Highlights for scikit-learn 0.23, Demonstration of k-means assumptions Demonstration of k-means assumptions, ...

scikit-learn.org

# import kmeans library
from sklearn.cluster import KMeans
kmean = KMeans(n_clusters=5, random_state=0).fit(pic_1d)

 

KMeans 라이브러리 적용으로, 다음과 같은 데이터를 가져올 수 있다.

  • labels_ : 각 픽셀의 클러스터 레이블 값(사용한 데모에서는 n_clusters=5 이기 때문에 0~4 중에 하나의 레이블이 각 픽셀에 할당되어진다.)
  • cluster_centers_ : 알고리즘 계산으로 결정된 각 클러스터 영역의 중심 좌표값

 

*출력된 데이터를 이미지에 적용 및 reshape 하기

# apply kmean attribues and ready for showing.
pic2show = kmean.cluster_centers_[kmean.labels_]

# change shape of matrix with original img shape.
clusterPic = pic2show.reshape(pic.shape[0],pic.shape[1],pic.shape[2])

5개의 클러스터 그룹으로 분류된 이미지를 확인할 수 있다.

 

각 클러스터 분류된 이미지.

 

 

 

*레이블 데이터의 히스토그램 : Kmean의 필드 값인 labels_ 의 분포를 확인.

import seaborn as sns
sns.histplot(data=kmean.labels_)

 

레이블 번호에 따른 픽셀 갯수를 나타내는 히스토그램.

 

다음엔 조금 더 고난도의 세그멘테이션에 도전 !

반응형