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

この記事では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勉強会に参加してみてはいかがでしょうか。


2 Comments

yoko · 2019-07-11 at 07:32

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

Leave a Reply

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