読者です 読者をやめる 読者になる 読者になる

もやしちょこれーと

りけじょのたまごのいろいろ

画像処理学習日記:猫の顔認識2

 忘れてないよ!ちまちま進めてます。

この間の記事を書いたときは猫の口と鼻まわりの学習を終わらせただけの進捗だったのですが、だいぶ進みました。

学習に関しては、鼻口、右目、左目の三か所、各1800枚くらい学習させてcascadeを作りました。

でも、あんまり精度よくないのよね…鼻と口はボロボロで、絨毯とか毛の模様とかの中のちょっと似たような形したやつにしょっちゅう引っかかるし、目は鏡面反射みたいなのがあるとすぐヒットしちゃう。

確実に私の学習のさせ方が悪いです。目半開きとかのやつもpositiveとして学習させてたから。

虹彩の色や瞳孔の開きによって猫の目は全く違ってくるから難しいですよね…色分けとか瞳孔の開き具合分けてまでやってられないし……

 

それはさておき、学習は(精度はともかく)終わったので、今はそのデータから顔の領域を求めるプログラムを書きました。

顔の検出は前回紹介したブログでcascadeが配布されていたので、それを使わせていただいています。

 

写真内の猫の数が一匹じゃない場合とか、顔は検出できなかったけど他のパーツは検出できた場合とか、いろいろ場合分けしてたら結構な行数になっちゃって…いや、私がゴリゴリ書きすぎなんでしょうが…

で、400行くらいのプログラムになったわけですが(とてもこれだけのことをするためのプログラムと思えない行数)、それで比較的いい感じに顔の領域を検出できるようになりました。

(以下結果の元画像は拾いものですごめんなさい)

 

この子は配布されていた顔の学習データだけで検出できてます。

f:id:moyachiyoco:20160711021558j:plain

が、前の記事でも言った通り、スコティッシュフォールドのような、耳が垂れていたりする猫さんは顔検出はできないんです。

下の猫さんは顔は検出できていない例です。

今回は鼻や目が検出できていたので、そこから顔の領域を推定しました。

(今後の目的考えて大きめに推定するように設計したけど、これはちょっと大きすぎやな…直そう()

f:id:moyachiyoco:20160711022534j:plain

ちなみに上側にかなり空間があるのは耳がある猫さんの可能性も想定しているからです。最終目的を考えると確実に猫の顔の範囲を囲っておきたいのです。

で!

今やりたいこととしては、この顔の領域に対し、前景抽出を行って、猫の顔だけ取り出したいんです。

これが難しい…上の猫さんのように背景と全く色が異なる場合には案外うまくいくのですが、

f:id:moyachiyoco:20160711023338j:plain

二枚目のように背景と毛の色が近いor顎と体の区別がつかないとこうなっちゃう…

f:id:moyachiyoco:20160711023533j:plain

grabcutというアルゴリズムを使っているのですが、全くうまくいかないです…困ったものだ…もちろんそれぞれの写真にあったマスクを手動で突っ込めばうまくいくと思いますが、それは今回やりたいこととは異なるので…

課題提出までに最終目的までたどり着くかわかりませんが、頑張るぞ~

 

Pythonで書いているとは思えないような汚いコード書いてて、Pythonに失礼な気がして、余裕があるときはPEP8に則ったコードを書くことを心がけよう、と思ったちよ子でした。

おわり