Подтвердить что ты не робот

Как обучить изображения для классификации, когда они имеют разные размеры?

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

4b9b3361

Ответ 1

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

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

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

Если это ваша проблема, вот несколько вещей, которые вы можете сделать:

  • Не заботьтесь о сжатии изображений. В любом случае, сеть может научиться понимать содержание; масштаб и перспектива что-нибудь значат для контента в любом случае?
  • Обрезать изображения по центру до определенного размера. Если вы опасаетесь, что теряете данные, сделайте несколько обрезок и используйте их для увеличения ваших входных данных, чтобы исходное изображение было разделено на N разных изображений правильного размера.
  • Дополните изображения сплошным цветом до квадрата, затем измените размер.
  • Сделайте комбинацию этого.

Опция заполнения может привести к дополнительному источнику ошибок в прогнозе сети, поскольку сеть может (читай: вероятно, будет) смещена к изображениям, которые содержат такую заполненную границу. Если вам нужны идеи, взгляните на раздел Images документации TensorFlow, там есть такие фрагменты, как resize_image_with_crop_or_pad, которые убирают большую работу.

Что касается просто не заботиться о сжатии, здесь фрагмент конвейера предварительной обработки известной сети Inception:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

Они полностью знают об этом и все равно делают.

В зависимости от того, как далеко вы хотите или нужно идти, на самом деле существует документ здесь, который называется "Пространственное пирамидальное объединение в сетях с глубокими свертками для визуального распознавания", который обрабатывает входные данные произвольных размеров, обрабатывая их совершенно особым образом.

Ответ 2

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