DreamPoseを使用したくて、GitHubのサンプルコードを動かしているので、備忘録を記録します。
2025.3.2
RTX3060 cuda 12.1 python3.8.20です。
メインで動かすのはこのコード
https://github.com/johannakarras/DreamPose?tab=readme-ov-file
まずは概要です。うっすい理解ですみませんが、構造としては、
動き画像はTarget Pose Sequence(動画中の1コマ)として、
動かしたい人をInput Frameと命名しています。
論文のFigure2のように、Target Pose SequenceをStable Diffusionで処理する途中にInput Frameのエンベディングデータを入れるという構造です。
ここで、Input Frameに入れる画像を学習させないといけないわけです。
なので、Demoでは不要ですが、自前データを動かすにはCLIP EncoderとVAE Encoderを学習する必要があります。(VAE Decoderも学習必要?まだそこまでいっていないからわからない)
まずはDemoから。
conda create --name test_env python=3.8.20
conda activate test_env
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install -r requirements.txt
python test.py --epoch 499 --folder demo/custom-chkpts --pose_folder demo/sample/poses --key_frame_path demo/sample/key_frame.png --s1 8 --s2 3 --n_steps 100 --output_dir demo/sample/results --custom_vae demo/custom-chkpts/vae_1499.pth
デモはこれだけで実行できるはず。
次に、自前データを学習するようにDataPreparationを行います。
自前データはスマホで撮ったjpegとして、そこには人物のアノテーションや人物の中でどこが腕なのかなどの情報が入っていません。それを処理たものが学習データとなります。
従って、その処理(DataPreparation)が必要。そのために使用するのがDensePoseです。(名前がDreamPoseとややこしい)
DensePoseを使うために、detectron2というモジュールを使うわけです。
detectron2というのは結構引っかかっている人が多そうで、多数ブログがヒットします。この場合、DensePoseを使うので、ほかのブログそのままだと動かなかったので、修正箇所等を含めたコードを書いておきます。
conda create --name detectron2 python=3.10.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install "numpy<2" -U
pip install opencv-python
pip install ninja
pip install cython
pip install pycocotools
git clone https://github.com/facebookresearch/detectron2.git
cd detectron2
ここでdetectron2の中のsetup.pyを以下に修正(修正後のみの提示ですみません。"-DCUDA_HAS_FP16=1"こういうワードで検索すれば箇所はわかると思います。)
https://note.com/tori29umai/n/n908f3483c1f4このサイトを参考に。
修正後は以下でインスコ
pip install .
→そのフォルダ内のsetup.pyからインスコしてくれるコマンド。
次に、このURLから学習済みモデルをDL:https://github.com/facebookresearch/detectron2/blob/main/projects/DensePose/doc/DENSEPOSE_IUV.md#ModelZoo
(R_50_FPN_s1xのレガシーじゃない方を使えた)
ここで、DreamPose\detectron2\projects\DensePoseのsetup.pyを実行したいが、これは上記修正前のgitを自動で使っちゃうから、手動で以下の2個をインスコ
pip install scipy
pip install av>=8.0.3
最後に以下のコードでdetectron2を実行!
cd projects/DensePose
python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml models/densepose_rcnn_R_50_FPN_s1x.pkl image.jpg --output output_densepose.pkl
もしくはこういう感じでフォルダ内のすべてのjpeg画像を処理
for %i in ("C:\Users\XXX\Downloads\XXX\*.jpeg") do (
python apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml models/densepose_rcnn_R_50_FPN_s1x.pkl "%i" --output "C:\Users\XXX\Downloads\XXX\densepose_output\%~ni.pkl"
)
DreamPoseのGithubにあるutil/densepose.pyだとエラーが出たのでその部分は以下の自作コードで代用
次に以下のpythonツールでpklを下処理:
import os
import cv2
import torch
import numpy as np
import tqdm
import sys
sys.path.append(r"C:\Users\XXX\Downloads\DreamPose\detectron2\projects\DensePose")
import densepose # ここでエラーが出なければOK
# Filepath to raw DensePose pickle output
outpath = r"C:\Users\XXX\Downloads\DreamPose\XXX\densepose.pkl"
# Convert pickle data to numpy arrays and save
data = torch.load(outpath)
for i in tqdm.tqdm(range(len(data))):
dp = data[i]
path = dp['file_name'] # path to original image
if not os.path.exists(path):
print(f"Warning: Image file not found: {path}")
continue
img = cv2.imread(path)
if img is None:
print(f"Warning: Failed to load image: {path}")
continue
h, w, c = img.shape
dp_uv = dp['pred_densepose'][0].uv # uv coordinates
_, h_, w_ = dp_uv.shape
(x1, y1, x2, y2) = dp['pred_boxes_XYXY'][0].int().numpy() # location of person
y2, x2 = y1 + h_, x1 + w_
# numpyファイルを保存
dp_im = np.zeros((2, h, w))
dp_im[:, y1:y2, x1:x2] = dp_uv.cpu().numpy()
savepath_npy = path.rsplit('.', 1)[0] + "_densepose.npy"
np.save(savepath_npy, dp_im)
print(f"Saved: {savepath_npy}")
# DensePoseのUVマップを可視化してpngとして保存
uv_map = (dp_uv[0] * 255).cpu().numpy().astype(np.uint8) # U成分のみ利用
uv_map_color = cv2.applyColorMap(uv_map, cv2.COLORMAP_JET) # カラーマップ適用
savepath_png = path.rsplit('.', 1)[0] + "_densepose.png"
cv2.imwrite(savepath_png, uv_map_color)
print(f"Saved: {savepath_png}")
とりあえず、これでDataPreparatioは完了。