Как я могу отсортировать счет и рецепт с помощью tenorflow? - PullRequest
0 голосов
/ 20 октября 2019

Моя цель - создать модель с TensorFlow для сортировки счета-фактуры и квитанции, сделать литературную модель классификации документов, но я пытаюсь подготовить модель предварительного обучения (точную настройку и нет) и создать свою собственную модель(CNN), но у меня все еще есть та же самая проблема ..., в конце после обучения, когда я пытаюсь предсказать некоторый новый документ с моей моделью, у меня только один результат invoice ..., и мой вопрос,почему?

Почему у меня есть только один результат, когда я прогнозирую новые данные?

Я тренируюсь с 1000 фотографиями каждого для своего счета и квитанции и 3 группами training, validation и test Мои данные - это фотография, полученная смартфоном от реальных пользователей, я так редко сканирую счет-фактуру или квитанцию.

Теперь я думаю, что моя фотография недостаточно хороша, или, возможно, я не могу сделатьэто по распознаванию изображений, скажите мне, если это возможно, с такими вещами или более сильным старым OCR с ~ 100 if более хорошим: D

Мой основной код для обучения предварительно обученной модели от Google:

...

base_dir, _ = os.path.splitext(rootDir)

image_size = 224
batch_size = 5
batch_size_test = 1

test_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)


train_generator = test_datagen.flow_from_directory(
                train_dir,  # Source directory for the training images
                target_size=(image_size, image_size),
                batch_size=batch_size,
                class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
                validation_dir, # Source directory for the validation images
                target_size=(image_size, image_size),
                batch_size=batch_size,
                class_mode='binary')

test_generator = test_datagen.flow_from_directory(
                test_dir,  # Source directory for the test images
                target_size=(image_size, image_size),
                batch_size=batch_size_test,
                class_mode=None)

IMG_SHAPE = (image_size, image_size, 3)

# I also try with pre-trained model: resnet50, InceptionResNetV2
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')

base_model.trainable = False

model = tf.keras.Sequential([
  base_model,
  keras.layers.GlobalAveragePooling2D(),
  keras.layers.Dense(1, activation='sigmoid')
])


model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),
              loss='binary_crossentropy',
              metrics=['accuracy'])

epochs = 10
steps_per_epoch = train_generator.n
validation_steps = validation_generator.n

history = model.fit_generator(train_generator,
                              steps_per_epoch=steps_per_epoch,
                              epochs=epochs,
                              workers=4,
                              validation_data=validation_generator,
                              validation_steps=validation_steps)

# save all model
model.save('my_model.h5')

# evaluate model
loss2, acc2 = model.evaluate(test_generator, steps=batch_size_test, workers=4)
print("Model, accuracy: {:5.2f}%".format(100*acc2))
print("Model, loss: {:5.2f}%".format(100*loss2))


# For activate fine tuning
# base_model.trainable = True

# fine_tune_at = 100

# for layer in base_model.layers[:fine_tune_at]:
#   layer.trainable =  False


# model.compile(optimizer = tf.keras.optimizers.RMSprop(lr=2e-5),
#               loss='binary_crossentropy',
#               metrics=['accuracy'])

# history_fine = model.fit_generator(train_generator,
#                                    steps_per_epoch = steps_per_epoch,
#                                    epochs=epochs,
#                                    workers=4,
#                                    validation_data=validation_generator,
#                                    validation_steps=validation_steps)

Моя собственная модель:

...

batch_size = 5
epochs = 10

img_height = 900
img_width = 680

...

base_dir, _ = os.path.splitext(rootDir)

train_dir = os.path.join(base_dir, 'train')
valid_dir = os.path.join(base_dir, 'validation')

train_invoice_dir = os.path.join(train_dir, 'Invoice') 
train_receipt_dir = os.path.join(train_dir, 'Receipt')
validation_invoice_dir = os.path.join(valid_dir, 'Invoice')
validation_receipt_dir = os.path.join(valid_dir, 'Receipt')

num_invoice_tr = len(os.listdir(train_invoice_dir))
num_receipt_tr = len(os.listdir(train_receipt_dir))

num_invoice_val = len(os.listdir(validation_invoice_dir))
num_receipt_val = len(os.listdir(validation_receipt_dir))

total_train = num_invoice_tr + num_receipt_tr
total_val = num_invoice_val + num_receipt_val

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = test_datagen.flow_from_directory(
    directory=train_dir,
    shuffle=True,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary')


valid_generator = test_datagen.flow_from_directory(
    directory=valid_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary')


model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(img_height, img_width, 3)),
    MaxPooling2D(),
    Dropout(0.2),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Dropout(0.2),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

history = model.fit_generator(train_generator,
                              steps_per_epoch=total_train,
                              epochs=epochs,
                              workers=4,
                              validation_data=valid_generator,
                              validation_steps=total_val,
                              )

model.save("my_model_cnn_fine_tune.h5")

Я также иногда меняю bash_size, я пытаюсь 100 или 50 в зависимости от модели, я использую, потому что я получил OOM ...

I 'Я начинающий в ML и глубоких знаниях, пожалуйста, прости меня, если я сделал большую ошибку, или мисс что-то понял:)

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...