实现一个 Keras 层,该层为区域提议网络(功能 API)获取不同形状的输入

Implementing a Keras Layer that takes inputs of different shape for a Region Proposal Network (functional API)

在 Keras 函数中编写基于 Faster R-CNN 的区域提议网络的实现 API,我遇到了一个问题,经过一番搜索后我还没有找到明确的解决方案。

我有一个自定义层,将其命名为 Roi_Projection_Layer,这将是 Keras 中的一个自定义层。这一层应该采取:

我希望将这两个明显不同形状的张量传递给 Keras 层,这样我就可以使用锚框的中心和形状作为投影参数,a.k.a 通过3window在feature map的空间维度,要传递到模型中的更多层。

我不知道该怎么做。我的一些想法是将锚框值附加到每个通道的空间维度,即传入空间维度 (32*19+4) 的特征图,但我不确定是否修改输入在严格的 Keras 层操作之外,模型在编译后是否会缺少此代码?任何见解表示赞赏。

由于我没有得到答案,我将 post 我的 attempt/investigation。

我能够通过 subclassing keras.layers.Layer 对 ROI 投影层进行编码,其中输入是单个元组的列表。列表中的第一个元素是一个元组,即元组的第一个元素是单个图像,第二个元素是 [x_min, y_min, width, height] 形式的锚框集合。我最终用零填充了结果,因为 Faster R-CNN 中的下一个卷积层采用 3 x 3 window 作为输入,因此对于映射到特征图边界像素的锚框,我们需要填充。

class RoiProjectionLayer(keras.layers.Layer):
    def __init__(self, stride):
        super(RoiProjectionLayer, self).__init__()
        self.stride = stride
    def call(self, inputs):
        projected_feature_maps = []
        batch_size = inputs[0][1].shape[0]
        for i in range(batch_size):
            # x centre (after padding) of the anchor box location in the feature map
            x_val = tf.dtypes.cast(inputs[0][1][i][0]/self.stride, tf.int32)+2
            # y centre (after padding) of the anchor box location in the feature map
            y_val = tf.dtypes.cast(inputs[0][1][i][1]/self.stride, tf.int32)+2 
            feature_map = inputs[0][0][0]
            padding_values = tf.constant([[2, 2], [2, 2], [0, 0]])
            feature_map = tf.pad(feature_map, padding_values, "CONSTANT")
            projected_feature_maps.append(feature_map[x_val-1:x_val+2, y_val-1:y_val+2, :])
        return tf.stack([x for x in projected_feature_maps])

基本上,关键是要注意 keras 中的层可以采用张量元组列表。这甚至在 non-eager 执行中也有效,但是我必须将 batch_size 设置为 RoiProjectionLayer class.

的固定参数