Raspberry Pi:画像認識(ディープラーニング)カメラで人物検出,顔認識【ラズパイ,Python,Picamera,Keras,OpenCV】

ラズパイ上で開発した顔認識プログラムを応用して、今度はリアルタイム物体(顔)検出に挑戦してみました!ラズパイのカメラモジュールから読み込んだ映像に対し、AIで顔認識を行う「AIカメラ」です。

顔認識にはやはり、前回同様、OpenCV、Kerasを中心とした画像認識、ディープラーニング関連ライブラリを用います。今回はさらにカメラ映像を扱うため、カメラモジュール操作ライブラリである「picamera」も利用します。

簡単のため、カメラに映っている顔が本人(自分)か他人かを区別する、2値分類モデルを顔予測モデルとして実装します。

開発環境

■ハードウェア

Raspberry Pi 3 Model B




カメラモジュール

アイ・オー・データ機器 Raspberry Pi オプション カメラモジュール UD-RPCAMERA
アイ・オー・データ (2017-02-20)
売り上げランキング: 15,239



※ラズパイとカメラモジュールの接続方法、セットアップについては以下の本などが参考になります。




■OS

Raspbian GNU/Linux 9.11 (stretch)


■プログラミング言語、主なライブラリとバージョン

・Python 2.7.13
・picamera 1.13
・OpenCV 2.4.9.1
・Keras 2.1.5
・numpy 1.12.1
・theano 1.0.1
・matplotlib 2.0.0

プログラム


GitHubにサンプルプログラムを公開します。

https://github.com/kotetsu99/ai_camera


■顔検出の大まかな流れ

(1) 本人が映っている画像、本人以外の人物が映っている画像をそれぞれ10枚以上用意

(2) 画像処理ライブラリOpenCVを用いて、顔画像を抽出

(3) 抽出した顔画像をAI(Keras)に学習

(4) テスト画像に対して、OpenCVで顔画像を抽出し、学習モデルの精度を確認

(5) (3)の学習モデルを用いて、カメラ映像に映る人物をリアルタイムで顔認識



■各プログラムの概要


(1) 01-face_detection.py: 顔検出プログラム
・画像から人物の顔を検出して、顔画像ファイルをディレクトリに保存。

(2) 02-cnn_face_train.py: 顔学習プログラム
・(1)で生成した顔画像をAIに学習させ、予測モデルを生成。
・予測モデルは、CIFAR-10 画像データセット向けのAIモデル(9層畳み込みネットワーク)の構成。本人と本人以外の2値分類モデルとする。

(3) 03-cnn_face_recognition.py: 顔認識プログラム
・(2)で生成した予測モデルを使って、テスト画像に対して顔認識を実行。

(4) 04-ai_camera.py: AIカメラプログラム
・(2)で生成した予測モデルを使って、カメラ映像上の人物をリアルタイムで顔認識。
・カメラ認識開始から制限時間(30分)後に、プログラムを自動終了。

(5) haarcascade_frontalface_alt.xml: 人物の正面顔検出 カスケード分類器
・(1)(3)(4)のプログラムで使用。OpenCVのパッケージに標準で付属している分類器。

(6) dataset: 画像データセット保存ディレクトリ
・01-org: 学習に使用する人物画像ファイル保存先。
  -person(本人), others(他人)の2フォルダあり。
・02-face: 01-orgから検出した顔画像ファイル保存先
  -person(本人), others(他人)の2フォルダあり。
・03-test: 顔認識テストに使用する人物画像ファイル保存先
・04-rec: 03-testに対する顔認識結果ファイル保存先

(7) model: 予測モデル保存ディレクトリ

プログラム使用方法


(1)データセットの準備

各人物の映った画像を以下のフォルダに保存します。

・dataset/01-org/person   →本人の画像を複数保存
・dataset/01-org/others    →他人の画像を複数保存


(2)顔検出プログラムを実行

以下のコマンドを実行します。

$ python 01-face_detection.py person others

先ほどのdataset/01-org 配下の画像から、dataset/02-face 配下にある以下のサブディレクトリに、検出された顔画像が保存されます。

・dataset/02-face/person   →本人の画像を複数保存
・dataset/02-face/others   →他人の画像を複数保存

02-face配下のサブディレクトリは人物名とします。このディレクトリ名は、AIで定義される顔ラベルとしてそのまま使用されます。


(3)顔学習プログラムの実行

以下のコマンドを実行します。

$ python 02-cnn_face_train.py model/face_model.h5

dataset/02-face 配下にある顔画像を学習し、顔予測モデル(face_model.h5)を生成します。マシンのスペックによりますが、学習時間がかなりかかります。以下のように、バックグラウンド実行することをおすすめします。

$ nohup python 02-cnn_face_train.py model/face_model.h5 &

バックグラウンドで画像学習処理が進みます。進捗状況は、nohup.outファイルに出力されるので、以下のコマンドで確認できます。

$ tail -f nohup.out

学習終了後、予測モデルの学習過程(損失関数の推移)を記した、以下のグラフ図ファイルが出力されます。

・cnn_face_train_figure.png


(4)テストデータセットの準備

顔認識させたい人物が映ったテスト用画像を以下のフォルダに格納。

・dataset/03-test
→人物が映っている適当な画像を保存


(5)顔認識プログラムの実行

以下のコマンドを実行します。

$ python 03-cnn_face_recognition.py model/face_model.h5

dataset/03-test 配下にある画像に対し、顔予測モデルを使用して顔認識を実行します。
顔認識結果は以下のフォルダに保存されます。

・dataset/04-rec


(6)AIカメラプログラムの実行

以下のコマンドを実行します。

$ python 04-ai_camera.py model/face-model.h5

しばらくすると、カメラ映像を映したウィンドウがデスクトップ画面上に現れます。
本人の顔がカメラに映った場合、赤枠と「person」という文字が顔の周りに表記されます。本人以外がカメラに映った場合、赤枠と「others」という文字が顔の周りに表記されます。

以下のような、感じですね。






(実行例を出したいところですが、すみません顔出しは勘弁で;)

ウィンドウをカーソル選択後に「q」キーを押下すればプログラムは終了します。
またカメラ認識開始から30分後に、プログラムは自動終了します。

プログラムの解説は以下に掲載しました。
https://nine-num-98.blogspot.com/2020/02/ai-camera-02.html

スポンサーリンク