Узнайте, как применять Grad-CAM с помощью Keras и TensorFlow для объяснения классификаторов изображений на основе глубокого обучения.

Алгоритмы классического машинного обучения (ML) неэффективны по сравнению с алгоритмами глубокого обучения (DL) при применении к неструктурированным данным, таким как изображения и текст. Из-за преимущества автоматического извлечения признаков в DL по сравнению с ручным проектированием признаков в классическом ML алгоритмы DL более эффективны с точки зрения точности модели и, следовательно, более предпочтительны. Однако эти модели более сложны и менее интерпретируемы, чем классические модели машинного обучения. Таким образом, объяснимость всегда является проблемой для моделей DL неструктурированных данных, таких как изображения. Послойное распространение релевантности (LRP) — это один из подходов к объяснимости, который выделяет релевантную область изображений для объяснения прогнозов модели.

Если вы не очень хорошо знакомы с концепциями объяснимого ИИ (XAI), я настоятельно рекомендую посмотреть одну из моих прошлых сессий по XAI, представленную на AI Accelerator Festival APAC, 2021:

Вы также можете ознакомиться с моей книгой Прикладные методы объяснимости машинного обучения и заглянуть в репозиторий кода, чтобы получить практическое представление о других методах XAI.



Если вы хотите получить подробный отзыв о книге, вам может быть полезно это видео:

В этой статье я буду ссылаться на практическое применение одного из популярных методов LRP под названием Grad-CAM для объяснения классификаторов изображений. Я также представлю пошаговое руководство по коду для применения Grad-CAM с использованием Keras и TensorFlow.

Теперь давайте начнем!

Краткое введение в LRP

Для объяснения моделей DL LRP является одним из наиболее известных подходов. Интуитивно говоря, этот метод использует веса в сети и нейронные активации прямого прохода для распространения выходных данных обратно на входной слой через различные слои в сети. Таким образом, с помощью сетевых весов мы можем визуализировать элементы данных (пиксели в случае изображений и слова в случае текстовых данных), которые больше всего повлияли на окончательный результат модели. Вклад этих элементов данных является качественной мерой релевантности, которая распространяется по уровням сети. Более того, для глубоких нейронных сетей с несколькими слоями обучение происходит, когда поток информации через процесс градиентного потока между слоями поддерживается согласованным. Итак, чтобы объяснить любую модель глубокого обучения, метод LRP позволяет нам визуализировать активированные или наиболее важные элементы данных на разных уровнях сети и качественно проверить функционирование алгоритма.



Что такое Град-САМ?

Карты активации классов (CAM) — это методы визуализации, используемые для объяснения моделей глубокого обучения. В этом методе спрогнозированные моделью оценки классов отслеживаются до последнего слоя свертки, чтобы выделить отличительные области интереса в изображении, которые являются специфическими для класса и даже не являются общими для других алгоритмов компьютерного зрения или обработки изображений. Gradient CAM, также известный как Grad-CAMs, сочетает в себе эффект управляемого обратного распространения и CAM для выделения областей интереса, различающихся по классам, без выделения важности отдельных пикселей. Но Grad-CAM можно применять к любой архитектуре CNN, в отличие от CAM, который можно применять к архитектурам, выполняющим глобальное усреднение по выходным картам объектов, поступающим из слоя свертки, непосредственно перед слоем прогнозирования. Чтобы получить более подробное представление о процессе Grad-CAM, вы можете ознакомиться с исследовательской статьей Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization, Ramprasaath et. al — https://arxiv.org/abs/1610.02391.

Применение Grad-CAM с использованием Keras и TensorFlow

Теперь самое интересное в этой статье: научиться применять Grad-CAM! Мы будем использовать Keras и TensorFlow для применения Grad-CAM для объяснения предварительно обученных классификаторов изображений. Вам понадобятся следующие фреймворки Python для применения Grad-CAM, которые можно установить с помощью установщика Python pip:

!pip install --upgrade numpy matplotlib tensorflow

Начнем с загрузки необходимых модулей в Python. Я бы порекомендовал использовать локальные блокноты Jupyter или Google Colab для запуска этого руководства по коду.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as c_map
from IPython.display import Image, display
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.applications.xception import Xception, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import os

Мы будем использовать платформу TensorFlow и Keras, чтобы получить предварительно обученную сеть на наборе данных ImageNet и протестировать подход на образце открытого изображения, полученного из источника: https://images.unsplash.com/photo- 1615963244664-5b845b2025ee?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=464&q=80. Для получения дополнительных примеров использования Keras и TensorFlow посетите: https://keras.io/examples/.

model_builder = Xception
preprocess_input = preprocess_input
decode_predictions = decode_predictions
IMG_SIZE = (299, 299)
last_conv_layer = "block14_sepconv2_act"
# The local path to our target image
image_path = keras.utils.get_file(
    "tiger.jpg", "https://images.unsplash.com/photo-1615963244664-5b845b2025ee?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=464&q=80"
)

display(Image(image_path))

После загрузки изображения вам нужно будет применить слой предварительной обработки. Поскольку мы будем использовать предварительно обученную модель Xception от Keras и TensorFlow, нам нужно будет применить ту же предварительную обработку.

def vectorize_image(img_path, size):
    '''
    Vectorize the given image to get a numpy array
    '''
    img = image.load_img(img_path, target_size=size)
    array = image.img_to_array(img)
    array = np.expand_dims(array, axis=0) # Adding dimension to convert array into a batch of size (1,299,299,3)
    return array

Теперь давайте применим предварительно обученную модель к нашему предварительно обработанному изображению и посмотрим на прогноз.

vectorized_image = preprocess_input(vectorize_image(image_path, size=IMG_SIZE))
model = model_builder(weights="imagenet")
model.layers[-1].activation = None # Removing the last layer as it is the softmax layer used for classification

model_prediction = model.predict(vectorized_image)
print(f"The predicted class is : {decode_predictions(model_prediction, top=1)[0][0][1]}")

Это вывод, который мы получаем:

The predicted class is : tiger

Итак, наша модель правильно предсказала наше исходное изображение как тигра. Теперь давайте разберемся в обосновании прогноза с использованием Grad-CAM.

Создание тепловой карты Grad-CAM

Мы создадим визуализатор тепловой карты Grad-CAM, чтобы выделить важные суперпиксели модели.

def get_heatmap(vectorized_image, model, last_conv_layer, pred_index=None):
    '''
    Function to visualize grad-cam heatmaps
    '''
    gradient_model = tf.keras.models.Model(
        [model.inputs], [model.get_layer(last_conv_layer).output, model.output]
    )

    # Gradient Computations
    with tf.GradientTape() as tape:
        last_conv_layer_output, preds = gradient_model(vectorized_image)
        if pred_index is None:
            pred_index = tf.argmax(preds[0])
        class_channel = preds[:, pred_index]

    grads = tape.gradient(class_channel, last_conv_layer_output)
    pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
    last_conv_layer_output = last_conv_layer_output[0]
    heatmap = last_conv_layer_output @ pooled_grads[..., tf.newaxis]
    heatmap = tf.squeeze(heatmap)
    heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap) # Normalize the heatmap
    return heatmap.numpy()

plt.matshow(get_heatmap(vectorized_image, model, last_conv_layer))
plt.show()

Когда мы применяем тепловую карту к 4-му сверточному слою нашей предварительно обученной модели, мы получаем выходное изображение тепловой карты:

Но это ничего нам не говорит, если мы не наложим это изображение на наше исходное изображение. Итак, давайте посмотрим, как это сделать, используя следующий фрагмент кода:

def superimpose_gradcam(img_path, heatmap, output_path="grad_cam_image.jpg", alpha=0.4):
    '''
    Superimpose Grad-CAM Heatmap on image
    '''
    img = image.load_img(img_path)
    img = image.img_to_array(img)

    heatmap = np.uint8(255 * heatmap) # Back scaling to 0-255 from 0 - 1
    jet = c_map.get_cmap("jet") # Colorizing heatmap
    jet_colors = jet(np.arange(256))[:, :3] # Using RGB values
    jet_heatmap = jet_colors[heatmap]
    jet_heatmap = image.array_to_img(jet_heatmap)
    jet_heatmap = jet_heatmap.resize((img.shape[1], img.shape[0]))
    jet_heatmap = image.img_to_array(jet_heatmap)

    
    superimposed_img = jet_heatmap * alpha + img # Superimposing the heatmap on original image
    superimposed_img = image.array_to_img(superimposed_img)

    superimposed_img.save(output_path) # Saving the superimposed image
    display(Image(output_path)) # Displaying Grad-CAM Superimposed Image
    
superimpose_gradcam(image_path, get_heatmap(vectorized_image, model, last_conv_layer))

И, вуаля! Мы получаем следующее наложенное изображение тепловой карты эталонного изображения:

Было ли это слишком сложно для применения Grad-CAM? Точно нет! Keras и TensorFlow еще больше упрощают применение такой техники объяснимости для классификаторов изображений! Это очень мощный метод, который используется для объяснения работы сложных алгоритмов глубокого обучения с неструктурированными данными, такими как изображения. Хотя этот метод сложен для понимания новичками. Однако, как только вы освоите его, вы поймете, что это очень мощный метод, очень полезный для объяснимости модели.

Надеюсь, вам понравилась эта статья! Полный учебный блокнот доступен по адресу: https://github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/blob/main/Chapter02/Layerwise%20Propagation.ipynb. Я рекомендую прочитать эту книгу: Прикладные методы объяснимости машинного обучения и изучить репозиторий GitHub для получения дополнительных практических примеров кода.

Подпишитесь на меня в Medium и LinkedIn, чтобы узнать больше об объяснимом искусственном интеллекте и машинном обучении.



ДРУГИЕ СТАТЬИ АВТОРА, СВЯЗАННЫЕ С XAI ПО TDS:

  1. Объяснимое машинное обучение для моделей, обученных на текстовых данных: сочетание SHAP с моделями-трансформерами
  2. EUCA — эффективная структура XAI для приближения искусственного интеллекта к конечным пользователям
  3. Понимание работы SHAP и значений Шепли, используемых в объяснимом ИИ
  4. Как объяснить классификаторы изображений с помощью LIME


ССЫЛКА

  1. Примеры учебника Keras Tensorflow — https://keras.io/examples/
  2. Grad-CAM: Визуальные пояснения из Deep Networks через локализацию на основе градиента, Ramprasaath et. al https://arxiv.org/abs/1610.02391.
  3. Прикладные методы объяснимости машинного обучения
  4. Репозиторий GitHub из книги Прикладные методы объяснимости машинного обученияhttps://github.com/PacktPublishing/Applied-Machine-Learning-Explainability-Techniques/