预测图像中的点序列

Posted

技术标签:

【中文标题】预测图像中的点序列【英文标题】:Predicting point sequence in image 【发布时间】:2020-10-06 16:36:15 【问题描述】:

我的训练集是一组图像(3 个通道或 1 个我只使用一种通道)。标签是我想从图像中预测的特定顺序的点序列。

我使用的模型灵感来自 tensorflow 网站上的图像字幕示例。这也是本文采用的方法https://arxiv.org/pdf/1901.03781.pdf

class CNN_Encoder(tf.keras.Model):
    # Since you have already extracted the features and dumped it using pickle
    # This encoder passes those features through a Fully connected layer
    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)

            # using teacher forcing
            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 ('Epoch  Batch  Loss :.4f'.format(
              epoch + 1, batch, batch_loss.numpy() / int(target.shape[1])))
        if batch == 10000:

            break
    # storing the epoch end loss value to plot later
    #loss_plot.append(total_loss / num_steps)

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

    print ('Epoch  Loss :.6f'.format(epoch + 1,
                                         total_loss/num_steps))
    print ('Time taken for 1 epoch  sec\n'.format(time.time() - start))

对于特征向量。我正在提取 unet 的最后一层。所以每张图片的大小都是 1x128x128。我将其重塑为 1x1x128*128。然后我通过一个完全连接的层。然后形状变成 1x1x256

我想要预测的标签是图像坐标 so (x, y)。 gru 层的输入是 连接 1x1x256 , 1x1x2 (t-1 坐标)。然后,我进一步通过 2 层 fc 层,输出维度为 2,用于 2 个坐标。我现在已经移除了注意力以获得更简单的模型。我标准化我的图像。我用 0,0 填充坐标序列,开始 -1,结束 -1,常规填充 -2,-2 以获得 350x2 的统一序列长度。

网络似乎没有学到很多东西。我只是在图像上对角线散布了几个点。我看到的图像字幕模型的最大区别是单词可以转换为嵌入,然后你有 128 个图像特征 128 个单词特征被连接并输入 lstm。在我的情况下,序列信息只是 1 个条目。这可能是网络没有学到很多东西的原因吗?

如果有人对我应该改变什么有任何见解,那就太好了

【问题讨论】:

【参考方案1】:

您的问题需要一定的经验和深入的调查。我只会针对不合适的问题提出一般建议。这是things to try的列表。

就个人而言,我会首先尝试在单个批次上过度拟合。

【讨论】:

嘿,谢谢您的评论赏金虽然我不期待答案

以上是关于预测图像中的点序列的主要内容,如果未能解决你的问题,请参考以下文章

将不同的预测方法传递给R中的分层时间序列预测?

如何将预测序列转换回keras中的文本?

Keras 中的 LSTM 序列预测只输出输入的最后一步

突出显示matplotlib中的点序列[重复]

用递归神经网络简要介绍序列预测模型

R中的LSTM网络用于时间序列预测