[PYTHON] GradCAM avec 22 lignes de code. tf_explain peut être facile à utiliser, je le recommande!

Objectif

Il semble y avoir ** tf_explain **. Il semble que ** GradCAM ** y soit inclus en tant que module. En regardant le github qui l'utilise, ** GradCAM ** peut être exécuté avec seulement 22 lignes (avec des lignes vides). Je pense que c'est merveilleux J'ai essayé de le déplacer.

22 lignes de code

Vous pouvez trouver ce code sur github ci-dessous. https://github.com/sicara/tf-explain/blob/master/examples/core/grad_cam.py

Le code ci-dessous est tout, donc

python grad_cam_py.py

Cela fonctionne juste.

grad_cam.py


import tensorflow as tf

from tf_explain.core.grad_cam import GradCAM

IMAGE_PATH = "./cat.jpg "

if __name__ == "__main__":
    model = tf.keras.applications.vgg16.VGG16(weights="imagenet", include_top=True)

    img = tf.keras.preprocessing.image.load_img(IMAGE_PATH, target_size=(224, 224))
    img = tf.keras.preprocessing.image.img_to_array(img)

    model.summary()
    data = ([img], None)

    tabby_cat_class_index = 281
    explainer = GradCAM()
    # Compute GradCAM on VGG16
    grid = explainer.explain(
        data, model, class_index=tabby_cat_class_index, layer_name="block5_conv3"
    )
    explainer.save(grid, ".", "grad_cam.png ")

Résultat d'exécution

L'image du chat ("chat tigré" dedans) est tirée de wikipedia. https://en.wikipedia.org/wiki/Tabby_cat Ce type de chat semble être caractérisé par la lettre M autour des yeux au milieu du visage ~~ ** la lettre M sur le «front» *. ( "Il y a une lettre M pour qu'elle entoure les yeux au milieu du visage" (faux), mais elle n'est pas invisible pour M ...)

sample1

cat_sample1.jpg grad_cam_sample1.png

sample2

cat_sample2.jpg grad_cam_sample2.png

Commentaires sur les résultats

Le résultat de GradCAM semble être juste. (Pourtant, Le but de cet article est que tf_explain est facile à utiliser, donc Aucun commentaire sur la qualité de GradCAM lui-même. Au cas où, ** Si vous mettez trop de sentiments sur l'écran GradCAM, vous aurez l'impression que la bonne aventure du diseur de bonne aventure viendra à vous, alors je pense que vous devriez le regarder aussi froid que possible, ce qui est un aparté complet. **)

environnement

C'est Windows 10. Il n'y a pas de GPU. tensorflow 2.0.0 tf-explain 0.2.1

Le tf-describe ci-dessus n'est probablement pas inclus, donc installez-le en utilisant pip ou une autre méthode normale. ** En ce qui concerne tensorflow, je pense que 2.1.x est le dernier maintenant (2020/3/11), mais j'ai eu une terrible erreur. ** ** ** Je ne sais pas comment le guérir, j'ai une idée complète! Donc, quand je l'ai mis à 2.0.0, cela a fonctionné. ** **

Cette section est une section pour voir réellement la nature de CNN plutôt que de tf_explain (en dehors de cet article?)

cat2_2nd_224.jpggrad_cam_cat2_2nd_224.png

cat2_3rd_224.jpggrad_cam_cat2_3rd_224.png

cat2_4th_224.jpggrad_cam_cat2_4th_224.png

cat2_5th_224.jpggrad_cam_cat2_5th_224.png

cat2_6th_224.jpggrad_cam_cat2_6th_224.png

Dans le cas de cet exemple Est-ce la plage d'environ 60x60 pixels qui capture les fonctionnalités en même temps? ⇒ Dans la dernière image, vous avez l'impression de réagir individuellement à chaque zone. De plus, il peut être plus précis d'afficher l'image et le point d'intérêt même en mode sans chevauchement (y a-t-il?). (Parce qu'il est difficile de comprendre s'il est affecté par la luminosité de l'image d'origine.) ⇒⇒ CNN est vulnérable à "plus d'images (images en haut)". ⇒⇒⇒ Je suis impressionné quand un modèle qui poursuit la configuration globale et montre un écran qui semble être saisi par GradCAM apparaît. .. .. (Qu'elle puisse être exprimée par GradCAM est une autre histoire ... Hormis le fait qu'elle ne peut pas être exprimée par GradCAM, je pense que ce serait génial si un tel modèle sortait. Système de capsule etc. S'il y a un modèle qui apparaît. )

Lié à la section ci-dessus (donc, à part). CNN est "faible à penché (faible à zoomer vers le haut)".

Nous avons également ajouté des diagrammes pour vous aider à mieux comprendre l'objectif de GradCAM. J'ai également ajouté la probabilité.

cat2_2nd_224.jpggrad_cam_cat2_2nd_224.pnggrad_cam_cat2_2nd_224ex.png

[[('n02123045', 'tabby', 0.40362296),
  ('n02124075', 'Egyptian_cat', 0.34350035),
  ('n02123159', 'tiger_cat', 0.1646882),
  ('n02747177', 'ashcan', 0.022324266),
  ('n02127052', 'lynx', 0.009675921),
  ('n03223299', 'doormat', 0.008641529),
  ('n02123394', 'Persian_cat', 0.00528028),
  ('n02909870', 'bucket', 0.0034843169),
  ('n04040759', 'radiator', 0.0028082374),
  ('n03958227', 'plastic_bag', 0.002630277),
  ('n04265275', 'space_heater', 0.002209679),
  ('n04493381', 'tub', 0.0015652123),
  ('n04049303', 'rain_barrel', 0.001464855),
  ('n04553703', 'washbasin', 0.0014180988),
  ('n04589890', 'window_screen', 0.0012623073),
  ('n03887697', 'paper_towel', 0.0012330494),
  ('n04522168', 'vase', 0.0012083148),
  ('n02123597', 'Siamese_cat', 0.0010707852),
  ('n03950228', 'pitcher', 0.0010204213),
  ('n03255030', 'dumbbell', 0.00096622825)]]

cat2_6th_224.jpggrad_cam_cat2_6th_224.pnggrad_cam_cat2_6th_224ex.png

[[('n03958227', 'plastic_bag', 0.23590706),
  ('n04209133', 'shower_cap', 0.117050014),
  ('n02124075', 'Egyptian_cat', 0.068308175),
  ('n01968897', 'chambered_nautilus', 0.052455623),
  ('n03825788', 'nipple', 0.042889122),
  ('n02123597', 'Siamese_cat', 0.040462725),
  ('n02120079', 'Arctic_fox', 0.02897999),
  ('n03868863', 'oxygen_mask', 0.018255476),
  ('n04370456', 'sweatshirt', 0.018049669),
  ('n02123045', 'tabby', 0.017420992),
  ('n04525038', 'velvet', 0.01728542),
  ('n02123394', 'Persian_cat', 0.0140852835),
  ('n03534580', 'hoopskirt', 0.012244948),
  ('n03724870', 'mask', 0.0106809465),
  ('n03045698', 'cloak', 0.007704126),
  ('n02120505', 'grey_fox', 0.0072637224),
  ('n02326432', 'hare', 0.006367313),
  ('n04127249', 'safety_pin', 0.006034479),
  ('n03887697', 'paper_towel', 0.0056772656),
  ('n04033995', 'quilt', 0.0056173983)]]

** tabby est environ 10e. .. .. ** ** ⇒ On peut dire que vous devriez le faire dans différentes tailles, mais je pense qu'il vaut mieux être un peu plus conscient de la composition, CNN. ** J'ai fait un échantillon en comprenant mal l'emplacement de la lettre M, qui est une caractéristique de tabby **, donc la lettre M, qui est importante, est en dehors de la zone de l'image. (En fait, il vaut mieux recommencer ... Je pense que c'est toujours inutile même si j'essaye à nouveau, donc je vais remettre ça un moment.)

Je me suis référé à ce qui suit pour obtenir le taux. https://medium.com/@gkadusumilli/image-recognition-using-pre-trained-xception-model-in-5-steps-96ac858f4206

Indique la source modifiée.

import tensorflow as tf

import numpy as np ##
import pprint ##

from tf_explain.core.grad_cam import GradCAM

from tensorflow.keras.applications.vgg16 import decode_predictions ##

IMAGE_PATH = "./cat2_2nd_224.jpg "

if __name__ == "__main__":
    model = tf.keras.applications.vgg16.VGG16(weights="imagenet", include_top=True)

    img = tf.keras.preprocessing.image.load_img(IMAGE_PATH, target_size=(224, 224))
    img = tf.keras.preprocessing.image.img_to_array(img)
    
    predictions=model.predict(np.array([img])) ##
    pprint.pprint(decode_predictions(predictions,top=20))##

    model.summary()
    data = ([img], None)

    tabby_cat_class_index = 281
    explainer = GradCAM()
    # Compute GradCAM on VGG16
    grid = explainer.explain(
        data, model, class_index=tabby_cat_class_index, layer_name="block5_conv3"
    )
    explainer.save(grid, ".", "grad_cam_cat2_2nd_224.png ")
    
    grid = explainer.explain( ##
        data, model, class_index=tabby_cat_class_index, layer_name="block5_conv3", image_weight=0.01 ##
    ) ##
    explainer.save(grid, ".", "grad_cam_cat2_2nd_224ex.png ") ##

Résumé

L'environnement évolue chaque jour (** tf_explain **). Si vous avez des commentaires, veuillez nous le faire savoir.

Recommended Posts

GradCAM avec 22 lignes de code. tf_explain peut être facile à utiliser, je le recommande!
Le son émis par M. Tick sur le lieu de travail est ... J'ai réussi à le faire avec le code
Comparaison des services informatiques GCP [Je souhaite l'utiliser sans serveur]
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
Utilisez Python de Java avec Jython. J'étais aussi accro.
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
Comment utiliser VS Code (serveur de code) avec Google Colab en seulement 3 lignes
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Je souhaite afficher uniquement différentes lignes du fichier texte avec diff
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
Facilitez la spécification de l'heure d'AWS CloudWatch Events avec CDK.
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
Je veux utiliser MATLAB feval avec python
J'ai essayé Flask avec des conteneurs distants de VS Code
Je veux être OREMO avec setParam!
Histoire d'essayer d'utiliser Tensorboard avec Pytorch
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
Je souhaite utiliser ip vrf avec SONiC
J'ai essayé de faciliter la modification du paramètre du proxy authentifié sur Jupyter
Je n'aime pas être frustré par la sortie de Pokemon Go, j'ai donc créé un script pour détecter la sortie et le tweeter
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de résumer comment utiliser matplotlib de python
Préparation à l'utilisation de Tensorflow (Anaconda) avec Visual Studio Code
[Introduction à WordCloud] Il est facile à utiliser même avec Jetson-nano ♬
Construction facile de code C ++ avec CMake sur Docker
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
L'utilisation du japonais pour les noms de dossier et les noms de bloc-notes dans Databricks peut poser problème