[PYTHON] J'ai créé un code pour convertir illustration2vec en modèle Keras

Aperçu

https://github.com/rezoo/illustration2vec illustration2vec est un modèle capable de détecter les caractéristiques et les balises des illustrations. La structure du modèle est presque un modèle VGG. Il y a quelques changements par rapport au VGG original, donc pour plus de détails, voir le document de commentaires au lien ci-dessus. C'est un modèle de café et de chainer. C'est un modèle intéressant, mais le chainer semble être un développement terminé, donc je voulais vraiment le réutiliser et j'ai écrit un code de conversion en keras. Je n'ai jamais utilisé de torche, alors allons-y.

L'exécution a été faite avec google colaboratory, donc lien ci-dessous. https://colab.research.google.com/drive/1UZN7pn4UzU5s501dwSIA2IHGmjnAmouY

Si vous ne pouvez pas ouvrir le lien, copiez ce qui suit dans colab et cela fonctionnera. <détails>

Tous les codes </ summary>

!git clone https://github.com/rezoo/illustration2vec.git
!sh illustration2vec/get_models.sh
!pip install -r /content/illustration2vec/requirements.txt
!mv /content/illustration2vec/i2v /content/
import i2v
illust2vec_tag = i2v.make_i2v_with_chainer('/content/illustration2vec/illust2vec_tag_ver200.caffemodel', '/content/illustration2vec/tag_list.json')
%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

#tag estimater model
model_tag = tf.keras.Sequential(name='illustration2vec_tag')
model_tag.add(tf.keras.layers.Input(shape=(224, 224, 3)))
pool_idx = [0, 1, 3, 5, 7]
for i, chainer_layer in enumerate(illust2vec_tag.net.children()):
    kernel, bias = tuple(chainer_layer.params())
    k_kernel = np.transpose(kernel.data, axes=[3, 2, 1, 0])
    bias = bias.data
    if i == 0:
        k_kernel = k_kernel[:,:,::-1,:]
    channel = bias.shape[0]
    keras_layer = tf.keras.layers.Conv2D(channel, 3, padding='SAME', activation='relu', kernel_initializer=tf.keras.initializers.constant(k_kernel), bias_initializer=tf.keras.initializers.constant(bias), name='Conv_%d'%i)
    model_tag.add(keras_layer)
    if i in pool_idx:
        model_tag.add(tf.keras.layers.MaxPooling2D())
    del kernel, bias
model_tag.add(tf.keras.layers.AveragePooling2D(pool_size=(7, 7)))
model_tag.add(tf.keras.layers.Lambda(lambda x : tf.nn.sigmoid(tf.squeeze(x, axis=[1, 2])), name='sigmoid'))
model_tag.save('illust2vec_tag_ver200.h5')
del model_tag, illust2vec_tag

#feature vector model
illust2vec = i2v.make_i2v_with_chainer('/content/illustration2vec/illust2vec_ver200.caffemodel')
model = tf.keras.Sequential(name='illustration2vec')
model.add(tf.keras.layers.Input(shape=(224, 224, 3)))
pool_idx = [0, 1, 3, 5, 7]
for i, chainer_layer in enumerate(illust2vec.net.children()):
    if i == 12:
        break
    kernel, bias = tuple(chainer_layer.params())
    if len(kernel.data.shape) == 4:
        k_kernel = np.transpose(kernel.data, axes=[3, 2, 1, 0])
        bias = bias.data
        if i == 0:
            k_kernel = k_kernel[:,:,::-1,:]
        channel = bias.shape[0]
        keras_layer = tf.keras.layers.Conv2D(channel, 3, padding='SAME', activation='relu', kernel_initializer=tf.keras.initializers.constant(k_kernel), bias_initializer=tf.keras.initializers.constant(bias), name='Conv_%d'%i)
        model.add(keras_layer)
        if i in pool_idx:
            model.add(tf.keras.layers.MaxPooling2D())
        elif i == 10:
            model.add(tf.keras.layers.Flatten())
    elif len(kernel.data.shape) == 2:
        model.add(tf.keras.layers.Dense(4096, kernel_initializer=tf.keras.initializers.constant(kernel.data), bias_initializer=tf.keras.initializers.constant(bias.data), name='encode1'))
    del kernel, bias
model.save('illust2vec_ver200.h5')
del model, illust2vec
def resize(imgs):
    mean = tf.constant(np.array([181.13838569, 167.47864617, 164.76139251]).reshape((1, 1, 3)), dtype=tf.float32)
    resized = []
    for img in imgs:
        img = tf.cast(img, tf.float32)
        im_max = tf.reduce_max(img, keepdims=True)
        im_min = tf.reduce_min(img, keepdims=True)
        im_std = (img - im_min) / (im_max - im_min + 1e-10)
        resized_std = tf.image.resize(im_std, (224, 224))
        resized_im = resized_std*(im_max - im_min) + im_min
        resized_im = resized_im - mean
        resized.append(tf.expand_dims(resized_im, 0))
    return tf.concat(resized, 0)

Commentaire

Tout ce que nous faisons est simplement de définir un modèle avec la même structure dans les keras et de l'initialiser avec le poids du modèle de chaînage. Il y a trois changements comme suit. ・ Transposition du poids Le noyau de convolution de ce modèle de chainer est (out_channel, in_channel, k_size, k_size), mais il a été transposé en (k_size, k_size, in_channel, out_channel) pour le modèle keras. -Change l'image d'entrée de BGR à RVB Dans le modèle d'origine, l'image d'entrée est BGR, mais je l'ai changée en entrée RVB. Par conséquent, le noyau convolutif de la première couche est inversé sur l'axe de in_channel. -Change l'image d'entrée en channel_last La convolution de chaînage a une entrée de (N, C, H, W), mais est la valeur par défaut de keras (N, H, W, C).

L'entrée du modèle converti est la taille de (lot, 224, 224, 3). Si vous passez la liste de numpy.array de l'image au lien colab ci-dessus ou à la fonction de redimensionnement dans tout le code, il sera redimensionné + normalisé. Il existe deux modèles, illust2vec_tag_ver200.h5 et illust2vec_ver200.h5, mais la première sortie est la tag_list sur https://github.com/rezoo/illustration2vec. Il s'agit de la probabilité de chacune des 1539 balises dans .json. La sortie du deuxième modèle est un vecteur caractéristique de l'image.

Veuillez signaler toute lacune.

Recommended Posts

J'ai créé un code pour convertir illustration2vec en modèle Keras
J'ai créé un outil pour convertir Jupyter py en ipynb avec VS Code
J'ai fait une fonction pour vérifier le modèle de DCGAN
J'ai fait un script pour afficher des pictogrammes
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
J'ai créé un outil CLI pour convertir les images de chaque répertoire en PDF
J'ai créé un réseau pour convertir des images noir et blanc en images couleur (pix2pix)
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
Je souhaite créer facilement un modèle de bruit
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
〇✕ J'ai fait un jeu
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai fait une commande pour marquer le clip de la table
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
J'ai fait un texte Python
J'ai fait un robot discord
Convertir le code python 3.x en python 2.x
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai fait une boîte pour me reposer avant que Pepper ne se fatigue
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
[Titan Craft] J'ai créé un outil pour invoquer un géant sur Minecraft
J'ai essayé d'écrire dans un modèle de langage profondément appris
Je vous ai fait exécuter des commandes depuis un navigateur WEB
J'ai fait un script pour dire bonjour à mon Koshien
J'ai créé un script en Python pour convertir un fichier texte pour JSON (pour l'extrait d'utilisateur vscode)
J'ai créé un site d'apprentissage C ++
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai essayé de transformer un fichier Python en un EXE (erreur de récursivité prise en charge)
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
Convertir un PDF A4 en A3 toutes les 2 pages
J'ai fait un wikipedia gacha bot
Python> J'ai créé un code de test pour mon propre fichier externe
J'ai créé un serveur Web avec Razpai pour regarder des anime
Je voulais convertir ma photo de visage en un style Yuyu.
Code qui génère un score au hasard
J'ai fait une loterie avec Python.
J'ai créé un script de traduction basé sur CUI
Comment convertir le modèle Tensorflow en Lite
Convertir une chaîne en image
Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
Outil pour convertir la configuration Juniper
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai créé un démon avec Python
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
J'ai créé un plugin pour générer une table Markdown à partir de csv avec Vim
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai fait un générateur de mot de passe pour enseigner Python3 aux enfants (bonus) * Complètement refait