3で実装したものを使って解説していきます。画像認識にかかわるアルゴリズムのひとつです。画像は画素(pixel)が縦横に並んでできています。superpixelは、距離的・色的に近い画素をひとまとまりにとらえたものです。画像認識の前処理としてsuperpixelを計算しておくことで、画像の情報量を上手に減らし、他の画像認識アルゴリズムが適用しやすくなるようです。(superpixel化された画像)SLICは画像を入力として、superpixelへの分割を出力とするアルゴリズムです。分割したいsuperpixelの数と画像を指定してSLICで処理すると、入力画像のsuperpixelへの分割を得ることができます。点で他のアルゴリズムに負けず劣らず優れていることが文献[2]で示されています。SLICのアルゴリズムの概略SLICのアルゴリズムはk平均法を基にしており、それにいくつかのアイデアを加えて改良されています。SLICのアルゴリズムの特徴を列挙すると、以下のようになります。以下で、SLICのアルゴリズムの詳細を解説していきます。実装に、以下のライブラリを使います。Pythonの画像処理ライブラリscikit-imageには既にSLICが実装されていますが、ここではscikit-imageのSLICは使わず、画像の読み込みとLab色空間への変換にのみscikit-imageを使うことにします。colorSLICクラスを定義します。以下でメソッドを定義していきます。SLIC:コンストラクタで各種パラメータを定義します。どれだけ重視するかを決めるパラメータです。paper.SLICのアルゴリズムは、大きく初期化と繰り返し処理の二つに分かれています。初期化処理をfit_init()、繰り返し処理をfit_iter()として、それぞれ実装していくことにします。画素数)を計算しておくなどの処理を行います。[1/(self.S**2)]*2)繰り返し処理では、k平均法の類似を行います。)の点のみについて距離を計算します。番目のクラスタに所属する、と更新します。おおむね通常のk平均法と同じですが、クラスタの中心との距離を計算する点が、クラスタの中心の位置と画素の位置が近い点のみに絞られていることが特徴です。所属するクラスタを更新したら、クラスタの中心も更新します(calc_new_center())。距離の定義も通常のユークリッド距離とは別の距離を用います(distance())。スケールが異なるためです。文献[2]によると、このk平均法の類似の繰り返し回数は、10回程度で十分であることが経験的に知られているそうです。ごとに何番目のsuperpixelに所属するのかのラベルの配列が計算できるようになりました。superpixelごとにsuperpixelに属する画素の色の平均を計算し、RGBに変換してから返すメソッドも実装します。color.lab2rgb(new_img_lab)ここまでの実装をchoco.jpgにかけ、変換してみます。私の環境で60秒くらいかかります。io.imshow(res)写っている物体の境界にうまく追従していることがわかると思います。superpixelを連結にするため、文献[1]の実装では、孤立したsuperpixelを近くの大きなsuperpixelに併合する後処理が追加されていますが、この記事では省略します。scikit-imageで実装されているSLICによる結果は以下のとおりです。こちらはCythonで実装されているため、1秒程度で終わります。out)scikit-imageでは孤立したsuperpixelを併合する後処理が追加されているため、イチゴの部分などに孤立したsuperpixelがありません。まとめ画像認識の前処理に使われるsuperpixelを計算するアルゴリズムのひとつであるSLICの紹介・解説をしました。SLICはk平均法を応用したアルゴリズムです。docsツイート#Python#機械学習#画像認識tmtkデータ分析と機械学習とソフトウェア開発をしています。アルゴリズムとデータ構造が好きです。Recommendsこちらもおすすめ相関係数は外れ値の影響をうけやすい?Pythonで確認してみた。