画像の追加OpenCVdlibOpenCV(DNN)dlib(DNN)所感さいごにはじめにOpenCVとdlib、またそれぞれのDNN(ディープニューラルネットワーク)実装を使って、顔検出の簡単な比較をしてみようと思います。検出した顔領域を矩形(四角形)で囲む、良くあるプログラムを書いてみました。比較項目は以下の4つです。OpenCVdlibOpenCV(DNN)dlib(DNN)結論としては、検出精度はdlibに軍配が上がり、一方、実行速度という点ではOpenCVが優れている印象でした。今回は導入ということで簡単な比較を行いましたが、次回以降、少しずつ突っ込んだ内容にしていきたいと思います。画像は以下のフリー素材を使用します。比較OpenCV版OpenCVは画像処理で広く使われているライブラリです。*1のカスケード分類器が提供されています。事前にカスケードファイル(haarcascade_frontalface_alt.xml)を取得し、実行ディレクトリに配置してください。github.comソースコードは以下の通りです。main()以下で実行できます。image.jpgの部分はご自身の環境に合わせて変更してください。"image.jpg"こちらが実行結果です。横顔が検出されませんでした。画像として保存する場合はoutputオプションに出力するファイル名を付加してください。dlibはC++ベースの機械学習ライブラリで、顔検出においては、HOG特徴量とSVMが使われているようです。ソースコードはこちらです。OpenCV版と大きな違いはありません。main()同じように実行します。cv2.COLOR_BGR2RGB)で画像をBGRからRGBに変換しているのにご注意ください。本来、OpenCVを使わずに画像を読み込めば必要の無い処理ですが、今回は画像の入出力を共通化するためにこのようにしています。`detector()`で顔検出を行います。引数の2はupsample_num_timesという引数で、デフォルト値の0から調整しています。upsample_num_timesの詳細は後述します。OpenCV版と同じような結果になりました。OpenCV(DNN)版OpenCV3.3からdnnモジュールが追加され、DNNを使えるようになりました。PyTorchなどがサポートされています。今回はCaffeを利用します。コードの一部および学習済みモデルは*2から拝借しました。main()Caffeでは、DNNのネットワーク構造が記述されたprototxtと、ネットワークの重みが保存されたcaffemodelというファイルがそれぞれ必要になります。PROTOTXT_PATHとWEIGHTS_PATHに各ファイルのパスを記述します。blobFromImage()では、画像をDNNの入力サイズである300×300に変換(リサイズ)しています。Subtractionを行います。123.0)はBGRの成分に対応しており、この値を入力画像から差し引きます。"image.jpg"全員検出することができました。横顔もしっかり検出していますね。dlib(DNN)版dlibでもDNNを利用することが可能です。dlibのリポジトリから作者が作成した学習済みモデル(mmod_human_face_detector.dat)をダウンロードします。Detection(MMOD)という、これまた作者が考案したアルゴリズムが用いられています。main()実行します。"image.jpg"OpenCV(DNN)と同じく、横顔含め全員検出することができました。画像の追加ここまでで思ったほど差が出なかったので、比較用の画像をもう一枚用意しました。検出対象が多いので、それなりに差が出るのではないでしょうか。ソースコードは先ほどと同じなので、全ての結果を全て並べて表示します。OpenCVdlibOpenCV(DNN)dlib(DNN)検出数ではdlib(dnn)が最も多く、OpenCV(DNN)では一人も検出できませんでした。共通して、横顔やうつむき顔は検出が難しくなることが分かります。OpenCV(DNN)では画像をリサイズする関係で、画像に占める顔領域が小さくなり、検出が難しくなったと考えられます。簡単な比較に留まりましたが、精度という点ではdlibが良さそうな印象です。その代わり、実行速度はdlibが最も遅く、メモリ消費も激しいです。先述したupsample_num_timesの引数は、値を大きくするほど実行時間とメモリ消費が大きくなります。これは、検出において顔とみなす最小サイズ(Windowサイズ)が、デフォルト値=0で80×80、1の場合40×40、2の場合20×20、という風に小さくなり、処理時間が4倍ずつ大きくなるためです*3。Windowサイズが小さくなるにつれて、走査にかかる時間が大きくなるというわけですね。OpenCVのカスケード分類器は速度が最速でした。dnnモジュールについては、バストアップ等、顔が大きく映し出された画像の検出は上手く行きそうです。APIによる顔検出や、顔認識などをテーマに連載にしていければと思います。(1)執筆者リストid:chowagiken_tanzimid:chowagiken_kato_yudaiid:chowagiken_nakadaid:chowagiken_takamatsuid:chowagiken_kinid:chowagiken_uzzalスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。