01. 顔認証・オブジェクト検出 DeepFace

手書きOCR・大規模言語モデルを使用した音声出力に続き、今回は新たに「顔認証・オブジェクト検出編」へと進み、ここではバーチャルヒューマノイド・PCOASの「眼」となる技術について勉強していきます。

といってもPCOAS初号機には、顔認証・感情分析・オブジェクト検出が既に搭載されており機能しています。このため現状、起動後の画面は顔認識・感情認識結果がリアルタイムに表示されています。



感情分析や第三世代オブジェクト認識を掲載した当時(と言っても数年前)は、「未来の技術」としてHPに掲載しましたが、2024/03現在、先月発表され大規模言語モデルGeminiの画像認識モデルでは、画像と質問するだけで表情を分析し、文章の中に取り入れることができてしまう程になりました。

『左上の写真は笑顔で、右上の写真は困った顔をしています。
 左下の写真は照れ笑いをしていて、右下の笑顔は少し大人びた表情ですね。』

但し、現在のところ大規模言語モデルGeminiは対話の場合は「gemini-pro」、画像認識の場合は「gemini-pro-vision」と異なったモデルを使用する必要があります。



このように 大規模言語モデルは数年のうちに飛躍的進化を遂げていますが、同様にPCOASに搭載した顔認識やオブジェクト検出用モジュールもかなりの進化を遂げているようです。 そこで、今回新たな章を立ち上げ、 最初にPCOASに搭載されている感情認識付き顔認識システムを復習していきます。次のステップでは、モジュールの新しいバージョンを調査し大規模言語モデルの顔認識・感情分析機能と比較調査を行い、効率的な使用モジュールを見極めていきたいと思います。

01.01 顔認証復習~DeepFace(感情分析)~

それでは復習編へと入っていきます。

一般的にはテーマが「顔認証」であれば、「オブジェクト検知」から入って「顔認証」「感情分析」へと駒を進めますが、現PCOAS搭載顔認証システムでは感情認識付き顔認証・識別システムを搭載しているため、その両方が可能な顔認識用モジュール「DeepFace」の復習から始めていきます。

DeepFaceは2014年に発表され「顔認識技術DeepFaceに関する論文」では、97%とほぼ人間と互角、メソッドの1つに感情認識も含まれています。

今回使用するpython仮想環境は現在PCOAS運用している「python3.6」(仮想環境名「py36」)ではなく、最近のモジュールが標準的に使用している「python 3.9」(仮想環境名「py39」)を使用します。

★ DeepFace感情分析サンプルプログラム1

それでは、最初にDeepFaceモジュールを使用して感情分析を行います。

DeepFaceモジュールというのは、本サイトも含め「感情分析」用とした使用例がネットなどでよく見かけますが、本来は「顔検出」「特徴抽出」「顔認識」「顔分析」等、人の顔を認識し分析するモジュールで、「顔」に関するあらゆることができるライブラリを持っています。まずはpython仮想環境py39で動作可能かの調査も兼ねて、サンプルプログラムを動かすためのモジュールをインストールし環境を作りましょう。




【使用環境】
Python               3.9.18
opencv-python    4.8.1.78
deepface             0.0.86

【事前インストール】
pip install opencv-python
pip install deepface

【使用画像】



【インストール時の確認点】
現在2024/03/14時点での話です。
バージョンがどんどん変化しているため、仮想環境py36(python 3.6)、py39(python3.9)における各モジュールは下記のようになっています。尚、この時点で「tensorflow」はCPU版、GPU版は共有で、自動識別するようになっているようです。以降バージョンが重要になってきます。

仮想環境 py36 py39
python 3.6.10 3.9.18
deepface 0.0.75 0.0.86
tensorflow 1.14.0 2.16.0



では 最初にインストールが成功しているかの起動試験です。

注意点として「DeepFace」はtensorflowを使用します。
tensorflowは2024/03月時点で最新版numpyを使用するとバージョン不一致や使用CUDA等に関するメッセージが出ます。これを抑制するため「from DeZero.common.nlp_util import *」「tensorflow_warning_cancel()」を起動しますが、「common\nlp_util.py」をお持ちでない方は無しでも動きます。

次に、tensorflowの浮動小数点丸め誤差等に関するワーニングは前述ワーニング抑制しても出てきます。このため環境設定 「os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'」を指定し抑制します。こちらも無くても動きます。

では、実際にやってみましょう。

結果として、顔から分析できる次のようなカテゴリーをキーとした辞書変数です。
    emotion(感情)
    dominant_emotion(代表される感情)
    region(器官位置)
    face_confidence(顔の信頼度)
    age(年齢)
    gender(性別)
    dominant_gender(代表される性別)
    race(人種)
    dominant_race(代表される人種)

「emotion(感情)」の内訳は、次のような項目です。
    angry
    disgust
    fear
    happy
    sad
    surprise
    neutral
「region(器官位置)」の内訳は、次のような項目です。
    x
    y
    w
    h
    left_eye
    right_eye
「gender(性別)」の内訳は、次のような項目です。
    Woman
    Man
「race(人種)」の内訳は、次のような項目です。
    asian
    indian
    black
    white
    middle eastern
    atino hispanic


実行すると、最初の一回だけ各カテゴリーに関するモデルをクラウドからダウンロードします。

【DeepFace_test01.py】
#coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【DeepFace試験】
# ///
# ///  【改訂履歴】
# /// V0.00 2024/03/13 DeepFaceシンプルテスト
# ///	https://cppx.hatenablog.com/entry/2017/12/25/231121
# ///
# ////////////////////////////////////////////////////////////////////////////
# ///【使用環境】
# /// ・ Python         3.9.18
# /// ・ opencv-python  4.8.1.78
# /// ・ deepface       0.0.86
# ///
# ///【事前インストール】
# /// ・ pip install opencv-python
# /// ・ pip install deepface
# ///
# ////////////////////////////////////////////////////////////////////////////
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
import cv2
from deepface import DeepFace
tensorflow_warning_cancel()

if __name__ == "__main__":
    img = cv2.imread("c:\\Photo\\aragaki.jpg")

    # /// STEP01 : 感情分析
    # ////////////////////////////////////////////////////////////////////////////
    result = DeepFace.analyze(img)
    print(result)
    print(type(result[0]))

# [result]
# (py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024>python DeepFace_test01.py
# WARNING:tensorflow:From C:\Users\yamin\anaconda3\envs\py39\lib\site-packages\keras\src\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead.
#
# Action: race: 100%|██████████████████████████████████████████████████████████████████████| 4/4 [00:06<00:00,  1.59s/it]
# [{
#  'emotion': {'angry': 3.791340158487699e-09, 'disgust': 2.002449489743453e-18, 'fear': 1.5015461747244774e-10, 'happy': 99.4605004787445, 'sad': 5.323184670835701e-08, 'surprise': 3.609682108773882e-07, 'neutral': 0.5395032931119204},
#  'dominant_emotion': 'happy',
#  'region': {'x': 102, 'y': 75, 'w': 276, 'h': 276, 'left_eye': (86, 100), 'right_eye': (187, 101)},
#  'face_confidence': 0.95,
#  'age': 31,
#  'gender': {'Woman': 99.9056875705719, 'Man': 0.09431541548110545},
#  'dominant_gender': 'Woman',
#  'race': {'asian': 99.99996423721313, 'indian': 1.0933387528666572e-07, 'black': 1.9666831097692183e-11, 'white': 4.716102708357539e-06, 'middle eastern': 3.519574388877178e-10, 'latino hispanic': 3.081885324718314e-05},
#  'dominant_race': 'asian'}]
# <class 'dict'>

★ DeepFace感情分析サンプルプログラム2

今回使用しているサンプルプログラムは、以前HP作成時に使用したサンプルプログラム「CASE06_test30_emotional_recognition0*,py」にコメントを付けたものを使用しています。厳密には仮想環境py36では問題なく動作したプログラムですが、今回py39では実行するとエラーとなってしまいます。
原因は、「result["emotion"]」のように出力結果の感情分析部のみを抽出した個所が、仮想環境py36は単純な辞書型変数でしたが、仮想環境py39では辞書型変数を内包したリスト型変数に変更されているためでした。

# py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024>python DeepFace_test02.py
# Traceback (most recent call last):
#   File "d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024\DeepFace_test02.py", line 40, in 
#     emotion_dict = result["emotion"]
# TypeError: list indices must be integers or slices, not str

このため、仮想環境py39の「deepface」(0.0.86)の中身を見ると、py36でインストールされた「deepface」(0.0.75)当時とはまるで異なることが分かりました。

仮想環境 py36 py39
python 3.6.10 3.9.18
deepface 0.0.75 0.0.86
tensorflow 1.14.0 2.16.0

例えば具体的には「from deepface.commons import *」を使用しているようなサンプルプログラムは「deepface」(0.0.86)では全くなくなっており使用不可となります。
また、前述のように実際には複数ないのに「辞書型変数を内包したリスト型変数」に結果が変更されているためエラーとなります。

このため、PCOAS本体でも感情分析は使用しているため下記黄色文字部分のように変更する必要があります。また現在はリスト型項目は1つですが、増える可能性があるので要観察です。

【DeepFace_test02.py】
#coding: utf-8
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//")
os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'
from DeZero.common.nlp_util import *
import cv2
from deepface import DeepFace
tensorflow_warning_cancel()

if __name__ == "__main__":
    img = cv2.imread("c:\\Photo\\aragaki.jpg")

    # /// STEP01 : 感情認証
    # ////////////////////////////////////////////////////////////////////////////
    result = DeepFace.analyze(img,actions=['emotion'])

    # /// STEP02 : 感情抽出
    # ////////////////////////////////////////////////////////////////////////////
    # emotion_dict = result["emotion"] ← 024/03/13修正
    emotion_dict = result[0]["emotion"]
    print("emotion_dict : " , emotion_dict)

    # /// STEP03 : 最大値感情抽出
    # ////////////////////////////////////////////////////////////////////////////
    max_emt = max(emotion_dict, key=emotion_dict.get)
    print("max_emt      ; " , max_emt,"\n")

    # /// STEP04 : 感情辞書変数分析
    # ////////////////////////////////////////////////////////////////////////////
    values = np.array(list(emotion_dict.values()))
    labels = list(emotion_dict.keys())
    print(values)
    print(labels)

このように、海外では「互換」や「使い勝手」という概念がないのか、変更していってしまうため、各モジュールの使用方法や実際に試しながら復習しつつ、新しいことも勉強していきます。

# (py39) d:\VisualStudio2017\Python3.5_GPU\Sample_TEST\顔認識2024>python DeepFace_test02.py
# emotion_dict :  {'angry': 3.791355424054288e-09, 'disgust': 2.0024499744195933e-18, 'fear': 1.501551704155557e-10, 'happy': 99.4605004787445, 'sad': 5.323184670835701e-08, 'surprise': 3.6096823308184867e-07, 'neutral': 0.5395035725086927}
# max_emt      ;  happy
#
# [3.79135542e-09 2.00244997e-18 1.50155170e-10 9.94605005e+01
#  5.32318467e-08 3.60968233e-07 5.39503573e-01]
# ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system