Я пытаюсь обучить мою модель, которая классифицирует изображения. У меня проблема в том, что они имеют разные размеры. Есть ли возможность тренировать эти изображения без изменения их размера.
Как обучить изображения для классификации, когда они имеют разные размеры?
Ответ 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 всегда получали постоянные размерные векторы в качестве входных данных. Во время обучения подготовьте изображения из всего набора данных, используя определенный размер изображения за одну эпоху. Затем на следующую эпоху переключитесь на другой размер изображения и продолжите обучение.