Lorsque j'ai essayé d'implémenter la reconnaissance d'image en utilisant Keras avec intérêt, c'était étonnamment facile, j'ai donc décidé d'utiliser VGG16 sur la recommandation d'un ami qui souhaite implémenter un modèle plus précis. Je suis débutant, je vais donc essayer d'en savoir plus. Cette fois, nous utiliserons l'image d'Obayashi de pommes pour évaluer si elle peut être appliquée aux variétés. Juste un mémo.
VGG16 est un modèle CNN à 16 couches formé sur un grand jeu de données d'image appelé "ImageNet". Il a été annoncé en 2014. C'est l'un des célèbres modèles formés utilisés dans diverses études. Les autres modèles formés avec ImageNet incluent AlexNet, GoogLeNet et ResNet. https://www.y-shinno.com/keras-vgg16/
Ce qui suit est une référence pour la comparaison avec AlexNet, GoogLeNet et ResNet ici.
(Source: http://thunders1028.hatenablog.com/entry/2017/11/01/035609)
Le réseau de l'équipe VGG de l'Université d'Oxford, qui est arrivée deuxième à l'ILSVRC 2014. Un CNN normal composé d'une couche de convolution et d'une couche de pooling, qui est une version plus profonde d'AlexNet, avec 16 ou 19 couches de poids (couche de convolution et couche entièrement connectée). Ils sont appelés respectivement VGG16 et VGG19.
Il présente une structure dans laquelle deux à quatre couches de pliage avec de petits filtres sont empilées successivement et la taille est divisée par deux avec une couche de mise en commun. Il semble que les caractéristiques puissent être mieux extraites en pliant plusieurs petits filtres (= approfondissement du calque) plutôt qu'en pliant l'image à la fois avec un grand filtre. (Je ne connais pas la raison, mais le nombre de fois où la fonction d'activation est passée augmente, donc l'expressivité augmente?) [2]
GoogleNet semble être plus fort, mais j'essaierai VGG en mettant l'accent sur la clarté. (Les choses qui semblent difficiles le seront à partir de la prochaine fois)
J'écrirai le code immédiatement. Tout d'abord, importation de Keras
vgg16_fluits.py
!pip install keras
Ensuite, importez les bibliothèques requises. VGG16 est inclus dans Keras. Le poids est spécifié dans la troisième ligne ci-dessous.
#Importez le modèle et affichez le résumé
import numpy as np
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
model = VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None)
model.summary()
L'image utilisée cette fois évalue des pommes (Orin).
#Lecture d'image
from PIL import Image
#import glob
url = '/content/drive/My Drive/Colab Notebooks/img'
files=url+"/apple_orin.jpg "
image =Image.open(files)
image=image.convert('RGB')
image=image.resize((224,224))
#Convertir l'image au format PIL lue en tableau
data = np.asarray(image)
#Évaluation
from keras.preprocessing import image
#Augmentez le nombre d'échantillons de un pour créer un tenseur à quatre dimensions
data = np.expand_dims(data, axis=0)
#Sortie top 5
preds = model.predict(preprocess_input(data))
results = decode_predictions(preds, top=5)[0]
for result in results:
print(result)
('n07742313', 'Granny_Smith', 0.9861995) ('n02948072', 'candle', 0.0040857443) ('n07747607', 'orange', 0.001778649) ('n03887697', 'paper_towel', 0.0016588464) ('n07693725', 'bagel', 0.0012920648)
C'est devenu.
Quelle est la 1ère place "Granny_Smith"?
Granny Smith est une variété de pomme cultivée. Développé en Australie en 1868 par des semis accidentels par Maria Ann Smith, à l'origine du nom
Cela dit, l'image elle-même est assez proche, il semble donc que la précision soit élevée. ImageNet peut ne pas avoir de données sur Wanglin.
Les informations d'ordre, d'étiquette et de nom de classe pour 1000 classes ImageNet sont résumées dans le fichier JSON suivant. Ci-dessous, Granny_Smith.
https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json
Puisqu'il est nécessaire d'apprendre séparément pour effectuer une reconnaissance d'image pour déterminer le type, nous le ferons à partir de la prochaine fois.
Cette fois, le but était de l'essayer, donc ça va.
À partir de la prochaine fois, nous créerons un modèle qui peut être appliqué à la variété.
Les points clés de l'utilisation du modèle VGG16 sont les suivants.
model = VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None)
argument | La description |
---|---|
include_top | S'il contient une couche entièrement connectée classée en 1000 classes. |
Vrai: Inclus (Cliquez ici pour utiliser pour la classification d'origine 1000) | |
Faux: non inclus (Cliquez ici pour personnaliser) | |
weights | Type de poids |
imagenet: poids appris avec ImageNet | |
Aucun: aléatoire | |
input_tensor | Utilisé lors de la saisie d'une image de modèle |
Toutes les données d'image: utilisez-les | |
Aucun: non utilisé | |
input_shape | Spécifiez la forme de l'image d'entrée |
N'importe quelle forme: utilisez-la | |
None:(224, 224, 3)Est utilisé |
Ajustez avec VGG16 pour l'extraction de fonctionnalités avec include_top défini sur False. (la prochaine fois)
Référence (ce que vous essayez de faire) http://aidiary.hatenablog.com/entry/20170131/1485864665
Recommended Posts