入力画像は416x416です。 4 x 10の出力を作成するにはどうすればよいですか(4は列数、10は行数)。
ラベルデータは、4列10行の2D配列です。
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、2番目のymin、3番目のxmax、4番目のymaxです。
ネットワークの最後の層は次のようになります
(None, 13, 13, 1024)
予測の形状を目的の出力に適合させる最も簡単な方法は、@ 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の実装がいくつかあります。
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)
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
_を与えます
1次元テンソル
次に、密なレイヤーを追加します
model.add(Dense(4*10))
40に出力されます
これにより、3D形状が1Dに変換されます
必要に応じてサイズを変更するだけです
model.add(Reshape(4,10))
これは機能しますが、データの空間的性質を完全に破壊します