Сверточные нейронные сети с входными изображениями разных размеров. Сегментация изображений

12

Я сталкиваюсь с проблемой наличия изображений разных размеров в качестве входных данных в задаче сегментации. Обратите внимание, что изображения даже не имеют одинаковое соотношение сторон.

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

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

Другой альтернативой было бы просто изменить размер каждого изображения до фиксированных размеров. Я думаю, что это было также предложено ответом на этот вопрос. Однако не указано, каким образом изображения изменяются.

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

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

Кроме того, какой из этих подходов вы считаете лучшим с учетом сложности вычислений, а также возможной потери производительности сетью?

Буду признателен, если в ответах на мои вопросы будет ссылка на источник, если он есть. Спасибо.

MattSt
источник

Ответы:

4

Я дам более подробный ответ.

Есть 2 проблемы, с которыми вы можете столкнуться.

1) Ваша нейронная сеть (в данном случае сверточная нейронная сеть) не может физически принимать изображения разных разрешений. Обычно это имеет место, если у вас есть полностью подключенные слои, однако, если сеть является полностью сверточной, она должна иметь возможность принимать изображения любого измерения. Полностью сверточный подразумевает, что он не содержит полностью связанных слоев, а содержит только сверточные слои, слои с максимальным пулом и нормализацией в пакетном режиме, которые не зависят от размера изображения. Именно этот подход был предложен в этой новаторской работе « Полностью сверточные сети для семантической сегментации» . Имейте в виду, что их архитектура и методы обучения могут быть немного устаревшими. Подобный подход использовался в широко используемыхU-Net: сверточные сети для биомедицинской сегментации изображений и многие другие архитектуры для обнаружения объектов, оценки поз и сегментации.

2) Сверточные нейронные сети не являются масштабно-инвариантными. Например, если тренироваться на кошках одинакового размера в пикселях на изображениях с фиксированным разрешением, сеть будет повреждена на изображениях кошек меньшего или большего размера. Чтобы преодолеть эту проблему, я знаю два метода (может быть, больше в литературе): 1) многоуровневое обучение изображений разных размеров в полностью сверточных сетях, чтобы сделать модель более устойчивой к изменениям масштаба; и 2) иметь многомасштабную архитектуру. Для начала стоит взглянуть на эти две заметные статьи: « Сети с пирамидами функций для обнаружения объектов» и « Представления в высоком разрешении для маркировки пикселей и областей» .

Ануар Y
источник
2

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

Фади Бакура
источник
Как же тогда справляться с нормализацией в этих случаях? Я полагаю, вы только нормализуете пиксели изображения, которые не включены в его поле?
MattSt
Да, поскольку ваш процесс создания данных имеет разные размеры, поэтому, если вы включите поля, вы измените распределение данных. поля вставляются для группировки обучающих выборок в пакеты, потому что вашей задаче нужно вывести фиксированный выходной вектор.
Фади Бакура
0

Я думаю, что эта статья будет полезна для вас.

Феликс Гольдберг
источник
Вы не должны давать ответы только для ссылок.
JohnnyApplesauce
0

Поскольку вы хотите выполнить сегментацию, вы можете использовать U-Net. Он не имеет полностью подключенных модулей. Следовательно, размер ввода не будет иметь значения.

ganLover
источник
3
Я думаю, что вы должны уточнить ваши моменты немного больше.
DuttaA
0

я думаю, что вы можете изменить размер изображения пикселя и конвертировать RGB в двоичную или целое число для следующего шага

Дэнни Лукмана
источник
1
Привет и добро пожаловать на AI Stack Exchange. Не могли бы вы расширить свой ответ? Попробуйте добавить больше контекста, чтобы поддержать свой ответ и, возможно, добавить ссылки.
Джейден Травник
0

Попробуйте изменить размер изображения до входных размеров вашей архитектуры нейронной сети (сохраняя фиксированное значение примерно 128 * 128 в стандартной 2D-архитектуре U-сети), используя метод интерполяции ближайшего соседа . Это связано с тем, что если вы измените размер изображения, используя любую другую интерполяцию, это может привести к подделке основных меток истинности. Это особенно проблема в сегментации. С классификацией вы не столкнетесь с такой проблемой.

Попробуйте следующее:

import cv2 
resized_image = cv2.resize(original_image, (new_width, new_height), 
                           interpolation=cv2.INTER_NEAREST)
Шалабх Гупта
источник