[PYTHON] Chargez le modèle caffe avec Chainer et classez les images

Chargez le modèle caffe avec Chainer et classez les images. L'échantillon Chainer a également une classification d'image, mais je ne peux pas dire quelle image a été classée dans quelle catégorie simplement en affichant le taux de reconnaissance. Vous permet de sortir le nom de la catégorie et le score comme résultat de la classification. Vous pouvez trouver le code source à ici. (Une version classifiée du code dans cet article) Si vous avez du mal à lire l'article, veuillez le cloner.

Télécharger le modèle caffe

Cette fois, nous utiliserons bvlc_googlenet comme modèle. 1000 catégories peuvent être classées. Il y a un lien vers le fichier caffemodel sur la page bvlc_googlenet, alors téléchargez-le à partir de là.

Générer un fichier d'étiquette

Un fichier d'étiquette est généré afin que le numéro de catégorie du résultat de la classification et le nom de la catégorie puissent être liés. Vous trouverez ci-dessous un script pour télécharger les fichiers associés à imagenet. https://github.com/BVLC/caffe/blob/master/data/ilsvrc12/get_ilsvrc_aux.sh Un fichier d'étiquette est généré en traitant synset_words.txt inclus dans caffe_ilsvrc12.tar.gz décrit dans ceci.

synset_words.txt


n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri

Exécutez la commande suivante

wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz
tar -xf caffe_ilsvrc12.tar.gz
sed -e 's/^[^ ]* //g' synset_words.txt > labels.txt

Le fichier d'étiquette est créé.

labels.txt


tench, Tinca tinca
goldfish, Carassius auratus
great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
tiger shark, Galeocerdo cuvieri
hammerhead, hammerhead shark

Puisqu'il y a deux lignes appelées «grue», c'est déroutant, changez donc la 135e ligne en «grue (oiseau)» et la 518e ligne en «grue (machine)».

Convertir l'image en tableau numpy

Utilisez Pillow (https://pillow.readthedocs.org/en/3.0.x/) pour lire l'image, la redimensionner, la couper, puis la convertir en un tableau numpy

import numpy as np
from PIL import Image

#Définition de la taille de l'image d'entrée
image_shape = (224, 224)

#Lire l'image et convertir au format RVB
image = Image.open('sample.png').convert('RGB')

#Redimensionnement et découpage d'image
image_w, image_h = self.image_shape
w, h = image.size
if w > h:
    shape = (image_w * w / h, image_h)
else:
    shape = (image_w, image_h * h / w)
x = (shape[0] - image_w) / 2
y = (shape[1] - image_h) / 2
image = image.resize(shape)
image = image.crop((x, y, x + image_w, y + image_h))
pixels = np.asarray(image).astype(np.float32)

#les pixels sont en 3D et chaque axe est[Coordonnée Y,Coordonnée X, RGB]Représente
#Les données d'entrée sont de 4 dimensions[Index des images, BGR,Coordonnée Y,Coordonnée X]Alors, faites la conversion de tableau
#Convertir de RVB en BGR
pixels = pixels[:,:,::-1]

#Échangez les axes
pixels = pixels.transpose(2,0,1)

#Dessiner une image moyenne
mean_image = np.ndarray((3, 224, 224), dtype=np.float32)
mean_image[0] = 103.939
mean_image[1] = 116.779
mean_image[2] = 123.68
pixels -= self.mean_image

#Faites-en 4 dimensions
pixels = pixels.reshape((1,) + pixels.shape)

Charger caffemodel et classer

Chargez le caffemodel et utilisez le tableau que vous venez de générer comme données d'entrée.

import chainer
import chainer.functions as F
from chainer.functions import caffe

#Charger le modèle caffe
func = caffe.CaffeFunction('bvlc_googlenet.caffemodel')

#couche'loss3/classifier'Obtenez la sortie et appliquez softmax
x = chainer.Variable(pixels, volatile=True)
y, = func(inputs={'data': x}, outputs=['loss3/classifier'], disable=['loss1/ave_pool', 'loss2/ave_pool'], train=False)
prediction = F.softmax(y)

Sortir le résultat

Le résultat de la classification est sorti.

#Lisez l'étiquette
categories = np.loadtxt('labels.txt', str, delimiter="\n")

#Les scores et les étiquettes sont liés et triés par ordre décroissant de score
result = zip(prediction.data.reshape((prediction.data.size,)), categories)
result = sorted(result, reverse=True)

#Voir les 10 meilleurs résultats
for i, (score, label) in enumerate(result[:10]):
    print '{:>3d} {:>6.2f}% {}'.format(i + 1, score * 100, label)

Exemple de reconnaissance

Quand j'ai reconnu l'image du paysage prise à Asakusa, c'est devenu comme suit. La catégorie supérieure est la mosquée. J'aimerais que vous reconnaissiez les gratte-ciel et les tours, mais ils ne semblent pas faire partie de cette catégorie.

sample.png

  1  38.85% mosque
  2   6.07% fire engine, fire truck
  3   5.15% traffic light, traffic signal, stoplight
  4   3.97% radio, wireless
  5   3.25% cinema, movie theater, movie theatre, movie house, picture palace
  6   2.14% pier
  7   2.01% limousine, limo
  8   1.92% stage
  9   1.89% trolleybus, trolley coach, trackless trolley
 10   1.61% crane (machine)

À la fin

Il existe plusieurs modèles de café entraînés publiés, et n'importe qui peut les utiliser pour classer les images. Cette fois, une seule image a été saisie, mais il est possible de saisir plusieurs images en même temps. Le chargement du caffemodel prend du temps, il est donc préférable de charger l'image tout en gardant le caffemodel chargé.

référence

Sur un Mac sans CUDA, essayez d'importer un modèle Caffe à l'aide de Chainer pour la reconnaissance d'image

Recommended Posts

Chargez le modèle caffe avec Chainer et classez les images
Installez Caffe sur OSX 10.10 et classez les images par modèle de référence
Reconnaissance d'image avec le modèle Caffe Chainer Yo!
Apprentissage automatique avec des images de catégorie Caffe -1 à l'aide du modèle de référence
Charger une image gif avec Python + OpenCV
Seq2Seq (2) ~ Attention Model edition ~ avec chainer
Télécharger et télécharger des images avec Falcon
Apprenez à coloriser les images monochromes avec Chainer
Classez les visages d'anime avec l'apprentissage en profondeur avec Chainer
Capturer des images avec Pupil, python et OpenCV
Importer et exporter des images GeoTiff avec Python
Découpez et connectez des images avec ImageMagick
Implémenter un modèle avec état et comportement
Chargez CSV avec des pandas et jouez avec Index
Catégoriser les images de visage de personnages d'anime avec Chainer
Résolution du modèle Lorenz 96 avec Julia et Python
Chargez le fichier de modèle TensorFlow .pb avec readNetFromTensorflow ().
Conversion en ondelettes d'images avec PyWavelets et OpenCV
Seq2Seq (1) avec chainer
Procédure pour charger MNIST avec python et sortie en png
Afficher des images intégrées de mp3 et flac avec mutagène
[# 2] Créez Minecraft avec Python. ~ Dessin du modèle et implémentation du lecteur ~
Caffe Model Zoo pour les débutants [Classification selon l'âge et le sexe]
Créez un lot d'images et gonflez avec ImageDataGenerator
Conv en direction x et déconv en direction y avec chainer
Créer une visionneuse de modèle 3D avec PyQt5 et PyQtGraph
Chainer Tech Circle ML # 8 avec modèle récurrent de langage neuronal
Découvrez Wasserstein GAN avec le modèle Keras et l'optimisation TensorFlow