はじめに
こんにちは、24年度からFIXERの新しい仲間となる寝占孝晃(ねじめよしあき)です。
大阪府出身で、福島県にある会津大学で6年間コンピュータ理工学を学んでいました。
今回は修論で取り組んだ3D表情生成の研究についてお話ししたいと思います。
初めてのブログ執筆で不慣れな点もあるかと思いますが、どうぞよろしくお願いします。
生成AIとの出会い
私は学部生の頃、深層強化学習の研究をしていて生成モデルについてあまり感心がありませんでした。
最初の出会いは修士1年の春頃に登場したコード生成するAlphaCodeでした。これの学習データは、競技プログラミングっていう与えられた問題に対してアルゴリズムを考えて正確なコードを書くコンテストを基にしています。私は学部で1年間半ほど競技プログラミングを嗜んでいて(Atcoder: 緑~水色)、どうやら私と同じくらいのレベルの問題を解けるらしく震えましたね。
次は確かその8月の下旬に、Stable Diffusionです。公開されて直ぐに環境を整えて、テキストに沿った画像を生成できたことに驚きました。「魔法みたいだ」って感じたのを覚えています。
ChatGPTも同じ年の12月初めに利用可能になり、論文の要約やコードエラーの対処など本当に勉強と開発が捗るようになりましたし、Github Copilotは手が離せなくなるほど、役立ちました。
オープンキャンパスで高校生などにAIに触れてもらうために、強化学習したオセロAIと対戦できるアプリを開発したんですが、3日ほどで作れたのはこれらのツールのおかげです。この2022年は生成AIの便利さを刻み込まれた日々でした。
なんで3D表情生成?
もともと深層強化学習を勉強していたこともあり、バーチャル空間のキャラクターの振る舞いを改善したいという気持ちがありました。
ゲームが大好きで、プレイヤーが操作しないNon-Player Character(NPC)が、周辺の状況を理解して色んな振る舞いができれば楽しくなるなっていうのが根本にあります。
そんな中でモーション生成や3Dオブジェクトの生成ではなく3D表情生成を対象にしたかというと、別段特に理由はなく、私の研究室では顔認識アプリケーションに取り組んでいて、それに関連するようなトピックを選んだだけです。
苦労したこと
その前に、画像や言語ではなくて3Dでしかも表情を生成することが可能なのかって疑問に思われる方もいるでしょう。
実はAIってコンピュータが数値として認識できるものであれば、なんでも生成できちゃいます。
とは言っても学習データが大量にないと実運用できません。文章や画像の生成が普及しているのは、データ間の構造関係が強いという理由もありますが、扱えるデータ量が他に比べて圧倒的で充実しているためなんですよね。
では、3Dオブジェクトや多変量時系列データなどの主流ではないデータを生成するには、AIが理解しやすいような形式に整えて、データセットを独自で作成する必要があります。
私は3D表情生成を実現するにあたって、初めはMediapipeというGoogleが公開しているツールでメッシュデータを収集し学習させていました。
最終的には計算量の複雑性の縮小するために、Facial Action Coding System(FACS)で定義される表情筋コードの多変量時系列データを学習に使うことにしました。
これらのデータセットの整理とさらにモデルの管理も相まって非常に大変で、そんな労力に堪えかねて、出会ったのがHuggingfaceライブラリです。
これめちゃくちゃ便利です!
大量のデータを扱うと分散並列処理やキャッシュ化の必要性が出てきて、これを自分で実装してメンテナンスするのって作業リソースを取られるんですが、Huggingface Datasetを使うとこれらの処理がほとんど自動でしてくれます。
また、3D表情を生成するために拡散モデルというフレームワークを採用していて、論文元のGithubからコードを引用してカスタマイズしていましたが、同ライブラリのDiffusersはこの機能を提供してくれます。
構築されたモデルを容易に活用できるTransformerも役立ちますし、何よりもこれらは共有が簡単で最も研究に役立ったライブラリでした。
さいごに
初めてで拙い部分もあったと思いますが、少しでも生成AIについて知れたら幸いです。ここまで読んでいただきありがとうございます。
以下が生成された表情をUnity上で可視化した結果です。
これからも新しい技術にアンテナを張りつつ、エンジニアとして日進月歩して楽しんでいきます。