重塑路缘石层

2024-06-02 06:10:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入图像416x416。如何创建4x 10的输出,其中4是列数,10是行数?

我的标签数据是4列10行的二维数组。

我知道reshape()方法,但它要求生成的形状具有与输入相同数量的元素。

使用416 x 416输入大小和最大池层,我可以获得最大13 x 13输出。

有没有办法在不丢失数据的情况下实现4x10输出?

例如,我的输入标签数据如下所示

[[  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [116  16 128  51]
 [132  16 149  52]
 [ 68  31  77  88]
 [ 79  34  96  92]
 [126  37 147 112]
 [100  41 126 116]]

这表示我的图像上有6个对象需要检测,第一个值是xmin,第二个ymin,第三个xmax,第四个ymax。

我的网络的最后一层看起来像

(None, 13, 13, 1024)

Tags: 数据对象方法图像元素数量情况标签
2条回答

我相信最简单的方法来符合你的预测形状和期望的输出是由@Darlyn提出的解决方案。假设您目前拥有的网络被声明为(输出形状张量(13, 13, 1024))如下:

x = Input(shape=(416, 416, 3))
y = Conv2D(32, activation='relu')(x)
...
y = Conv2D(1024, activation='relu')(y)

您只需要添加一个回归层,该层将尝试预测这些框,然后将这些框重塑为(10, 4)

from keras.layers import Flatten, Dense, Reshape

samples = 1
boxes = 10

y = Flatten(name='flatten')(model.outputs)
y = Dense(boxes * 4, activation='relu')(y)
y = Reshape((boxes, 4), name='predictions')(y)
model = Model(inputs=model.inputs, outputs=y)

x_train = np.random.randn(samples, 416, 416, 3)

p = model.predict(x_train)
print(p.shape)

(1, 10, 4)

这是可行的,但我并不完全确信直接回归这些值会产生好的结果。我通常看到的目标检测模型使用注意力、区域或显著性来确定目标的位置。您可以尝试以下几种对象检测keras实现:

keras-rcnn

classes = ["dog", "cat", "hooman"]

backbone = keras_rcnn.models.backbone.VGG16
model = keras_rcnn.models.RCNN((416, 416, 3), classes, backbone)
boxes, predictions = model.predict(x)

keras-retinanet

from keras_retinanet.models.resnet import resnet_retinanet

x = Input(shape=(416, 416, 3))
model = resnet_retinanet(len(classes), inputs=x)
_, _, boxes, _ = model.predict_on_batch(inputs)

首先展平(None, 13, 13, 1024)

model.add(Flatten())

它将给出13*13*1024=173056

一维张量

然后添加一个致密层

model.add(Dense(4*10))它将输出到40

这将把你的3D形状转换成1D

然后根据需要调整大小

model.add(Reshape(4,10))

这将起作用,但绝对会破坏数据的空间性质

相关问题 更多 >