[PYTHON] Exécutez PIFuHD dans l'environnement Windows + Anaconda + Git Bash

Aperçu

J'ai essayé un modèle de Deep Learning appelé PIFuHD qui génère un maillage tridimensionnel à partir d'une (ou plusieurs) photos, c'est donc un mémo. C'est un mémo parce que j'étais accro à l'exécuter dans un environnement Windows.

En citant la vidéo publiée sur GitHub, vous pouvez effectuer les opérations suivantes:

PIFuHD demo

Environnement

Cet environnement utilise Anaconda. (PIFuHD utilise Python, donc un environnement Python est requis)

Normalement, lorsque vous installez Anaconda, une interface graphique est également incluse, vous pouvez donc y définir l'environnement. À partir de là, vous pouvez également lancer un terminal avec l'environnement Anaconda configuré, il vous suffit donc d'exécuter un script Python à partir de la ligne de commande.

Cependant, lorsque j'essaye différents modèles de Deep Learning, il y a toujours des moments où je travaille avec des scripts Shell. Bien sûr, il ne peut pas être exécuté à partir de l'invite de commande Windows.

Donc, cette fois, je voudrais configurer pour utiliser Anaconda (commande conda) même dans l'environnement Bash de Git pour Windows. (Si vous voulez juste essayer la démo PIFuHD, il vous suffit d'appuyer vous-même sur certaines commandes dans .sh, donc je ne peux pas dire que ce n'est pas nécessaire)

Après avoir installé Anaconda, configurez la commande conda pour qu'elle soit disponible sur Git pour Windows.

Installez Anaconda

Tout d'abord, installez Anaconda. Cliquez sur le bouton «Commencer» sur la page Anaconda, puis sur ** Installer Anaconda Individual Edition ** pour accéder à la page de téléchargement (https://www.anaconda.com/products/individual).

Il y a un bouton ** Télécharger ** sur la page de téléchargement, cliquez dessus pour faire défiler jusqu'au lien de téléchargement en bas de la page, sélectionnez ** 64-Bit Graphical Installer ** à partir de là pour télécharger le programme d'installation et Anaconda À installer.

À travers le chemin

Une fois l'installation terminée, transmettez le chemin pour que Bash le reconnaisse. Ensuite, la commande conda elle-même sera reconnue.

Dans mon environnement, j'ai ajouté ce qui suit à .basahrc.

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

Veuillez réécrire en fonction de l'emplacement d'installation. Si vous conservez la valeur par défaut, vous pouvez utiliser la même chose que ci-dessus.

J'obtiens une erreur avec conda activate

Après avoir traversé Path, lorsque j'ai essayé d'activer l'environnement Anaconda et exécuté $ conda activate, l'erreur suivante s'est produite.

$ 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'.

Je l'ai résolu en me référant à l'article suivant.

Apparemment, c'est un problème car lorsque je lance conda init, ce qui est écrit automatiquement ne l'est pas. Ainsi, en ajoutant manuellement ce qui suit à .bashrc, conda est reconnu et peut être utilisé en toute sécurité sur Bash of Git pour Windows.

# >>> 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 <<<

Après avoir ajouté cela, vous pouvez exécuter $ source ~ / .bashrc ou redémarrer le terminal et vous pourrez exécuter $ conda activate [ENV_NAME]. Si l'environnement est correctement appliqué, vous devriez voir le nom de l'environnement dans l'invite.

Configuration pour PIFuHD

Après avoir créé l'environnement pour Anaconda, nous installerons PIFU HD. Le fichier README de GitHub indique ce qui suit, nous allons donc le configurer pour qu'ils puissent être utilisés.

Requirements

À propos, la configuration manuelle est décrite dans le README de Référentiel de la version sans HD comme suit, donc je l'ai configuré en faisant référence à cela. (J'ai fait référence à la partie ** OU configuration manuelle de l'environnement **. ** Je n'ai pas fait référence à la partie ci-dessus car j'utilise miniconda **)

Windows demo installation instuction

Installer les modules supplémentaires requis

En plus de ce qui précède, j'ai également installé les éléments suivants. (Il est écrit dans le README de PIFuHD)

Installez chacun comme suit.

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

Installez GLUT sur Windows

Lorsque j'ai essayé d'exécuter l'exemple sans installer GLUT, l'erreur suivante s'est produite.

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

C'est une erreur car il n'y a pas de GLUT. Cependant, je ne savais pas comment l'installer et cet article m'a aidé.

Dans cet article, il est écrit qu'il a été résolu en se référant à un autre article. Cliquez ici pour un autre article (Utilisation d'OpenGL avec Python sur le journal de Windows-Tadao Yamaoka)

Permettez-moi d'en citer

Installation gratuite de GLUT

Vous devez installer GLUT séparément de PyOpenGL. GLUT semble être une bibliothèque indépendante de la plate-forme pour gérer OpenGL.

Original GLUT ne peut pas télécharger le binaire 64 bits de Windows. À la place, installez FreeGLUT, qui fournit un binaire 64 bits.

Depuis la page FreeGLUT Martin Payne's Windows binaries (MSVC and MinGW) Suivez le lien, Download freeglut 3.0.0 for MSVC Téléchargez freeglut-MSVC-3.0.0-2.mp.zip depuis.

Copiez freeglut.dll de freeglut \ bin \ x64 \ dans le fichier zip vers C: \ Windows \ System32.

Vous pouvez maintenant utiliser GLUT.

Installation de ffmpeg

Pour l'installation de ffmpeg, je me suis référé à cet article.

En gros, déposez simplement le fichier ʻexe, enregistrez-le, ajoutez-le à Path et faites-le reconnaître. L'article ci-dessus est un exemple utilisé à l'invite de commande, mais comme j'utilise Git Bash cette fois, j'ai ajouté le chemin vers .bashrc` comme suit.

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

Corriger le fichier Python

Comme mentionné dans cet article auquel j'ai fait référence, j'ai toujours une erreur même après avoir terminé la configuration ci-dessus. L'erreur qui s'est produite est la suivante.

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

Si vous vous référez à l'article ci-dessus, cela semble être résolu en réécrivant la partie suivante dans lib / render / gl / render.py.

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)
            #Pour spécifier la chaîne d'argument`b`Ajouter
            #_glut_window = glutCreateWindow("My Render.")
            _glut_window = glutCreateWindow(b"My Render.")

Exécutez la démo et affichez les résultats

Eh bien, c'est vraiment la configuration. Tout ce que vous avez à faire maintenant est d'exécuter le script de démonstration fourni.

bash ./scripts/demo.sh

Lorsque ceci est exécuté, la sortie vidéo de la photo d'exemple sera affichée comme indiqué ci-dessous.

result_test_512.gif

Au fait, voici la photo qui a servi de base à la génération de ce modèle ↓

test.png

Générez un maillage avec votre propre photo

Jetons d'abord un coup d'œil au script Shell utilisé pour générer le maillage.

# 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

C'est tout ce qu'on peut en dire. L'un a commenté, mais c'est probablement s'il faut effacer le maillage précédemment généré, etc.

En regardant le premier processus (ʻapps / simple_test.py`), j'ai défini quelques paramètres.

# 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)

Les éléments de réglage sont l'emplacement des données d'entrée, l'emplacement des données de sortie, la résolution, etc.

En regardant l'entrée, il semble que les images du dossier . / Sample_images soient utilisées. Donc, j'ai placé l'image que je veux générer un maillage là-bas et l'ai exécutée.

Cliquez ici pour les résultats.

result_test_512.gif

Vous pouvez le générer normalement. (L'image d'origine a été récupérée, je ne la publierai donc pas ici.)

Il a été confirmé qu'il peut être généré normalement même s'il n'est pas inclus à l'origine.

Out of Memory ne génère pas de maillage

Je n'ai rencontré ce problème que quelques fois, mais lorsque j'ai essayé de générer des maillages, j'ai eu un problème en raison de l'interruption de la génération du maillage en raison d'une erreur CUDA Out of Memory.

Il y a peut-être un moyen normal de libérer la mémoire, mais j'ai pu le résoudre en effectuant une fois $ conda deactivate. (Une fois que vous l'avez fait, il n'y a plus d'erreur de mémoire après cela ... mystère)

Si vous le rencontrez, essayez-le.

Environnement de génération réussi

En référence à cet article, je publierai l'environnement d'Anaconda qui a réussi à sortir PI FuHD.

<détails>

Liste d'installation d'Anaconda </ summary> # 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

<details>

Ce qui précède est écrit avec la commande suivante.

```console
$ conda list --explicit > env_name.txt

Vous pouvez créer l'environnement en copiant la liste ci-dessus et en utilisant la commande suivante.

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

##finalement

C'est incroyable le nombre de maillages pouvant être générés à partir d'une seule photo. De plus, il semble que la précision sera encore plus élevée si elle est générée à partir de plusieurs photos. (Et il semble qu'il puisse être généré à partir de vidéos)

Dans un futur proche, le moment viendra où nous partagerons ce que nous avions l'habitude de partager en photos sous la forme de ces modèles 3D. Il ne fait aucun doute que les données seront partagées en trois dimensions à l'ère de la RA, donc j'attends avec impatience une telle ère à partir de maintenant.

Recommended Posts