goo blog サービス終了のお知らせ 

gooブログはじめました!

写真付きで日記や趣味を書くならgooブログ

DreamPoseの使用備忘録1

2025-03-02 15:38:08 | 日記

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このサイトを参考に。

        if not is_rocm_pytorch:
            define_macros += [("WITH_CUDA", None)]
            extra_compile_args["nvcc"] = [
                "-O3",
                "-DCUDA_HAS_FP16=1",
                "-D__CUDA_NO_HALF_OPERATORS__",
                "-D__CUDA_NO_HALF_CONVERSIONS__",
                "-D__CUDA_NO_HALF2_OPERATORS__",
                "-DWITH_CUDA",
                "-allow-unsupported-compiler",  # この行を追加
            ]
        else:
            define_macros += [("WITH_HIP", None)]
            extra_compile_args["nvcc"] = [
                "-allow-unsupported-compiler",  # この行を追加
            ]
また末尾の2行をコメントアウト
# ext_modules=get_extensions(),
# cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension},
 


修正後は以下でインスコ
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

でも、まだこのままだとmatplotlibのバージョンが合わないので
 C:\Users\fujiw\Downloads\DreamPose\detectron2\projects\DensePose\densepose\vis\densepose_results.py
このファイルを以下に修正
        image_1d = np.fromstring(canvas.tostring_rgb(), dtype="uint8")
        image_rgb = image_1d.reshape(h, w, 3)
        image_1d = np.frombuffer(canvas.tostring_argb(), dtype="uint8")
        image_1d = image_1d.reshape(h, w, 4)  # (H, W, 4) に変換(ARGB)
        image_rgb = image_1d[:, :, 1:]  # αチャンネル(A)を除外し、RGB のみにする
 
 
 

最後に以下のコードで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は完了。


コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。