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.
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à.
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)».
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)
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)
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)
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.
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)
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é.
Recommended Posts