最近のスマートフォンでは顔認識システムが導入されています。生体認証として指紋や静脈とともに顔認識はよく使われています。手がふさがっていても使えるのが便利です。

この記事ではReal-Time Face Recognition: An End-to-End Project – Hackster.ioを参考に、Raspberry Pi上で動作する顔認識システムを構築してみます。

利用するデバイス

  • Raspberry Pi 3 B+
  • カメラモジュール v2

利用する技術

  • Python3
  • OpenCV

ライブラリのインストール

まずは必要になるライブラリをインストールします。

sudo pip3 install opencv-python
sudo pip3 install pillow
sudo apt-get install libatlas-base-dev
sudo apt install libjasper1 -y

OpenCVとともに、取得した画像を扱うPILをインストールします。

テスト

まずはちゃんとカメラで認識できるかテストしてみます。今回はRaspberry PiにHDMIディスプレイを接続して確認しています。 raspi-config でカメラを有効にした後、下記コマンドを実行します。

sudo modprobe bcm2835-v4l2 

そしてこちらのコードをダウンロードして実行します。実行後、カメラモウィンドウが開き、顔が表示されれば問題ありません。

顔を認識する

顔を認識する際には、こちらのスクリプトをダウンロードして実行します。他にも顔と目を認識する笑い顔を認識する笑い顔と目を認識するサンプルファイルが用意されています。

実行結果は例えば以下のようになります。

顔だけ認識した場合。

顔と目を認識した場合。

顔画像を作成する

では顔認証のために、最初に顔画像を用意します。まずこちらの設定ファイルをダウンロードします。同じディレクトリにこのスクリプトファイルを置きます。最後に dataset というディレクトリを作成します。

スクリプトを実行すると、顔の画像を30枚保存して処理が終了します。

$ ls dataset/
User.1.1.jpg   User.1.13.jpg  User.1.17.jpg  User.1.20.jpg  User.1.24.jpg  User.1.28.jpg  User.1.4.jpg  User.1.8.jpg
User.1.10.jpg  User.1.14.jpg  User.1.18.jpg  User.1.21.jpg  User.1.25.jpg  User.1.29.jpg  User.1.5.jpg  User.1.9.jpg
User.1.11.jpg  User.1.15.jpg  User.1.19.jpg  User.1.22.jpg  User.1.26.jpg  User.1.3.jpg   User.1.6.jpg
User.1.12.jpg  User.1.16.jpg  User.1.2.jpg   User.1.23.jpg  User.1.27.jpg  User.1.30.jpg  User.1.7.jpg

顔画像を学習する

集めた顔画像を使って学習を行います。設定はYAMLファイルになります。保存されるファイルのために trainer というディレクトリを作成しておきます。トレーニングはこちらのスクリプトで行います。

もし AttributeError: module 'cv2.cv2' has no attribute 'face' というエラーが出たら、下記のコマンドを実行してください。

$ sudo pip3 install opencv-contrib-python

また ImportError: libhdf5_serial.so.100: cannot open shared object file: No such file or directory というエラーの場合は下記のコマンドを実行します。

$ sudo apt install libhdf5-100

試す

学習が正しく行われたのかテストします。こちらのスクリプトをダウンロードし、実行します。

枠線の中に、認識精度が出ています(名前はコードにハードコーディングされているだけです)。30〜60%程度の認識精度です。逆に登録していない顔の場合はマイナスの認識精度になっています。

課題

今回作ったシステムの場合、顔写真でも認識してしまいます。本来の顔認識であれば、写真では反応しないようにすべきでしょう。

まとめ

このシステムはあくまで簡易的なもので、実用的とは言えないでしょう。しかし顔を認識し、それを学習するという基本的な動きは顔認識システムと変わりません。写真や彫刻などを除外する仕組みであったり、学習量を増やすことで認識精度を高めることができれば、ちょっとした入退室管理システムは作れそうですね。

Real-Time Face Recognition: An End-to-End Project – Hackster.io

おわりに

Raspberry Piを使ったエッジAIのIoTシステムを構築に興味のある方はぜひIoTエンジニア養成キットで学習してみたりisaax User Groupe勉強会に参加してみてはいかがでしょうか。


11 Comments

yoko · 2019-07-11 at 07:32

とても参考になります。
私の場合、Raspbian Buster だとsudo pip3 install opencv-pythonでエラーとなってしまい、Raspbian Stretch に戻す必要がありましたので試される方はご参考まで。

Rei · 2019-11-04 at 23:40

はじめまして。顔認識に興味を持ちこちらのサイトの方を参考にさせて頂いている者です。
早速質問なのですが、「顔画像を作成する」の所のURLの「このスクリプトファイル」の所で「01_face_dataset.py」のスクリプトをLXTerminal上で動かした際に「enter user id end press ==>」と表示され user id の入力を求められるのですが、何と入力したらよろしいでしょうか?
ホスト名(raspberrypi)やユーザー名(pi)などの思い当たる物を打ち込んではいるものの「NameError : name ○○ is not defind」 と表示されるばかりで次の工程に進むことができずにいます。
申し訳ございませんが、ご教示くださいますよう何卒よろしくお願い致します。

    atsushi · 2019-11-06 at 12:12

    Reiさn
    コメントありがとうございます。user idは、顔を学習する際のIDになります。なので1や2といった数字を入力します。

    なお、01_face_dataset.py と言うスクリプトを見る限り、 `NameError : name ○○ is not defind` という出力を行うようにはなっていません。別なファイルを実行しているということはないでしょうか?

      Rei · 2019-11-07 at 17:55

      “NameError : name ○○ is not defind”についてですが、user id 入力画面で”1″や”2″と打たずに”raspberry”や”pi”などと打つと何故か出てきました。

    Tomoyuki Sugita · 2019-11-06 at 12:20

    Reiさん
    記事に興味を持っていただきありがとうございます。
    ソースコードのコメントを参考に実行してみてください😁
    https://github.com/Mjrovai/OpenCV-Face-Recognition/blob/master/FacialRecognition/01_face_dataset.py#L21-L22

Rei · 2019-11-07 at 17:49

返信ありがとうございます!
user id 入力画面の所で”1″を入れたところスクリプトが動きラズパイのカメラが起動して画面上に投影されて終了しました。
そこからなのですが、terminal上で”ls dataset/” と入力したところこのサイトのようにjpegのデータの表示されずjpegデータが入っていませんでした。
対処法をもしご存知であれば教えて頂きたいのです。よろしくお願いします。
(pi/homeの中に”dataset”というファイルを作りその中に”01_face_dataset.py”というスクリプトと”haarcascade_frontalface_default.xml”というxmlファイルを入れた状態でスクリプトを実行しました。)

    Rei · 2019-11-07 at 18:01

    返信ありがとうございます!
    サイト上での解釈についての質問なのですが、”顔画像を作成する”の所でダウンロードした”xmlファイル”とコピペした”スクリプトファイル”を同じフォルダに入れて、そのフォルダ名を”dataset”という名前にすればよろしいのでしょうか?

      atsushi · 2019-11-07 at 18:13

      構造としては

      – haarcascade_frontalface_default.xml
      – 01_face_dataset.py
      – dataset/
      – User.1.1.jpg
      :
      – User.1.30.jpg

      のようになるかと思います。

        Rei · 2019-11-08 at 15:50

        ありがとうございます!
        “facemakepicture”というフォルダの中に”dataset”と”01_face_dataset.py”、”haarcascade_frontalface_default.xml”を入れて実行したところ”dataset”の中に30枚程 jpgファイルが作成されました。

        その後なのですが、先程の”facemakepicture”のフォルダの中に新たに”02_face_training.py”というスクリプトを入れて起動したところ

        Traceback (most recent call last):
        File “02_face_training.py”, line 21 , in
        recognizer = cv.2face.LBPHFaceRecognizer_create()
        AttributeError: ‘module’ object has no attribute ‘LBPHFaceRecognizer_create’

        というエラーが出てきまして、もし対処法などご存知であれば教えて頂きたいのですが…

    atsushi · 2019-11-07 at 18:15

    datasetはファイルではなく、フォルダでしょうか?

    datasetの中に01_face_dataset.py、haarcascade_frontalface_default.xmlではありません。

    01_face_dataset.py、haarcascade_frontalface_default.xmlがある場所にdatasetというフォルダを作成します。

Leave a Reply to Rei Cancel reply

Your email address will not be published. Required fields are marked *