dslclib.src.face_recognition module#

class dslclib.src.face_recognition.EmotionType(Neutral: Literal['neutral'] = 'neutral', Happiness: Literal['happiness'] = 'happiness', Surprise: Literal['surprise'] = 'surprise', Sadness: Literal['sadness'] = 'sadness', Anger: Literal['anger'] = 'anger', Disgust: Literal['disgust'] = 'disgust', Fear: Literal['fear'] = 'fear')#

ベースクラス: object

感情認識サーバが出力する感情値を定義したデータクラス

Anger: Literal['anger'] = 'anger'#
Disgust: Literal['disgust'] = 'disgust'#
Fear: Literal['fear'] = 'fear'#
Happiness: Literal['happiness'] = 'happiness'#
Neutral: Literal['neutral'] = 'neutral'#
Sadness: Literal['sadness'] = 'sadness'#
Surprise: Literal['surprise'] = 'surprise'#
class dslclib.src.face_recognition.FaceRecognitionClient(ip: str | None = None, port: int = 4500)#

ベースクラス: dslclib.src.base.BaseClient

ユーザの感情を認識するサーバとソケット通信するクライアント. (これから顔の向きに対応する予定)

パラメータ:
  • ip (str, optional) --

    ipアドレス.

    デフォルトはNoneであり,Noneが与えられた時,127.0.0.1(ローカルホスト)を指定し, もし,docker内でこのモジュールが立ち上がっていた場合,自動でそれが認識され,host.docker.internalを指定する.

    host.docker.internalは,docker内からローカルホストのポートに接続するために必要である.

  • port (int = 4500) -- ソケット通信を行うポート.

サンプル

>>> client = FaceRecognitionClient()
ipがNoneだったため、127.0.0.1をipアドレスとして設定します。
>>> client
Socket(
    ip   = 127.0.0.1
    port = 4500
)
>>>
get_user_info() tuple[Optional[int], Optional[Literal['Man', 'Woman']], Optional[float]]#
listen(func: Callable | None = None) dslclib.src.face_recognition.OutputForFaceRecognition#

感情認識サーバとのソケット通信をするメソッド

パラメータ:

func (Callable, optional) --

funcに何も与えない場合、感情認識結果が取得された時点ですぐに結果を返します.

ただし、認識結果の応答が早く、安定しないこともあることから、funcを与えないことは推奨しません.

カスタムでfuncを定義してもよいですが、簡易的な静的メソッドとして`summarize_times`と`summarize_timestamps`を用意してあります. カスタムで定義する場合の要件は以下です. 入力: list[tuple[float, str, float]]

リストの各要素は各時点での認識結果であり、 認識結果は (timestamp, emotion_class, emotion_score)です.

出力: tuple[bool, Optional[float], Optional[str], Optional[float]]

(要約した認識結果を返す=True | まだプールする=False, timestamp, emotion_class, emotion_score) 以上の要件を満たした関数を設計してください.

戻り値の型:

OutputForFaceRecognition

サンプル

>>> client = FaceRecognitionClient()
>>> output = client.listen(FaceRecognitionClient.summarize_times)
>>> output.emotion
angry
>>> output["emotion"]
angry
receive_line() str#

ソケットから受け取ったバイナリコードを文字列(utf-8)に変換するメソッド

戻り値:

received -- ソケット通信によって受け取った値を文字列に変換したもの

戻り値の型:

str

static summarize_times(data: list[tuple[float, str, float]], times: int = 10, strategy: Literal['majority', 'latest'] = 'majority') tuple[bool, Optional[float], Optional[str], Optional[float]]#

感情認識サーバから得たtimes回の結果を集約し,strategyに則ったアルゴリズムで感情値を決定する静的メソッド.

strategyはmajorityを推奨する.

パラメータ:
  • data (list[tuple[float, str, float]]) -- 各時刻における感情認識結果がプールされたリスト

  • times (int, default = 10) -- 何回分の結果をプールしたら要約するか

  • strategy (str, default = 'majority') -- majorityならば多数決、latestならば最新の認識結果を認識結果とする

戻り値:

(戻り値があるか?, timestamp, 感情値, 感情スコア)

1つ目の要素がTrueならば,指定回数分の結果を用いて感情値を決定していることを示す. Falseならば,回数分に満たないため,さらにプールを要求することを示す.

戻り値の型:

tuple[bool, Optional[float], Optional[str], Optional[float]]

static summarize_timestamps(data: list[tuple[float, str, float]], sec: float = 1, strategy: Literal['majority', 'latest'] = 'majority') tuple[bool, Optional[float], Optional[str], Optional[float]]#

感情認識サーバから得たsec秒分の結果を集約し,strategyに則ったアルゴリズムで感情値を決定する静的メソッド.

strategyはmajorityを推奨する.

パラメータ:
  • data (list[tuple[float, str, float]]) -- 各時刻における感情認識結果がプールされたリスト

  • sec (float, default = 1) -- 何秒プールしたら認識結果を要約するか

  • strategy (str, default = 'majority') -- majorityならば多数決、latestならば最新の認識結果を認識結果とする

戻り値:

1つ目の要素がTrueならば,指定回数分の結果を用いて感情値を決定していることを示す. Falseならば,回数分に満たないため,さらにプールを要求することを示す.

戻り値の型:

tuple[bool, Optional[float], Optional[str], Optional[float]]

class dslclib.src.face_recognition.OutputForFaceRecognition(summarized: bool, timestamp: float, emotion: str, emotion_score: float, rotations: list[dslclib.src.face_recognition.Rotation], age: int | None = None, gender: Literal['Man', 'Woman'] | None = None, gender_score: float | None = None)#

ベースクラス: object

感情認識サーバのクライアントが出力するデータクラス

各アトリビュートは以下の通りです.

  • summarized: 出力結果が,funcによって,一定時刻分の認識結果を要約されたものであるかどうか

  • timestamp: タイムスタンプ

  • emotion: 認識された感情クラス

  • emotion_score: 感情クラスのスコア

  • rotations: 各時刻のRotationの情報が時系列順に含まれるリスト

  • age: 推測された年齢

  • gender: 推測された性別

  • gender_score: 推測性別のスコア

age: int | None = None#
emotion: str#
emotion_score: float#
gender: Literal['Man', 'Woman'] | None = None#
gender_score: float | None = None#
rotations: list[dslclib.src.face_recognition.Rotation]#
summarized: bool#
timestamp: float#
class dslclib.src.face_recognition.Rotation(pitch: float, roll: float, yaw: float)#

ベースクラス: object

ユーザの顔の向きを示すデータクラス

各アトリビュートは以下の通りです.

  • pitch: 上下(上がプラス)

  • roll: 回転.首をかしげる動き(右にかしげるとプラス)

  • yaw: 横向き(左がプラス)

pitch: float#
roll: float#
yaw: float#