Предсказание последовательности точек на изображении

Вопрос или проблема

Мой обучающий набор состоит из набора изображений (либо с 3 каналами, либо с 1 каналом, конечно, я использую только один тип канала). Метки представляют собой последовательность точек в определенном порядке, которые я хочу предсказать по изображениям.

Я использую модель, вдохновленную примером подписи к изображению на сайте TensorFlow. Это также подход, который использован в этой статье https://arxiv.org/pdf/1901.03781.pdf

class CNN_Encoder(tf.keras.Model):
    # Поскольку вы уже извлекли функции и сохранили их с помощью pickle
    # Этот энкодер передает эти функции через полносвязный слой
    def __init__(self, embedding_dim):
        super(CNN_Encoder, self).__init__()
        self.fc = tf.keras.layers.Dense(embedding_dim)

    def call(self, x):
        x = self.fc(x)
        x = tf.nn.relu(x)
        return x

class RNN_Decoder(tf.keras.Model):
    def __init__(self, embedding_dim, units, output_dim):
        super(RNN_Decoder, self).__init__()
        self.units = units


        self.gru = tf.keras.layers.GRU(self.units,
                                       return_sequences=True,
                                       return_state=True,
                                       recurrent_initializer="glorot_uniform")
        self.fc1 = tf.keras.layers.Dense(self.units)
        self.fc2 = tf.keras.layers.Dense(output_dim)

    def call(self, x, features, hidden):


        x = tf.concat((features, x), axis=-1)
        output, state = self.gru(x)
        x = self.fc1(state)
        x = self.fc2(x)
        return x

    def reset_state(self, batch_size):
        return tf.zeros((batch_size, self.units))

@tf.function
def train_step(img_tensor, target):
    loss = 0


    hidden = decoder.reset_state(batch_size=target.shape[0])
    dec_input = tf.expand_dims([[0., 0.]] * target.shape[0], 1)
    with tf.GradientTape() as tape:

        features = encoder(img_tensor)
        for i in (range(1, target.shape[1])):
            predictions = decoder(dec_input, features, hidden)
            loss += loss_function(target[:, i], predictions)

            # использование принудительного обучения
            dec_input = tf.expand_dims(target[:, i], 1)
    total_loss = (loss / int(target.shape[1]))
    trainable_variables = encoder.trainable_variables + decoder.trainable_variables
    gradients = tape.gradient(loss, trainable_variables)
    optimizer.apply_gradients(zip(gradients, trainable_variables))
    return loss, total_loss

EPOCHS = 20
batch_size = 8
for epoch in tqdm(range(start_epoch, EPOCHS)):
    start = time.time()
    total_loss = 0

    for (batch, (img_tensor, target)) in enumerate((data_generator(preds_t, labels_t))):
        img_tensor = img_tensor.reshape((-1, 1, 128*128))
        batch_loss, t_loss = train_step(img_tensor, target)
        total_loss += t_loss

        if batch % 100 == 0:
            print ('Эпоха {} Пакет {} Потеря {:.4f}'.format(
              epoch + 1, batch, batch_loss.numpy() / int(target.shape[1])))
        if batch == 10000:

            break
    # сохранение значения потерь на конец эпохи для последующего построения графика
    #loss_plot.append(total_loss / num_steps)

    if epoch % 5 == 0:
        ckpt_manager.save()

    print ('Эпоха {} Потеря {:.6f}'.format(epoch + 1,
                                         total_loss/num_steps))
    print ('Время, затраченное на 1 эпоху {} сек\n'.format(time.time() - start))

Для вектора признаков. Я извлекаю последний слой U-Net. Таким образом, каждое изображение имеет размер 1x128x128. Я преобразую его в 1x1x128*128. Затем я передаю его через полносвязный слой. Форма затем становится 1x1x256

Мои метки, которые я хочу предсказать, — это координаты изображения (x, y). Вход для слоя GRU — объединенные 1x1x256, 1x1x2 (координаты t-1). Затем я передаю их через 2-слойный полносвязный слой с выходным размером 2 для двух координат. Я убрал внимание, чтобы упростить модель. Я нормализую свои изображения. Я заполняю последовательности координат 0,0 для начала, -1, -1 для конца и -2,-2 для регулярного заполнения, чтобы получить равномерную длину последовательности 350×2.

Сеть, похоже, не учится многому. Я просто получаю несколько точек, разбросанных по диагонали изображения. Самая большая разница, которую я вижу с моделью подписи изображения, заключается в том, что слова можно преобразовать в векторы, и тогда у вас есть 128 признаков изображения, 128 признаков слова, объединенные и переданные в LSTM. В моем случае информация о последовательности — это всего лишь одна запись. Может быть, из-за этого сеть не учится многому.

Если у кого-то есть идеи, что мне изменить, это было бы замечательно

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

Ответ или решение

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

Анализ текущего подхода

  1. Предобработка данных: Вы нормализуете изображения и используете последнее слое сети UNet для извлечения признаков размером 1x128x128, что затем преобразуется в вектор 1x1x16384. Этот процесс, по сути, сокращает размерность данных, позволяя модели фокусироваться на более глобальных признаках изображения.

  2. Архитектура модели:

    • CNN_Encoder: Простой линейный слой для уменьшения размерности признаков до 256 с применением функции активации ReLU.
    • RNN_Decoder: Использует GRU слои для обработки временных данных с учетом предыдущего состояния. На выходе – два полносвязанных слоя для прогноза координат (x, y).
  3. Обучение модели: Включает в себя стандартные техники, такие как использование обратного распространения ошибки через GradientTape и оптимизация с использованием вычисленных градиентов. Обучение происходит батчами с применением подхода Teacher Forcing.

Возможные проблемы и решения

  1. Сложности с обучением:

    • Возможно, не хватает данных или тренировочных примеров. Убедитесь, что ваш датасет достаточно велик и разнообразен. Воспользуйтесь методами увеличения данных (data augmentation), чтобы искусственно увеличить объем тренировочных данных.
    • Неподходящая функция потерь. Попробуйте другие функции потерь, например, Mean Squared Error для регрессивных задач, если вы этого ещё не сделали.
  2. Архитектура сети:

    • Усложнение модели: Возможно, текущая модель слишком проста для выполнения такой сложной задачи, как предсказание последовательностей. Рассмотрите возможность добавления слоёв или внедрение механизма внимания (Attention).
    • Является ли текущий подход GRU оптимальным? Возможно, другие архитектуры, такие как LSTM или Transformer-основные модели, могут показать лучшие результаты.
  3. Гиперпараметры и обучение:

    • Настройка гиперпараметров: Попробуйте поменять размер батча, скорость обучения или количество слоёв в GRU.
    • Регуляризация: Используйте Dropout или Batch Normalization, чтобы избежать переобучения.
  4. Качество данных:

    • Убедитесь, что разметка данных (т. е. координаты (x, y)) точна и непротиворечива в вашем наборе данных.
    • Проверьте корректность и отсутствие артефактов в самом наборе изображений.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...