Grad-CAM в Android Studio: реализация тепловой карты для модели ИИ

    Визуализация решений нейросетей - важная задача для разработчиков мобильных приложений. Grad-CAM (Gradient-weighted Class Activation Mapping) позволяет понять, на какие участки изображения модель обращает внимание при классификации. Вопрос: можно ли реализовать аналог Grad-CAM в Android Studio, как в Python? Ответ - да, это возможно с помощью TensorFlow Lite и дополнительных библиотек. В этой статье мы разберём способы создания тепловых карт (heatmap) для оффлайн-приложений на Android.

    Что такое Grad-CAM и зачем он нужен на Android?

    Grad-CAM - это метод, который вычисляет градиенты последнего свёрточного слоя модели по отношению к целевому классу. Полученная карта активации (class activation map) накладывается на исходное изображение, показывая области, важные для предсказания. На Android это полезно для диагностики ошибок модели, повышения доверия пользователей и отладки в приложениях компьютерного зрения (например, медицинская диагностика или распознавание объектов).

    Как реализовать Grad-CAM в Android Studio?

    1. Использование TensorFlow Lite Interpreter

    Основной подход - экспорт модели (например, из Keras) в формат TensorFlow Lite (tflite) с сохранением всех слоёв, включая последний свёрточный. Загрузите модель через Interpreter и выполните прямой проход (forward pass). Затем получите градиенты с помощью обратного распространения (backpropagation). Для этого можно использовать Interpreter.runSignature или низкоуровневый API с пользовательскими операциями.

    2. Вычисление градиентов на устройстве

    В Android нет прямого аналога tf.GradientTape, но вы можете реализовать градиенты вручную, используя библиотеку TensorFlow Lite GPU Delegate или NN API. Альтернатива - выполнить все вычисления на сервере, но для оффлайн-режима нужно использовать OpenCV для обработки изображения и матричных операций (например, Core.gemm).

    3. Наложение тепловой карты

    После получения карты активации (размером, например, 7x7) интерполируйте её до размеров исходного изображения с помощью Imgproc.resize (OpenCV) или Bitmap.createScaledBitmap. Наложите карту как полупрозрачный слой в формате Jet colormap (от синего к красному). Библиотека OpenCV Android предоставляет функцию Imgproc.applyColorMap для преобразования градаций серого в цветную карту.

    Обходные пути и альтернативы

    Если реализация полного Grad-CAM кажется сложной, рассмотрите:

    • Self-Attention карты - если модель содержит механизм внимания (например, Vision Transformer), можно извлечь веса внимания напрямую.
    • Grad-CAM++ - улучшенная версия, которая даёт более точные карты для сложных сцен.
    • Score-CAM - не требует градиентов, использует взвешивание карт активации по изменению уверенности модели.
    • Готовые библиотеки: tflite-support (Task Vision API) не поддерживает Grad-CAM напрямую, но можно использовать mlkit от Google для базовой визуализации.

    Пошаговая инструкция для Android Studio

    1. Экспортируйте модель из Python: model.save('model.tflite') с указанием входных и выходных тензоров. 2. Добавьте зависимости в build.gradle: org.tensorflow:tensorflow-lite:2.13.0 и org.tensorflow:tensorflow-lite-gpu:2.13.0. 3. Загрузите модель: Interpreter tflite = new Interpreter(loadModelFile());. 4. Выполните прямой проход: tflite.run(input, output);. 5. Для градиентов используйте runSignature с пользовательской функцией потерь. 6. Обработайте карту через OpenCV: Imgproc.applyColorMap(grayMap, coloredMap, Imgproc.COLORMAP_JET);. 7. Наложите на исходный Bitmap через Canvas.drawBitmap с прозрачностью.

    Заключение

    Реализация Grad-CAM в Android Studio возможна, но требует ручного вычисления градиентов и интеграции с OpenCV. Для упрощения используйте предобученные модели с механизмом внимания или серверную обработку. Тепловые карты повышают интерпретируемость ИИ в оффлайн-приложениях, что особенно важно для медицинских и промышленных решений.

    Часто задаваемые вопросы