我开发了一个用于车牌识别的神经网络,并使用了 EfficientNet 架构 ( https://keras.io/api/applications/efficientnet/#efficientnetb0-function ),在 ImageNet 上使用和不使用预训练权重,以及使用和不使用数据增强。我只有 10.000 个训练图像和 3.000 个验证图像。这就是我应用迁移学习和图像增强 ( AdditiveGaussianNoise
) 的原因。
我创建了这个模型:
efnB0_model = efn.EfficientNetB0(include_top=False, weights="imagenet", input_shape=(224, 224, 3))
efnB0_model.trainable = False
def create_model(input_shape = (224, 224, 3)):
input_img = Input(shape=input_shape)
model = efnB0_model (input_img)
model = GlobalAveragePooling2D(name='avg_pool')(model)
model = Dropout(0.2)(model)
backbone = model
branches = []
for i in range(7):
branches.append(backbone)
branches[i] = Dense(360, name="branch_"+str(i)+"_Dense_360")(branches[i])
branches[i] = BatchNormalization()(branches[i])
branches[i] = Activation("relu") (branches[i])
branches[i] = Dropout(0.2)(branches[i])
branches[i] = Dense(35, activation = "softmax", name="branch_"+str(i)+"_output")(branches[i])
output = Concatenate(axis=1)(branches)
output = Reshape((7, 35))(output)
model = Model(input_img, output)
return model
我编译了模型:
opt = keras.optimizers.Adam(learning_rate=0.0001)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
并使用此代码来适应它:
hist = model.fit(
x=training_generator, epochs=10, verbose=1, callbacks=None,
validation_data=validation_generator, steps_per_epoch=num_train_samples // 16,
validation_steps=num_val_samples // 16,
max_queue_size=10, workers=6, use_multiprocessing=True)
我的假设是:
H1:EfficientNet架构适用于车牌识别。
H2:迁移学习将提高车牌识别的准确性(与没有迁移学习的情况相比)。
H3:图像增强将提高车牌识别的准确性(与没有它的情况相比)。
H4:迁移学习结合图像增强会带来最好的结果。
我现在得到了这个结果:
因此,H1 似乎是正确的。但是 H2、H3 和 H4 似乎是错误的。
我正在考虑它并得到了对 H3 和 H4 的解释,这对我来说似乎是合乎逻辑的。也就是说,图像增强过于繁重,并且会在一定程度上降低图像质量,从而使网络很难识别字符。
1. 这个解释合适吗?还有其他解释吗?
似乎是这样,图像增强太强了。所以,第一个问题解决了。
关于H2,老实说,我有点困惑。网络似乎过度拟合,但在验证准确性方面完全停滞不前。因此,Imagenet 权重不适用的结论对我来说似乎不合逻辑,因为网络从训练数据中学到了一些东西。我还排除了数据量很小的可能性,因为我们在没有使用迁移学习或图像增强的情况下具有良好的识别率......
2. 这有什么合乎逻辑的解释吗?