OpenCVのカスケード分類器で顔検出をしてみた!

私は今、Aidemy Premium Planという、未経験者が3か月で機械学習、ディープラーニング、データ分析、AIアプリ開発まで最先端技術を幅広く学べるオンライン学習サービスで勉強しています。

そして、AIアプリ開発コースにおいて、AIアプリの自主制作に取り組んでいます。

私が製作しているアプリは、『嵐のメンバーでいうと誰?』というアプリです。顔画像をアップロードすると、嵐のメンバーで最も似ているメンバーを教えてくれるというアプリです。製作の大きな流れはこんな感じ。

  • 学習用の画像の収集
  • 嵐メンバーの学習
  • アプリに実装

学習用の画像の収集については、Bing Image Search APIを使いました。こちらの記事(【Bing Image Search API v7】学習用の画像を収集してみた!)にまとめております。

学習用の画像を収集しましたが、これをそのまま学習に使うべきではありません。なぜなら、収集した画像には顔部分以外も含んでいるので、純粋に顔の学習ができないからです。

そこで、顔部分の画像にしてやる必要があります。例えば、このように全身の画像を、顔部分の画像にする処理を行います。

今回は、OpenCVというライブラリを使って顔検出をして、顔部分だけの画像を生成します。OpenCVには顔や目を検出できるカスケード分類器の学習済みファイルがあるので、それを使います。

OpenCVのカスケード分類器の使い方

Github(https://github.com/opencv/opencv)から、Clone or downloadをクリックして、Download zipをクリックしてダウンロードします。そして、opencv-master/data/haarcascades/の中にあるhaarcascade_frontalface_default.xmlというファイルを使います。

まず、こちらの画像を顔検出して四角で囲んでみます。

face.pyにコードを書きます。face.pyと同じ階層にhaarcascade_frontalface_alt.xmlファイルを置いときます。face.pyのコードは以下。

参考にした記事はこちら(PythonでOpenCVを使った顔検出してみた)。

顔認識をする場合は、グレースケールへ変換するのが一般的のようです。

顔認識cascade.detectMultiScaleでは、パラメータ(scaleFactor, minNeighbors, minSize)を設定できます。パラメータについてはこちらの記事(物体検出(detectMultiScale)をパラメータを変えて試してみる(scaleFactor編))を参考にしてください。

結果はこちら。見事に顔が検出されています。

顔検出して画像を保存

上記のOpenCVのカスケード分類器を使って、嵐のメンバー(ここでは二宮和也)の顔検出をして画像を保存します。

Desktopにあるarashiディレクトリの中にface_detect.py、haarcascade_frontalface_alt.xml、二宮君の画像が入ったninomiyaフォルダを置きます。

  • arashiの構造
    • face_detect.py
    • haarcascade_frontalface_alt.xml
    • ninomiya
      • 二宮画像1
      • 二宮画像2
      • 二宮画像3
      • ・・・

こちらがコード(face_detect.py)です。

このように、二宮君の顔検出した画像が保存されます。

しかしながら、すべての画像が顔検出できるわけではなく、顔検出ができなかった画像(以下)もありました。顔が横向きだったり、顔が斜めになっている場合は顔検出が難しいようです。

と〜げ

今回、コードはこちらの記事(Kerasでアニメ 「けいおん!」を画像認識させてみた)を参考にしました。今回のコードだけではなく、こちらの記事を参考に進めています。

2 COMMENTS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です