おまけサムネイル画像をクラスタリングするお新田先生(株)ライトコードの競馬サイエンティストこと、新田(にった)です!何かをクラスタリングしたいと、ある日、ふと思いました。100記事を超えた弊社のブログ。記事のサムネ画像を自動で分類させてみるか...(暇つぶしに)ということで、今回は、弊社ブログのサムネイル画像をクラスタリングするお。クラスタリングとはクラスタリングは、教師なし学習の一種です。データを特徴によって、いくつかの塊に分けることができます。以下のグラフを見て下さい固まったデータに対して事前に何も正解ラベルを与えていなくても右のように分類して(クラスタに分けて)くれるのです。今回は、弊社ブログのサムネイル画像に対して実行してみようと思います。K-Means法K-Means法は、シンプルなアルゴリズムです。各データと中心の距離を求めて最も近い中心のクラスタに再度割り当てるクラスタの割り当てが変わらなかったり重心が変化しなかったりしたら終了。データの距離を元にクラスタに分割していくことになります。画像のnumpy配列をflatにしてそのまま特徴量とする画像もRGBの数値なので、数値の配列を変形して学習してみます。p.split('/')[-1]))最初に読み込んだ時点では、画像サイズやタテヨコ比はマチマチです。そのため、一律で「64×64」のサイズに変換しています。ように平坦な形へ変形しています。分けるクラスタの数を指定しています。変えてみて試してみることにします。上の画像は、縦にクラスタが並んでいる感じになります。右端のクラスタは、キレイに簡易手書き数字認識アプリの記事の「前編」「後編」だけのクラスタとなっています。「第1回」「第2回」などのシリーズ物は全て同じクラスタ内には入っていますね。面白いのは、左から5番目のクラスタです。なんとなーく「左が暗い」「右が明るい」となっており、似ているといえば似ているような(?)気もします。ボカしてみると...たしかに。実際、どのようなことになっているか?先ほどのK-Means法の仕組みを思い出してみましょう。K-Means法では、距離を元にクラスタに分割しています。sklearnのKMeansは、距離の計算にユークリッド距離をつかっています。画像の距離は、各ピクセルごとの二乗和の平方根で表されます。一方で画像的な見た目は、どちらも縦線なのでAとBの方が近いように感じます。シンプルな画像なら良いのですが、それなりのカラー画像や写真に対しては、そのままK-Means法を行うのは少し無理があるように思います。主成分分析)は、多変数を少ない変数で表現し直す方法です。今回の記事で、詳細は避けますが、軸を新たにとり直すため、先ほどの方法では全く同じ場所のピクセル同士を参照していたという点が緩和されます。実行後の次元数を指定します。何次元に削減するかは、こちらで決める値となります。{}".format(sum(pca.explained_variance_ratio_)))累積寄与率は、各寄与率を足し合わせたもので、元のデータの何%を説明できているかを表します。しましたが、もう少し落としてもいいかもしれません。先ほどの結果と似てはいますが、シリーズ物がそれのみのクラスタとして分割されやすくなりました。教師あり学習のデータチェックなどで(ほとんど同じような画像が含まれているケース)使えそうですね。やりたいことは、ほとんど同じ画像をまとめたり検出したりすることではなく、クラスタリングなのでもう一歩進んだ結果が欲しいところです。学習済みネットワークを特徴抽出器として使うimagenetで学習済みネットワークは、100万枚を超える画像で1000種類のラベルに分類するよう学習しています。そのまま普通に予測してみましょう。予測結果の上位5件が入っています。ここで、一部結果を見てみましょう。0.004030874)]「comicbook」と出ました。確かにアメコミ調ですね。0.038544197)]「泡」「クラゲ」「香水」「ヘアスプレー」「カツラ」どれも違うのですが、なんとなくわかりますね。0.053135008)]]・・・「lab_coat(白衣)」。うーん、微妙に違いますね。suit」は正解と言えます。0.023440091)]「パン屋」「タバコ屋」...。学生時代からプログラ...学習済みネットワークから特徴を抽出では、学習済みネットワークから特徴を抽出しましょう。n_clusters多層CNNは深い層ほど複雑な特徴を学習するため、抽象的な特徴に注目したい場合は終盤の畳み込み層も使わず、少し前の出力を使う。自然の画像ではなくイラストやパターン、またはその組み合わせでは特に彩度が高いため、grayscaleに変換してみる.。学習済みモデルはRGBで学習しているため、データの形はRGBの形式にする学習済みネットワークを別のネットワークに切り替えてみるなどです。注目すべきは、左から4番目のクラスタです。人の画像ばかり入っています!(一枚微妙に違うものが入っていますが)学習済みモデルは、「人物」といったラベルでは学習していませんでしたが、人物に共通する特徴量から同じクラスタに分割することができたようです。右から6番目のクラスタは画面など、関連性のある組み合わせが出てきました。おまけブログサムネイルには、「データ自体にまとまりがあまりないこと」と、「イラストやコミックに対して学習済みネットワークはパフォーマンスを落としてしまう」ということもあります。そのため、ブログサムネイルではなく普通の写真でも試してみることにしました。バリエーションも多く、こちらが意図した通りの(まるで教師あり学習のような)分類をクラスタリングで実現するには難しいですが、ある程度、似たような画像をまとめることはできました。まとめシンプルな画像に対するクラスタリングや、色味などに基づいてクラスタリングするにはそのままK-Means法でもよい。写真のような画像には学習済みネットワークを使うと何が写っているかや質感にも焦点を当てたクラスタリングが可能。決めるパラメータは多く、実行してみつつ調整してみる、を地道にやる必要がありそう。社長と一杯飲みながらお話してみたい方はこちらミツオカフリーランスエンジニア様の募集はこちらにゃんこ師匠その他、お問い合わせはこちらミツオカお気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!一緒に働いてくれる仲間を募集しております!ライトコードでは、仲間を募集しております!当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。rightcodeエンジニア大募集中!私たちライトコードでは、エンジニアを募集しております。私服大歓迎のカジュアルな職場なので、お気軽にご応募ください!また、フリーエンジニアの方も募集しております。