Avance.Lab

技術紹介

第7回 顔認識デバイス Raspberry Pi 4B編 〜画像解析(顔認識)編 〜

公開日:2022.01.28 更新日:2022.01.28

tag: Raspberry PiIoT

こんにちは。Kです。

Raspberry Pi 4B編ということで回を分けて細かく解説してきたわけですが、

顔認識だけでも機能や簡単な原理を説明するとまだ2〜3本作れることに気づきました。

なのでもう少しお付き合いください。

顔認識と一言でお話ししていましたが、実際には下記の2点の機能に分かれています。

  1. ① 顔の特徴点解析(Haar-Like分類機)+顔方向へ首振り
  2. ② DNNを使った年齢と性別判別機能

この回では①について説明していきます。

画像解析に使用するライブラリはOpenCVのver3系列を使います。

物体の特徴点を分類するアルゴリズムの一つとして、Haar-Like分類機のアルゴリズムを使用します。

顔の標準的な特徴データはOpenCVに内包してあるので、こちらを使います。

おまけとして目の特徴データもあるのでこちらも読み込ませます。

face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml' )
eye_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_eye.xml')

下記はカメラ画像に対する解析処理です。

特徴点分類にはグレースケール画像で処理する必要があるため、カメラ画像は必ずグレースケール画像に置き換えます。前段の顔認識オブジェクトからdetectMultiScale関数使うことで顔の特徴と分類された矩形データを返します。

顔の特徴と捉えた矩形を全て返すため、複数返される場合があります。

        # グレースケールに変換
        gray = cv2.cvtColor(frame_for_analyze, cv2.COLOR_BGR2GRAY)

        # 顔認識
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

顔認識した矩形情報から目の検出を行うため、顔部分から画像データを抽出してそこから目を検出します。

また、顔部分の画像データは年齢/性別判断に使用するため、画像データリストとしてメモリに保持しておきます。

上記処理の終わりにカメラの首振りの位置を算出します。本来であれば顔の推定距離から正確な角度を割り出したいところですが、処理を簡易化しています。

        for (x,y,w,h) in faces:
          # Eye Detect
          if spp.eyedetect == 1:
            roi_gray = gray[y:y + h, x:x + w]
            eyes_ = eye_cascade.detectMultiScale(roi_gray)

            for (ex,ey,ew,eh) in eyes_:
              eyes.append(pygame.Rect(x + ex, y + ey, ew, eh))

          # Age/Gender Detect
          if spp.agegenderdetect == 1:
            if analyzing_agegender == False:
              face_images.append(frame_for_analyze[y:y + h, x:x + w])


          # 顔認識位置からパンチルト移動量を算出
          rectcenterx = x + w / 2
          rectcentery = y + h / 2
          res_x = analyze_width / 2 - rectcenterx
          res_y = -(analyze_height / 2 - rectcentery)
          if rectcenterx != analyze_width / 2:
            mov_x += res_x / 30
          if rectcentery != analyze_height / 2:
            mov_y += res_y / 40

これで顔検出とカメラの移動については完成です。

次回は性別/年齢推定部分の解説です。ではまた!

K
K

クラウド,IoT,小型PC,スマートフォンなど環境問わず担当しています。
最近はROS2に興味があります。

関連記事