iPhoneを使ってエゴマと蕎麦とそれ以外(ごみ)を識別してみました。
前回記事『iPhone で円形度を使ってエゴマと蕎麦の実を識別』では円形度だけで識別したので、今回は円形度と面積でクラスの分布を反映してマハラノビス距離で識別します。
※後半でげろしますが前回記事の補足の位置付けの記事です。
識別結果の青がエゴマ、緑が蕎麦、赤がそれ以外です。
学習用データの分布 | 入力画像での識別 |
---|---|
識別結果の下のグラフの楕円がマハラノビスの等距離線で左側がエゴマ、右側が蕎麦です。楕円の中心が平均値です。距離が3を超えると異常(ゴミ)と判定するようにしています。この例ではエゴマ・蕎麦・ゴミ(大小)を識別できています。
クラス辞書
クラス | 円形度 平均$\mu_1$ |
円形度 標準偏差$\sigma_1$ |
面積 平均$\mu_2$ |
面積 標準偏差$\sigma_2$ |
共分散 $\sigma_{12}$ |
---|---|---|---|---|---|
エゴマ | 0.858361 | 0.197776 | 0.000974214 | 0.000189814 | 0.000018802 |
蕎麦 | 0.814706 | 0.0700254 | 0.00386794 | 0.000603650 | 0.000000648 |
コードはGithubに置いています。サンプルデータも入っています。
1. マハラノビス距離
エゴマや蕎麦を代表とする値(平均値など)との距離(ユークリッド距離)でパターン認識行う方法があります(距離が近ければそのクラスに属するという判定をする。プロトタイプ法と呼ぶ)。『マハラノビス距離』によるパターン認識では学習用データの分布の広がりに基づいた距離で識別を行います。
この手法はパターン認識のほかに品質管理で異常値を見つけるのに利用します。分布の広がりを考慮することで、冒頭の識別結果のように平均値(楕円の中心)との距離が近くても蕎麦の場合は異常とせず、エゴマの場合は異常(ゴミ)と判別できる場合があります。
マハラノビス距離の計算式は次のようになります。
マハラノビス距離\;d = \sqrt{(\vec{\;x\;} - \vec{\;\mu\;})^\top \Sigma^{-1} (\vec{\;x\;} - \vec{\;\mu\;})}
。。。ここでげろすると、参考URLの記事を読んだだけで説明できるような理解度がありません。とりあえずこちらの記事『マハラノビス距離の意味を2次元の場合で理解する』の数式をswiftで愚直に実装すれば冒頭の実行結果のようにそれなりの結果が得られることは確認した、という状態です(マハラノビス距離の存在は知っていて試してみたかった)。
2. 最後に
参考になりそうな知見、ノウハウが皆無な記事ですが、
今回のプログラムは古い機種(iPhone6s)で実行しており、画像処理においてカメラ性能、処理能力面でこのような処理にこのくらいの機種は使えそう、という一つの目安になれば幸いです。