exponenta event banner

Понимание сетевых прогнозов с помощью окклюзии

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

Deep Learning Toolbox предоставляет occlusionSensitivity функция для вычисления карт чувствительности окклюзии для глубоких нейронных сетей, которые принимают входные данные изображения. 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);

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

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 является пространственное разрешение последней сверточной карты признаков; в том случае, если она имеет значение «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. Вы можете убедиться, что это так, используя другое изображение Лайки.

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) Визуализация и понимание сверточных сетей. В: Fleet D., Pajdla T., Schiele B., Tuytelaars T. (eds) Computer Vision - ECCV 2014. ECCV 2014. Лекции по информатике, том 8689. Спрингер, Чем

См. также

|

Связанные темы