Цель этого блога

В этом блоге мы расскажем о LayoutLMInvoice мультимодальной модели LayoutLM для задачи ответов на вопросы по счетам и другим документам.

Мы также увидим, как развернуть конечные точки + сделать интерактивное приложение Streamlit на платформе Daisi.

Что такое LayoutLM?

Модель LayoutLM основана на архитектуре BERT, но с двумя дополнительными типами вложений ввода. Первый представляет собой встраивание двумерного положения, которое обозначает относительное положение маркера в документе, а второй представляет собой встраивание изображения для отсканированных изображений маркера в документе. Эта модель достигла новых передовых результатов в нескольких последующих задачах, включая понимание форм, понимание квитанций и классификацию изображений документов.

LayoutLM в действии

Статья: https://arxiv.org/pdf/1912.13318.pdf

Код: https://github.com/microsoft/unilm/tree/master/layoutlm

Создание приложения для вопросов и ответов по документам?

Мы планируем создать оптимизированное приложение для приложения для аннотаций документов, которое принимает PDF-документ и вопрос в качестве входных данных и возвращает из него ответы. Пример-› У вас есть репозиторий счетов-фактур, и теперь у вас возникает вопрос: какой номер счета-фактуры? или какая общая сумма?

Теперь наше приложение будет просматривать каждый документ и извлекать из него сущности/ответы.

Теперь мы поняли нашу цель, давайте разберемся с инструментом daisi.

Что такое Дайси?

Daisi — это просто функция Python, работающая в облаке. Вам не нужно обновлять свой обычный код Python, чтобы превратить его в Daisi, вы просто свяжете его репозиторий Github с платформой. Daisi поддерживает как интерактивный пользовательский интерфейс, в котором мы можем играть с поддерживаемыми функциями Streamlit, так и конечные точки, которые могут использоваться сообществом разработчиков для экономии времени при создании приложения с нуля.

Как было бы здорово, если бы вы могли получить доступ к функциям в виде конечной точки и использовать ее в своем собственном приложении.

Создание API для выставления счетов SmartAI

Функция для извлечения предопределенных вопросов из документа.

import os
import torch
import pandas as pd
from PIL import Image, ImageDraw
from docquery import pipeline
from docquery.document import load_document,PDFDocument,OCRReader
from subprocess import run
from utils import *
device = 'cuda' if torch.cuda.is_available() else 'cpu'
pipe = pipeline("document-question-answering", model="impira/layoutlm-invoices")
### below are the questions that we will be searching in a doc
FIELDS = {
"Vendor Name": ["Vendor Name - Logo?",
 "Vendor Name - Address?"],
"Vendor Address": ["Vendor Address?"],
"Customer Name": ["Customer Name?"],
"Customer Address": ["Customer Address?"],
"Invoice Number": ["Invoice Number?"],
"Invoice Date": ["Invoice Date?"],
"Due Date": ["Due Date?"],
"Subtotal": ["Subtotal?"],
"Total Tax": ["Total Tax?"],
"Invoice Total": ["Invoice Total?"],
"Remit To Address": ["Remit To Address?"]}
def  make_tables( document ):
'''
Extract all necessary entities from document and return in table format
Parameters
----------
document: A document object loaded using docquery load_document()
Returns
-------
ret  : dict
Dictionary containing entities and the answers found for them
table : List[List] A table form of entities + answers
document :docquery object Document object
pages : PIL annotated Pages
'''
ret = {}
table = []
pages = [x.copy().convert("RGB") for x in document.preview]
for (field_name, questions) in zip(FIELDS.keys(),FIELDS.values()):
answers = [a for q in questions for a in ensure_list(run_pipeline( q, document, top_k=1))
if a.get("score", 1) > 0.5]
answers.sort(key=lambda x: -x.get("score", 0) if x else 0)
top = answers[0] if len(answers) > 0 else None
ret[field_name] = top
table.append([field_name, top.get("answer") if top is not None else None])
annotate_page(top, pages, document)
return ret ,table,document,pages

Функция, чтобы получить Задать вопрос и получить ответы от документа.

def  ask_question( question , document ):
'''
Ask questions like ship to? address ?  from document to get relevant answers
Parameters
- question (str) : text question you want to ask
- document (docquery ) : A document object loaded using docquery load_document()
Returns
- answer (str): Returns the string answer , it will return "No Entity found" if the question/entity is not present
'''
answers = ensure_list(run_pipeline( question , document, top_k=1))
answers.sort(key=lambda x: -x.get("score", 0) if x else 0)
top = answers[0] if len(answers) > 0 else None
if top:
    return top['answer']
else:
   return "No Entity found"

Развертывание кода в Daisi

Отправьте код на github с файлом requirements.txt. Вы можете обратиться к моему коду. Как только код появится на github, мы вытащим его из daisi за несколько простых шагов.

  1. Нажмите «Создать новый Daisi».
  2. Укажите git-адрес вашей daisi, как показано на рисунке ниже.

После развертывания ваши Daisi-Endpoints теперь готовы к логическим выводам. Вы можете найти их в разделе API. Давайте посмотрим, как использовать их в коде.

Примечание. Убедитесь, что у вас установлена ​​версия Python › = 3.8.

Загрузить Дайси

import pydaisi as pyd 
smartai_invoice = pyd.Daisi("surbhi/SmartAI-Invoice")

Загрузить daisi API и совершать звонки

Это та же самая функция, которая присутствовала в нашем app.py выше. Теперь он доступен как конечная точка Python, которую можно вызывать где угодно.

smartai_invoice.make_tables(document).value

Добавьте пользовательский интерфейс с помощью Streamlit

Платформа Daisi может отображать интерфейс, разработанный с помощью Streamlit. Это отличный способ позволить вашим пользователям протестировать и понять, на что способны ваши маргаритки.

Когда вы импортируете streamlit в свой код, кнопка Запустить приложение будет активна на странице Daisi в app.daisi.io, а также

Вы можете найти Streamlit-код вышеуказанного приложения на github.

Также я сделал видео на YouTube для этого урока. Связь-

Заключение

Вот и все, мы успешно развернули нашу модель на платформе Daisi!

Чтобы еще раз подчеркнуть это, мы создали управляемую, безопасную, масштабируемую конечную точку вывода, которая запускает наш собственный обработчик, включая нашу пользовательскую логику.

Это позволит специалистам по данным и инженерам по машинному обучению сосредоточиться на исследованиях и разработках, улучшая модель, а не возясь с темами MLOps.

Спасибо