(2025/06時点の記事です)
経緯
・OpenCV+Dlibでフェイストラッキングを行っていたら、キャラクターを動かしたくなった
・でもDlibの顔検出って片目隠れるくらい横向くと外れるよね…じゃあ他のヤツ使おうか!
・MediaPipeいいじゃん!でもC#でラッパー?一応あるけどこれいつの???
・MediaPipeが正式にサポートしてるのはPythonか…
開発環境
・Python 3.12.10
・Unity 6.1
大まかな設計
とりあえず、カメラ処理をPythonで、Unity処理をC#で行うことだけは決まった。
問題はどうやってやりとりするかだが…
正直Pythonは詳しくない
正直Pythonは詳しくない。トラッキングはリアルタイム処理だ。それなりの速度が求められる。
そんな中、パフォーマンスの悪い書き方も最適化の手段もわからん。そんな手探り状態で長々と処理を書くやる気は私にはない…
つまり、Python部分は出来る限り少なく書きたい。
というわけで、Python部分をどうするか、いくつか挙げてみる
・Python部分をライブラリ化
メリット →任意のタイミングでトラッキングデータを収集できる。構成がわかりやすい。
デメリット→Nugetで取得出来るラッパーライブラリのほうがよくないか。dll作成方法も知らないし、調べるのが面倒。その割に作り始めたらエラー処理考えたり…やっぱ面倒…
・Python部分を実行ファイル化
メリット →ほとんどサンプルソースのまま作れる。非同期なのでCPU資源とか効率的に使えるかも。
デメリット→やりとりが面倒。同期処理が必要。
私はPython部分を楽に処理したいためだけに実行ファイル化を選択しました。
Python−Unity間通信はどうするか
プロセス間通信をどうするか
同じようにいくつか候補を挙げる
・共有メモリ
メリット →最速
デメリット→今時使っていいのか?
・名前付きパイプ
メリット →標準
デメリット→Pythonのパイプ処理調べなきゃ
・TCP
メリット →サンプルが豊富。別のPCに任せてもいい。
デメリット→速度が…。と言うか今回の用途ではもっといいプロトコルがあるじゃろう?
・UDP
メリット →TCPと一緒、TCPよりはやーい
デメリット→やっぱ速度が…。
はい、UDPでいきましょう!
カメラ側処理の作成
・カメラ側処理(Python処理)でフェイストラッキングが正常に実行出来ているか確認
この部分はサンプルコードをそのまま利用した。
サンプルURL:
・UDPの送信処理を実装
IPアドレスとポート番号は固定。
約470箇所の座標情報を転送フォーマットに変換して送信
・不要な箇所を削除
フェイストラッキングが正常に出来ているか、画面上に表示していたコードをコメントアウトしておく(うまくトラッキングできないときの確認用)
Unity側処理
・UDP受信部分の作成
起動メソッドでUDP受信スレッドを作成
・受信した座標データを保管する変数を作成
ここの読み書きをロックしてスレッドセーフとする。
・アップデートメソッドでモデルに座標データを渡す。
完成物
(Dlibの名称間違えてましたので直しました)
