Python + dlibで顔検出を行う
この記事のまとめ:
- dlibをインストールする。
- dlibに標準実装されているHOGアルゴリズムによる顔検出を試す。
背景:
前回、OpenCVのCascade分類器による顔検出を行いましたがあまり精度が良いものではなかったため、より良さそうなものとしてHOG (Histogram of Gradients)というアルゴリズムによる顔検出をdlibライブラリをを用いて試してみたいと思います。
dlibのインストール:
前回と同様にWindowsでAnaconda環境を使ったPython 3.5を前提に話をしていきます。 (参考:AnacondaディストリビューションでPythonの仮想環境を整える)
condaを使って、dlibのインストールをします。また、skimageというライブラリも使用するためこれもインストールします。
HOGアルゴリズムについて
細かいアルゴリズムは理解していないので詳細説明はできませんが、なんとなく私の理解を書いておきます。
写真データの各ピクセルに隣接するピクセルの明暗を比較して勾配情報(gradient)に変換します。そのままでは情報が大きすぎるため、検索対象の矩形内の勾配情報を16x16個のスクエアにとなるように分割して各スクエア内の勾配情報のヒストグラムを算出します。この16x16個のヒストグラムと学習済みの顔のヒストグラムを比較して、似通ったヒストグラムであれば顔と識別するもののようです。
下記にイメージ付きでもう少し詳しく説明がありますので詳細を知りたい方はこちらをご覧ください。
dlibのHOGアルゴリズムを使ってみる
顔検出を試すサンプルコードを以下に示します。なお、画像への顔と検出された矩形の書き込みとその画像の保存のためにOpen CVも使用しております。
結果
前回と同じ6枚の写真を使って評価してみました。
1枚目
完璧です!2枚目
これまた完璧です!3枚目
流石に後ろ向きよりの横顔は認識しませんが十分です!4枚目
真横くらいの顔まで認識してくれていますね。5枚目
OpenCVのCascade分類器では全く検出してくれなかったものでも幾つか検出してくれています。6枚目
ここもほとんど検出してくれていますね。最後に
すべての写真でOpenCVのCascade分類器よりも良い結果となったのではないでしょうか。 このあとはこれを使って人物認識をやっていこうかと思います。
今回は以上です。 最後まで読んでいただき、ありがとうございます。
画像はどのようにセットするのでしょうか。
返信削除特定のフォルダに入れて、引数にそのパスをセットして実行すればいいですか。
返信が遅くなってすいません。
返信削除はい、おっしゃるとおり、mainの引数として画像のファイルパスを渡せば良いです。
ご確認ありがとうございます。
返信削除画像ファイルパス(フルパス)を渡して
実行しているのですが、
なぜか対象のファイルの顔に線が描画されません。
実行すると特にエラーが出るわけでもなく
そのまま正常終了するようです。
こちらで記載いただいているコードで
インデントなどは当方で修正して実行しています。
何が原因か分かりますでしょうか。
連続での投稿失礼いたします。
返信削除ファイルパスの受渡しが上手くいっていなかったようで
少し、中身を書き換えて実行したところ
無事に処理が通りました。
ご報告までm(_ _)m
無事に処理が通ってよかったです!
返信削除もし私のサンプルコードに誤りなどあればご指摘いただければ幸いです。