質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Python

    3863questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    2431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    627questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

opencv+pythonでリアルタイム顔検出をする際の精度を向上させたい。

解決済

回答 3

投稿 2017/12/05 14:20 ・編集 2017/12/05 16:57

  • 評価
  • クリップ 1
  • VIEW 244

ShibaInnu

score 1

前提・実現したいこと

現在、pythonとOpencvでリアルタイムな顔検出をしています。
Opencv公式のカスケード分類器を使用しています。

机に座って、PC作業をしている間、webカメラでリアルタイム顔検出を行いたいです。
しかし、通常起こりうる動き(首をかしげるなど顔を20度ほど左右に傾ける動き)にOpencvのカスケードでは対応できず、ほぼ正面を向いていないと検出できないのが現状です。

どうにかして顔を左右に20度ほど傾けてもリアルタイム顔検出できるようにしたいと思っていますが
Opencv公式のカスケードでは厳しいのでしょうか?
それとも、カスケードではなく他のアプローチで解決できるのでしょうか?
どなたか、この分野に詳しいお方がいらっしゃいましたらお力をお貸しください。
どうぞ宜しくお願い致します。

該当のソースコード

よくあるOpencv+python+webカメラを使った顔検出をしています。
こちらのサイトを参考にさせていただきました。
https://note.nkmk.me/python-opencv-face-detection-haar-cascade/

補足情報

python2.7
opencv2.4.11
Spyderで実行しています。

追記

顔認識ではなく、顔検出です。
目の検出でも構いません。
最終的にはwebカメラで撮影⇒顔(もしくは顔パーツ)検出し、矩形で囲う
という処理をリアルタイムで垂れ流しにしたいと考えております。
伝え方が下手で、もし伝わっていませんでしたら申し訳ございません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

pythonではやったことないですが、取得したwebcamの静止画像をbitmap化したあと、
角度を変えて(-20度,0度、20度)と3回検査するのが一般的だと思います。
bitmap化する際にリサイズして画像を縮小したもので処理すれば高速に処理できるのではないかと思います。

投稿 2017/12/05 14:54

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/05 16:33

    回答ありがとうございます。
    やったことがないのでわかりませんが、その方法ですとリアルタイムに検出するのは難しいのではないのでしょうか?回転させた静止画像中で顔を矩形で囲う場合、元のwebcamの動画像の顔の位置とずれが生じてしまうような気がします。
    Qoo様はこの問題をどう対処しましたか?可能でしたら、アドバイスを頂きたく存じます。

    キャンセル

  • 2017/12/05 16:39

    画像認識は全てカメラからの入力画像を1フレームずつ取得し、画像認識のライブラリに投げて検査することでリアルタイムに検出を行なっています。
    私はas3とc#で顔認識の経験がありますがサイネージのような縦型のディスプレイでwebカメラを横に
    して利用する場合、カメラからの画像を90度反転して処理することでリアルタイムな顔認識を実現しました。
    顔の位置は元の画像を何度傾けたかはわかっているので、再計算すれば顔の位置も計算によって導くことが可能です

    キャンセル

  • 2017/12/05 17:01

    迅速な回答、感謝致します。
    なるほど…
    顔検出失敗 ⇒ 画像回転、検出 ⇒ 元画像に回転した分を戻して矩形を表示
    と理解しましたが正しいでしょうか?これならすぐにも出来そうです。早速やってみます。

    キャンセル

  • 2017/12/05 18:43

    はい。その理解で良いです。画像は縮小できるなら縮小した方が軽くなるので高速に処理できると思います。
    頑張ってください。

    キャンセル

  • 2017/12/06 16:48

    Qoo様,昨日はどうもありがとうございました。
    アドバイス頂いた方法でリアルタイムでの傾いた顔の検出が出来ました。あとは矩形を元画像に表示するだけです。かなり良く検出してくれていますので,目的を達成できそうです。

    ご助言を頂いたお三方にこの場をお借りして感謝します。
    また質問することがありましたら、よろしくお願い致します。

    キャンセル

+1

どうにかして顔を左右に20度ほど傾けてもリアルタイム顔検出できるようにしたいと思っていますが
Opencv公式のカスケードでは厳しいのでしょうか?

opencvに付属しているHaar-like特徴分類器の顔検出は顔正面用のものです。
以下のトピックで書いてくださっている方がいます。

OpenCVを使った顔認識(Haar-like特徴分類器)

傾いた顔で検出をしたければ、それ用に特徴量を定義する必要があると思います。
この方の記事が参考になると思います。

OpenCVで物体検出器を作成する① ~基礎知識~

それとも、カスケードではなく他のアプローチで解決できるのでしょうか?

今流行りのCNNを使った物体検出だと、学習時に画像を加工することで、平行移動やコントラストの違い、傾き等へのロバスト性を獲得する(ように訓練するがより正確)ことが出来たりします。

いずれにしても、ご自分のやりたいコト向けの特徴量を示すデータを探す or 自前で作るという作業が必要になると思います。

投稿 2017/12/05 14:34

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/05 16:51

    回答ありがとうございます。
    やはり傾けた顔用の検出器を自作するか探す必要がありそうですね…
    精度としてはopencv公式のカスケードで十分なのですが、あともう一歩ほしい(顔の左右20度の傾きだけ!)ということで質問させていただきました。
    CNN、簡単にですが調べてみました。初心者の自分ができるか分かりませんが、これが出来ればかなりの精度で顔検出できそうですね。作りたいものを考えると少しオーバーかもしれませんが、それを最終手段ということにしてまずはカスケードで攻めてみようと思います。

    キャンセル

  • 2017/12/05 16:59

    Qooさんの回答にある画像を回転させて検出する方法ががシンプルに出来そうですね。
    これで行けるようなら、別の検出器は不要になりますし。。
    ↑のコメントにお書きになっている通り、実装の手間(コード実装+学習データの準備)を考えると、かなり手間がかかるので(特にデータの準備)・・・。
    以前CNNベースの顔検出のための学習データの準備の際にQooさんのご回答の手法で顔部分を切り出したりしたのを回答を読んで思い出しました。

    キャンセル

  • 2017/12/05 17:08

    迅速な回答、感謝致します。
    t_masa様のおっしゃるとおり、かなりの準備が必要ですので,一度Qoo様の回答の手法で試してみることにしました。調べてみると静止画像でやっている方は多いですが(というか主流ですね…)、動画像でリアルタイム処理をしている方は少ないようです。どうなるか分かりませんが早速やってみようと思います。

    キャンセル

+1

dlibというC++のライブラリがあってHOG特徴量での顔検出が行えます。
pythonのサンプルは動かしたことがないですが、face_detector.pyというのがあるので動かしてみたらどうでしょうか?
傾いた顔のモデルデータも登録してあるのである程度の傾きは検出してくれたと思います。

CNNを使用したpythonのサンプルもあるようです。
cnn_face_detector.py

投稿 2017/12/05 17:03

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/05 17:17

    回答ありがとうございます。
    dlib、試してみる価値はありそうですね。少し調べてみるとhaar-likeと比べて精度がよいみたいな記事がありましたので、読んで試してみようと思います。
    CNN-pythonのサンプルがあったのですね。今の環境でできるかどうか試してみます。
    有意義な提案をどうもありがとうございました。お三方のアドバイスを今日明日で試してみようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • Python

    3863questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • C++

    2431questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    627questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。