Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔検出、アニメ顔検出、顔にモザイク処理する方法をソースコード付きで解説します。
【はじめに】Haar Cascadeとは
Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
Haar Cascadeの詳細は下記事で解説しています。
404 NOT FOUND | Python入門速報
このアルゴリズムは、OpenCVを使うと簡単に実装できます。
今回はOpenCVの「cv2.CascadeClassifier」「cascade.detectMultiScale」を使って入力画像から顔を検出してみました。
動画解説版
実行例
書式
cascade = cv2.CascadeClassifier(path) face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)
パラメータ名 | 説明 |
---|---|
path | 使用するカスケード識別器のファイルパス |
src | 入力画像 |
scaleFactor | 画像スケールにおける縮小量 |
minNeighbors | 矩形を要素とするベクトル |
minSize | 探索窓の最小サイズ(これより小さい対象は無視) |
face | 探索結果(見つかった場所の左上座標・幅・高さを格納したリスト) |
– | カスケード型識別器のファイル |
---|---|
説明 | OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。学習済みファイルは下記リンク先からダウンロードできます。今回は顔検出のために「haarcascade_frontalface_default.xml」を使います。 |
URL | https://github.com/opencv/opencv/tree/master/data/haarcascades |
ファイル名 | 検出対象 |
---|---|
haarcascade_eye.xml | 目 |
haarcascade_eye_tree_eyeglasses.xml | 眼鏡 |
haarcascade_frontalcatface.xml | 猫の顔(正面) |
haarcascade_frontalcatface_extended.xml | 猫の顔(正面) |
haarcascade_frontalface_alt.xml | 顔(正面) |
haarcascade_frontalface_alt2.xml | 顔(正面) |
haarcascade_frontalface_alt_tree.xml | 顔(正面) |
haarcascade_frontalface_default.xml | 顔(正面) |
haarcascade_fullbody.xml | 全身 |
haarcascade_lefteye_2splits.xml | 左目 |
haarcascade_licence_plate_rus_16stages.xml | ロシアのナンバープレート(全体) |
haarcascade_lowerbody.xml | 下半身 |
haarcascade_profileface.xml | 顔(証明写真) |
haarcascade_righteye_2splits.xml | 右目 |
haarcascade_russian_plate_number.xml | ロシアのナンバープレート(数字) |
haarcascade_smile.xml | 笑顔 |
haarcascade_upperbody.xml | 上半身 |
【補足】
以下エラーが出る場合、公式ページ(https://opencv.org/releases/)から、自分が利用しているopencvバージョンに合わせてresourceファイルを入手することで解決できるようです。
systemError: returned a result with an error set
コメント欄でご指摘いただきました。ありがとうございました。
【サンプルコード】Python3 + OpenCV
サンプルプログラムのソースコードです。
実行結果
サンプルプログラムの実行結果です。
【応用例】動画の顔に自動でモザイク処理
動画を読み込んで、顔部分に自動でモザイクをかけてみました。
【Python版OpenCV】動画の顔に自動でモザイク処理
Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。
ソースコード
サンプルプログラムのソースコードです。
実行結果
サンプルプログラムの実行結果です。
【Python版OpenCV】動画の顔に自動でモザイク処理
Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。
【参考例】アニメ顔の検出
アニメの顔を検出するために有志が公開されている「lbpcascade_animeface.xml(https://github.com/nagadomi/lbpcascade_animeface)」を使います。
ただし、こちらは弱識別器にHaar-Like特徴ではなく、計算コストがより低いLBP特徴(Local Binary Patterns)が用いられています。
サンプルコード
実行結果
お借りした画像:プロ生ちゃん(暮井 慧)
【Python版OpenCV】アニメ顔を検出
Python+OpenCVでCascade識別器(分類器)を実装し、画像からアニメ顔を検出する方法をソースコード付きで解説します。
【Python/OpenCV】人の検出(HoG + SVM識別器)
この記事では、Python+OpenCVでHoG SVM識別器(分類器)を実装し、画像から人を検出する方法をソースコード付きで解説します。
【Python/OpenCV】HoG特徴+SVM識別器の学習/作成
Python版OpenCVでHoG特徴+SVM識別器(分類器・xmlファイル)を作成する方法をソースコード付きで解説します。
【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
コメント
Haar Cascadeを使って上と同じような顔認識プログラムを組んだところ、以下のようなエラーが出てしまいます。
error: OpenCV(3.4.1) D:\Build\OpenCV\opencv-3.4.1\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale
このエラーの原因は何なのでしょうか?教えていただきたいです。
※TTT様
コメントありがとうございます。
ファイルパスが間違っていてファイルを読み込めないときのエラーですね。
この記事のソースコードをお使いの場合、「Pythonファイル」「画像ファイル」「XMLファイル(分類器)」が
同じフォルダにある必要がございますのでご確認ください。
cascadeがあるフォルダをWinPythonのフォルダの中に移して実行したところ、上記のエラーは出なくなりました。
しかし、実行後タスクバーに出てきた画像をクリックするとresult.jpg(応答なし)という名前の全面灰色の画像がずっと読み込み中のまま表示されているだけでした。
画像を閉じようとすると、「Pythonは応答していません 」というメッセージが表示されてしまい、仕方なくプログラムを終了するしかありません。
コードはほぼ記載されている通りのまま実行しているのですが、何か他に要因があるのでしょうか?
※TTT様
コメントありがとうございます。
掲載中のソースコードを一部修正しました。
そちらでどうでしょうか。
正しく動作しました。ありがとうございます。
jupyter notebookで実行したところ以下のようなエラーが出ました。
error: OpenCV(3.4.2) c:\miniconda3\conda-bld\opencv-suite_1534379934306\work\modules\imgproc\src\color.hpp:253: error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function ‘cv::CvtHelper<struct cv::Set,struct cv::Set,struct cv::Set,2>::CvtHelper’
この原因として考えられることは何かありますか?
画像が正しく読み込まれてない可能性がありますので、画像のファイルパスが正しいか、画像データがロードされてるか確認されると良いと思います。
急なコメント失礼いたします。
このページ内に記載されているgithubからHaar Cascadeの各xmlファイルをダウンロードしてきて使用すると、以下エラーが出ます。
systemError: returned a result with an error set
調べてみたところ、どうやらgithub上の各xmlファイルはopencvのバージョンによって適宜選択する必要があるようです。
以下から、自分の環境で使用しているopencvバージョンに合わせてresourceファイルを落としてくることで解決できるようです。
https://opencv.org/releases/
参考にお願いします。
コメントありがとうございます。
記事を書いたときからバージョンも大きく異なり、合わせる必要があるようですね。
記事にも補足を追加しました。
コメント失礼します。
name ‘dst’ is not defined
というエラーが表示されてしまうのですが、どうすればよいでしょうか。
対処法をご存じでしたら、教えていただきたいです。
すいません、dstはimgの間違いです。