Наша команда стремится создать модель для распознавания номерного знака без сегментации, со следующей архитектурой:
Мы успешно реализовали большинство из архитектура, но мы боремся с подключением 8 ветвей полностью связанных слоев (каждая из которых для одного символа номерного знака).
Есть ли способ использовать один и тот же вход (тензор 25x5x128
) для каждого из 8 ветвей, и пусть они работают независимо и сравнивают свои результаты независимо с соответствующей основной буквой истинности номерного знака и puni sh (функция потерь), на основании которых буквы были неправильными?
Мы пробовали несколько подходов используя модели keras (как последовательный, так и API класса Model), но безуспешно. Ниже наша текущая версия модели. Мы будем очень благодарны за любую помощь.
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), use_bias=False, input_shape=(32, 32, 3),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(32, (3, 3), use_bias=False, input_shape=(32, 32, 3),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(32, (3, 3), use_bias=False, input_shape=(32, 32, 3),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), use_bias=False, input_shape=(100, 20, 32),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(64, (3, 3), use_bias=False, input_shape=(100, 20, 32),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(64, (3, 3), use_bias=False, input_shape=(100, 20, 32),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), use_bias=False, input_shape=(50, 10, 64),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(128, (3, 3), use_bias=False, input_shape=(50, 10, 64),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.Conv2D(128, (3, 3), use_bias=False, input_shape=(50, 10, 64),padding='same'))
model.add(layers.BatchNormalization())
model.add(layers.Activation("relu"))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
branch1 = models.Sequential()
branch1 .add(layers.Dense(128, input_shape=(16000,)))
branch1.add(layers.Dense(36, input_shape=(128,)))
branch1.add(layers.Activation("softmax"))
# Another 7 branches follows with exact same definition
final_model = keras.Model(inputs=[model, model, model, model, model, model, model, model],
outputs=[branch1, branch2, branch3, branch4, branch5, branch6, branch7, branch8])
final_model.compile(tf.keras.optimizers.Adam(learning_rate=0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = final_model.fit(train_images, train_labels, epochs=80,
validation_data=(test_images, test_labels))