Ce projet vise à simplifier le processus de création d'un modèle Deepdream personnalisé en utilisant des modèles Googlenet pré-traçés et des ensembles de données d'image personnalisés.
Voici quelques exemples de visualisations créées avec des modèles Deepdream personnalisés formés sur les images sur le thème de l'été:
Dépendances:
Vous pouvez trouver des instructions d'installation détaillées pour Ubuntu et Windows dans le guide d'installation.
Après s'être assuré que Pytorch est installé, vous pouvez éventuellement télécharger les modèles pré-étendus Places365 Googlenet et Inception5h (INCECCEPV1) avec la commande suivante:
python models/download_models.py
Si vous voulez simplement créer Deepdreams avec les modèles pré-entraînés ou si vous avez téléchargé un modèle pré-entraîné par quelqu'un d'autre avec Dream-Creator, vous pouvez passer de l'avant pour visualiser les modèles.
Créez et préparez votre ensemble de données
Recueillir des images
Trier les images dans le format requis.
Supprimer toutes les images corrompues.
Assurez-vous que les doublons sont supprimés si vous ne l'avez pas déjà fait
Redimensionner l'ensemble de données pour accélérer l'entraînement.
Calculez la moyenne et l'écart type de votre ensemble de données.
Former un modèle googlenet
Visualisez les résultats
Si les résultats ne sont pas excellents, vous devrez peut-être revenir à l'étape 1-2 et apporter des modifications avec les images, les catégories et les paramètres de formation.
Il peut prendre aussi peu que 5 époques pour créer des visualisations qui ressemblent à vos données de formation à l'aide de la couche FC / Logits principale. Afin d'accélérer l'entraînement et de créer de meilleurs résultats, le modèle BVLC pré-entraîné utilisé est partiellement gelé afin de protéger les couches inférieures contre les changements.
Afin de former un modèle Deepdream personnalisé, vous devrez créer un ensemble de données composé d'images que vous souhaitez utiliser pour la formation. Il existe une variété de façons de pouvoir acquérir des images pour votre ensemble de données, et vous aurez besoin d'au moins quelques centaines d'images pour chaque catégorie / classe.
Deepdream est le plus souvent effectué avec des modèles de classification d'image formés sur des ensembles de données d'image composés de différentes catégories / classes. Les modèles de classification d'images tentent d'apprendre la différence entre différentes classes d'images et, ce faisant, les neurones acquièrent la capacité de créer des hallucinations de rêve. Les images que vous choisissez, les différences entre elles, les différences entre les classes choisies et le nombre d'images utilisées affecteront grandement les visualisations qui peuvent être produites.
Les ensembles de données d'image Pytorch doivent être structurés lorsque le répertoire principal / le dossier contient des sous-dossiers / répertoires pour chaque catégorie / classe. Ci-dessous, un exemple de la structure de l'ensemble de données requis est illustré:
dataset_dir
│
└───category1
│ │ image1.jpg
│ │ image2.jpg
│ │ image3.jpg
│
└───category2
│ image1.jpg
│ image2.jpg
│ image3.jpg
Une fois que vous avez créé votre ensemble de données dans le format approprié, assurez-vous de supprimer des images en double si vous ne l'avez pas déjà fait. Il existe une variété d'outils que vous pouvez utiliser pour cette tâche, y compris des logiciels gratuits et open source.
Si vous ne l'avez pas déjà fait, vous souhaiterez peut-être créer une copie de sauvegarde de votre ensemble de données.
Ensuite, vous devrez vérifier qu'aucune des images n'est corrompue de manière à empêcher Pytorch de les charger. Pour supprimer automatiquement toutes les images corrompues de votre ensemble de données, utilisez la commande suivante:
python data_tools/remove_bad.py -delete_bad -data_path <training_data>
Ensuite, vous voudrez probablement redimensionner votre ensemble de données pour être plus proche de la taille de l'image de formation afin d'accélérer l'entraînement. Le redimensionnement de votre ensemble de données ne vous empêchera pas de créer des images Deepdream plus grandes avec le modèle résultant. Le script de redimensionnement inclus ne modifiera que des images qui dépassent la taille de l'image spécifiée avec leur hauteur ou leur largeur.
Pour redimensionner les images de votre ensemble de données, utilisez la commande suivante:
python data_tools/resize_data.py -data_path <training_data> -max_size 500
Maintenant, avec votre ensemble de données nouvellement redimensionné, vous pouvez calculer la moyenne et l'écart type de votre ensemble de données pour une utilisation dans la formation et Deepdreaming. Assurez-vous de recalculer à nouveau la moyenne et l'écart type si vous modifiez l'ensemble de données en ajoutant ou en supprimant les images.
Pour calculer la moyenne et l'écart type de votre ensemble de données, utilisez la commande suivante et enregistrez la sortie pour l'étape suivante:
python data_tools/calc_ms.py -data_path <training_data>
Vous pouvez maintenant commencer à former votre modèle Deepdream en exécutant le script de formation Googlenet. Il est recommandé de sauver le modèle toutes les époques de 5 à 10 pour surveiller la qualité des visualisations.
Après avoir entraîné vos modèles, vous pouvez y ajouter une matrice de corrélation de couleur pour la décorrélation des couleurs avec la commande suivante:
python data_tools/calc_cm.py -data_path <training_data> -model_file <bvlc_out120>.pth
Commande de formation de base:
python train_googlenet.py -data_path <training_data> -balance_classes -batch_size 96 -data_mean <mean> -data_sd <sd>
Options d'entrée:
-data_path
: Chemin vers le répertoire / dossier de jeu de données que vous souhaitez utiliser.-data_mean
: Votre liste pré-calculée de valeurs moyennes pour votre ensemble de données choisi.-data_sd
: Votre liste pré-calculée des valeurs d'écart type pour votre ensemble de données choisi.Options de formation:
-num_epochs
: le nombre d'époques de formation à utiliser. La valeur par défaut est 120
.-batch_size
: le nombre d'images de formation et de validation à passer le réseau en même temps. La valeur par défaut est 32
.-learning_rate
: taux d'apprentissage à utiliser avec l'optimiseur Adam ou SGD. La valeur par défaut est 1e-2
.-optimizer
: l'algorithme d'optimisation à utiliser; sgd
ou adam
; La valeur par défaut est sgd
.-train_workers
: Combien de travailleurs utiliser pour la formation. La valeur par défaut est 0
.-val_workers
: Combien de travailleurs utiliser pour la validation. La valeur par défaut est 0
.-balance_classes
: l'activation de ce drapeau équilibrera la formation pour chaque classe en fonction de la taille de la classe.Options du modèle:
-model_file
: chemin vers le fichier du modèle .pth
à utiliser pour le modèle de départ. La valeur par défaut est le modèle BVLC Googlenet.-freeze_to
: quelle calque pour geler le modèle jusqu'à; L'un des none
, conv1
, conv2
, conv3
, mixed3a
, mixed3b
, mixed4a
, mixed4b
, mixed4c
, mixed4d
, mixed4e
, mixed5a
ou mixed5b
. La valeur par défaut est mixed3b
.-freeze_aux1_to
: qui superpose pour geler la première branche auxiliaire jusqu'à; L'un des none
, loss_conv
, loss_fc
ou loss_classifier
. La valeur par défaut n'est none
.-freeze_aux2_to
: qui superpose pour geler la deuxième branche auxiliaire jusqu'à; L'un des none
, loss_conv
, loss_fc
ou loss_classifier
. La valeur par défaut n'est none
.-delete_branches
: Si ce drapeau est activé, aucune branche auxiliaire ne sera utilisée dans le modèle.Options de sortie:
-save_epoch
: Enregistrez le modèle toutes les époques save_epoch
. La valeur par défaut est 10
. Réglé sur 0
pour désactiver la sauvegarde des modèles intermédiaires.-output_name
: nom du modèle de sortie. La valeur par défaut est bvlc_out.pth
.-individual_acc
: l'activation de ce drapeau imprimera la précision individuelle de chaque classe.-save_csv
: l'activation de ce drapeau enregistrera les données de perte et de précision dans les fichiers txt.-csv_dir
: où enregistrer les fichiers CSV. La valeur par défaut est définie sur le répertoire de travail actuel.Autres options:
-use_device
: ID indexé zéro du GPU à utiliser plus cuda:
. La valeur par défaut est cuda:0
.-seed
: une valeur entière que vous pouvez spécifier pour des résultats reproductibles. Par défaut, cette valeur est aléatoire pour chaque exécution.Options d'ensemble de données:
-val_percent
: le pourcentage d'images de chaque classe à utiliser pour la validation. La valeur par défaut est 0.2
.Après avoir entraîné un nouveau modèle Deepdream, vous devrez tester ses visualisations. Les meilleures visualisations se trouvent dans la couche FC principale également connue sous le nom de couche «Logits». Ce script vous aide à visualiser rapidement et facilement tous les canaux d'une couche spécifiés dans un modèle particulier pour une époque de modèle particulier, en générant une image distincte pour chaque canal.
Options d'entrée:
-model_file
: chemin vers le modèle Googlenet pré-entraîné que vous souhaitez utiliser.-learning_rate
: Taux d'apprentissage à utiliser avec l'optimiseur Adam ou L-BFGS. La valeur par défaut est 1.5
.-optimizer
: l'algorithme d'optimisation à utiliser; Soit lbfgs
ou adam
; La valeur par défaut est adam
.-num_iterations
: la valeur par défaut est 500
.-layer
: la couche spécifique que vous souhaitez utiliser. La valeur par défaut est définie sur fc
.-extract_neuron
: Si ce drapeau est activé, le neurone central sera extrait de chaque canal.-image_size
: une liste séparée par des virgules de <height>,<width>
à utiliser pour l'image de sortie. La valeur par défaut est définie sur 224,224
.-jitter
: la quantité de gigue d'image à utiliser pour le prétraitement. La valeur par défaut est 16
.-fft_decorrelation
: si vous utilisez ou non une décorrélation spatiale FFT. S'il est activé, un taux d'apprentissage inférieur doit être utilisé.-color_decorrelation
: si vous utilisez ou non la décorrélation des couleurs. Fournir éventuellement une liste de valeurs séparées par des virgules pour la matrice de corrélation des couleurs. Si aucune valeur n'est fournie, une tentative de chargement une matrice de corrélation de couleur à partir du fichier de modèle sera faite avant de défaut à la matrice de corrélation de couleur ImageNet.-random_scale
: s'il faut utiliser ou non une mise à l'échelle aléatoire. Fournissez éventuellement une liste séparée de virgules des valeurs pour les échelles à partir de sélection au hasard. Si aucune valeur n'est fournie, les échelles seront sélectionnées au hasard dans la liste suivante: 1, 0.975, 1.025, 0.95, 1.05
.-random_rotation
: s'il faut utiliser ou non des rotations aléatoires. Fournissez éventuellement une liste séparée par des virgules des valeurs de degré pour que les rotations soient sélectionnées au hasard ou une seule valeur à utiliser pour sélectionner au hasard des degrés à partir de [-value, value]
. Si aucune valeur n'est fournie, une plage de [-5, 5]
sera utilisée.-padding
: la quantité de rembourrage à utiliser avant l'échelle aléatoire et les rotations aléatoires pour empêcher les artefacts de bord. Le rembourrage est ensuite supprimé après les transformations. La valeur par défaut est définie sur 0
pour le désactiver.Options de traitement:
-batch_size
: combien d'images de visualisation de canaux à créer dans chaque lot. La valeur par défaut est 10
.-start_channel
: Quel canal pour commencer à créer des images de visualisation à. La valeur par défaut est 0
.-end_channel
: quel canal arrêter de créer des images de visualisation à. La valeur par défaut est définie sur -1
pour tous les canaux.Seulement requis si le modèle ne les contienne pas, options :
-model_epoch
: L'époque de formation dont le modèle a été enregistré, à utiliser pour les noms d'image de sortie. La valeur par défaut est 120
.-data_mean
: Votre liste pré-calculée de valeurs moyennes qui a été utilisée pour former le modèle, s'ils n'ont pas été enregistrés à l'intérieur du modèle.-num_classes
: le nombre de classes sur lesquelles le modèle a été formé. La valeur par défaut est 120
.Options de sortie :
-output_dir
: où enregistrer les images de sortie. La valeur par défaut est définie sur le répertoire de travail actuel.-print_iter
: imprimer progresser chaque print_iter
itérations. Réglé sur 0
pour désactiver l'impression.-save_iter
: Enregistrez les images toutes les itérations save_iter
. La valeur par défaut est de 0
pour désactiver la sauvegarde des résultats intermédiaires.Autres options:
-use_device
: ID indexé zéro du GPU à utiliser plus cuda:
. La valeur par défaut est cuda:0
.-seed
: une valeur entière que vous pouvez spécifier pour des résultats reproductibles. Par défaut, cette valeur est aléatoire pour chaque exécution.Visualisation de la couche FC (Logits) de base:
python vis_multi.py -model_file <bvlc_out120>.pth
Visualisation de la couche FC (Logits) avancée:
python vis_multi.py -model_file <bvlc_out120>.pth -layer fc -color_decorrelation -fft_decorrelation -random_scale -random_rotation -lr 0.4 -output_dir <output_dir> -padding 16 -jitter 16,8
Ce script vous permet de créer des hallucinations Deepdream avec des modèles Googlenet formés.
Options d'entrée:
-model_file
: chemin vers le modèle Googlenet pré-entraîné que vous souhaitez utiliser.-learning_rate
: Taux d'apprentissage à utiliser avec l'optimiseur Adam ou L-BFGS. La valeur par défaut est 1.5
.-optimizer
: l'algorithme d'optimisation à utiliser; Soit lbfgs
ou adam
; La valeur par défaut est adam
.-num_iterations
: la valeur par défaut est 500
.-content_image
: chemin vers votre image d'entrée. Si aucune image d'entrée n'est spécifiée, un bruit aléatoire est utilisé à la place.-layer
: la couche spécifique que vous souhaitez utiliser. La valeur par défaut est définie sur mixed5a
.-channel
: le canal de couche spécifique que vous souhaitez utiliser. La valeur par défaut est définie sur -1
pour désactiver la sélection spécifique des canaux.-extract_neuron
: Si ce drapeau est activé, le neurone central sera extrait du canal sélectionné par le paramètre -channel
.-image_size
: une liste séparée par des virgules de <height>,<width>
à utiliser pour l'image de sortie. Si une seule valeur pour une longueur latérale maximale est fournie avec une image de contenu, la longueur latérale minimale sera calculée automatiquement. La valeur par défaut est définie sur 224,224
.-jitter
: la quantité de gigue d'image à utiliser pour le prétraitement. La valeur par défaut est 16
.-fft_decorrelation
: si vous utilisez ou non une décorrélation spatiale FFT. S'il est activé, un taux d'apprentissage inférieur doit être utilisé.-color_decorrelation
: si vous utilisez ou non la décorrélation des couleurs. Fournir éventuellement une liste de valeurs séparées par des virgules pour la matrice de corrélation des couleurs. Si aucune valeur n'est fournie, une tentative de chargement une matrice de corrélation de couleur à partir du fichier de modèle sera faite avant de défaut à la matrice de corrélation de couleur ImageNet.-random_scale
: s'il faut utiliser ou non une mise à l'échelle aléatoire. Fournissez éventuellement une liste séparée de virgules des valeurs pour les échelles à partir de sélection au hasard. Si aucune valeur n'est fournie, les échelles seront sélectionnées au hasard dans la liste suivante: 1, 0.975, 1.025, 0.95, 1.05
.-random_rotation
: s'il faut utiliser ou non des rotations aléatoires. Fournissez éventuellement une liste séparée par des virgules des valeurs de degré pour que les rotations soient sélectionnées au hasard ou une seule valeur à utiliser pour sélectionner au hasard des degrés à partir de [-value, value]
. Si aucune valeur n'est fournie, une plage de [-5, 5]
sera utilisée.-padding
: la quantité de rembourrage à utiliser avant l'échelle aléatoire et les rotations aléatoires pour empêcher les artefacts de bord. Le rembourrage est ensuite supprimé après les transformations. La valeur par défaut est définie sur 0
pour le désactiver.-layer_vis
: Que ce soit pour utiliser DeepDream ou une visualisation de direction lorsque vous ne visualisez pas des canaux de couche spécifiques. Un de deepdream
ou direction
; La valeur par défaut est deepdream
.Seulement requis si le modèle ne les contienne pas, options :
-data_mean
: Votre liste pré-calculée de valeurs moyennes qui a été utilisée pour former le modèle, s'ils n'ont pas été enregistrés à l'intérieur du modèle.-num_classes
: le nombre de classes sur lesquelles le modèle a été formé, s'il n'était pas enregistré à l'intérieur du modèle.Options de sortie :
-output_image
: nom de l'image de sortie. La valeur par défaut est out.png
.-print_iter
: imprimer progresser chaque print_iter
itérations. Réglé sur 0
pour désactiver l'impression.-save_iter
: Enregistrez les images toutes les itérations save_iter
. La valeur par défaut est de 0
pour désactiver la sauvegarde des résultats intermédiaires.Options de carrelage:
-tile_size
: La taille des carreaux souhaitée à utiliser. Soit une liste séparée par des virgules de <height>,<width>
ou une seule valeur à utiliser pour la hauteur et la largeur des carreaux. La valeur par défaut est définie sur 0
pour désactiver le carrelage.-tile_overlap
: Le pourcentage de chevauchement à utiliser pour les carreaux. La valeur par défaut est 25
pour 25% de chevauchement. Les pourcentages de chevauchement supérieurs à 50% entraîneront des problèmes.-tile_iter
: la valeur par défaut est 50
.Autres options:
-use_device
: ID indexé zéro du GPU à utiliser plus cuda:
. La valeur par défaut est cuda:0
.-seed
: une valeur entière que vous pouvez spécifier pour des résultats reproductibles. Par défaut, cette valeur est aléatoire pour chaque exécution.Deepdream de base:
python vis.py -model_file <bvlc_out120>.pth -layer mixed5a
Deepdream avancé:
python vis.py -model_file <bvlc_out120>.pth -layer mixed5a/conv_5x5_relu -channel 9 -color_decorrelation -fft_decorrelation -random_scale -random_rotation -lr 0.4 -padding 16 -jitter 16,8
Voir ici pour plus d'informations sur tous les scripts / outils inclus relatifs à la création, au nettoyage et à la préparation des ensembles de données.