07. PIFuHDインストール

★ PIFUHDについて

2022年に発表された下記論文を自宅のwindows11で再現することにしました。

PIFuHD
Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization
Shunsuke Saito1 / Tomas Simon / Jason Saragih / Hanbyul Joo
(University of Southern California1)
https://shunsukesaito.github.io/PIFuHD/

「Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization」を 直訳すると「高解像度3Dヒューマンデジタル化のためのマルチレベルの位置合わせ関数」つまり「写真から高精度3Dモデルを合成する」技術です。

結構驚きの技術で、正面から写した写真やCGは、裏側や足の裏などはわからず、立体的な特徴は陰でのみです。人間なら「ああなっているだろうな」と想像できますが、これをAIにやらせて立体画像を構築するというんのですから、「そんなバナナ」と先日アンミカが言ってました。



こういうのを見ると、即やってみたくなるのですが実際のところ、windows環境だと90%以上が挫折してしまいます。半分はLinuxで出来ているか、ほぼ間違いなくそのままでは動かないからです。

facebookresearch/pifuhd
https://github.com/facebookresearch/pifuhd

今回 幸いにも参考サイトさんが2つ見つかったので、実際にやってみることにします。
しかし多分2つのサイトさんはwindowsでもUbuntuかGoogle Colaboratoryを使用しているのか、双方を合わせてやっても動かなかないので、windows用に調整して無理やりやるようにさせたので忘れないうちに残しておきます。

但し、以降は前提として「windows 64bit」(GGEはwindows11です)を対象とします。

【参考サイト】
Pythonで写真の3D化が可能なPIFuHDをインストール
https://self-development.info/python%E3%81%A7%E5%86%99%E7%9C%9F%E3%81%AE3d%E5%8C%96%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AApifuhd%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

PIFuHDを使ってAI美女を3Dモデルにしてみた
https://chmod774.com/pifuhd-stable-diffusion/

★ PIFuHDのpython仮想環境の作成

基本的にはLinux/Ubuntuベースのシステムです。

このため、プログラムもインストールも全てwindowsコマンドやwindows pythonのみでやるという訳にはいかなかったので、途中windowsのPowershellを併用してインストールを行います。python仮想環境・Powershellなどの用語がわからない方や、Ubuntuを使用せずwindowsのAnaconda shellで強制的に動かすため、一部コアプログラムを改修しますので、テキストエディタなどツールがない方もやめた方が良いと思います。

GGEの場合、インストールが過激になるとコアプログラムの修正や既存モジュールのバージョン改訂が必要になるため、最初に「新しいpython仮想環境」を作成して行います。このため、ダメだったらすべて削除して最初から作り直せるようにします。ちなみにその1つ前のNG技術は削除して最初からやり直しても二度目以降できませんでしたが・・・。

【仮想環境作成】
conda仮想環境を作成し、同時にpython 3.9をインストールします。
具体的にインストールされたバージョンは 3.9.18 (2023/12/1)

以降全て同じですが、PIFuHDはモジュール相互にバージョン互換が厳格(一択)に設定されているため、決められたバージョンで設定してください。遵守しない場合は最後numpyでエラーで動かなくなります。

conda create -n py39 python=3.9


★ Pytouchのインストール

GGEの内部事情として現在NVIDIA CUDAが使用できるPCで長期学習中で、GPU有でもCUDAが使用できないAMD PCのみであるため、CPU仕様でインストールを進めていきますが、CUDAが使用できる場合はTouchをCUDA仕様でインストールをお願いします。

【PyTourchインストール参考サイト】
https://self-development.info/pytorch%e3%81%ae%e7%b0%a1%e5%8d%98%e9%81%8e%e3%81%8e%e3%82%8b%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%80%90python%e3%81%a7%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92%e3%80%91/

・ 公式サイトへ移動
公式サイトへ移動すると、インストールコマンドカスタマイズ画面ですので、下記のように設定すると、「Run this Command」横にインストール用コマンドが現れますので、それをコピーし、コマンドプロンプトにて出力するとインストールが開始されます。

https://pytorch.org/get-started/locally/

PyTourch Build    : Stable
OS                     : Windows
Package              : conda
Language            : Python
CUDA                :: ここでCUDA有の場合「バージョン」、無し「None」
Run this Command: ここに表示されるコマンドをコピー


・ 動作試験
pythonを起動してスクリプトが起動することで動作確認します。
import torch
x = torch.rand(5, 3)
print(x)

出力結果
tensor([[0.5402, 0.5178, 0.0699],
[0.0316, 0.3497, 0.0154],
[0.6478, 0.9491, 0.2383],
[0.7290, 0.3570, 0.3752],
[0.0213, 0.4007, 0.1434]])

★ PyOpenGL/freeglutのインストール

PyOpenGLはPiFuHDの全インストールでインストールされますが、今回の処理中で使用するfreeglut(GLUT:OpenGL Utility Toolkit)というツールキットがインストールされないため、先に2つ同時にインストールを行います。

【【Python】PyOpenGLのインストール方法を解説 参考サイト】
https://self-development.info/%e3%80%90python%e3%80%91pyopengl%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95%e3%82%92%e8%a7%a3%e8%aa%ac/

先にインストールするfreeglutは、自分でビルドする方法と、DLLをダウンロードする方法がありますが、後に色々面倒なのでDLLをダウンロードする方法で行いますので、下記へ移動します。

https://www.transmissionzero.co.uk/software/freeglut-devel/

このページの「Download freeglut 3.0.0 for MSVC」をクリックし「freeglut-MSVC-3.0.0-2.mp.zip」をダウンロードしテンポラリで解凍します。

最初前提として「Windows 64bit」としましたが、PyOpenGLは32bit/64bitの両方があるため、解凍後フォルダーから
        Freeglut → bin → x64 → freeglut.dll
を「c:\Windows\System32」へコピーすれば完了です。


次にOpenGLをインストールします。

以降 何度もpipコマンドのアップデートワーニング表示が出るため、ここでもう一度アップデートします。

python -m pip install --upgrade pip setuptools

PyOpenGLのインストールをします。
その際PyOpenGL_accelerateも一緒にインストールします。

pip install PyOpenGL PyOpenGL_accelerate


このままだとエラーなのでコアプログラムを修正します

GGEの場合Anaconda3プロンプト使用しているため、python仮想環境はAnaconda3のenvsにできるので、下記「win32.py」ファイルを探して黄色文字のように修正します。
    anaconda3/envs/py39/Lib/site-packages/OpenGL/platform/win32.py

"""Windows-specific platform features"""
import ctypes
import platform
from OpenGL.platform import ctypesloader, baseplatform
import sys

if sys.hexversion < 0x2070000:
    vc = 'vc7'
elif sys.hexversion >= 0x3050000:
    vc = 'vc14'
elif sys.hexversion >= 0x3030000:
    vc = 'vc10'
else:
    vc = 'vc9'

def _size():
    return platform.architecture()[0].strip( 'bits' )
size = _size()

class Win32Platform( baseplatform.BasePlatform ):
    """Win32-specific platform implementation"""

    GLUT_GUARD_CALLBACKS = True
    @baseplatform.lazy_property
    def GL(self):
        try:
            return ctypesloader.loadLibrary(
                ctypes.windll, 'opengl32', mode = ctypes.RTLD_GLOBAL
            )
        except OSError as err:
            raise ImportError("Unable to load OpenGL library", *err.args)
    @baseplatform.lazy_property
    def GLU(self):
        try:
            return ctypesloader.loadLibrary(
                ctypes.windll, 'glu32', mode = ctypes.RTLD_GLOBAL
            )
        except OSError:
            return None
    @baseplatform.lazy_property
    def GLUT( self ):
        # 2023/12/01 https://self-development.info/%e3%80%90python%e3%80%91pyopengl%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95%e3%82%92%e8%a7%a3%e8%aa%ac/
        for possible in ('freeglut%s.%s'%(size,vc,),'freeglut', 'glut%s.%s'%(size,vc,)):


修正カ所が正常に動くかの確認します。

起動すると黒背景のウィンドウの中に白い正方形が描かれたウィンドウが登場します。
出てこれば完了です。

【OpenGL_test01.py】
# coding: utf-8
# ////////////////////////////////////////////////////////////////////////////
# ///【OpenGL試験】
# ///   https://self-development.info/%e3%80%90python%e3%80%91pyopengl%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%96%b9%e6%b3%95%e3%82%92%e8%a7%a3%e8%aa%ac/
# ///   【Python】PyOpenGLのインストール方法を解説
# ///【freeglutインストール】
# ///・ DLLダウンロード
# ///   https://www.transmissionzero.co.uk/software/freeglut-devel/
# ///・ Download freeglut 3.0.0 for MSVC」をクリックダウンロードが完了すると「freeglut-MSVC-3.0.0-2.mp.zip」
# ///・ 「freeglut.dll」を「C:\Windows\System32」にコピーし
# ///【PyOpenGLのインストール】
# ///・ python -m pip install --upgrade pip setuptools
# ///・ pip install PyOpenGL PyOpenGL_accelerate
# ///【PyOpenGLの以下ファイルを変更】
# ///   \Lib\site-packages\OpenGL\platform\win32.py
# ///    for possible in ('freeglut%s.%s'%(size,vc,), 'glut%s.%s'%(size,vc,)):
# ///                               ↓
# ///    for possible in ('freeglut%s.%s'%(size,vc,),'freeglut', 'glut%s.%s'%(size,vc,)):
# ///
# ///  【改訂履歴】
# /// V0.00 2023/12/01 プロトタイプ
# ////////////////////////////////////////////////////////////////////////////
if "__file__" in globals():
    import os, sys
    sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
    sys.path.append(os.path.join(os.path.dirname(__file__), "..") + "//..//")

from OpenGL.GLUT import *
from OpenGL.GL import *

def display():
    glClear(GL_COLOR_BUFFER_BIT)

    glColor3f(1.0, 1.0, 1.0)
    glBegin(GL_POLYGON)
    glVertex3f(0.25, 0.75, 0.0)
    glVertex3f(0.25, 0.25, 0.0)
    glVertex3f(0.75, 0.25, 0.0)
    glVertex3f(0.75, 0.75, 0.0)
    glEnd()

    glFlush()

if __name__ == '__main__':
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(300, 300)
    glutCreateWindow(b"test")
    glutDisplayFunc(display)
    glutMainLoop()

★ ffmpegのインストール

当サイトでは以前よりffmpegを使用しており、pythonには依存せず動作確認もされているため省略しますが、まだの方は下記をご覧ください。

https://self-development.info/python%e3%81%a7%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3gif%e3%81%a8%e5%8b%95%e7%94%bb%e3%82%92%e7%b0%a1%e5%8d%98%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/

★ PIFuHDのインストール

PiFuHDインストールは、GitHubのクローンを作成する方式で行います。

git clone https://github.com/facebookresearch/pifuhd.git

★ 学習済みモデルのインストール

gitHubのクローンを作成すると、フォルダー「gifuhd」が作成されますので、その中に「checkpoint」というフォルダーを作成します。 次にコマンドシェルはそのままにして、windowsのPowerShellを開き、先ほどの空のフォルダー「checkpoint」へ移動し、 次のコマンドを実行し、学習済モデルをダウンロードします。
wget "https://dl.fbaipublicfiles.com/pifuhd/checkpoints/pifuhd.pt" -O pifuhd.pt

ちなみに「wget」はLinuxコマンドなので、コマンドプロンプトでは動作しません。
全1.4GBあるため、相当時間がかかります。

★ PIFuHDのインストール

PowerShell終了まで待って、完了したらPowerShellは閉じてコマンドプロンプトへ戻り、PIFuHDをインストールします。
フォルダ「pifuhd」まで移動し、下記で一括インストールします。
pip install -r requirements.txt

★ インストール済モジュール修正

「pip install -r requirements.txt」で一括インストールのはずですが、これでは全く動作しませんので、いくつかインストールをやり直します。
最初に「matplotlib」がインストールされないので行います。

pip install matplotlib

それでもエラーが多発するため海外サイトを検索し自分でも試したところ、エラーやワーニングの原因は numpy のバージョン不一致によるものであることが分かりました。つまりバージョンが低すぎると処理がなく、高すぎると型が不一致などが出ます。
最終結果としてnumpyの適合バージョンは「1.23.0」の一択しかないことが分かりましたのでバージョンを入れ替えます。

pip install numpy==1.23.0

★ プログラムの修正

それでもエラーは解消されませんので、プログラムを修正します。

「ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type」の対応策として、ファイル「pifuhd/lib/render/gl/render.py line45を下記のように修正します。

_glut_window = None

class Render:
    def __init__(self, width=1600, height=1200, name='GL Renderer',
                 program_files=['simple.fs', 'simple.vs'], color_size=1, ms_rate=1):
        self.width = width
        self.height = height
        self.name = name
        self.display_mode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH
        self.use_inverse_depth = False

        global _glut_window
        if _glut_window is None:
            glutInit()
            glutInitDisplayMode(self.display_mode)
            glutInitWindowSize(self.width, self.height)
            glutInitWindowPosition(0, 0)
            # 2023/12/01
            # _glut_window = glutCreateWindow("My Render.")
            _glut_window = glutCreateWindow(b"My Render.")


次に、起動後最後に、Linuxコマンドで不要なファイルを削除する箇所があるため、windowsコマンドに変更します。

【pifuhd/apps/render_turntable.py 一番最後】
 cmd = 'ffmpeg -framerate 30 -i ' + obj_root + '/rot_%04d.png -vcodec libx264 -y -pix_fmt yuv420p -refs 16 ' + os.path.join(obj_root, file_name + '.mp4')
os.system(cmd)
# cmd = 'rm %s/rot_*.png' % obj_root
cmd = 'del results\\pifuhd_final\\*.png'
os.system(cmd)

★ 動作確認 obj版3Dモデル作成

やっと操作確認できます。

最初確認のために フォルダ「sample_images」の中を見てみましょう。
ファイル「test_keypoints.json」「test.png」のデモ用データが入っています。

ファイル「test.png」を表示すると、CGの人物が描かれています。



次に下記コマンド実行してみてください。

python -m apps.simple_test

すると、フォルダー「pifuhd/results/pifuhd_final/recon」に
    「result_test_512.png」「result_test_512.obj」
という2つのOBJ版3Dモデルが作成されます。

★ 3Dモデルの可視化

といっても、 OBJ版3Dモデルファイルのみでは内容がわかりませんので、動画用に可視化します。それでは次のコマンド実行してみてください。

python -m apps.render_turntable -f ./results/pifuhd_final/recon -ww 512 -hh 512

終了すると、フォルダー「pifuhd/results/pifuhd_final/recon」に「result_test_512.mp4」という動画が作成されます。


何をやっているか解説していきます。

下記の場合、おまじないのように「python -m 」と起動していますが、これは「pythonモジュール起動」または「pythonスクリプト起動」といい、フォルダ「apps」のファイル「simple_test.py」をスクリプト起動しています。
本来入力ファイル名などを設定しますが、デフォルトはフォルダ「sample_images」のファイル「test.png」と決められています。変更するのが面倒なので、目的の画像を「sample_images\test.png」に変更すれば良いわけです。

python -m apps.simple_test

OBJ型3Dモデル表示ができないため次のコマンドで動画に変更していますが、表示できるものがあれば、そのツールで表示すれば下記はいりません。

python -m apps.render_turntable -f ./results/pifuhd_final/recon -ww 512 -hh 512

例えば、誰でも知っている有名な泥棒を動画にして動画変種アプリでマルチ画面にしてみると、こんなようになります。



★ 3Dモデルの可視化~MeshLab~

別の可視化ツールをインストールして使用する場合、下記参考サイトさんを参考にMeshLabというツールをインストールしてみます。

【参考サイト】
MeshLab のインストール,Wavefront OBJ ファイルのインポート(Windows 上)
https://www.kkaneko.jp/db/win/meshlab.html

MeshLabはwavefrontOBJファイルをインポートして3次元の表示、簡易編集を行うツールです、

・ MeshLabへ移動します。
    https://www.meshlab.net/

・ メニュー「Download」をクリックします。
・ 2023/12/01現在の最新版は「MeshLab 2022.02」の「Win 64」をクリックしダウンロードします。
・ 「MeshLab2022.02-windows」をクリックしインストールします。

・ MeshLabを起動します

・ 「File>ImportMesh」をクリックし、先ほどのOBJを開くと可視化ができます。

この場合、動画ではないため、ビューポイントは自由に設定できます。



★ まとめ

PiFuHDは去年できた真新しい技術です。
この技術があれば、3Dプリンターと併用すれば、新しい世界が広がることでしょう。
ただ、最近思うのは海外の研究者はLinuxを使用している方がほとんどであるため、windowsインストールには相当時間も手間もかかります。

今回は挫折せずによかったと思いました。


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system