【问题标题】:using vgg16 for bounding box prediction for own dataset使用 vgg16 对自己的数据集进行边界框预测
【发布时间】:2021-12-31 08:06:31
【问题描述】:

在构建基于 vgg16 的分类器之后。我想构建一个边界框来绑定检测到的对象。

我发现可以通过删除最后一个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: "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
_________________________________________________________________

然后训练模型

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个暗淡,与我的班级数(5)不匹配。在我将昏暗更改为 5 之后。它可以工作,但我无法训练任何东西。输出的 5 值数组不合理(全为 0)。

还是我的实现不正确?

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning object-detection


    【解决方案1】:

    简而言之:你的实现很好,但你的数据是错误的。

    为了训练新的输出,您需要新的标签。输入不需要更改,但您需要以某种方式获取您尝试检测的边界框的 x、y、高度和宽度。如果数据集没有提供,您需要自己标记。

    如果您想在边界框坐标上进行训练,您的标签需要是边界框坐标。您无法继续使用数据集的类标签进行训练。无论您的模型试图在监督学习中学习什么,这都是您需要提供的标签。

    【讨论】:

    • 感谢您的回复!这意味着我应该使用标签 x、y、高度、宽度来训练它?因为我的数据集只是一组照片。我完成了分类工作,现在想添加边界框功能
    • 如果 x,y 是角之一,并且您从该角计算边界框的高度和宽度,那么是的,这将起作用。确保如果您进行任何调整大小,请在标签中考虑到这一点。
    • 我想我搞砸了,我的数据集只是被分类的图像。可以吗?或者输入数据应该是带有坐标的图像,以便我可以训练它们?
    • 为了训练一个新的输出,你需要新的标签。输入不需要更改,但您需要以某种方式获取您提到的 x、y、高度、宽度标签。如果数据集不提供此信息,您将需要自己标记它们。请记住,算法仅与其训练的数据一样好。我将编辑答案以使其更完整。让我知道这是否完全回答了您的问题,或者您是否还有其他问题。
    • 谢谢!!我找到了一个软件调用labelImg,它是用来打标签的。至少我的模型是正确的。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 2019-06-25
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2020-09-20
    相关资源
    最近更新 更多