記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

機械学習(Haar-Like)でコンピュータにピカチュウを検出させてみる



最近のデジタルカメラやスマートフォンのカメラには、人の顔検出機能が付いていると思います。そのピカチュウ版を簡単に作ってみました。



開発環境

OS:Ubuntu14.04
CPU:Core i7-4790K
GPU:AMD Radeon R9 M295X 4GB
メモリ:32GB



コンピュータに学習させるサンプル画像の収集

コンピュータに学習させるサンプル画像の種類は2種類。
●検出させる物体(今回はピカチュウ)が写っている画像
●検出させる物体が写っていない画像(風景や他のポケモン)

以降、前者をポジティブ画像、後者をネガティブ画像と呼称します。


ポジティブ画像の例
pika_0021.jpg pika_0037.jpg pika_0016.jpg


ネガティブ画像の例
ng_0010.jpg ng_0013.jpg ng_0025.jpg

学習をさせる上で効率的と言われているサンプル数はポジティブ画像が7000枚、ネガティブ画像が3000枚と言われています。今回はお試しとしてポジティブ画像を247枚、ネガティブ画像を174枚用意しました。



ポジティブ画像のラベル付けと準備

対象の物体がポジティブ画像のどの座標に位置しているか指定してあげる作業です。コンピュータに「こいつがピカチュウだ」と教えてあげます。

下記のように句形画像で指定してx座標、y座標、高さ、幅をテキストファイルに記述していきます。
テキストファイルへの記述方法は【画像ファイル名 対象の物体の数 x座標 y座標 width height】となります。
画像内に対象の物体の数が2つ以上の場合【画像ファイル名 対象の物体の数 x座標 y座標 width height x座標 y座標 width height】となります。

矩形画像で指定
blog.jpg
【画像ファイル名 対象の物体の数 x座標 y座標 width height】

対象の物体が2つ以上の場合
blog用3
【画像ファイル名 対象の物体の数 x座標 y座標 width height x座標 y座標 width height


このテキストファイルのファイル名を今回は pos.txt とします。

しかしこのままではOpenCVが認識してくれないので、認識してくれるファイル形式(バイナリファイル)に変換します。

numはサンプル数です。1つの画像に複数の対象の物体が写っているものもあるので、画像数が247枚でもサンプル数は261となりました。



ネガティブ画像の準備

ネガティブ画像をコンピュータに読み込ませるため、テキストファイルに下記のようにファイル名を記述していきます。




コンピュータに学習させる

コンピュータに実施に学習させてみます。

下記コードをターミナルにて実行

-data ./cascade/Pikachu で保存したいフォルダを指定しています。フォルダは自動では生成されないのであらかじめ作成しておきます。

numPos でポジティブ画像の要素数を指定していますが、ピッタリの枚数だとエラーが出るみたいなのでかなり余裕をもって200枚としました。
詳しくは下記の方の記事をご参照ください。
OpenCVのtraincascadeのnumPos引数はvecファイル内のサンプル数より少ない数を設定すること

OpenCVでは、「Haar-Like」「LBP」「HOG」の3つの特徴量の機械学習を行えます。
今回はHaar-Likeを使用し機械学習をします。
Hara-LikeはOpenCVではデフォルトで設定されているのでターミナルでの実行時、特に指定はしません。
LBPやHOGで機械学習を行いたい場合は、「-featureType LBP」や「-featureType HOG」を付け足して指定してあげて下さい。

実行すると学習の様子がターミナルに表示されていきます。

最終的に学習にかかった時間は1時間30分程でした。

学習が終了すると指定したフォルダにcascade.xmlと各ステージのxmlファイルが作られます。

./cascade/Pikachu
|----cascade.xml
|----params.xml
|----stage0.xml
|----stage1.xml
|----stage2.xml
---------省略---------
|----stage17
|----stage18

ただし、画像認識をさせる上で必要になるファイルは cascade.xml のみです。
このcascadeファイルがいわゆる分類器と言われるものです。



画像から検出させてみる

作成したcascadeファイル(分類器)を使って検出をしてみます。下記の検証用プログラムを実際に画像を読み込んで、結果を出力してみます。検証用プログラムはPyshonで書きました。Pythonはプログラム全体がすっきりしていいですね。



実行結果
Pika_test8.jpg   result_2016080716545648d.jpg
いい感じに検出してくれてます。


Pika_test5.jpg   result_20160807164720c19.jpg
顔の一部が隠れていると検出してくれないですね。


Pika_test6.jpg   result_2016080717012641f.jpg
これは笑いました。どうも頭に巻いてるやつが邪魔で検出できていないようです。


Pika_test3.jpg    result.jpg
おっ、ピチューとの区別できてますね。


Pika_test7_20160807170855434.jpg   result_2016080717085719b.jpg
現実は甘くありませんでした。2匹のピチューの顔をそれぞれ半分ずつ合体させてピカチュウの顔と判定してますね。ピチューの顔ってピカチュウの顔を薄くしただけっぽいので許してあげてください。



まとめ

今回OpenCVのテストとして機械学習を試してみましたが、サンプル画像の少なさの割にはちゃんと検出してくれたほうなのかなと思います。さらにサンプル画像の量や質を増やせばもっと精度良く、ピカチュウを検出してくれると思います。

その他誤字脱字や間違い、質問等ございましたらコメントでお願い致します。

スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

むらりん

Author:むらりん
学部3年
ピカチュウLOVE

「将来絶対ハゲるよねw」とよく言われます。

累計閲覧者数

最新の人工知能関連のツイート

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。