Этот пример показывает, как использовать карты чувствительности окклюзии, чтобы понять, почему глубокая нейронная сеть принимает решение о классификации. Чувствительность к окклюзии является простым методом для понимания того, какие части изображения наиболее важны для классификации глубокой сети. Можно измерить чувствительность сети к окклюзии в различных областях данных с помощью небольших возмущений данных. Используйте чувствительность к окклюзии, чтобы получить высокоуровневое понимание того, какие функции изображений использует сеть для составления конкретной классификации, и чтобы дать представление о причинах, по которым сеть может ошибочно классифицировать изображение.
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. Спрингер, Чэм
googlenet
| occlusionSensitivity