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は完了。


raspberrypiでPCA9685でサーボを動かす方法と躓いて解消したメモ

2024-03-26 22:16:13 | 日記

タイトル通りです。

 

現在仮想環境でpipを使ってPCA9685をインストールして、サーボを動かす流れまでを行います。

今回はいくつかのサイトのリンク張るだけみたいになります。

 

まずこのサイトを参考に進めていきます。

https://zenn.dev/naoya_oshiro/articles/fa95bd81e3ac8a

(ちなみに仮想環境でinstallする場合はsudo不要です)

 

進めていくと、

pwm = Adafruit_PCA9685.PCA9685()

このコードでエラーが出ますので

http://kazuki-room.com/error_when_combining_jetson_nano_and_pca9685/

このサイトに則ってAdafruit_GPIOフォルダ内のI2C.pyを修正します。

そしたらできました!

 

 

最後に話がそれますが、このサイトいいです。すごい情報量。https://note.com/kiyo_ai_note/n/nfbfb83df256f

 


raspberrypiでusb webカメラからopencvで写真を取得する方法

2024-03-25 19:31:33 | 日記

こんにちは

raspberrypi で usb webカメラから写真を取得するのにいろいろてこづったので備忘録を書きます。

raspberrypi 4です。

 

https://qiita.com/suo-takefumi/items/355479f46bf3957ffd8f

序盤は上記記事のように

lsusbコマンドでWebカメラをUSB接続したことを認識できるか確認して、

fswebcam image.jpg

コマンドで写真取得まではすんなりいきました。

 

次にsudo apt-getからopencvをインストールして、

cc = cv2.VideoCapture(0)

を実行するとエラー

WARN:0@16.618] global ./modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

こうなります。

どうやらopencvを依存関係を含めてインストールしないといけないようです。

 

ここまでは他のブログでも生じていたので、ビルドに必要な依存関係をインストールしようと以下のコードを入れると再度エラー。少し嫌になってきます。

動かなかったコード: sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev

 

最終的にバージョンの変更などがあり、私の環境では以下のコードで依存関係をインストールできました。

sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev python3-dev python3-numpy libtbb-dev libdc1394-dev

次にopencvをインストールするのですが、raspberrypiの環境ではサードパーティ(pip)でのインストールができなかったので、
仮想環境でpipを使用する必要がありました。
python3 -m venv myenv
source myenv/bin/activate
pip install opencv-python
 
これで
cc = cv2.VideoCapture(0)
が動くようになりました。
 
ちなみに仮想環境のactivateは
source myenv/bin/activate
deactivateは
deactivate
で出来ました。
 
---蛇足---
arucoマーカー認識というopen cvでのマーカー認識機能を使いたかったのでopencv_contribをインストールしました。
まず、opencvのバージョンを確認します。
import cv2
cv2.__version__
>>4.9.0
従って、
pip3 install opencv-contrib-python==4.9.0
でインストールを試みます。
すると
ERROR: Could not find a version that satisfies the requirement opencv-contrib-python==4.9.0 (from versions: 3.4.11.45, 3.4.13.47, 3.4.14.51, 3.4.15.55, 3.4.16.59, 3.4.17.61, 3.4.17.63, 3.4.18.65, 4.4.0.46, 4.5.1.48, 4.5.2.52, 4.5.3.56, 4.5.4.58, 4.5.4.60, 4.5.5.62, 4.5.5.64, 4.6.0.66, 4.7.0.68, 4.7.0.72, 4.8.0.74, 4.8.0.76, 4.8.1.78, 4.9.0.80)
ERROR: No matching distribution found for opencv-contrib-python==4.9.0
というエラーが返ってきます。
どうやら、4.9.0.80としないといけないみたいなので
pip3 install opencv-contrib-python==4.9.0.80でインストールできます。