Осмыслите сетевые Предсказания с помощью окклюзии

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

Deep Learning Toolbox предоставляет occlusionSensitivity функция для вычисления карт чувствительности к окклюзии для глубоких нейронных сетей, которые принимают входы изображения. The occlusionSensitivity функция возмущает небольшие области входа путем замены его окклюдирующей маской, обычно серым квадратом. Маска перемещается через изображение, и изменение счета вероятности для данного класса измеряется как функция положения маски. Можно использовать этот метод, чтобы выделить, какие части изображения наиболее важны для классификации: когда эта часть изображения окклюдирована, счет вероятности для предсказанного класса резко упадет.

Загрузка предварительно обученной сети и изображения

Загрузите предварительно обученную сеть GoogLeNet, которая будет использоваться для классификации изображений.

net = googlenet;

Извлеките изображение входа размера и выхода классов сети.

inputSize = net.Layers(1).InputSize(1:2);
classes = net.Layers(end).Classes;

Загрузите изображение. Изображение - собака по имени Лайка. Измените размер изображения на размер входа сети.

imgLaikaGrass = imread("laika_grass.jpg");
imgLaikaGrass = imresize(imgLaikaGrass,inputSize);

Классифицируйте изображение и отобразите три класса с наивысшей классификационной оценкой в заголовке изображения.

[YPred,scores] = classify(net,imgLaikaGrass);
[~,topIdx] = maxk(scores, 3);
topScores = scores(topIdx);
topClasses = classes(topIdx);

imshow(imgLaikaGrass)
titleString = compose("%s (%.2f)",topClasses,topScores');
title(sprintf(join(titleString, "; ")));

Лайка - пудель-кокер-спаниель крест. Эта порода не является классом в GoogLeNet, поэтому у сети есть некоторые трудности с классификацией изображения. Сеть не очень уверена в своих предсказаниях - предсказанном классе miniature poodle имеет только счет 23%. Класс со следующим самым высоким счетом также является видом пуделя, который является разумной классификацией. Сеть также присваивает умеренную вероятность Tibetan terrier класс. Мы можем использовать окклюзию, чтобы понять, какие части изображения заставляют сеть предлагать эти три класса.

Идентифицируйте области изображения, которое сеть использует для классификации

Можно использовать окклюзию, чтобы выяснить, какие части изображения важны для классификации. Во-первых, посмотрите на предсказанный класс miniature poodle. Какие части изображения предполагают этот класс? Используйте функцию чувствительности к окклюзии, чтобы сопоставить изменение в классификационной оценке, когда части изображения окклюдированы.

map = occlusionSensitivity(net,imgLaikaGrass,YPred);

Отобразите изображение Лайки с наложенной картой чувствительности окклюзии.

imshow(imgLaikaGrass,'InitialMagnification', 150)
hold on
imagesc(map,'AlphaData',0.5)
colormap jet
colorbar

title(sprintf("Occlusion sensitivity (%s)", ...
    YPred))

Карта окклюзии показывает, какие части изображения имеют положительный вклад в счет для miniature poodle Классы, и какие части имеют отрицательный вклад. Красные области карты имеют более высокое значение и являются доказательством miniature poodle класс - когда красные области заслонены, счет для miniature poodle спускается вниз. На этом изображении голова, спина и уши Лайки обеспечивают самое сильное доказательство для miniature poodle класс.

Синие области карты с более низкими значениями являются частями изображения, которые приводят к увеличению счета для miniature poodle при окклюдировании. Часто эти области являются доказательством другого класса и могут запутать сеть. В этом случае рот и ноги Лайки имеют отрицательный вклад в общий счет для miniature poodle.

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

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

Чувствительность к окклюзии и Grad-CAM обычно возвращают качественно схожие результаты, хотя работают по-разному. Как правило, вы можете вычислить карту Grad-CAM быстрее, чем карту окклюзии, не настраивая никаких параметров. Однако карта Grad-CAM обычно может иметь более низкое пространственное разрешение, чем карта окклюзии, и может пропустить мелкие детали. Базовое разрешение Grad-CAM является пространственным разрешением последней сверточной карты функций; в случае с GoogleNet это 7 на 7 пикселей. Чтобы получить лучшие результаты от чувствительности к окклюзии, вы должны выбрать правильные значения для MaskSize и Stride опции. Эта настройка обеспечивает большую гибкость, чтобы исследовать входные функции в различных шкалах длины.

Сравнение доказательств для различных классов

Можно использовать окклюзию, чтобы сравнить какие части изображения идентифицирует сеть как доказательство для различных классов. Это может быть полезно в тех случаях, когда сеть не уверена в классификации и дает аналогичные счета нескольким классам.

Вычислите карту окклюзии для каждого из трех лучших классов. Чтобы изучить результаты окклюзии с более высоким разрешением, уменьшите размер маски и перемещайтесь с помощью MaskSize и Stride опции. Меньшее Stride приводит к карте более высокого разрешения, но может занять больше времени, чтобы вычислить и использовать больше памяти. Меньшее MaskSize иллюстрирует меньшие детали, но может привести к более шумным результатам.

topClasses = classes(topIdx);
topClassesMap = occlusionSensitivity(net, imgLaikaGrass, topClasses, ...
    "Stride", 10, ...
    "MaskSize", 15);

Постройте график результатов для каждого из трех лучших классов.

for i=1:length(topIdx)        
    figure
    imshow(imgLaikaGrass); 
    hold on
    imagesc(topClassesMap(:,:,i), 'AlphaData', 0.5);
    colormap jet;
    
    classLabel = string(classes(topIdx(i)));
    title(sprintf("%s", classLabel));
end

Различные части изображения оказывают очень разное влияние на счета классов для различных пород собак. Спина собаки оказывает сильное влияние на miniature poodle и toy poodle классы, в то время как рот и уши способствуют Tibetan terrier класс.

Расследование проблем неправильной классификации

Если ваша сеть постоянно неправильно классифицирует определенные типы входных данных, можно использовать чувствительность к окклюзии, чтобы определить, путают ли определенные функции ваших входных данных сеть. Из карты окклюзии Лайки, сидящей на траве, можно ожидать, что изображения Лайки, которые более сфокусированы на ее лице, вероятно, будут неправильно классифицированы как Tibetan terrier. Можно проверить, что это так, используя другое изображение Laika.

imgLaikaSit = imresize(imread("laika_sitting.jpg"),inputSize);

[YPred,scores] = classify(net,imgLaikaSit);
[score,idx] = max(scores);
YPred, score
YPred = categorical
     Tibetan terrier 

score = single
    0.5668

Вычислите карту окклюзии нового изображения.

map = occlusionSensitivity(net,imgLaikaSit,YPred);

imshow(imgLaikaSit); 
hold on;
imagesc(map, 'AlphaData', 0.5);
colormap jet;

title(sprintf("%s (%.2f)",...
    string(classes(idx)),score));

Снова сеть сильно связывает нос и рот собаки с Tibetan terrier класс. Это подчеркивает возможный тип отказа сети, поскольку предполагает, что изображения лица Лайки будут последовательно неправильно классифицироваться как Tibetan terrier.

Можно использовать понимание, полученное из occlusionSensitivity функция, чтобы убедиться, что ваша сеть фокусируется на правильных функциях входных данных. Причиной проблемы классификации в этом примере является то, что доступные классы GoogleNet не включают собак перекрестных пород, таких как Laika. Карта окклюзии демонстрирует, почему сеть путают эти изображения Лайки. Важно быть уверенным, что сеть, которую вы используете, подходит для поставленной задачи.

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

Ссылки

[1] Цейлер М.Д., Фергус Р. (2014) Визуализация и понимание сверточных сетей. In: Fleet D., Pajdla T., Schiele B., Tuytelaars T. (eds) Компьютерное Зрение - ECCV 2014. ECCV 2014. Lecture Notes in Computer Science, vol 8689. Спрингер, Чэм

См. также

|

Похожие темы