![](/img/trans.png)
[英]Long prediction time when using converter.optimization in a VGG16 model and Tensorflow lite
[英]using vgg16 for bounding box prediction for own dataset
在构建了一个基于 vgg16 的分类器之后。 我想建立一个边界框来绑定检测到的 object。
我发现可以通过删除最后一个Maxpool
之后的层并添加一些fully connected layer
来做到这一点的互联网
flatten = vgg16.output
flatten = Flatten()(flatten)
bboxhead = Dense(128,activation="relu")(flatten)
bboxhead = Dense(64,activation="relu")(bboxhead)
bboxhead = Dense(32,activation="relu")(bboxhead)
bboxhead = Dense(4,activation="relu")(bboxhead)
box_model = Model(inputs = vgg16.input,outputs = bboxhead)
box_model.summary()
model应该是这样的,和我搜索的一样。
Model: "box_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 224, 224, 3)] 0
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
block5_pool (MaxPooling2D) (None, 7, 7, 512) 0
flatten (Flatten) (None, 25088) 0
dense (Dense) (None, 128) 3211392
dense_1 (Dense) (None, 64) 8256
dense_2 (Dense) (None, 32) 2080
dense_3 (Dense) (None, 4) 132
=================================================================
Total params: 17,936,548
Trainable params: 3,221,860
Non-trainable params: 14,714,688
_________________________________________________________________
然后训练model
from tensorflow.keras.optimizers import Adam
opt = Adam(1e-4)
box_model.compile(loss='mse',optimizer=opt)
steps, val_steps = train_gen.n/batch_size, val_gen.n/batch_size
num_epochs = 30
history = box_model.fit(train_gen,validation_data=val_gen,batch_size=32,epochs=30,verbose=1)
但我发现最后一个Dense
层有 4 个暗淡,与我的 class (5) 的数量不匹配。 在我将昏暗更改为 5 之后。它可以工作,但我无法训练任何东西。 output 5 值数组不合理(全为 0)。
还是我的实现不正确?
简而言之:你的实现很好,但你的数据是错误的。
如果您想在边界框坐标上进行训练,您的 label 需要是边界框坐标。 您无法继续使用数据集的 class 标签进行训练。 无论您的 model 试图在监督学习中学习什么,这就是您需要作为 label 提供的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.