知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

ラズパイでOpenCVを使った顔検出と顔認識を試してみた

ラズパイでOpenCVを使って顔認識を行う的な記事は、既に星のように出ている気がしていましたが、最近やろうとしたら意外とすんなりいかなかったので、記事にすることにしました。

 

基本はこのプロジェクトのプログラムを実行していく感じになります。

この方、いい笑顔してますよね!

このプロジェクトのチュートリアルはこのサイトに書かれています。

 

使ったもの

ハードウェア

ソフトウェア

 

環境構築

カメラの有効化

Raspberry Pi の設定」の「インターフェイス」タブを開いて、「カメラ」を「有効」にします。

f:id:IntellectualCuriosity:20200903155251p:plain

 

OpenCVのインストール

※2020年9月4日追加

顔検出だけならoepncv_python 4.1.0.25で動いたのですが、顔認識のトレーニング用のプログラムを実行したら次のエラーが出て動きませんでした。

Traceback (most recent call last):
  File "02_face_training.py", line 21, in <module>
    recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module 'cv2.cv2' has no attribute 'face'

ググってみたらopencv-pythonにはメインモジュールしか含まれていなく、contribモジュールが含まれているopencv-contrib-pythonをインストールする必要があったことがわかりました。

既にoepncv_python 4.1.0.25をインストールしてしまった方は、次のコマンドでアンインストールした後にopencv-contrib-pythonをインストールしてください。

$ sudo pip3 uninstall opencv-python

OpenCVをインストールするのに、本当に必要だったコマンドは次の1行です!

$ sudo pip3 install opencv-contrib-python==4.1.0.25

追加はここまで

 

今回の記事を書くきっかけとなったのがこの作業です。

普通なら次のコマンドだけで、サクッとインストールできるのですが...

$ sudo pip3 install opencv-python

2020年9月1日時点では、なぜか100MB近いファイルをダウンロードしてきて、1時間経ってもインストールが終わらず、挙句の果てにエラーが出たので中断しました。

ググってみると2019年11月ぐらいからインストールできなくなっていたらしく、次のように古い(インストールできる)バージョンを指定してインストールしている記事が複数見つかりました。

$ sudo pip3 install opencv-python==4.1.0.25

このバージョンだと10MB程度のファイルで、1分もかからずにインストールが完了しました。

 

必要なライブラリのインストール

Raspberry Pi OSにデスクトップ版のイメージを使っている場合は、次のライブラリをインストールします。

2020年9月4日 顔認識で必要なlibhdf5-devを追加

$ sudo apt install libatlas-base-dev libqt4-test libjasper1 libhdf5-dev

 

プロジェクトファイルのダウンロード(クローン)

https://github.com/Mjrovai/OpenCV-Face-Recognitionにアクセスして、プロジェクトファイルをダウンロードします。

f:id:IntellectualCuriosity:20200903163816p:plain

 緑色の「Code」ボタンをクリックすると、クローン用のURLが表示されるので「コピー」アイコンをクリックします。

$ git clone の後にコピーしたURLをペーストすると次の文になるので、実行します。

$ git clone https://github.com/Mjrovai/OpenCV-Face-Recognition.git

これでホームディレクトリに「OpenCV-Face-Recognition」ディレクトが作られて、プロジェクトのファイルがダウンロード(クローン)されます。

 

顔検出(Face Detection)

OpenCV-Face-Recognition」プロジェクトには「FaceDetection」(顔検出)と「FacialRecognition」(顔認識)の2つのディレクトリがあります。

顔認識は認識させる顔の写真をいつくも用意する必要があるので、まずはそのまま動かすことができる顔検出から行ってみます。

顔検出ディレクトリには次の4つのプログラムがあります。

  • faceDetection.py
  • faceEyeDetection.py
  • faceSmileDetection.py
  • faceSmileEyeDetection.py

実行するには「FaceDetection」ディレクトで次のようにコマンドを実行します。

$ python3 faceDetection.py

プログラムは「video」ウインドウでエスケープキーを押すと終了します。

眼鏡をかけていると目の検出精度が落ちるので、ジョブズの若い頃の写真でそれぞれ実行してみた結果を載せます。

faceDetection.py(顔検出)

f:id:IntellectualCuriosity:20200903183939p:plain

faceEyeDetection.py(顔と目の検出)

f:id:IntellectualCuriosity:20200903184128p:plain

faceSmileDetection.py(顔とスマイル(口)の検出)

f:id:IntellectualCuriosity:20200903184326p:plain

faceSmileEyeDetection.py(顔とスマイル(口)と目の検出)

f:id:IntellectualCuriosity:20200903184432p:plain

 

顔認識(Facial Recognition)

顔データの用意

まずは「FacialRecognition」ディレクトリに顔データを格納するディレクトリ「dataset」を作ります。

$ mkdir dataset

そして顔データ作成用のプログラム「01_face_dataset.py」を実行します。

$ python3 01_face_dataset.py

実行すると

enter user id end press <return> ==>

と、聞かれるので、識別する顔番号を入力します。

[INFO] Initializing face capture. Look the camera and wait ...

と、表示されてカメラに顔を向けて少し待つと、どどどどどっと連続して30枚写真が撮られます。

最後に

[INFO] Exiting Program and cleanup stuff

と、表示されてプログラムが終了します。

 

写真を撮るときに帽子や眼鏡をしていると、顔と認識されるのに時間がかかったりするみたいで、柄の細かい服を着ているとそれを顔と認識することもありました。

写真を撮った後はファイルマネージャで「dataset」フォルダの写真をサムネイル表示して確認した方が良さそうです。

 

ぼくとジョブズの検索画面で出た顔で2つのデータセットを作った後の「dataset」フォルダのスクショ。

f:id:IntellectualCuriosity:20200904170301p:plain

 

レーニン

作成したデータセットOpenCV Recognizerを使ってトレーニングします。

まず、トレーニング結果を保存するディレクトリ「trainer」を作成します。

$ mkdir trainer

「trainer」ディレクトリができたら、トレーニング用のプログラムを実行します。

$ python3 02_face_training.py

プログラムを実行したら次のように表示されました。

[INFO] Training faces. It will take a few seconds. Wait ...

[INFO] 2 faces trained. Exiting Program

今回は、ぼくとジョブズの2人分のデータを用意してトレーニングを実行したので、2 faces trained.と表示されています。

プログラムが終了すると、最初に作成した「trainer」ディレクトリにOpenCV Recognizerによってトレーニングされた結果ファイル「trainer.yml」ができます。

 

顔認識

これでやっと顔認識ができる!っと喜ぶ前に、最後の試練、ソースの書き換えをしましょう。

03_face_recognition.pyの26行目に、認識した人の名前が次のように記述されているので、顔データとして用意した人の名前に変更します。

names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

最初の'None'は顔番号0で、トレーニングを行ったのは顔番号1のぼくと顔番号2のジョブズなので、次のように変更しました。

names = ['None', 'Hiro', 'Steve', 'Ilza', 'Z', 'W']

変更したら、次のコマンドで03_face_recognition.pyを実行します。

$ python3 03_face_recognition.py

f:id:IntellectualCuriosity:20200904193549p:plain

自分なのに40%とは!まぁ、うまく動いたようです。

 

おわり