Slide 1

Slide 1 text

1/63 株式会社Cygames 開発運営支援 ゲームエンジニア / 立福 寛 エンジニアリング・プロダクション AIを活用した 柔軟かつ効率的な社内リソース検索への取り組み

Slide 2

Slide 2 text

2/63 はじめに

Slide 3

Slide 3 text

3/63 立福 寛 開発運営支援 / ゲームエンジニア 複数のゲーム会社でコンテンツパイプラインの構築、モバイルゲームの開発・運営などを担当。 2018年10月に株式会社Cygamesへ入社。2019年後半からAIの社内導入に取り組んでいる。 CEDEC2021:ゲーム制作効率化のためのAIによる画像認識・自然言語処理への取り組み CEDEC2022:AIによる自然言語処理を活用したゲームシナリオの誤字検出への取り組み CEDEC2023:AIによる自然言語処理・音声解析を用いたゲーム内会話パートの感情分析への取り組み 自己紹介

Slide 4

Slide 4 text

4/63 この講演で得られること AIを使った画像検索の原理 サーバレスで実装する場合の問題点と 解決方法 楽曲・効果音への適用

Slide 5

Slide 5 text

5/63 今回解決したい課題 ◼ 人力で行うには大変すぎる ◼ 担当者によってばらつきがでてしまう 大量の画像へのタグ付けをAIで行えないか? ◼ 所属部署が社内に提供しているWebアプリ 対象は社内のリソース管理ツール

Slide 6

Slide 6 text

6/63 リソース管理ツール : CyResource ◼ 画像、動画、音声、スライドなどをアップロード可能 ◼ タグ付け、バージョン管理、ユーザー管理 ◼ 用途ごとに「スペース」が分かれている 社内向けの汎用アップローダー ◼ アップロードされたリソースはS3に格納される AWS上に実装

Slide 7

Slide 7 text

7/63 リソース管理ツールにAI検索を実装 ◼ テキストで画像を検索 ◼ 画像で画像を検索 ◼ 色で画像を検索 AIを使えば テキストで直接画像検索できる ◼ 画像のアップロード時に検索用情報を登録 ◼ 検索時には登録された情報を使って検索 登録と検索

Slide 8

Slide 8 text

8/63 原理と機能

Slide 9

Slide 9 text

9/63 AI画像検索の原理と機能

Slide 10

Slide 10 text

10/63 AI画像検索の原理(その1) ◼ 画像を扱うAIでよく利用されているモデル ◼ テキストと画像を関連付けすることができる ◼ 日本語モデルも公開されている CLIPモデルを利用 ◼ CLIP : OpenAI(英語) ◼ Japanese CLIP : rinna、日本語対応したCLIP(今回採用) 利用可能なCLIPモデル

Slide 11

Slide 11 text

11/63 AI画像検索の原理(その2) ◼ CLIPはテキストと画像をベクトルに変換する 基本的な原理 意味が近いものは ベクトル間の距離が近くなる 近い 遠い 「赤いりんご」 テキスト ベクトル (スイカ) ベクトル (テキスト) ベクトル (りんご) 相談 画像 画像

Slide 12

Slide 12 text

12/63 AI画像検索の原理(その3) ◼ Web上の画像とそのテキストのペアを4億セット学習している ◼ ゼロショット(ファインチューニングなし)で高い性能を達成 CLIPの学習 赤いリンゴ テキスト 大きなスイカ テキスト 相談 画像 画像

Slide 13

Slide 13 text

13/63 AI画像検索の原理(その4) 1. あらかじめ「検索対象の全画像」をベクトルに変換 2. 検索テキストをベクトルに変換 3. 2のベクトルに近い順に画像のベクトルをソート テキストで画像を検索 1. あらかじめ「検索対象の全画像」をベクトルに変換 2. 検索画像をベクトルに変換 3. 2のベクトルに近い順に画像のベクトルをソート 画像で画像を検索

Slide 14

Slide 14 text

14/63 例:画像検索の結果

Slide 15

Slide 15 text

15/63 リソース管理ツールの検索結果(1) 「パン」で検索 ◼ 左から右に近いものが並ぶ ◼ 原理上、多少違うものが上位に来ることがある

Slide 16

Slide 16 text

16/63 リソース管理ツールの検索結果(2) 「テレビ」で検索 ◼ デフォルメのイラストでも大丈夫 ◼ 完全一致するテキストでなくても検索できる

Slide 17

Slide 17 text

17/63 リソース管理ツールの検索結果(3) 「マグロの寿司」の画像で検索 ◼ 同じものがトップに来る

Slide 18

Slide 18 text

18/63 CLIPによる検索の特徴と限界 画像の「意味・要素」で検索できる 類似した構図でも検索したいが…… 同じポーズ・似た構図を検索したい 意味を優先してしまう(別のアプローチが必要)

Slide 19

Slide 19 text

19/63 実装

Slide 20

Slide 20 text

20/63 機能の概要

Slide 21

Slide 21 text

21/63 機能の概要: 画像のアップロード 画像をベクトル変換して登録 アップロード API:登録処理 相談 画像 AI検索 画像 相談 リソース管理ツール 検索インデックス ベクトル

Slide 22

Slide 22 text

22/63 機能の概要: テキストで検索 テキストをベクトル変換 検索インデックス ベクトル 検索 AI検索 近いベクトルを検索 赤いリンゴ テキスト 赤いリンゴ テキスト 検索結果 画像 相談 リソース管理ツール API:検索処理

Slide 23

Slide 23 text

23/63 実装 : デプロイ環境、ベクトル検索エンジン ◼ サーバレスで扱いやすい ◼ コストが低い ◼ リソース管理ツールとは別に実装(後で役に立った) ◼ Lambdaの詳しい話は次のデプロイのところで AWSのLambda上にデプロイ ◼ ベクトル間の距離を高速に求める ◼ Meta社のfaissを利用 https://github.com/facebookresearch/faiss ◼ 今回は検索件数が数万の単位なので必須ではない ベクトル検索エンジンを利用

Slide 24

Slide 24 text

24/63 実装 : ベクトル検索エンジン faiss ◼ C++実装なので高速 ◼ 多様な検索方法、GPUサポート(今回はCPU版を利用) 特徴 ◼ コサイン類似度:2つのベクトルのなす角のコサイン値(同じベクトルの場合1) ◼ faiss.IndexFlatIPがコサイン類似度で検索 ◼ 削除時:検索インデックスを再作成(削除機能がないため) 今回はコサイン類似度が近いものを検索 ◼ 検索前:ベクトルを追加して「検索インデックス」を構築 ◼ 検索時:「検索したいベクトル」と「検索インデックス」から検索 ◼ 検索結果は距離が近い順のインデックス値 [2,3,1,…] 検索インデックスを構築 > 検索

Slide 25

Slide 25 text

25/63 実装 : faissはベクトルしか格納できない ◼ 同じ順番でfaissのインデックスを作成 ◼ faissの検索結果を使って、リソースIDを取得 ◼ 「ベクトル間の距離が近い順」の「リソースIDのリスト」を返す ◼ Pythonのpickle形式で保存 (リソースID:ベクトル)の配列を別に持つ 検索結果 リソースリスト リソースID1, 画像のベクトル1 リソースID2, 画像のベクトル2 リソースID3, 画像のベクトル3 faissの検索インデックス 画像のベクトル1 画像のベクトル2 画像のベクトル3 検索

Slide 26

Slide 26 text

26/63 実装 : APIごとの処理 ◼ 画像の登録時 > 検索インデックスの登録処理 ◼ 画像の検索時 > 検索してソートされたリソースIDのリストを返す リソース管理ツールからAPIを呼び出す

Slide 27

Slide 27 text

27/63 実装 : 登録時の処理 1. 登録する画像をCLIPでベクトルに変換 2. リソースリストを読み込む 3. リソース名とベクトルのペアをリソースリストに追加 4. リソースリストを使ってfaissのインデックスを再作成 インデックスの追加 faissの検索 インデックス インデックス 再作成 • ベクトル • リソースID リストに 追加 リソースリスト 画像 CLIPで ベクトル変換

Slide 28

Slide 28 text

28/63 実装 : 検索時の処理 1. テキストor画像をCLIPでベクトルに変換 2. faissのsearch関数で検索 3. コサイン距離が近い順に配列のインデックスのリストが返る 4. リソースリストからリソースIDのリストを取得して返す faissの検索+リソースIDのリストを返す faissの検索 インデックス リンゴ テキスト ベクトル Search関数で 近いベクトルを検索 リソースIDの リストを取得 CLIPで ベクトル変換 リソースリスト

Slide 29

Slide 29 text

29/63 デプロイ

Slide 30

Slide 30 text

30/63 デプロイ上の問題点と解決策 ◼ 合計15万枚を登録 ◼ 1回のAPI呼び出しで20枚登録 ◼ 1分間に1回実行 ◼ 5日以上 アップロード済みの画像を登録 ◼ 同時アクセスで検索インデックスが壊れる ◼ AIのモデルがインフラの帯域制限に引っかかってしまう ◼ 制限時間内に処理が終わらない 実行すると問題が多数発生

Slide 31

Slide 31 text

31/63 システム構成

Slide 32

Slide 32 text

32/63 システム構成 リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 API Gateway Lambda /tmp エフェメラルストレージ 30秒の制限 S3

Slide 33

Slide 33 text

33/63 AI画像検索 API Gateway EFS リソース管理ツール 帯域制限 ファイル転送 API Gateway Lambda /tmp エフェメラルストレージ 30秒の制限 S3

Slide 34

Slide 34 text

34/63 Lambda リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 Lambda API Gateway 30秒の制限 /tmp エフェメラルストレージ S3

Slide 35

Slide 35 text

35/63 EFS リソース管理ツール AI画像検索 EFS 帯域制限 ファイル転送 API Gateway Lambda /tmp エフェメラルストレージ 30秒の制限 S3

Slide 36

Slide 36 text

36/63 S3 リソース管理ツール AI画像検索 S3 EFS 帯域制限 ファイル転送 API Gateway Lambda /tmp エフェメラルストレージ 30秒の制限

Slide 37

Slide 37 text

37/63 発生した問題

Slide 38

Slide 38 text

38/63 検索インデックスが同時アクセスで壊れる ◼ Faissの検索インデックスのファイルをEFSに保存 ◼ 登録時、検索時にロード&セーブ ◼ 同時アクセスするとファイルが破損! 当初の実装 ◼ ネットワークファイルシステムなのでアクセス制御してくると思っていた EFSは同時アクセスの制御はしてくれない ◼ fcntl.LOCK_EXで排他ロック ◼ ロックファイルはサービスごとに作成(EFSに作成) ◼ サービス単位での同時アクセス数が少ないので問題なかった シンプルにファイルロックで回避

Slide 39

Slide 39 text

39/63 AIのモデルがインフラの帯域制限に引っかかる ◼ モデルをS3に配置 ◼ 最初の一回だけS3からEFSにコピー ◼ 実行時にEFSからモデルをロード 当初の実装 ①コピー ②ロード モデルファイル モデルファイル S3 EFS Lambda

Slide 40

Slide 40 text

40/63 AIのモデルがインフラの帯域制限に引っかかる ◼ Lambdaの関数を呼び出していくと途中で重くなる ◼ EFSは一定枠までは高速に使えるがそれ以上は制限がかかる(知らなかった!) 最初は問題なく動くが……! ①コピー ②ロード モデルファイル モデルファイル S3 EFS Lambda 帯域制限

Slide 41

Slide 41 text

41/63 AIのモデルがインフラの帯域制限に引っかかる ◼ 関数呼び出しごとにS3から/tmpへモデルをコピー ◼ 2022年4月から/tmpの容量を追加できる Lambdaのエフェメラルストレージで解決 モデルファイル S3 Lambda /tmp

Slide 42

Slide 42 text

42/63 faissのファイルも帯域制限に引っかかる ◼ faissの検索インデックスをEFSに保存 ◼ 画像登録・検索ごとにEFSからロード 当初の実装 ◼ faissの検索インデックスは数十MB ◼ 数千回EFSから読み込むと制限がかかって遅くなる こちらも最初は問題なく動くが……! ◼ 関数呼び出しごとにS3から/tmpへ検索インデックスをコピー ◼ 更新後はS3へ戻す ◼ 最終的にEFSはロックファイル置き場としてのみ利用 同じ方法で解決

Slide 43

Slide 43 text

43/63 画像の登録処理が制限時間内に終わらない ◼ 画像の登録処理は20件まとめて行う ◼ Lambda内部では1件の登録処理を20回呼ぶ実装 ◼ モデルを20回S3から転送するので遅い! ◼ API Gatewayの制限のため30秒以内に終わらせたい 当初の実装 1. S3からモデルをコピー 2. 20件まとめて画像をベクトルに変換 3. faissにベクトルを登録 4. faissの検索インデックスをS3へコピー まとめて処理する実装に変更

Slide 44

Slide 44 text

44/63 開発期間 ◼ Japanese CLIPとfaissを使った実装 1週間 ◼ Lambdaでの初期実装 2週間 ◼ リソース管理ツールへの組み込み 1ヶ月(別の担当者) ◼ デプロイ時のトラブル対応 1ヶ月 初期実装からリソース管理ツールへの組込みまで ◼ 基本構成は過去のAI機能と同じ ◼ AWSのインフラ構成も同じ ◼ AWS CDKのコードを流用 過去のAI機能の実装を使い回す

Slide 45

Slide 45 text

45/63 導入後の感想と今後の改善

Slide 46

Slide 46 text

46/63 リリース後の社内の感想

Slide 47

Slide 47 text

47/63 リリース後の社内での感想 ◼ 新しく入ったAI検索機能ものすごくいいです。...今まで発掘できなかったイラストが、 グーグル検索のように適当に思い浮かんだ言葉で検索出来てしまう。 これはまさに、かゆかったところに手が届く機能です!ありがとうございます! ◼ 本日の更新にてAI機能がつきました!とてもすごいのでぜひ使ってみてください~! (「青」って入れたら、青系イラストがいっぱい出てきました。すごい) 社内の感想 ◼ 予想以上に好印象 ◼ 開発中の問題は多かったが、導入してよかった ◼ これもAIでできるんじゃない?という相談が増えた 想定以上に評判がよかった

Slide 48

Slide 48 text

48/63 別のアプリケーションでも使いたい ◼ シナリオライターがゲーム中の背景画像を指定 ◼ 数百枚以上ある背景画像を検索したい ◼ タグやファイル名を知らないと探せない ◼ 埋もれている背景がある 社内のシナリオ執筆ツールに導入してほしい ◼ リソース管理ツールとは独立している ◼ 別のサービスからでもAPIを呼び出せる 独立した実装になっているので導入が簡単

Slide 49

Slide 49 text

49/63 AI画像検索の改善

Slide 50

Slide 50 text

50/63 検索システムの改善 ◼ 「赤いリボンを付けたキャラクターA」で検索できるとさらに便利 ◼ Japanese CLIPのファインチューニングが必要 ◼ ファインチューニングの実装コードがない キャラクター名でも検索したい ◼ とあるカンファレンスで開発者の講演があった ◼ 講演後に話をして教えてもらった ◼ OpenAIのCLIPと同じ方法でファインチューニング可能 開発者に直接質問できた

Slide 51

Slide 51 text

51/63 ファインチューニングを行ってみた(その1) ◼ リソース管理ツールにはキャラクター名がタグで付いている ◼ 画像とキャラクター名の対応は取れるのでこれを学習 ◼ キャラクター名は学習できるが、学習済みの情報が失われてしまう キャラクター名を学習 ◼ ファインチューニングで学習した知識は増えるが、他の知識を忘れる現象 ◼ 両者のバランスを維持するファインチューニング手法 ◼ PAINT ◼ Patching open-vocabulary models by interpolating weights ◼ 参考文献:深層学習による画像認識の基礎 オーム社 菅沼 雅徳 破滅的忘却

Slide 52

Slide 52 text

52/63 ファインチューニングを行ってみた(その2) ◼ LLaVA1.5は画像に対してテキストで問い合わせを行えるモデル ◼ キャラクターの名前+画像の説明テキストを学習 ◼ 「(キャラクター名)の画像です。ギターを持った女性がいます」 ◼ 出力は英語なので日本語に翻訳して適用 ◼ 学習してみたが精度が上がっていかなかった ◼ 生成テキストが学習に向いていなかった可能性 LLaVA1.5モデルで画像からテキストを生成 画像 テキスト 「画像を説明して」 プロンプト LLaVAモデル 「ギターを持った 女性がいます」

Slide 53

Slide 53 text

53/63 楽曲と効果音への適用

Slide 54

Slide 54 text

54/63 社内の楽曲管理について ◼ 社内リソース管理ツールのUIを変更したもの ◼ 楽曲管理に便利な機能を足してある ◼ 2023年から導入中 社内の楽曲管理システム:MusicDB ◼ 担当者ごとにぶれてしまう ◼ こちらをAIで自動化できないか? 手動でタグを付けているが大変

Slide 55

Slide 55 text

55/63 音声版のCLIP : CLAP ◼ 画像以外を扱うCLIPモデルが多数公開済み ◼ 今回はLAION-AI/CLAPモデルを利用 音声版のCLIPを使えば可能! ◼ CLAP : Contrastive Language-Audio Pretraining ◼ 楽曲、効果音を扱えるCLIP(英語のみ) ◼ 商用利用可能なライセンス ◼ 精度が高い ◼ 先頭の10秒のみ利用(10秒以下の場合はリピート) ◼ 楽曲用の事前学習モデルを利用 LAION-AI/CLAP

Slide 56

Slide 56 text

56/63 楽曲の自動タグ付け ◼ CLAPをクラス分類に適用 ◼ ジャンル : クラシック、カントリー、ジャズ、…… ◼ テンポ:速い、普通、ゆっくり ◼ ムード:クール、楽しい、ロマンティック、悲しい、…… ジャンル、テンポ、ムードを自動タグ付け ◼ ジャンル分類の場合 ◼ 例:this audio is {ジャンル名} sound ◼ ジャンル名 : 'classical', 'country', 'jazz’ , … ◼ 「テキスト」と「楽曲」の距離が近いものへ分類 テキストのテンプレートを利用してクラス分類 ◼ 途中でテンポやムードが変わる曲は扱えない 実際の運用に使える精度

Slide 57

Slide 57 text

57/63 類似楽曲の検索 ◼ 楽曲から楽曲を探せる機能 ◼ 便利な機能なのでこちらから提案 ◼ 同じ曲のアレンジ版が上位に出てきたので正しく動作している ◼ たまに間違える(まったく別の曲が出てくる) 画像検索と同様に類似楽曲を検索できる

Slide 58

Slide 58 text

58/63 Lambdaでの実装 ◼ モデルファイルがrinna社のCLIPより大きい ◼ 初期化に時間がかかる 同様にAWS Lambdaで実装 ◼ LAION-AI/CLAPはモデルのファイルサイズが2.2GB ◼ これをS3から毎回転送するのは時間がかかる ◼ モデルを16bitに変換すると383MB(精度変わらず) モデルファイルが大きい ◼ 特定のクラスのインスタンス化に数秒かかる ◼ インスタンスをPythonのpickle形式で保存 ◼ 毎回S3から転送して読み込むことで高速化 初期化に時間がかかる

Slide 59

Slide 59 text

59/63 現在実装中 ◼ リソース管理ツールへの組み込み待ち Lambda側は完成

Slide 60

Slide 60 text

60/63 効果音の検索 ◼ 大量の効果音にタグを付けるのは大変 ◼ 担当者が異動すると引き継ぎのコストが大きい ◼ LAION/CLAPは効果音(環境音)の扱いが得意なモデル 効果音の検索もやりたい! ◼ テキストで効果音を検索 ◼ 効果音で効果音を検索 楽曲と同様のシステムとして提供(予定)

Slide 61

Slide 61 text

61/63 まとめ

Slide 62

Slide 62 text

62/63 まとめ : AIを使ったリソース検索を開発 ◼ 「いままで発掘できなかった画像が見つかった」など ◼ タグは使わずに、テキストで直接検索 ◼ 担当者ごとの感覚の違いに影響されない AI画像検索は評判がよかった ◼ 同様の仕組みで楽曲・効果音も検索できる ◼ 工夫すればクラス分類も実装可能 楽曲・効果音の検索にも利用可能 ◼ 原理は極めてシンプル ◼ サーバレスでの実装には工夫が必要 ◼ 独立したシステムにすると他でも使える サーバレスでの実装は少し大変

Slide 63

Slide 63 text

63/63

Slide 64

Slide 64 text

参考文献 ◼ https://github.com/openai/CLIP CLIP ◼ https://github.com/rinnakk/japanese-clip Japanese CLIP ◼ https://github.com/facebookresearch/faiss faiss

Slide 65

Slide 65 text

参考文献 ◼ https://github.com/LAION-AI/CLAP LAION-AI/CLAP ◼ https://github.com/haotian-liu/LLaVA LLaVA 1.5

Slide 66

Slide 66 text

参考文献 ◼ MERT: Acoustic Music Understanding Model with Large- Scale Self-supervised Training ◼ https://github.com/yizhilll/MERT MERT ◼ Patching open-vocabulary models by interpolating weights ◼ https://arxiv.org/abs/2208.05592 PAINT

Slide 67

Slide 67 text

参考文献 ◼ オーム社 菅沼 雅徳 ◼ 8章 3.6 CLIP 深層学習による画像認識の基礎

Slide 68

Slide 68 text

参考文献 ◼ https://magazine.cygames.co.jp/archives/19967 社内のシナリオ執筆ツール

Slide 69

Slide 69 text

クラス分類の精度を向上できないか? ◼ テキストor楽曲による検索がメイン ◼ 開発者がクラス分類は得意でないとコメント LAION-AI/CLAPはクラス分類は得意ではない ◼ タスクごとのモデルの精度を見れるサイト ◼ Music Auto-Tagging ◼ Music Genre Recognition ◼ Music Question Answering ◼ Music Classification Papers with Codeで探す ◼ 楽曲生成はかなり盛り上がっているのに…… 楽曲分類は人気がない

Slide 70

Slide 70 text

LAION-AI/CLAPより高精度のモデル ◼ 楽曲をベクトルに変換するモデル ◼ ジャンル分けなどのクラス分類の精度が高い ◼ ソースコードは商用利用可能 ◼ 事前学習モデルが商用利用不可! MERT