[PYTHON] Führen Sie PIFuHD in der Windows + Anaconda + Git Bash-Umgebung aus

Überblick

Ich habe ein Deep Learning-Modell namens PIFuHD ausprobiert, das aus einem (oder mehreren) Fotos ein dreidimensionales Netz generiert. Dies ist also ein Memo. Es ist ein Memo, weil ich süchtig danach war, es in einer Windows-Umgebung auszuführen.

Wenn Sie das auf GitHub veröffentlichte Video zitieren, können Sie Folgendes tun:

PIFuHD demo

Umgebung

Diese Umgebung verwendet Anaconda. (PIFuHD verwendet Python, daher ist eine Python-Umgebung erforderlich.)

Normalerweise ist bei der Installation von Anaconda auch eine grafische Benutzeroberfläche enthalten, sodass Sie die Umgebung dort einstellen können. Von dort aus können Sie auch ein Terminal mit eingerichteter Anaconda-Umgebung starten. Sie müssen also lediglich ein Python-Skript über die Befehlszeile ausführen.

Wenn ich jedoch verschiedene Deep Learning-Modelle ausprobiere, gibt es immer Momente, in denen ich mit Shell-Skripten arbeite. Natürlich kann es nicht über die Windows-Eingabeaufforderung ausgeführt werden.

Daher möchte ich dieses Mal die Verwendung von Anaconda (Befehl conda) auch in der Bash-Umgebung von Git für Windows einrichten. (Wenn Sie nur die PIFuHD-Demo ausprobieren möchten, müssen Sie nur einige Befehle in .sh selbst eingeben, daher kann ich nicht sagen, dass dies nicht erforderlich ist.)

Konfigurieren Sie nach der Installation von Anaconda den Befehl conda so, dass er auf Git für Windows verfügbar ist.

Installieren Sie Anaconda

Installieren Sie zuerst Anaconda. Klicken Sie auf der Anaconda-Seite auf die Schaltfläche "Erste Schritte" und dann auf "Anaconda Individual Edition installieren" **, um zur Download-Seite (https://www.anaconda.com/products/individual) zu springen.

Auf der Download-Seite befindet sich eine Schaltfläche ** Herunterladen **. Klicken Sie darauf, um zum Download-Link unten auf der Seite zu blättern. Wählen Sie dort ** 64-Bit-Grafikinstallationsprogramm ** aus, um das Installationsprogramm und Anaconda herunterzuladen Installieren.

Durch den Weg

Übergeben Sie nach Abschluss der Installation den Pfad, damit Bash ihn erkennt. Dann wird der Befehl "conda" selbst erkannt.

In meiner Umgebung habe ich Folgendes zu .basahrc hinzugefügt.

export PATH=$PATH:/c/Users/[USER_NAME]/anaconda3
export PATH=$PATH:/c/Users/[USER_NAME]/anaconda3/Scripts

Bitte schreiben Sie entsprechend dem Installationsort neu. Wenn Sie die Standardeinstellung beibehalten, können Sie dieselbe wie oben verwenden.

Ich erhalte eine Fehlermeldung mit "conda enabled"

Als ich nach dem Durchlaufen von Path versuchte, die Anaconda-Umgebung zu aktivieren und "$ conda enable" ausführte, trat der folgende Fehler auf.

$ conda activate

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If using 'conda activate' from a batch script, change your
invocation to 'CALL conda.bat activate'.

To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - cmd.exe
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

Ich habe es unter Bezugnahme auf den folgenden Artikel gelöst.

Anscheinend ist es ein Problem, denn wenn ich "conda init" starte, wird das, was automatisch geschrieben wird, nicht geschrieben. Durch manuelles Hinzufügen des Folgenden zu ".bashrc" wird "conda" erkannt und kann sicher unter Bash of Git für Windows verwendet werden.

# >>> conda init >>>
__conda_setup="$(CONDA_REPORT_ERRORS=false '$HOME/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "$HOME/anaconda3/etc/profile.d/conda.sh" ]; then
        . "$HOME/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="$PATH:$HOME/anaconda3/bin"
    fi
fi

unset __conda_setup
# <<< conda init <<<

Wenn Sie dies hinzufügen und dann "$ source ~ / .bashrc" ausführen oder das Terminal neu starten, können Sie "$ conda activ [ENV_NAME]" ausführen. Wenn die Umgebung erfolgreich angewendet wurde, sollte der Umgebungsname in der Eingabeaufforderung angezeigt werden.

Setup für PIFuHD

Nachdem wir die Umgebung für Anaconda erstellt haben, werden wir uns für PIFU HD einrichten. Die GitHub-README-Datei gibt Folgendes an, daher richten wir sie so ein, dass sie verwendet werden können.

Requirements

Das manuelle Setup wird übrigens in der README-Datei von Repository der Version ohne HD wie folgt beschrieben, daher habe ich es unter Bezugnahme darauf eingerichtet. (Ich habe auf den Teil ** ODER manuelle Einrichtung der Umgebung ** verwiesen. ** Ich habe nicht auf den obigen Teil verwiesen, weil ich Miniconda ** verwende.)

Windows demo installation instuction

Installieren Sie zusätzliche erforderliche Module

Zusätzlich zu den oben genannten habe ich auch die folgenden Elemente installiert. (Es ist in der README von PIFuHD geschrieben)

Installieren Sie jedes wie folgt.

$ conda install -c conda-forge trimesh
$ conda install -c anaconda pyopengl

Installieren Sie GLUT unter Windows

Als ich versuchte, das Beispiel ohne Installation von GLUT auszuführen, trat der folgende Fehler auf.

OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling

Dies ist ein Fehler, da kein GLUT vorhanden ist. Ich wusste jedoch nicht, wie ich es installieren sollte, und dieser Artikel half mir.

In diesem Artikel wird geschrieben, dass es durch Bezugnahme auf einen anderen Artikel behoben wurde. Klicken Sie hier für einen weiteren Artikel (Verwenden von OpenGL mit Python in Windows-Tadao Yamaokas Tagebuch)

Lassen Sie mich daraus zitieren

Kostenlose GLUT-Installation

Sie müssen GLUT separat von PyOpenGL installieren. GLUT scheint eine plattformunabhängige Bibliothek für den Umgang mit OpenGL zu sein.

Original GLUT kann die 64-Bit-Binärdatei von Windows nicht herunterladen. Installieren Sie stattdessen FreeGLUT, das eine 64-Bit-Binärdatei bereitstellt.

Von der Seite FreeGLUT Martin Payne's Windows binaries (MSVC and MinGW) Folge dem Link, Download freeglut 3.0.0 for MSVC Laden Sie freeglut-MSVC-3.0.0-2.mp.zip von herunter.

Kopieren Sie die Datei freeglut.dll aus freeglut \ bin \ x64 \ in der Zip-Datei nach C: \ Windows \ System32.

Jetzt können Sie GLUT verwenden.

Fmpeg installieren

Für die Installation von ffmpeg habe ich auf diesen Artikel verwiesen.

Legen Sie einfach die exe-Datei ab, speichern Sie sie, fügen Sie sie dem Pfad hinzu und lassen Sie sie erkennen. Der obige Artikel ist ein Beispiel, das an der Eingabeaufforderung verwendet wird. Da ich diesmal Git Bash verwende, habe ich den Pfad zu ".bashrc" wie folgt hinzugefügt.

export PATH=$PATH:/path/to/bin/ffmpeg

Python-Datei reparieren

Wie in diesem Artikel erwähnt, auf den ich mich bezog, wurde auch nach Abschluss des obigen Setups immer noch ein Fehler angezeigt. Der aufgetretene Fehler ist wie folgt.

Traceback (most recent call last):
  File "C:\Users\[USER_NAME]\anaconda3\envs\pifu\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Users\[USER_NAME]\anaconda3\envs\pifu\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\MyDesktop\Python-Projects\pifuhd\apps\render_turntable.py", line 69, in <module>
    renderer = ColorRender(width=args.width, height=args.height)
  File "D:\MyDesktop\Python-Projects\pifuhd\lib\render\gl\color_render.py", line 34, in __init__
    CamRender.__init__(self, width, height, name, program_files=program_files)
  File "D:\MyDesktop\Python-Projects\pifuhd\lib\render\gl\cam_render.py", line 32, in __init__
    Render.__init__(self, width, height, name, program_files, color_size, ms_rate)
  File "D:\MyDesktop\Python-Projects\pifuhd\lib\render\gl\render.py", line 45, in __init__
    _glut_window = glutCreateWindow("My Render.")
  File "C:\Users\[USER_NAME]\anaconda3\envs\pifu\lib\site-packages\OpenGL\GLUT\special.py", line 73, in glutCreateWindow
    return __glutCreateWindowWithExit(title, _exitfunc)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

Wenn Sie sich auf den obigen Artikel beziehen, scheint dies gelöst zu sein, indem Sie den folgenden Teil in "lib / render / gl / render.py" umschreiben.

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)
            #Angabe der Argumentzeichenfolge`b`Hinzufügen
            #_glut_window = glutCreateWindow("My Render.")
            _glut_window = glutCreateWindow(b"My Render.")

Führen Sie die Demo aus und geben Sie die Ergebnisse aus

Nun, das ist wirklich das Setup. Jetzt müssen Sie nur noch das bereitgestellte Demoskript ausführen.

bash ./scripts/demo.sh

Wenn dies ausgeführt wird, wird die Videoausgabe des Beispielfotos wie unten gezeigt angezeigt.

result_test_512.gif

Hier ist übrigens das Foto, auf dem dieses Modell erstellt wurde ↓

test.png

Generieren Sie ein Netz mit Ihrem eigenen Foto

Schauen wir uns zunächst das Shell-Skript an, mit dem das Netz generiert wurde.

# Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.

python -m apps.simple_test
# python apps/clean_mesh.py -f ./results/pifuhd_final/recon
python -m apps.render_turntable -f ./results/pifuhd_final/recon -ww 512 -hh 512

Das ist alles dazu. Einer kommentierte aus, aber dies ist wahrscheinlich, ob das zuvor erzeugte Netz usw. gelöscht werden soll.

Beim ersten Prozess (apps / simple_test.py) habe ich einige Parameter eingestellt.

# Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.


from .recon import reconWrapper
import argparse


###############################################################################################
##                   Setting
###############################################################################################
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input_path', type=str, default='./sample_images')
parser.add_argument('-o', '--out_path', type=str, default='./results')
parser.add_argument('-c', '--ckpt_path', type=str, default='./checkpoints/pifuhd.pt')
parser.add_argument('-r', '--resolution', type=int, default=512)
parser.add_argument('--use_rect', action='store_true', help='use rectangle for cropping')
args = parser.parse_args()
###############################################################################################
##                   Upper PIFu
###############################################################################################

resolution = str(args.resolution)

start_id = -1
end_id = -1
cmd = ['--dataroot', args.input_path, '--results_path', args.out_path,\
       '--loadSize', '1024', '--resolution', resolution, '--load_netMR_checkpoint_path', \
       args.ckpt_path,\
       '--start_id', '%d' % start_id, '--end_id', '%d' % end_id]
reconWrapper(cmd, args.use_rect)

Die Einstellungselemente sind der Ort der Eingabedaten, der Ort der Ausgabedaten, die Auflösung usw.

Bei Betrachtung der Eingabe scheinen die Bilder im Ordner . / Sample_images verwendet zu werden. Also habe ich das Bild, das ich erzeugen möchte, dort platziert und ausgeführt.

Klicken Sie hier für die Ergebnisse.

result_test_512.gif

Sie können es normal generieren. (Das Originalbild wurde aufgenommen, daher werde ich es hier nicht veröffentlichen.)

Es wurde bestätigt, dass es normal generiert werden kann, auch wenn es ursprünglich nicht enthalten ist.

Nicht genügend Speicher erzeugt kein Netz

Ich bin nur ein paar Mal auf dieses Problem gestoßen, aber als ich versuchte, einige Netze zu generieren, hatte ich das Problem, dass die Netzgenerierung aufgrund eines CUDA-Speichermangels unterbrochen wurde.

Es mag einen normalen Weg geben, den Speicher freizugeben, aber ich konnte ihn lösen, indem ich einmal "$ conda disable" machte. (Sobald Sie es tun, gibt es keinen Speicherfehler danach ... Rätsel)

Wenn Sie darauf stoßen, probieren Sie es aus.

Erfolgreiche Generierungsumgebung

In Bezug auf diesen Artikel werde ich die Umgebung von Anaconda veröffentlichen, in der PI FuHD erfolgreich ausgegeben werden konnte.

Anaconda-Installationsliste \# This file may be used to create an environment using: \# $ conda create --name --file \# platform: win-64 @EXPLICIT https://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.conda https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2020.6.20-hecda079_0.tar.bz2 https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2019.0.0-h0cc432a_1.conda https://repo.anaconda.com/pkgs/main/win-64/intel-openmp-2020.1-216.conda https://repo.anaconda.com/pkgs/main/win-64/vs2015_runtime-14.16.27012-hf0eaf9b_3.conda https://repo.anaconda.com/pkgs/main/win-64/mkl-2020.1-216.conda https://repo.anaconda.com/pkgs/main/win-64/vc-14.1-h0510ff6_4.conda https://repo.anaconda.com/pkgs/main/win-64/cudatoolkit-10.1.243-h74a9793_0.conda https://repo.anaconda.com/pkgs/main/win-64/icu-58.2-ha925a31_3.conda https://repo.anaconda.com/pkgs/main/win-64/jpeg-9b-hb83a4c4_2.conda https://repo.anaconda.com/pkgs/main/win-64/lz4-c-1.9.2-h62dcd97_1.conda https://conda.anaconda.org/conda-forge/win-64/openssl-1.1.1g-he774522_1.tar.bz2 https://repo.anaconda.com/pkgs/main/win-64/tk-8.6.10-he774522_0.conda https://repo.anaconda.com/pkgs/main/win-64/xz-5.2.5-h62dcd97_0.conda https://repo.anaconda.com/pkgs/main/win-64/yaml-0.2.5-he774522_0.conda https://repo.anaconda.com/pkgs/main/win-64/zlib-1.2.11-h62dcd97_4.conda https://repo.anaconda.com/pkgs/main/win-64/hdf5-1.8.20-hac2f561_1.conda https://repo.anaconda.com/pkgs/main/win-64/libpng-1.6.37-h2a8f88b_0.conda https://repo.anaconda.com/pkgs/main/win-64/sqlite-3.33.0-h2a8f88b_0.conda https://repo.anaconda.com/pkgs/main/win-64/zstd-1.4.5-h04227a9_0.conda https://repo.anaconda.com/pkgs/main/win-64/freetype-2.10.2-hd328e21_0.conda https://repo.anaconda.com/pkgs/main/win-64/libtiff-4.1.0-h56a325e_1.conda https://repo.anaconda.com/pkgs/main/win-64/python-3.7.7-h81c818b_4.conda https://repo.anaconda.com/pkgs/main/win-64/qt-5.9.7-vc14h73c81de_0.conda https://repo.anaconda.com/pkgs/main/noarch/cloudpickle-1.5.0-py_0.conda https://repo.anaconda.com/pkgs/main/noarch/decorator-4.4.2-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/kiwisolver-1.2.0-py37h74a9793_0.conda https://repo.anaconda.com/pkgs/main/win-64/libopencv-3.4.2-h20b85fd_0.conda https://repo.anaconda.com/pkgs/main/win-64/ninja-1.10.0-py37h7ef1ec2_0.conda https://repo.anaconda.com/pkgs/main/win-64/olefile-0.46-py37_0.conda https://conda.anaconda.org/anaconda/win-64/pyopengl-3.1.1a1-py37_0.tar.bz2 https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.7-py_0.conda https://conda.anaconda.org/conda-forge/win-64/python_abi-3.7-1_cp37m.tar.bz2 https://repo.anaconda.com/pkgs/main/win-64/pyyaml-5.3.1-py37he774522_1.conda https://repo.anaconda.com/pkgs/main/win-64/sip-4.19.8-py37h6538335_0.conda https://repo.anaconda.com/pkgs/main/noarch/six-1.15.0-py_0.conda https://repo.anaconda.com/pkgs/main/noarch/toolz-0.10.0-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/tornado-6.0.4-py37he774522_1.conda https://repo.anaconda.com/pkgs/main/noarch/tqdm-4.48.2-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/wincertstore-0.2-py37_0.conda https://conda.anaconda.org/conda-forge/win-64/certifi-2020.6.20-py37hc8dfbb8_0.tar.bz2 https://repo.anaconda.com/pkgs/main/win-64/cycler-0.10.0-py37_0.conda https://repo.anaconda.com/pkgs/main/win-64/cytoolz-0.10.1-py37he774522_0.conda https://repo.anaconda.com/pkgs/main/noarch/dask-core-2.23.0-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/mkl-service-2.3.0-py37hb782905_0.conda https://repo.anaconda.com/pkgs/main/win-64/pillow-7.2.0-py37hcc1f983_0.conda https://repo.anaconda.com/pkgs/main/win-64/pyqt-5.9.2-py37h6538335_2.conda https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.1-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/numpy-base-1.19.1-py37ha3acd2a_0.conda https://repo.anaconda.com/pkgs/main/win-64/setuptools-49.6.0-py37_0.conda https://repo.anaconda.com/pkgs/main/noarch/networkx-2.4-py_1.conda https://repo.anaconda.com/pkgs/main/win-64/wheel-0.34.2-py37_0.conda https://repo.anaconda.com/pkgs/main/win-64/pip-20.2.2-py37_0.conda https://conda.anaconda.org/conda-forge/noarch/trimesh-3.8.1-pyh9f0ad1d_0.tar.bz2 https://repo.anaconda.com/pkgs/main/noarch/imageio-2.9.0-py_0.conda https://repo.anaconda.com/pkgs/main/win-64/matplotlib-3.3.1-0.conda https://repo.anaconda.com/pkgs/main/win-64/matplotlib-base-3.3.1-py37hba9282a_0.conda https://repo.anaconda.com/pkgs/main/win-64/mkl_fft-1.1.0-py37h45dec08_0.conda https://repo.anaconda.com/pkgs/main/win-64/mkl_random-1.1.1-py37h47e9c7a_0.conda https://repo.anaconda.com/pkgs/main/win-64/numpy-1.19.1-py37h5510c5b_0.conda https://repo.anaconda.com/pkgs/main/win-64/py-opencv-3.4.2-py37hc319ecb_0.conda https://conda.anaconda.org/pytorch/win-64/pytorch-1.6.0-py3.7_cuda101_cudnn7_0.tar.bz2 https://repo.anaconda.com/pkgs/main/win-64/pywavelets-1.1.1-py37he774522_0.conda https://repo.anaconda.com/pkgs/main/win-64/scipy-1.5.0-py37h9439919_0.conda https://repo.anaconda.com/pkgs/main/win-64/opencv-3.4.2-py37h40b0b35_0.conda https://repo.anaconda.com/pkgs/main/win-64/scikit-image-0.16.2-py37h47e9c7a_0.conda https://conda.anaconda.org/pytorch/win-64/torchvision-0.7.0-py37_cu101.tar.bz2 ```

Das Obige wird mit dem folgenden Befehl geschrieben.

$ conda list --explicit > env_name.txt

Sie können die Umgebung erstellen, indem Sie die obige Liste kopieren und den folgenden Befehl verwenden.

$ conda create -n [env_name] --file env_name.txt

##Schließlich

Es ist erstaunlich, wie viele Netze aus einem einzelnen Foto generiert werden können. Darüber hinaus scheint die Genauigkeit noch höher zu sein, wenn sie aus mehreren Fotos generiert wird. (Und es scheint, dass es aus Videos generiert werden kann)

In naher Zukunft wird die Zeit kommen, in der wir das, was wir früher in Fotos geteilt haben, in Form dieser 3D-Modelle teilen werden. Es besteht kein Zweifel, dass Daten in der AR-Ära dreidimensional geteilt werden, daher freue ich mich von nun an auf eine solche Ära.

Recommended Posts