どうも~、IoT探検家のシンジです。
今日はラズパイでAIの顔検出にチャレンジしてみました〜。
用意したもの
・ラズパイ本体(Raspberry Pi 4)
・モニター
・キーボードとマウス
・microSDカード
・HDMIケーブル(microHDMI→HDMI)
・USB-C接続の電源アダプター



全体の流れ
1)GitHubから学習済みの顔検出モデル「Haar Cascades」をダウンロード
2)実行ファイルを作成
3)サンプル画像を用意
4)AIによる顔検出をおこなう
準備としてOpenCVがラズパイにインストールされている必要があります。ラズパイへのOpenCVのインストール方法についてはこちらの記事を御覧ください

1)GitHubから学習済みの顔検出モデル「Haar Cascades」をダウンロード
顔検出ができるAIのモデルは沢山ありますが、今回選んだのはHaar Cascadesという20年以上前から使われている歴史のあるモデルになります。
Haar Cascadesとは
Haar特徴ベースのCascade型分類器を使った物体検出モデルで、
Paul ViolaとMichael Jonesが2001年に”Rapid Object Detection using a Boosted Cascade of Simple Features”という論文で発表した。
最近流行っているディープラーニングのモデルほど正確な予測はできませんが、モデルの容量が小さいため早く予測できるのが特徴です。
そしてこのモデルは無料で利用でき、OpenCVのGitHubからソースコードをダウンロードできます。

GitHubとは
ユーザのみなさんからヒントを得て作成された開発プラットフォームです。オープンソースプロジェクトやビジネスユースまで、GitHub上にソースコードをホスティングすることで数百万人もの他の開発者と一緒にコードのレビューを行ったり、プロジェクトの管理をしながら、ソフトウェアの開発を行うことができます。
それではやっていきましょう。

まずはラズパイにHaar Cascadesモデルを入れるフォルダを用意します。(僕はデスクトップにface-detectionというフォルダを作りました。)
cd /home/pi/Desktop/face-detection
wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml
そしてLXTerminalを使って、用意したフォルダに移動して、wgetコマンドを使ってOpenCVのGithubからHaar Cascadesモデルをダウンロードします。(Haar Cascadesモデルは沢山の種類がありますが、一般的なhaarcascade_frontalface_defaultを選びました。)

これでHaar Cascadesモデルはダウンロードが終わりです。
2)実行ファイルを作成
続いてHaar Cascadesモデルを使って顔検出をおこなうための実行ファイルを作っていきましょう。

ファイル名はdetect_faces.pyとして、face-detectionフォルダの中に置きます。
そしてdetect_faces.pyをコードエディターで開きます。コードエディターはどれを使っても良いですが、僕は今一番人気があるVisual Studio Codeを選びました。
Visual Studio Codeとは
Microsoftが開発しているWindows、Linux、macOS用のソースコードエディタである。デバッグ、埋め込みGitコントロールとGitHub、シンタックスハイライト、インテリジェントなコード補完 、スニペット、コードリファクタリングのサポートが含まれる。カスタマイズ性が高く、テーマやキーボードショートカット、環境設定を変更できたり、機能を追加する拡張機能をインストールすることができる。
sudo apt update
sudo apt install code
ラズパイにVisual Studio CodeをインストールするためにはLXTerminalにこの2つのコマンドを入力。
インストールが終わるとメニューバーのプログラミングからVisual Studio Codeを使えるようになります。

それではコードエディターで開いたdetect_faces.pyファイルにHaar Cascadesモデルを使った顔検出のコードを書いていきましょう。
import argparse
import cv2
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to input image")
ap.add_argument("-d", "--detector",
default="haarcascade_frontalface_default.xml",
help="path to haar cascade face detector")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
detector = cv2.CascadeClassifier(args["detector"])
rects = detector.detectMultiScale(gray, scaleFactor=1.05,
minNeighbors=9, minSize=(40, 40),
flags=cv2.CASCADE_SCALE_IMAGE)
print("[INFO] {} faces detected...".format(len(rects)))
for (x, y, w, h) in rects:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("Faces", image)
cv2.waitKey(0)
簡単にコードを説明してみます。
ap.add_argument 引数を設定
rects = detector.detectMultiScale() 顔の座標を取得
cv2.rectangle() サンプル画像上に四角形を描く
コードを書き終えたらdetect_faces.pyファイルを保存します。
3)サンプル画像を用意
次は顔検出で使うサンプル画像を用意です。(人間の顔が写っていればどんな画像でもオーケー)
face-detectionフォルダ内にimagesフォルダを作って、その中に入れます。

これでAIによる顔検出をおこなう準備が整いました。いよいよ実際に顔検出を試してみましょう~
4)AIによる顔検出をおこなう
workon cv
cd /home/pi/Desktop/face-detection
python detect_faces.py --image images/example.png \
--detector haarcascade_frontalface_default.xml
まずはLXTerminalでworkon cvコマンドを入れてPythonの仮想環境を立ち上げます。
そして2つ目のコマンドでface-detectionフォルダに移動して、3つ目のコマンドでdetect_faces.pyファイルを実行します。(example.pngは自分の画像ファイル名に置き換えてくださいね。)

するとデスクトップに顔検出がおこなわれた画像が現れました~!
他の写真でも試してみましょう~。



※注意点
1枚目の画像をよく見てみると、後ろの野球の掲示板の文字を誤って顔と予測してしまっています。また3枚目の画像ではリボンを顔と予測してしまっていますし、4枚目では顔を予測できいません。
これはHaar Cascadesモデルが顔以外の物体を顔と誤検知しやすく、ディープラーニングのモデルほど正確に予測できないためです。
その一方で、モデルの容量が小さいため、ラズパイのような処理能力に制限があるコンピュータでも早く予測できるようです。
今後はディープラーニングの顔検知モデルなども試してみたいと思っています〜
振り返り
最後に今回のAIによる顔検出の振り返りです。
振り返り
・OpenCVのGithubからHaar Cascadesモデルをダウンロードする際はwgetコマンドを使うと便利
・顔検出モデル「Haar Cascades」は正確さはイマイチだが、モデルの容量が小さいため、ラズパイのような処理能力に制限があるコンピュータでも早く予測できる
・今回のAI顔検出にかかった時間は180分でした。(Haar Cascadesモデルをダウンロードする方法が分からず時間がかかってしまいました~汗)
コメント