[PYTHON] Reconnaissance d'image des fruits avec VGG16

1. 1. Contexte

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.

2. Qu'est-ce que VGG16 en premier lieu? : en pensant:

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)

3. 3. Introduction de VGG16 (en utilisant Google Colab)

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()
model.summary () result
Model: "vgg16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_3 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ predictions (Dense) (None, 1000) 4097000 ================================================================= Total params: 138,357,544 Trainable params: 138,357,544 Non-trainable params: 0 _________________________________________________________________

L'image utilisée cette fois évalue des pommes (Orin). apple_orin.jpg

  #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.

4. résultat

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 commodity-granny-smith.jpg

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é.

5. Considération

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)

Détails

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

Reconnaissance d'image des fruits avec VGG16
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Application de la reconnaissance d'image CNN2
Capture d'image de Firefox en utilisant Python
Jugement de l'image rétroéclairée avec OpenCV
Reconnaissance d'image
Estimation de catégorie à l'aide de l'API de reconnaissance d'image de docomo
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Image de fermeture
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
Comment coder un drone en utilisant la reconnaissance d'image
Programme de reconnaissance Nogizaka (utilisant Yolov5) Table des matières
Reconnaissance d'accords à l'aide du chromagramme de la bibliothèque de python librosa
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
Principes de base de la technologie de reconnaissance d'image (pour les débutants)
J'ai essayé d'utiliser le filtre d'image d'OpenCV
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Reconnaissance d'image avec keras
Tutoriel Pepper (7): Reconnaissance d'image
Segmentation d'image à l'aide de U-net
Principes de base de la reconnaissance d'image CNN 1
Exemple d'utilisation de lambda
Implémentation de VGG16 à l'aide de Keras créé sans utiliser de modèle entraîné
Détermination des maladies des arbres par reconnaissance d'image à l'aide de CNTK et SVM
Collectez un grand nombre d'images à l'aide de l'API de recherche d'images de Bing
Reconnaissance d'image avec API à partir de zéro connaissance avec AutoML Vision
Juger la victoire ou la défaite de Shadova par reconnaissance d'image
Classifier les ensembles de données d'image CIFAR-10 à l'aide de divers modèles d'apprentissage en profondeur
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
[PyTorch] Classification des images du CIFAR-10
Implémentation de TF-IDF à l'aide de gensim
Essayez d'utiliser l'image Docker de Jupyter
Reconnaissance de l'âge à l'aide de l'API de Pepper
Reconnaissance d'image par apprentissage profond 1 théorie
J'ai essayé la reconnaissance faciale avec Face ++
python: principes de base de l'utilisation de scikit-learn ①
Reconnaissance d'image des déchets avec Edge (Raspberry Pi) à partir de zéro connaissance en utilisant AutoML Vsion et TPU
Introduction de caffe en utilisant pyenv
Reconnaissance d'image avec Keras + OpenCV
Un mémorandum d'utilisation de eigen3
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Essai de la reconnaissance vocale à l'aide d'Azure avec Python (entrée depuis le microphone)
Une histoire qui prend en charge la notation électronique des examens avec reconnaissance d'image
Implémentation de l'action de sélecteur Datetime à l'aide de line-bot-sdk-python et exemple d'implémentation du carrousel d'images