![見出し画像](https://assets.st-note.com/production/uploads/images/151035313/rectangle_large_type_2_7f5d13de7ac1f46a7884334749f333b4.jpeg?width=1200)
【実践と苦悩】ControlNeXt-SVDによるアニメーション作成を実用化に向けてトライした話、課題と代替案についても・・・。後、メディアへのネガティブな不満も吐露する
はじめに
重要な話
◾️ 2024.08.17. 22:00 追記
本プロジェクトは想像以上に課題が残っている。私の仕方が悪いのかfacefusion自体も微調整といった具合で、Webの記事で描かれているようなディープフェイク画像は再現できなかった。まあ、簡単に出来たらそれはそれで問題なのだが・・・。体感としてはControlNeXt-SVDで、そこそこのリアル調の顔の出力が出来た上での、FaceFusionの微調整が可能というレベルだ。過度な期待はしない方がプロジェクト主もユーザーも幸せだ
また、キャラクターのアニメーションの方法については別途、見直していく。例えば、基本的な動きは本プロジェクトで描いて画像を輪切りにしてバッチ処理で顔の部分だけインペイントで修正していくなど、何かしらのアプローチが必要となるので、こちらも何か進捗が分かれば見直して追記する
この記事の読み方について
ControlNeXt-SVDのみ実行することをお勧めする。ただし、FaceFusionを使わないと前述の通りユーザーが期待している結果にはならないので注意だ。(ユーザー側は普段、見ているビデオと遜色のない映像が出来がると思っているだろうが、それはプロジェクトが現在、提供している範囲と異なる。Poseデータによる映像を作成するだけで、クオリティは追求していない)一方でFaceFusionも過度な期待をするものでもない。微調整で修正できる範囲だと考えるのが適切である
伝え方について
しかし、私の使い方が間違ってはいない前提の話だが、実際に使ったからこそ、実際(本当)の温度感、具合を確かめる(伝える)ことが出来た
「文字の情報=クオリティにはならない」音楽の演奏もそうだが、大層なことを言っても、実際のクオリティが期待したほど良くはなかったってのと同じだ
誰かが余計に騒ぐと、過度な期待が生まれてしまう
それに食いついた人間は時間を無駄にしてしまうので「ユーザー」にとってはマイナスでしかない
プロジェクトに罪はないし、必ずクオリティを担保する決まりもない。
むしろ、どんどんリリースして失敗していった方が課題が生まれるので建設的だ。クオリティを意識して一生、作品が出せずにストレスを抱えて生きていくのは嫌なことだと自分は感じている
大事なのは、出来るだけ適切な温度感で「物事」を伝えること
そうすると過度な期待は生まれず、ポジティブに捉えようとするし、適切な温度感が分かっているから、こんなものだろうと分かるからプロジェクトのクオリティに過度な反応をしなくて済む。良かった点と課題に感じた点をあげていければ、次につながると思う
そんな伝え方をこちらも心がけていきたい
本文
昨日、Linaqrufさんのリツイートを見ていたら、"ControlNeXt"の存在を知った。そのプロジェクトの中の一つに"ControlNeXt-SVD"があり、AnimateAnyoneの再現と実装を試みるものだった
※)最新の情報はメディアではなく開発者から得られると思った。今回であれば、ControlNeXt-SVD2が最新の情報かと
ControlNeXt
— AK (@_akhaliq) August 13, 2024
Powerful and Efficient Control for Image and Video Generation
discuss: https://t.co/ZCCFddBpWL
Diffusion models have demonstrated remarkable and robust abilities in both image and video generation. To achieve greater control over generated results, researchers… pic.twitter.com/cUuFc8Qbz5
機能としては、リファレンスとなる画像を読み込ませることで、ポーズの動画と同じ動きをさせるものだと理解している
本件はアニメーションを自由に作成できるか考察をした記事となる
前提
Google Colab 有料版(T4 GPU)
Google Driveの空領域(100MBもあれば!)
Hugging Faceのアカウントとトークン
作業時間
30分〜1時間(1回の試行)
詳細について
詳しい説明はドキュメントを読んで貰えれば
簡潔にまとめられている
注意点
◾️ 2024.08.17 20:00 追記
FaceFusionがDeepFakeにあたるのか?Colabでコードの実行を制限されていることが分かりました ghostのgithubにあるColabページが停止しているのもそのためかと思います
ControlNeXt-SVDはコードを実行していて問題はなかったかと思いますが、FaceFusionにおいてはGoogle Colabの利用を停止される恐れがあるためご注意ください
期待と検証
ControlNeXt-SVDで顔は崩れないか?
FaceFusionで顔を崩れた修正できるか?
poseデータを用意すれば自由にアニメーションを作成できるか?
最終的にはどんなシチュエーションでも作成できるか?
今回は1と2を検証した
特にキャラクターの画像についてはアニメーションさせるデモがなかったので、デモにないリファレンスの画像でも動かせるかを確認したい。AnimateAnyoneではデモとして存在したからだ
結論
リアル調の画像は動作した
アニメ調の画像は顔が崩れた(他のプロジェクトと同じ?)
そのため、リアル調の画像で試したい人は続きをどうぞ
実装(動画の作成)
Google Colabのnotebookを作成していく
Google Driveをマウントする
# Google Driveをマウントする
from google.colab import drive
drive.mount('/content/drive')
ControlNeXtをCloneする
# ControlNeXtをCloneする
!git clone https://github.com/dvlab-research/ControlNeXt.git
%cd ControlNeXt/ControlNeXt-SVD
# 必要なファイルをダウンロードするためのフォルダ
!mkdir ./tmp_input_dir
# 出力結果を保存するフォルダ
!mkdir ./tmp_output_dir
requirementをインストールする
!pip install -r ../requirements.txt
modelのダウンロードをする
Stability AIのstable-video-diffusion-img2vid-xt-1-1は認証が必要なのでHugging FaceのアカウントとTokenが必要である。プロジェクトのCloneの仕方はこれでいいのか正直、わからない
# モデルをダウンロードする
!curl -Lo ./tmp_input_dir/controlnet.bin https://huggingface.co/Pbihao/ControlNeXt/resolve/main/ControlNeXt-SVD/finetune/controlnet.bin
!curl -Lo ./tmp_input_dir/unet_fp16.bin https://huggingface.co/Pbihao/ControlNeXt/resolve/main/ControlNeXt-SVD/finetune/unet_fp16.bin
from google.colab import userdata
USER_NAME="Hugging FaceのAccount Name"
YOUR_HUGGING_FACE_API_TOKEN=userdata.get('HF_TOKEN')
ACCESS_PATH=USER_NAME+":"+YOUR_HUGGING_FACE_API_TOKEN
!git clone https://$ACCESS_PATH@huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt-1-1
Google Colabにリファレンスとなる画像をGoogle Driveからコピーする
# Google Driveに保存した画像を、Google Colaboratoryにコピーする
!cp -r /content/drive/MyDrive/sample ./tmp_input_dir/
実行する
20分程度待つとoutput.mp4が出来上がる。GPUの使用率は10GB程度だった。なぜか、ref_image_pathが相対パスで見つけられなかったので絶対パスに切り替えた
# 実行する
!python run_controlnext.py \
--pretrained_model_name_or_path ./stable-video-diffusion-img2vid-xt-1-1 \
--validation_control_video_path ./examples/pose/pose.mp4 \
--output_dir ./tmp_output_dir \
--controlnext_path ./tmp_input_dir/controlnet.bin \
--unet_path ./tmp_input_dir/unet_fp16.bin \
--ref_image_path /content/ControlNeXt/ControlNeXt-SVD/tmp_input_dir/sample/real.jpeg
Google Colabに保存された結果をGoogle Driveにコピーする
Colabだけで動画を確認する方法を知らないので分かる人は結果を先に確認してから問題なければコピーしてたらいいかも
# Google Colaboratoryに保存されている結果を、Google Driveにコピーする
!cp -r ./tmp_output_dir/ /content/drive/MyDrive/sample
結果を確認する
リアル調の画像は顔が崩れて表示された
アニメ調の画像でも顔が崩れて表示された
実装(動画の補正)
上記の動画における顔の崩れをfacefusionで補正する
FaceFusionをCloneする
%cd /content/
!git clone https://github.com/facefusion/facefusion.git
%cd facefusion
requirementをインストールする
!pip install -r ./requirements.txt
!pip install onnxruntime-gpu
実行する
3分程度で完了する。cudaはなくてもいける。CPUでもGPUでも実行時間はあまり変わらない。
!python run.py \
-s /content/ControlNeXt/ControlNeXt-SVD/tmp_input_dir/sample/real.png \
-t /content/ControlNeXt/ControlNeXt-SVD/tmp_output_dir/output.mp4 \
-o /content/ControlNeXt/ControlNeXt-SVD/tmp_output_dir/output_fix.mp4 \
--headless \
-ーexecution-providers cuda \
--face-selector-mode reference
Google Colabに保存された結果をGoogle Driveにコピーする
# Google Driveに保存した画像を、Google Colaboratoryにコピーする
!cp -f /content/ControlNeXt/ControlNeXt-SVD/tmp_output_dir/output_fix.mp4 /content/drive/MyDrive/sample/tmp_output_dir/output_fix.mp4
結果を確認する
リアル調の画像は改善された
アニメ調の画像は改善されているようには見えなかった(変化なし)
考察
アニメ調の画像をどう補正するか
リアル調の画像は"ControlNeXt-SVD"の段階でも、ある程度は顔の形を保っていたが、アニメ調の画像は顔の形が崩壊していた
ドキュメントにもある通り、facefusionなど後処理で修正した方がいいとのことだったのでオプションを確認したら、いくつかモデルを選択できたので試してみたが、どれもアニメ調の画像では上手くいかなかった
face analyser:
--face-detector-model {many,retinaface,scrfd,yoloface,yunet}
課題としては、アニメ調の顔の検出ツールはいくつかあるようだ。onnxモデルでは提供されておらず、pth形式ぽいのだけど変換の仕方や違いが分からないが、所謂、face detection(顔検出)モデルを用意できれば解決できるのだろうか? facefusionはどうやって差し替えているか知る必要があるが、モデルを自由に追加できるのか?それとも自作するしかないか。いくつか検討する項目はある。とりあえず、知見を得られないかissueをポストしておいた
高速化
また、7秒の動画の作成に20分程度、時間が掛かっているので高速化を出来ないか別途、検討していきたい。よく、Stable Diffusionでxformerを使った高速化を目にしているので早くならないだろうか。実際、7秒、14fps、1080*1620の動画なので98枚の画像を作成していることになるが、stable diffusionであれば30秒で1枚を生成しているとすると30分の計算だ。実はかなり早い範囲なのか?どうやって実現をしているか分からん。いずれにしても高速化は課題だ
代替案の実施
◾️ 2024.08.18 5:25 追記
実験の域を超えないが、ControlNeXt-SVDのサンプルの動画を画像にスライスして、classicにcontrolnetを使って、SDXLで1枚ずつ描画していき、再度、動画として結合する方法をとった。何気に初めて本格的に動画を作成したかもしれない。もちろん、許容しないといけない点はいくつもあるし、かなり制限や課題もある。しかし、ユーザーが取れる方法としては一番、手軽な方法かもしれない。既存の活用で出来る範囲なので開発しなくて済むから良いことだ
こうして振り返ってみると、自分が現状できる範囲で何とかした後に思うことは、僕らは、Animate Anyoneに夢を見過ぎたのかもしれない・・・
感想
ユーザーとしては、既存の方法よりも手軽に動画を作成出来たので、自分が知っている範囲では革新的なプロジェクトだと思う
※ Google Colabで試行錯誤してコードを書いているので動作しないなどあったらコメントをください。ごちゃごちゃしすぎて、本文にコードを貼り忘れている可能性があります。
おわり!