クラスタリングのk-meansで画像の分類に挑戦

のえる のえる 2019.04.05

みなさん、画像はどうやって管理していますか?
私は画像ディレクトリに雑多に入れているため、いつも探すのが大変です。
整理したいけど自分でやるのは面倒・・・。
そんな時に「k-meansで分類できるんじゃない?」という話を聞いたので試してみました。

事前情報

自動分類にはPythonを利用します。
Pythonにはバージョンがありますが、今回は3を利用しています。
また、Pythonの「Jupyter notebook」というものを利用し、ブラウザからPythonが実行できる環境となっています。
 
Python: 3.7.1(Anaconda)
Jupyter notebook: 5.7.4
 
※Python3およびJupyter notebookのインストールは割愛いたします。

そもそもk-meansって何?

k-means(k平均法)とは、ウィキペディアによるとこんな感じだそうです。

k平均法(kへいきんほう、英: k-means clustering)は、非階層型クラスタリングのアルゴリズム。
クラスタの平均を用い、与えられたクラスタ数k個に分類することから、MacQueen がこのように命名した。
k-平均法(k-means)、c-平均法(c-means)とも呼ばれる。
 
https://ja.wikipedia.org/wiki/K平均法

つまり、「個数kを指定すると、その数に自動的に分類してくれる」という感じみたいです。

分類してみる

では画像を分類していきましょう。
まずは各種ライブラリなどを読み込みます。

次に、画像が保存されているディレクトリを指定し、中身のファイル一覧を取ってきます。
※ここではソースコードと同じディレクトリにある「img」ディレクトリ内のjpgファイルのみ取得しています。

画像の一覧が取得出来たら、画像サイズを取得・チェックしましょう。

画像サイズを調整しながら、データセットを作成します。

データセットは多次元になっており、次元数が多すぎるため、「次元数の圧縮」を行います。

さて、お待たせしました。
クラスタ数を指定し、分類を行っていきましょう。

ここまでのプログラムを実行すると、img内のjpg画像が5つに分類されるかと思います。
(「img_0」 から 「img_4」 まで5つに分けられ、中に画像がコピーされます)

個数を指定したくない!!

何個に分類するか、それすらも自動化したいめんどくさがりやさんな人は多いと思います。
そんな方に朗報、 「x-means」 というものがあるそうです。
こちらはk-meansの 「k」 を自動推定してくれるので、クラスタ数を指定する必要がなくなります。

x-meansによるクラスタ数の推定

今回は「pyclustering」というライブラリを使用して、x-meansのクラスタ数推定を行ってみます。
まずはライブラリの読み込みを追加しましょう。
Step1の部分を改修します。

続いて、クラスタ数を指定する前に、x-meansでクラスタ数推定をします。

あとは最適クラスタサイズを指定して分類すればOKです。

これでめんどくさがりな人も分類ができるはず!!

さいごに

このx-meansによる最適クラスタ数推定ですが、
「確実なものではなく、大枠としての最適数が取得できる」だけで、
確実なクラスタ数が取得できるわけではありません。
 
また、この「教師なし学習」と呼ばれる方法においては、
「素材となる画像によって、分類方法が大きく異なることになる」ため、
「画像を足したら結果が変わった」というのはよくある話です。
 
ですので「完全な分類」をするのではなく、「与えられたものの中で大きく分類する」くらいの感覚が非常に近いです。
 
以上、画像分類の自動化のお話でした。

POPULAR

のえる

書いた人

のえる

Full-stack Developer / Guitarist