« 「けものフレンズ」風ロゴジェネレータのサイト | トップページ | ごみの種類をTensorFlowのAIで判別してくれるRaspberry Piごみ分別器 »

2017年4月15日 (土)

OpenCVでLBP特徴を使った”物体検出器”を作成してみた

TensorFlowによる”物体認識”と、ネット上に存在するアニメ顔検出器を組み合わせて「けものフレンズの動画からフレンズさんの顔を検出するやつ」を作ってみましたが。

自分の認識させたいものを検出するためには、この”物体検出器”ってやつを自作できないといけません。

てことで、物体検出器を作ってみることにしました。

参考にしたのはこちらのサイト。

OpenCVで物体検出器を作成する① ~基礎知識~ - 技術者ブログ

ここの⑤、⑥にある手順を参考にすれば完成・・・するはずですが、こちらに載ってるやり方そのままでは動かなかったので、ちょっと工夫してます。

なお、前提は

・たくさんの正解画像から検出器を作成(上のリンクは正解画像1枚で作成)

・LBP特徴を用いた検出器を作成

OpenCVだけでHaar-Like特徴、LBP特徴、HOG特徴を用いた検出器を作成できますが、Haar-Like特徴というのは検出率がいまいちらしい(と思ってるだけ?)という印象があるのと、HOG特徴を用いた検出器はそのままでは使えない模様なので、消去法でLBP特徴になりました。

■ 前準備

まず、検出器を作成する作業フォルダを作ります(英数字でスペースを入れてないフォルダ名)。

そのフォルダ内に”cascade”、”pos”、”neg”、”vec”の4つのフォルダを作成。

さらに”cascade”フォルダ内に”ooo”というフォルダを作っておきます。

不要かもしれませんが、以下のOpenCVの検出器作成に必要な実行ファイルを作業フォルダに入れておきます(私の場合はOpenCV 3)。

・ opencv_calib3d310.dll

・ opencv_core310.dll

・ opencv_createsamples.exe

・ opencv_features2d310.dll

・ opencv_flann310.dll

・ opencv_highgui310.dll

・ opencv_imgproc310.dll

・ opencv_ml310.dll

・ opencv_objdetect310.dll

・ opencv_traincascade.exe

私と同様、Anaconda for WindowsにTensorFlowをインストールしている環境なら、これらのファイルは「(Anaconda3インストールフォルダ)\envs\tensorenv\Library\bin」か「(Anaconda3インストールフォルダ)\Library\bin」のどちらかに入ってるはずです。

”pos”フォルダには正解画像を、”neg”フォルダには不正解の画像(正解でなければなんでもOK)を入れておきます。

参考までに、私は”pos”にけもフレ顔画像を1970枚、”neg”に全く違う画像(城やらクラウンやらの画像)を487枚入れました。

■ 正解画像のベクトル作成(opencv_createsamples.exe)

まず、正解画像を入れた”pos”フォルダ内のファイル一覧を作成します。

コマンドプロンプトを開き、”pos”フォルダに移動後、以下のコマンドを実行。

$ dir *.jpg /b /a-d /s > poslist.txt

これでファイル一覧ができます・・・が、そのままでは使えません。

このとき作成される”poslist.txt”は

C:\(作業フォルダ)\pos\358.jpg
C:\(作業フォルダ)\pos\359.jpg
C:\(作業フォルダ)\pos\360.jpg
C:\(作業フォルダ)\pos\361.jpg


みたいになってますが、各ファイル名の後ろに

C:\(作業フォルダ)\pos\358.jpg 1 0 0 64 64
C:\(作業フォルダ)\pos\359.jpg 1 0 0 64 64
C:\(作業フォルダ)\pos\360.jpg 1 0 0 64 64
C:\(作業フォルダ)\pos\361.jpg 1 0 0 64 64


てな感じの数字を入れる必要があります(スペース区切り)。

一つ目の1は不明、2、3つ目の”0 0”は多分画像切り出しの始点座標、”64 64”は終点座標の模様。

私の使った画像はすべて64×64で切り出し不要だったので、上のような表記になります。

ばらばらのサイズの画像だったり、入れた画像の中に認識させたい部分以外が入ってる場合は・・・下記のサイトにあるGUIツールなどを使うしかなさそうです。

OpenCVでの物体検出器作成 - kivantium活動日記

で、作成した”poslist.txt”を作業フォルダ直下(つまり一つ上のフォルダ)に移動し、以下のコマンドを実行します。

$ opencv_createsamples.exe -info poslist.txt -vec ./vec/ooo.vec -num 1970 -bgcolor 255

■ 検出器学習 (opencv_traincascade.exe)

いよいよ検出器の作成開始ですが、その前に不正解画像の一覧を作っておきます。

コマンドプロンプトで”neg”フォルダに移動し

$ dir *.jpg /b /a-d /s > nglist.txt

を実行。

こっちは”poslist.txt”のようにいちいち後ろに何かつけたり、一つ上のフォルダに移動しなくてOKです。

コマンドプロンプトで作業フォルダに移動し、以下のコマンドを実行します。

$ opencv_traincascade.exe -data ./cascade/ooo/ -vec ./vec/ooo.vec -bg ./neg/nglist.txt -numPos 1700 -numNeg 487 -featureType LBP

中身の詳しい説明は省きますが、”-numPos”の後ろには正解画像の数を、”-numNeg”の後ろは不正解画像の数を入れます。

が、正解画像はたしか1970枚のはずなのに”1700”なのはなぜ?

私もよくわかりませんが、ここは大体8割くらいの数字を入れておくものらしいです。

私の場合は1700くらいでようやく動いてくれました。これはケースバイケースかもしれません。

最後の”-featureType”の後ろに”LBP”と入れてます。省略するとHaar-Like特徴で学習されます。

で、学習開始ですが、私の環境で大体1時間くらいかかりました。

終わると”cascade\ooo\”のフォルダに”cascade.xml”というファイルができてます。

これが”物体検出器”本体。

あとはOpenCVによる”アニメ顔”検出の記事に載せているコードの”lbpcascade_animeface.xml”のところを”cascade.xml”に変えて動かすだけ。

----------------------------------------------------------------

さて、上の手順でけもフレ顔検出器を作りましたが、元のアニメ顔検出器に比べていいところ悪いところがそれぞれ。

・ 誤検出が増加(草むらや模様を”顔”と認識する確率が増加)

・ ハシビロコウちゃんなど従来のアニメ顔検出器では拾えなかった顔が検出可能に

画像データがもう少しあると、あるいはopencv_createsamples.exeのパラメータチューニングなどでもう少し検出率を上げることができるかもしれません。そのあたりは今後やっていこうかと。

もっとも、”けもフレ”の顔検出器を作るのが目的ではないので、これをベースに”本業”で試行錯誤していこうかと思ってます。というか、既にやってますが(会社で)。

そういえば今年初めにTensorFlowを使って”ゴキブリ”探知機を作ろうとしてみたという記事書きました。

撮影した画像を全部検索しようとしたので異様に時間がかかる仕組みになっちゃいましたが。

今ならこの「検出器」作って、高速化できますね。

なんならゴキだけでなくムカデなどの害虫をディープラーニングでより認識精度の高い害虫探知機も作れそう。

てことで、ネットで害虫の画像を集めてそういうのを作ろうかと考えたんですが。

Googleの画像検索した時点で

ヴォエ!!

となり、耐えられなくて断念。

ゴキぐらいならなんとかなりそうですが、私的は特に「ゲジゲジ」の画像検索がダメでしたね。あまり見つめると夢に出てきそう。

検出器作成には少なくとも1000枚は欲しいところ。並大抵の精神力では駄目だと悟りました。だれか害虫画像検出器、作ってくれないかなぁ・・・せめてデータセットだけでもいいので・・・

さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング

« 「けものフレンズ」風ロゴジェネレータのサイト | トップページ | ごみの種類をTensorFlowのAIで判別してくれるRaspberry Piごみ分別器 »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

パソコン系」カテゴリの記事

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/510034/65129472

この記事へのトラックバック一覧です: OpenCVでLBP特徴を使った”物体検出器”を作成してみた:

« 「けものフレンズ」風ロゴジェネレータのサイト | トップページ | ごみの種類をTensorFlowのAIで判別してくれるRaspberry Piごみ分別器 »

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ