[PYTHON] J'ai essayé d'utiliser PI Fu pour générer un modèle 3D d'une personne à partir d'une image

Qu'est-ce que PIFu

image.png Citation de l'image (à gauche): Blog officiel Sumire Uesaka Nekomori Rally

PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization

Grosso modo,

** Un modèle d'apprentissage automatique qui génère un modèle 3D d'une personne avec des vêtements à partir d'une seule image **

est.

We introduce Pixel-aligned Implicit Function (PIFu), a highly effective implicit representation that locally aligns pixels of 2D images with the global context of their corresponding 3D object. Using PIFu, we propose an end-to-end deep learning method for digitizing highly detailed clothed humans that can infer both 3D surface and texture from a single image, and optionally, multiple input images. Highly intricate shapes, such as hairstyles, clothing, as well as their variations and deformations can be digitized in a unified way.

Introduisez la fonction implicite alignée sur les pixels (PIFu). Il s'agit d'une représentation implicite très efficace qui aligne les pixels d'une image 2D localement dans le contexte global de l'objet 3D correspondant. Nous proposons une méthode d'apprentissage en profondeur de bout en bout pour numériser des vêtements très détaillés qui peut déduire à la fois des surfaces et des textures 3D à partir d'une seule image et éventuellement de plusieurs images d'entrée à l'aide de PIFu. .. Des formes très complexes telles que les coiffures et les vêtements, ainsi que leurs variations et variantes, peuvent être numérisées de manière unifiée.

Méthode d'installation et tutoriel

La méthode d'installation est simple.

$ git clone https://github.com/shunsukesaito/PIFu.git
$ cd PIFu
$ pip install -r requirements.txt
$ sh ./scripts/download_trained_model.sh

PIFu est livré avec un exemple de jeu de données avec lequel vous pouvez facilement le faire fonctionner.

$ sh ./scripts/test.sh

Cela affichera un fichier appelé results / pifu_demo / result_ryota.obj.

image.png

MeshLab est recommandé lors de la visualisation de modèles 3D. La raison est que le modèle produit par PIFu n'a pas de texture et est coloré par VertexColor. Il est recommandé car peu de téléspectateurs peuvent voir les modèles colorés avec ce Vertex Color et c'est facile à voir.

Générer un modèle 3D avec l'image spécifiée

Il y a deux choses que vous devez faire pour générer un modèle 3D avec PIFu.

  1. Préparez une image carrée
  2. Préparation de l'image du masque

Cette fois, à partir du matériel gratuit Pakutaso (www.pakutaso.com), Image gratuite (photo) du garçon aux lunettes Yukata (corps entier) mettant ses mains sur la manche .html) est utilisé.

image.png

Étant donné que l'image d'origine est longue verticalement, ajoutez une bande pour en faire une image carrée. Appelons cela «kimono.png».

image.png

Générez ensuite une image de masque. Appelons cela kimono_mask.png. ** Le nom est important ici. Assurez-vous d'ajouter «_mask» à l'image du masque. ** **

image.png

Créez ensuite un dossier kimono / et copiez les deux fichiers.

mkdir kimono/
cp kimono.png kimono/
cp kimono_mask.png kimono/

Créez le contenu suivant en tant que scripts / eval.sh.

scripts/eval.sh


#!/usr/bin/env bash
set -ex

# Training
GPU_ID=0
DISPLAY_ID=$((GPU_ID*10+10))
NAME='pifu_demo'

# Network configuration

BATCH_SIZE=1
MLP_DIM='257 1024 512 256 128 1'
MLP_DIM_COLOR='513 1024 512 256 128 3'

TEST_FOLDER_PATH=$1
shift

# Reconstruction resolution
# NOTE: one can change here to reconstruct mesh in a different resolution.
VOL_RES=$1
shift

CHECKPOINTS_NETG_PATH='./checkpoints/net_G'
CHECKPOINTS_NETC_PATH='./checkpoints/net_C'

# command
CUDA_VISIBLE_DEVICES=${GPU_ID} python ./apps/eval.py \
    --name ${NAME} \
    --batch_size ${BATCH_SIZE} \
    --mlp_dim ${MLP_DIM} \
    --mlp_dim_color ${MLP_DIM_COLOR} \
    --num_stack 4 \
    --num_hourglass 2 \
    --resolution ${VOL_RES} \
    --hg_down 'ave_pool' \
    --norm 'group' \
    --norm_color 'group' \
    --test_folder_path ${TEST_FOLDER_PATH} \
    --load_netG_checkpoint_path ${CHECKPOINTS_NETG_PATH} \
    --load_netC_checkpoint_path ${CHECKPOINTS_NETC_PATH}

Finalement,

$ sh scripts/eval_default.sh kimono/ 256

Générera results / pifu_demo / result_kimono.obj.

image.png

Échapper à PIFu

Il existe une méthode appelée PIFu. C'est un PIFu ** que j'ai réalisé pour créer des textures de haute qualité. (Je viens de le nommer pour le distinguer de la famille d'origine.) C'est juste une sortie, et il y a des choses qui sont un peu étranges. Eh bien, il y a plusieurs circonstances, donc je vais l'expliquer plus tard.

À gauche: image d'origine Moyen: PIFu par défaut Droite: PIFu

image.png

Une branche appelée 2_phase_generate dans mon référentiel PIFu.

https://github.com/kotauchisunsun/PIFu/tree/2_phase_generate

Dans cette branche, vous pouvez sortir avec scripts / eval_two_phase.sh. Quant à savoir comment utiliser

./scripts/eval_two_phase.sh IMAGE_DIR/  VOXEL_RESOLUTION VOXEL_LOAD_SIZE TEX_LOAD_SIZE

C'est comme ça. IMAGE_DIR / est le répertoire contenant les images. VOXEL_RESOLUTION est recommandé autour de 512,1024. Si c'est 1024, cela apportera environ 20 Go de mémoire, alors faites correspondre cette zone à la machine. Il est recommandé de fixer VOXEL_LOAD_SIZE à 512. Réglez TEX_LOAD_SIZE sur 1024 ou 2048 selon la résolution de la texture. C'est une bonne idée pour obtenir un modèle avec une texture de haute qualité.

Alors, quelle zone est illégale? C'est une histoire. Eh bien, cela ressemble à ** utiliser un comportement anormal **. Pour plus de détails, voir Pull Request, mais à l'origine VOXEL_LOAD_SIZE et TEX_LOAD_SIZE ne doivent pas être spécifiés sauf pour 512. à propos de ça. Cependant, lorsque je mets TEX_LOAD_SIZE à 1024 et que je le publie ici, il est gênant que ** un joli modèle ait été créé **. Au début, j'ai pensé: "Si je mets une valeur invalide dans TEX_LOAD_SIZE, je mourrais" ou "Si ça bouge, la texture sera brisée", alors je l'ai modifiée de manière appropriée, mais ça ressemble à ça. Il est sorti à merveille. Il est sorti. Donc, j'ai fait une pull request, mais il semble que c'était à l'origine inutile. En fait, la texture derrière est plutôt déchiquetée. Gauche: PIFu Droite: PIFu

image.png

Comme l'a dit l'auteur, si vous voulez une texture de haute qualité, pourquoi ne pas simplement la projeter? On dit qu'il en est peut-être ainsi. En fait, PIFu a également une fonction pour projeter des textures, mais je pense que la modification est essentielle car j'ai l'impression d'avoir vu le code et il est impossible de sortir en haute résolution.

Impressions

Je suis content car j'ai pu vous présenter Sumipe. PIFu connaît son existence depuis l'année dernière et se demande quand le code sera publié, mais j'ai été surpris qu'il soit sorti tôt de manière inattendue. De plus, il était relativement facile de se déplacer, donc je suis content d'avoir pu le faire rapidement. Cependant, je me demande si je peux me sentir un peu mieux. Sonic Boom Sonic Boom Esaka Kawaii.

Recommended Posts

J'ai essayé d'utiliser PI Fu pour générer un modèle 3D d'une personne à partir d'une image
J'ai essayé de générer automatiquement une table de gestion des ports à partir de L2SW Config
Je voulais collecter beaucoup d'images, j'ai donc essayé d'utiliser "google image download"
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [3]. MiDaS de feat. Intel-isl seulement profondeur sans permission.
J'ai essayé la détection 3D d'une voiture
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo.
ConSinGAN: J'ai essayé d'utiliser le GAN qui peut être généré à partir d'une image
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai créé un jeu ○ ✕ avec TensorFlow
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [-1]. (La zone cachée est-elle vraiment visible?)
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo Partie 02 Chargement d'images et dessin de sommets
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé d'héberger un exemple de modèle de Pytorch en utilisant TorchServe
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de trier les objets de l'image du plat de steak-④ Clustering
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo.0 Projection vers l'espace 3D
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [1]. (La profondeur peut maintenant être modifiée en PNG.)
J'ai essayé de créer facilement une image 3D de haute précision avec une seule photo [0]. (Confirmé comment capturer l'espace, l'ombre)
J'ai essayé de trouver l'entropie de l'image avec python
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo Partie 04 Générer des polygones
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
Je veux démarrer beaucoup de processus à partir de python
J'ai essayé d'utiliser la console Pi I / F du kit de démarrage Raspeye IoT de Mechatrax "anyPi"
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai essayé d'automatiser "un cœur même séparé" à l'aide d'un algorithme génétique en Python
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé un éditeur de texte simple en utilisant PyQt
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
Une personne qui veut résoudre le problème D avec ABC d'AtCoder a essayé de gratter
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de trier les objets de l'image du plat de steak-② Tri des numéros de chevauchement