** PyTorch, un type de framework Deep Learning, a une version C ++ ainsi qu'une version Python! ** **
Cette fois, j'expliquerai la marche à suivre pour construire un environnement sur Ubuntu avec "PyTorch C ++" ou "LibTorch". Pour ceux qui aiment le Deep Learning, ceux dont le langage principal est le C ++, et ceux qui travaillent avec des systèmes embarqués, c'est peut-être une solution! De plus, même les personnes qui n'ont jamais utilisé C ++ devraient pouvoir le comprendre dans une certaine mesure.
Tout d'abord, j'expliquerai la procédure de création et d'exécution d'un code source simple, puis j'expliquerai la procédure d'exécution en utilisant le code source réel (code source que j'ai écrit). ** Le code source que j'ai écrit est téléchargé sur GitHub ci-dessous! </ font> ** https://github.com/koba-jon/pytorch_cpp
Ensuite, j'expliquerai la procédure spécifique.
--Obligatoire --Installation d'Ubuntu (18.04, 20.04)
--Lors de l'utilisation du GPU --Installation du pilote NVIDIA ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#1-nvidia%E3%83%89%E3%83%A9%E3%82%A4%E3% " 83% 90% E3% 83% BC% E3% 81% AE% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% UN B))) --Installation de CUDA ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#2-cuda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82] % B9% E3% 83% 88% E3% 83% BC% E3% 83% AB)) --Installez cuDNN ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#3-cudnn%E3%81%AE%E3%82%A4%E3%83%B3%E3%82 % B9% E3% 83% 88% E3% 83% BC% E3% 83% AB))
Officiel PyTorch: https://pytorch.org/ Accédez au lien et suivez les étapes ci-dessous pour télécharger LibTorch.
Ceci termine le téléchargement de LibTorch lui-même. Il est recommandé de placer le répertoire lui-même dans un emplacement facile à comprendre (tel que directement sous le répertoire personnel).
Tout d'abord, créez un ** code source temporaire **.
$ mkdir libtorch_test
$ cd libtorch_test
$ vi main.cpp
Ajoutez le code suivant et enregistrez-le. Il s'agit d'un programme qui crée une matrice 3x3 (tenseur du second ordre) avec l'élément de type Float 1.5 et l'affiche sur l'écran de la console.
main.cpp
#include <iostream>
#include <torch/torch.h>
int main(void){
torch::Tensor x = torch::full({3, 3}, 1.5, torch::TensorOptions().dtype(torch::kFloat));
std::cout << x << std::endl;
return 0;
}
Cette fois, nous utiliserons "Makefile" pour construire facilement le code source. Créez également "CMakeLists.txt" pour créer le "Makefile".
$ vi CMakeLists.txt
Le CMakeLists.txt le plus simple est: ** Copiez et enregistrez ** ceci.
CMakeLists.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# Project Name
project(test CXX)
# Find Package
find_package(Torch REQUIRED)
# Create Executable File
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${TORCH_LIBRARIES})
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
En bref, la première ligne est "spécifier la version de cmake", la suivante est "spécifier le nom du projet et le compilateur C ++", la suivante est "spécifier la bibliothèque à rechercher", la suivante est "spécifier le fichier à compiler", et la suivante Cela signifie "spécifier la bibliothèque" et enfin "spécifier la version du compilateur C ++".
Ensuite, créez un répertoire de construction et exécutez cmake. Ici, ** entrez le chemin du répertoire libtorch que vous avez téléchargé précédemment ** ensemble. (Lorsque "~ / libtorch" est directement sous le répertoire personnel)
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_PREFIX_PATH=~/libtorch
Cela créera un Makefile, alors lancez make pour le construire.
$ make
Enfin, exécutez le fichier exécutable.
$ ./test
Si ce qui suit est affiché, cela réussit.
1.5000 1.5000 1.5000
1.5000 1.5000 1.5000
1.5000 1.5000 1.5000
[ CPUFloatType{3,3} ]
** La construction de l'environnement de LibTorch lui-même est maintenant terminée </ font> **! Après cela, installez la bibliothèque dépendante et définissez-la pour que l'exemple de code puisse être exécuté.
OpenCV
OpenCV est utilisé pour ** l'entrée / la sortie de données d'image **.
La méthode d'installation était très simple à comprendre dans cet article. Comme il a été implémenté sur la base de la classe cv :: Mat, veuillez installer ** version 3.0.0 ou supérieure </ font> **.
Boost
Boost est utilisé pour ** obtenir des arguments de ligne de commande et des noms de fichiers **.
Exécutez la commande suivante pour l'installer.
$ sudo apt install libboost-dev libboost-all-dev
Gnuplot
Gnuplot est utilisé pour ** pour dessiner un graphique de perte **.
Exécutez la commande suivante pour l'installer.
$ sudo apt install gnuplot
libpng
libpng est utilisé pour ** lire les images de couleur d'index pour la segmentation sémantique **.
Exécutez la commande suivante pour l'installer.
$ sudo apt install libpng++-dev
Tout d'abord, exécutez la commande suivante pour cloner l'exemple de code.
$ cd ~
$ git clone https://github.com/koba-jon/pytorch_cpp.git
$ cd pytorch_cpp
Editez "CMakeLists.txt" pour définir le chemin de LibTorch.
$ vi utils/CMakeLists.txt
Auparavant, j'ai ajouté "-DCMAKE_PREFIX_PATH = ~ / libtorch" à l'argument de cmake et je l'ai exécuté, mais il est difficile de le saisir à chaque fois. Par conséquent, intégrez le chemin directement dans "CMakeLists.txt".
** Définissez le chemin ** du répertoire "libtorch" où vous avez téléchargé "$ ENV {HOME} / libtorch" ** sur la 4ème ligne. ** S'il y a "libtorch" directement sous votre répertoire personnel, vous n'avez pas besoin de le changer. </ font> **
CMakeLists.txt
3: # LibTorch
4: set(LIBTORCH_DIR $ENV{HOME}/libtorch)
5: list(APPEND CMAKE_PREFIX_PATH ${LIBTORCH_DIR})
Cela trouvera automatiquement le fichier libtorch lorsque vous le construirez. Au fait, mon exemple de code cmake est un ensemble de "CMakeLists.txt" de "utils" et de "CMakeLists.txt" de chaque répertoire de modèle. (Cet article était très facile à comprendre comment utiliser cmake.)
Cette fois, je vais utiliser l'encodeur automatique de convolution, alors déplacez-vous vers ce répertoire. Générez le code source en exécutant la commande suivante.
$ cd AE2d
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ cd ..
Cette fois, nous utiliserons les données d'image du visage de "Celeb A". Accédez au site suivant et cliquez sur ** "Téléchargements> Images In-The-Wild-> Img-> img_align_celeba.zip" ** pour télécharger. http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
De plus, je souhaite diviser l'ensemble de données d'origine en données d'entraînement et en données de test, alors définissez-le. Tout d'abord, appliquez ** \ <dataset_path> au "chemin du jeu de données celebA téléchargé" </ font> ** et exécutez la commande suivante.
$ cd datasets
$ ln -s <dataset_path> ./celebA_org
Exécutez ensuite la commande suivante pour séparer les données en formation et test. (Par défaut, "Formation: Test = 9: 1")
$ sudo apt install python3 python3-pip
$ pip3 install natsort
$ sh hold_out.sh
$ mv ./celebA/valid ./celebA/test
$ cd ..
Créez un fichier pour la formation.
$ vi scripts/train.sh
** Vous pouvez sélectionner le nombre d'époques avec les époques, la taille de l'image avec la taille, le numéro de GPU utilisé avec gpu_id (passe automatiquement en mode CPU s'il n'y a pas de GPU) et le nombre de canaux d'image ** avec nc. (Pour les autres options, ajoutez "--help" à l'argument ou consultez "main.cpp".)
Puisqu'il s'agit d'un exemple de test de code, modifions ** "epochs" en "1" et "size" en "64" **. En passant, ce paramètre est exactement le même, sauf pour la fonction de perte par rapport au paramètre d'entraînement écrit dans cet article.
train.sh
#!/bin/bash
DATA='celebA'
./AE2d \
--train true \
--epochs 300 \ #Changer en 1
--dataset ${DATA} \
--size 256 \ #Changer en 64
--batch_size 16 \
--gpu_id 0 \
--nc 3
Exécutez la commande suivante pour démarrer l'entraînement.
$ sh scripts/train.sh
L'étape intermédiaire de la formation est comme ça.
Si la valeur de la perte ne diminue pas, c'est un problème, mais sinon, je pense qu'il n'y a pas de problème particulier.
Définissez le fichier pour le test.
$ vi scripts/test.sh
Cette fois, nous testons l'exemple de code, changeons donc ** "size" en "64" **. De plus, en définissant "test_in_dir" sur l'image d'entrée et "test_out_dir" sur le chemin Ground Truth de l'image de sortie, il peut être utilisé pour l'évaluation des performances du débruitage, mais cette fois nous ne le changerons pas.
test.sh
#!/bin/bash
DATA='celebA'
./AE2d \
--test true \
--dataset ${DATA} \
--test_in_dir "test" \
--test_out_dir "test" \
--size 256 \ #Changer en 64
--gpu_id 0 \
--nc 3
Exécutez la commande suivante pour démarrer le test.
$ sh scripts/test.sh
C'est un état du test. La perte à gauche est l'erreur entre l'image de sortie et l'image d'entrée, et la perte à droite est l'erreur entre l'image de sortie et son Ground Truth. Enfin, la perte moyenne sort et c'est fini.
** Le code source de cette heure est disponible sur GitHub ci-dessous! !! !! </ font> ** https://github.com/koba-jon/pytorch_cpp
J'ai écrit non seulement un encodeur automatique mais aussi ** VAE, U-Net, pix2pix **, alors essayez-le! Si vous avez des conseils ou des suggestions de corrections, n'hésitez pas à commenter!
De plus, nous avons implémenté des outils utiles pour le débogage, comme indiqué dans le graphique des pertes ci-dessous, alors profitez-en! (Il est créé dans le répertoire "checkpoints" ajouté lors de la formation.)
À propos, le déroulement de ce processus est le suivant.
Cette fois, j'ai construit l'environnement de PyTorch C ++ (LibTorch) sur Ubuntu. Nous espérons qu'il sera utile aux développeurs, aux chercheurs et à toute personne intéressée et étudiée par le Deep Learning.
Merci d'avoir lu l'article jusqu'au bout! Let's have a good development and research life!
Recommended Posts