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

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

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

C++

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

Python

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

Q&A

解決済

3回答

1719閲覧

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

ShibaInnu

総合スコア11

OpenCV

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

C++

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

Python

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

1グッド

2クリップ

投稿2017/12/05 05:20

編集2017/12/05 07:57

###前提・実現したいこと
現在、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カメラで撮影⇒顔(もしくは顔パーツ)検出し、矩形で囲う
という処理をリアルタイムで垂れ流しにしたいと考えております。
伝え方が下手で、もし伝わっていませんでしたら申し訳ございません。

Inu-Shiba👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

投稿2017/12/05 05:54

Qoo

総合スコア1249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShibaInnu

2017/12/05 07:33

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

2017/12/05 07:39

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

2017/12/05 08:01

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

2017/12/05 09:43

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

2017/12/06 07:48

Qoo様,昨日はどうもありがとうございました。 アドバイス頂いた方法でリアルタイムでの傾いた顔の検出が出来ました。あとは矩形を元画像に表示するだけです。かなり良く検出してくれていますので,目的を達成できそうです。 ご助言を頂いたお三方にこの場をお借りして感謝します。 また質問することがありましたら、よろしくお願い致します。
guest

0

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

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

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

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

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

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

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

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

投稿2017/12/05 05:34

diningyo

総合スコア379

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShibaInnu

2017/12/05 07:51

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

2017/12/05 07:59

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

2017/12/05 08:08

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

0

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

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

投稿2017/12/05 08:03

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShibaInnu

2017/12/05 08:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問