1.はじめに
従来から、1枚の人物写真から3Dモデルを作成する技術はありましたが、かなりポーズに制約がありました。今回ご紹介するのは、ボディ推定プロセスにフィードバックを掛けることによってこのポーズの制約を緩和したICONという技術です。
この論文は、2021.12に提出されました。
2.ICONとは?
ICONは、Implicit Clothed humans Obtained from Normals(法線から得られた暗黙の服を着た人間)の略です。
下図はICONの概要で、ボディガイドによる予測(Body-guided normal predictions)と3D再構成(Local-feature based implicit 3D representation)の2つので構成されています。
ボディガイドによる予測では、写真から取り出した人間のRGB画像を出力すると共に、SMPL(簡易人体モデル)の推定結果を元に前・後方向から見た衣服を着たモデルの推定結果を出力します。
このSMPL推定プロセスにおいて、法線を利用した形状改良のフィードバックを掛けることで精度を向上させている点が今回の技術のミソです。
3D再構成では、それらの出力結果から可視性を考慮して陰関数曲面(占有フィールドの等値面)を推定します。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。今回は、元のコードがcolabにminicondaで新たな環境を作って動かすものになっているので、20分くらい時間がかかりますが、コーヒーでも飲んでゆっくりお待ちください。
なお、セットアップの途中で下記のような「まだ操作中ですか?」という表示が現れることがあります。その時は「私はロボットではありません」をクリックして下さい。最近、googleは良くこの警告を入れて来て、反応がないと接続を切断するのでご注意下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#@title **set up (about 20 min)** # get the code of ICON !git clone https://github.com/cedro3/ICON.git %cd /content/ICON # install package !bash colab.sh # download data import gdown gdown.download('https://drive.google.com/uc?id=1rX8EmsO8SBJcXtYTNjz2Pyk5H2FjgpNJ', 'data.zip', quiet=False) ! unzip data.zip # import function from function import * |
*ご注意:このブロックの完了に25分以上掛かる場合は、一部のサイトからのダウンロードが上手く行っていないことが考えられます。その場合は「ランライム/ランタイムを接続解除して削除」を押してリセットし、再度実行して下さい。
まず、サンプル画像を見てみましょう。ご自分で用意した画像を使用したい場合は、examples フォルダにその画像をアップロードして下さい。
1 2 |
#@title **display sample** display_pic('/content/ICON/examples') |
それでは、3Dモデルを作成してみましょう。表示されたサンプル画像の中から1つ選んで filename に記入し、実行します。ここでは、filename = 05.jpg と設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#@title **make 3D-model** # setting model = 'icon-filter' # icon-filter / pifu / pamir image_folder = 'image' filename = '14.jpg' #@param {type:"string"} reset_folder(image_folder) shutil.copy('examples/'+filename, image_folder+'/'+filename) # modeling !source activate icon && python -m apps.infer -cfg ./configs/{model}.yaml -loop_smpl 100 -loop_cloth 200 -colab -gpu 0 -export_video -in_dir {image_folder} # clear log from IPython.display import clear_output clear_output() # change codec video_path = f"/content/ICON/results/{model}/vid/{filename[:-4]}_cloth.mp4" video_display_path = f"/content/ICON/results/{model}/vid/{filename[:-4]}_display.mp4" !ffmpeg -r 30 -i $video_path -vcodec libx264 $video_display_path -y -loglevel quiet # make variation import cv2 cap = cv2.VideoCapture(video_display_path) width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) crop1 = 'crop=512:512:'+str(width-512)+':0' ! ffmpeg -y -i $video_display_path -filter:v $crop1 -async 1 tmp1.mp4 -loglevel quiet crop2 = 'crop='+str(width-1024)+':512:0:0' ! ffmpeg -y -i $video_display_path -filter:v $crop2 -async 1 tmp2.mp4 -loglevel quiet video_display_path1 = os.path.dirname(video_display_path)+'/'+os.path.splitext(filename)[0]+'_c.mp4' ! ffmpeg -y -i tmp2.mp4 -i tmp1.mp4 -filter_complex "hstack" $video_display_path1 -loglevel quiet crop3 = 'crop=512:512:'+str(width-1024)+':0' ! ffmpeg -y -i $video_display_path -filter:v $crop3 -async 1 tmp3.mp4 -loglevel quiet video_display_path2 = os.path.dirname(video_display_path)+'/'+os.path.splitext(filename)[0]+'_b.mp4' ! ffmpeg -y -i tmp2.mp4 -i tmp3.mp4 -filter_complex "hstack" $video_display_path2 -loglevel quiet # display mp4 display_mp4(video_display_path1) |
下記を実行すると作成した動画がダウンロード出来ます。その際、style に cloth を設定すると「着衣」、body を設定すると「ボディ」、full を設定すると「ボディ+着衣」の動画が選択出来ます。
1 2 3 4 5 6 7 8 9 |
#@title **download mp4(chrome)** from google.colab import files style = 'cloth' #@param ['full', 'cloth', 'body'] if style == 'full': files.download(video_display_path) if style == 'cloth': files.download(video_display_path1) if style == 'body': files.download(video_display_path2) |
その他、results/icon-filter には、以下の画像データが出力されます。また、objフォルダには*.objファイルデータが保存されています。
その他の画像サンプルでもやってみましょうか。
最終的に出力する3Dモデルの形状の精度はまだ粗いですが、かなりアクロバティックなポーズでも3Dモデルの作成が可能になったようです。
では、また。
(オリジナルgithub)https://github.com/YuliangXiu/ICON
2022.11.9 アップデート
オリジナルgithubの改定に伴い、コードをアップデートしました。
コメントを残す