首页 > 解决方案 > 使用 Keras 迁移学习的边界框回归给出 0% 的准确率。Sigmoid 激活的输出层只输出 0 或 1

问题描述

我正在尝试创建一个对象定位模型来检测汽车图像中的车牌。我使用 VGG16 模型并排除顶层以添加我自己的密集层,最后一层有 4 个节点和 sigmoid 激活以获得 (xmin, ymin, xmax, ymax)。

我使用 keras 提供的函数读取图像,并将其调整为 (224, 244, 3),并使用 preprocess_input() 函数处理输入。我还尝试通过使用填充调整大小以保持比例来手动处理图像,并通过除以 255 来规范化输入。

我训练时似乎没有任何效果。我得到 0% 的训练和测试准确率。下面是我的这个模型的代码。

def get_custom(output_size, optimizer, loss):

    vgg = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=IMG_DIMS))

    vgg.trainable = False

    flatten = vgg.output
    flatten = Flatten()(flatten)

    bboxHead = Dense(128, activation="relu")(flatten)
    bboxHead = Dense(32, activation="relu")(bboxHead)

    bboxHead = Dense(output_size, activation="sigmoid")(bboxHead)

    model = Model(inputs=vgg.input, outputs=bboxHead)
    model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])

    return model

X 和 y 分别为 (616, 224, 224, 3) 和 (616, 4) 形状。我将坐标除以各自边的长度,因此 y 中的每个值都在 (0,1) 范围内。

我将从 github 链接下面的 python 笔记本,以便您查看完整代码。我正在使用 google colab 来训练模型。 https://github.com/gauthamramesh3110/image_processing_scripts/blob/main/License_Plate_Detection.ipynb

提前致谢。我在这里真的需要帮助。

标签: tensorflowmachine-learningkerasdeep-learningobject-detection

解决方案


如果您正在执行对象本地化任务,那么您不应该将'accuracy'其用作指标,因为compile() 的文档说:

当您传递字符串 'accuracy' 或 'acc' 时,我们会根据使用的损失函数和模型输出形状

您应该改用tf.keras.metrics.MeanAbsoluteErrorIoU (联合交集)或mAP(平均平均精度)


推荐阅读