我正在尝试创建一个对象定位模型来检测汽车图像中的车牌。我使用 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
如果你正在做对象本地化任务,那么你不应该使用
'accuracy'
作为你的指标,因为 compile() 的文档说:
当您传递字符串“accuracy”或“acc”时,我们将其转换为一 tf.keras.metrics.BinaryAccuracy, tf.keras.metrics.CategoricalAccuracy, 基于损失函数的tf.keras.metrics.SparseCategoricalAccuracy 使用和模型输出形状
您应该使用 tf.keras.metrics.MeanAbsoluteError、IoU(Intersection Over Union)或 mAP(Mean Average Precision)来代替