contentpythonとdlibでお手軽に顔のランドマークを検出してみたPythonOpenCVdlibはじめに私が学生の頃は顔のランドマーク検出の研究をひーひー言いながらやっていました。今ではそれが信じられないくらい簡単になって驚きました。実際にやってみたいと思います。実装したいんじゃ、という人は「お手軽に顔のランドマーク検出をやってみた」から読んでください。顔のランドマーク検出方法について顔のランドマーク検出の方法は主に以下の3つに分かれるようです。各々の詳細は参考リンクに載せた論文をご参照ください。回帰ツリー分析を用いてリアルタイムで高精度なランドマーク検出を実現しています。dlib、OpenCV(FacemarkKazemi)共に実装されています。学習モデルがデフォルトで用意されているのはdlibだけです。物体の形状と外観から学習された統計モデルに基づき物体検出を行います。顔に限らず高度な物体追跡として長く使われている手法です。(学生時代に私が研究していたのもこのAAMです)OpenCV(FacemarkAAM)に実装されていますが、学習モデルは自作する必要があります。学習モデル生成用のツールや、誰かの作った学習モデルは探せば見つかるので、敷居は低いと思います。回帰学習により非常に高速なランドマーク検出が可能です。trees」と類似した手法のようですが細かい違いが分かりません。OpenCV(FacemarkLBF)に実装されており、学習モデルも用意されています。treesを用いた手法」を使います。事前準備pythonモジュールの入手モジュールとして顔のランドマーク検出のためdlibとimutils、画像関連のためにOpenCVを追加します。注意点としてdlibを追加するためにはAnaconda環境のpythonである必要があります。学習済みモデルはdlibの公式サイトの以下から入手できます。余談ですが上記の学習済みモデルは以下のサイトのデータを元に生成されています。顔画像は以下から「Girl.bmp」を入手し使わさせていただきました。思う方もいるかもしれません。「Lenna」は振り向き顔のせいか、思ったよりよい結果が得られなかったので外しています。気になる方は試してください。静止画から顔のランドマーク検出を実施するサンプルです。学習済みモデル(shape_predictor_68_face_landmarks.dat)と顔画像(Girl.bmp)は面倒なので同じ階層に置いています。※2番めの引数はupsampleの回数。img)cv2.waitKey(0)cv2.destroyAllWindows()結果は次の通りです。上図の通りキレイに顔のランドマークが検出されています。ランドマーク検出までに各コードで何をしているか解説します。顔のランドマーク検出をしたあとは、当然色々な処理をしたいと思います。その時に気になるのが、各ランドマークをどのように呼び出せばよいかです。顔のランドマークは上述したサイトのデータから学習されています。そのためランドマークの番号も、学習元のサイトに記載されている番号通りになっています。ランドマークの番号:https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/上図を見れば分かる通り、番号は1~68まで割り振られています。実際に参照するときは、配列は0番から始まるため、0~67となり番号がひとつずれます。分かりにくいので図とコードを交え実際に、一部を切り取って見ます。cv2.destroyAllWindows()結果は次の通りです。このようになる理由は以下の通りです。ランドマークは1番からスタートしますが、それを格納する配列は0番からスタートします。そのためこのようなズレが生じます。リアルタイムでの顔のランドマーク検出おまけにカメラ画像から顔のランドマーク検出をするサンプルを載せます。ネット上に顔を晒す勇気がないため実行結果はなしです。OpenCVhttps://www.learnopencv.com/facemark-facial-landmark-detection-using-opencv/各顔のランドマーク検出のアルゴリズムがどの論文から実装されているか解説されています。C++によるFacemakerLBFを用いた顔のランドマーク検出のサンプルも載っています。Sullivanさんによって発表された論文です。今回使用したdlibに実装されている顔のランドマーク検出のアルゴリズムは本論文に基づいています。Panticさんによって発表された論文です。OpenCVのFacemakerAAMは本論文に基づき実装されています。Renによって発表された論文です。OpenCVのFacemakerLBFは本論文に基づき実装されています。Detection~http://dlib.net/face_landmark_detection.py.htmldlib公式サイトに紹介されている、pythonによる顔のランドマーク検出のサンプルです。dlibによる顔のランドマーク検出のソースコードが日本語で案内されています。コーディングの際に参考にさせていただきました。dlibによる顔のランドマーク検出のソースコードが英語で案内されています。詳しく解説されているため、各処理の理解に繋がり、大変参考になりました。requestStockLike6@mimitaroPostgreSQL大好き人間です。他にも趣味でpythonやらJavaやらをいじっています。upLoginユーザーは見つかりませんでした。