O blog da AWS

Ganhando escala com a extração automatizada de informações de imagens de documentos utilizando o Amazon Textract

Por Gabriel Marchelli (Startups Solution Architect)

Empresas de diferentes setores e tamanhos tiveram uma aceleração no ritmo de Transformação Digital nos últimos anos, principalmente devido a pandemia de COVID-19, que obrigou as organizações a adiantarem cronogramas de digitalização que estavam previstos para os próximos anos para serem realizados em poucos meses. Entre os processos que foram digitalizados se destaca o de fluxo de documentos, mesmo que a utilização de documentos em papel esteja em queda ano após ano muitas organizações ainda trabalham com documentos físicos no seu dia a dia.

Uma demanda muito presente nas rotinas das empresas é a necessidade de extração dos dados dos documentos físicos e inserção manual em sistemas como ERPs, planilhas, Banco de Dados, entre outros, o que de fato é um trabalho oneroso considerando o tempo e esforço dos funcionários para realizar tal atividade repetitiva.

A AWS oferece um serviço que pode ser incorporado na arquitetura de TI das empresas para auxiliar na extração das informações dos documentos, o Amazon Textract.

O objetivo desse artigo é compartilhar uma arquitetura focada na extração e análise de informações de formulários, e explorar um pouco as possibilidades que esse serviço pode trazer. Além de se aprofundar nas funcionalidades do Amazon Textract, vamos trazer um passo a passo de uma possível arquitetura.

O que é o Amazon Textract?

É um serviço com machine learning auto-gerenciado, que extrai dados de formulários, tabelas, manuscritos, dados de documentos digitalizados, entre outros. O serviço se diferencia em relação a outros serviços de OCR (Optical Character Recognition), processo que converte uma imagem de texto em um formato de texto legível por máquina que visam apenas a extração do texto dos documentos, uma vez que o Amazon Textract é capaz de extrair dados de formulários e tabelas e disponibilizar essas informações no formato chave-valor.

A extração de dados com o Amazon Textract é compatível com diferentes formatos de arquivos como PDF, JPG, PNG e TIFF. Também é possível adicionar revisões humanas com o serviço Amazon Augmented AI.

Sempre que falamos sobre dados de documentos vem à tona a questão da segurança, o Amazon Textract trabalha com segurança e conformidade por meio de privacidade de dados robusta, criptografia, controles de segurança e suporte a padrões de conformidade, como HIPAA, GDPR entre outros.

Existem diversas aplicações para o Amazon Textract nos diferentes segmentos:

  • Serviços Financeiros: Extração de dados críticos como solicitações de empréstimos, formulários diversos, faturas e recibos, entre outros;
  • Área da Saúde: Extração de dados de prontuários médicos, solicitações de exames médicos, atestados médicos, formulários de admissão, receitas médicas e muito mais;
  • Setor Público: Extração de dados relacionados com o governo, como formulários manuais de recolhimento de impostos, solicitação de emissão de documentos para o cidadão, entre outros;
  • Você pode encontrar casos de uso do Amazon Textract clicando aqui.

Para exemplificar o funcionamento do Amazon Textract, analisaremos os resultados da extração do documento abaixo, se trata de um modelo simples de formulário de cadastro, com utilização de diferentes tipos de caligrafia (os dados do formulário são fictícios):

Primeiramente irei fazer a extração dos dados do formulário utilizando as opções de demo do Amazon Textract disponível na console da AWS, é possível assistir o passo-a-passo clicando aqui.

No decorrer do artigo irei demonstrar a utilização do Amazon Textract por meio da API e demonstrar a utilização do serviço dentro de uma arquitetura, exemplo em Python de uma chamada de API para o Amazon Textract:

      response = textract.analyze_document(

            Document={

                "S3Object": {

                    "Bucket": bucketname,

                    "Name": filename,

                }

            },

            FeatureTypes=["FORMS", "TABLES"],

        )

Após o upload do documento para extração das informações no Amazon Textract, obtivemos o seguinte resultado (captura da tela do serviço):

Analisando o resultado da extração percebemos que o serviço identificou o documento como um formulário, e disponibilizou as informações por meio de “chave-valor”. Essa extração pode ser incorporada dentro de uma arquitetura, sendo inserida em um Banco de Dados e analisada, os usuários podem ser notificados caso necessário alguma alteração ou obtenção de mais informações.

Sugestão de Arquitetura

A arquitetura em questão demonstra a funcionalidade do Amazon Textract dentro de um fluxo simplificado de tratativa de documentos, utilizamos uma arquitetura serveless que não necessita de configurações a nível de servidor e nem realização de atividades a nível de sistema operacional, além de oferecer um menor custo para a implantação do cenário.

Na arquitetura proposta a única interação do usuário é no upload do arquivo que será processado, todo o restante do fluxo será realizado de forma automática. Em resumo a solução proposta nesse exemplo funciona da seguinte maneira:

  1. Upload da imagem (etapa 1 da arquitetura): O repositório de imagens (Amazon S3) é um “Bucket” para upload dos arquivos que serão analisados, esse repositório utiliza o Amazon S3 que é o serviço de armazenamento de objetos da AWS. O arquivo pode ser carregado no “Bucket” acessando diretamente sua conta da AWS pelo navegador, entretanto é possível configurar sua aplicação para fazer o processo de upload no “Bucket” através de APIs ou via SDK (Software Development Kit). É necessário configurar que ao ser carregado um novo arquivo dentro no “Bucket” do Amazon S3, a função do AWS Lambda “Processar Imagem” seja executada automaticamente, seguem instruções no link.

 

  1. Processar Imagem (etapa 2): Essa função do AWS Lambda tem o papel de processar os arquivos do “Bucket”, todo o novo arquivo carregado no “Bucket” é trabalhado pela função no AWS Lambda, a função solicita que o arquivo seja analisado pelo Amazon Textract, recebe as informações depois de processadas no formato chave-valor, converte essas informações para um arquivo no formato “.json” e salva o arquivo no segundo Bucket do Amazon S3 (etapa 3). A razão de salvarmos o arquivo em um segundo local e não inserirmos diretamente no Banco de Dados é construir uma arquitetura de maneira mais desacoplada.

Caso queira, você pode utilizar o código em Python abaixo como sugestão. Esse código trabalha com o AWS SDK para Python (boto3), e foi originalmente escrito para Python 3.9, é necessário substituir no código o campo [INSERIR O NOME DO BUCKET DO AMAZON S3 CRIADO PARA OS ARQUIVOS .JSON] para o nome do “Bucket” que você deseja salvar os arquivos no formato .json. Você pode consultar os logs da função no Amazon CloudWatch.

 

import boto3

from pprint import pprint

from parser import (

    extract_text,

    map_word_id,

    extract_table_info,

    get_key_map,

    get_value_map,

    get_kv_map,

)

 

 

def lambda_handler(event, context):

    textract = boto3.client("textract")

    if event:

        file_obj = event["Records"][0]

        bucketname = str(file_obj["s3"]["bucket"]["name"])

        filename = str(file_obj["s3"]["object"]["key"])

 

        print(f"Bucket: {bucketname} ::: Key: {filename}")

 

        response = textract.analyze_document(

            Document={

                "S3Object": {

                    "Bucket": bucketname,

                    "Name": filename,

                }

            },

            FeatureTypes=["FORMS", "TABLES"],

        ) 

        print(json.dumps(response))

 

        raw_text = extract_text(response, extract_by="LINE")

        word_map = map_word_id(response)

        table = extract_table_info(response, word_map)

        key_map = get_key_map(response, word_map)

        value_map = get_value_map(response, word_map)

        final_map = get_kv_map(key_map, value_map)

 

        print(json.dumps(final_map))

       

        s3 = boto3.client('s3')

       

        bucket = "[INSERIR O NOME DO BUCKET DO AMAZON S3 CRIADO PARA OS ARQUIVOS .JSON]"

       

        json_filename = filename + '.json'

           

        uploadByteStream = bytes(json.dumps(final_map).encode('UTF-8'))

           

        s3.put_object(Bucket=bucket, Key=json_filename, Body=uploadByteStream)

           

        print('Upload')

       

    return {"statusCode": 200, "body": json.dumps("OK")}

   

Imagem do arquivo no formato “.json” e do “Bucket” (etapa 3 da arquitetura) após a extração do formulário:

É preciso configurar que ao ser carregado um novo arquivo dentro no “Bucket” do Amazon S3, a função do AWS Lambda “Upload DynamoDB” (etapa 4) seja executada automaticamente, seguem instruções no link.

  1. Upload DynamoDB (AWS Lambda): O objetivo dessa função (etapa 4) é carregar os arquivos no formato “.json” salvos no “Bucket” em um Banco de Dados, na arquitetura vamos trabalhar com o Amazon DynamoDB, que é um serviço de Banco de Dados NoSQL rápido e flexível, entretanto o arquivo “.json” pode ser importado em qualquer Banco de Dados compatível (entre eles MySQL, PostgreSQL entre outros). Clique “aqui” para consultar os diferentes Bancos de Dados gerenciados disponíveis na AWS. Você pode utilizar o código em Python abaixo como sugestão. com o AWS SDK para Python (boto3), o código foi originalmente escrito para Python 3.9, é necessário substituir no código o campo [NOME DA SUA TABELA DO AMAZON DYNAMODB] com o nome da sua tabela do DynamoDB, você pode consultar os logs da função no Amazon CloudWatch. É possível consultar o tutorial para criação de tabelas no DynamoDB no link. Segue imagem dos logs no Amazon CloudWatch:

 Sugestão de código:

import boto3

import json

s3_client = boto3.client('s3')

dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):

    bucket = event['Records'][0]['s3']['bucket']['name']

    json_file_name = event['Records'][0]['s3']['object']['key']

    json_object = s3_client.get_object(Bucket=bucket,Key=json_file_name)

    jsonFileReader = json_object['Body'].read()

    jsonDict = json.loads(jsonFileReader)

    table = dynamodb.Table('[NOME DA SUA TABELA DO AMAZON DYNAMODB]')

    table.put_item(Item=jsonDict)

   

    print(bucket)

    print(json_file_name)

    print(str(event))

   

    return 'Done!’

 

  1. Você pode consultar os dados que foram inseridos na tabela do DynamoDB (imagem abaixo), é possível assistir o passo-a-passo de como realizar essa consulta clicando aqui. Os códigos propostos podem ser trabalhados com diferentes formulários, uma vez que não está especificado nenhum campo específico, isso só é possível graças a utilização do DynamoDB que é um banco NoSQL Vale lembrar que esse código pode ser adaptado para ser utilizado por diferentes Bancos de Dados.

Popular um Banco de Dados com os dados extraídos dos documentos é apenas uma das possibilidades, utilizando diferentes serviços voltados para Data lakes e análises na AWS você pode obter informações dos seus dados de forma rápida, escalável e econômica, mais informações e descrição dos diferentes serviços nesse link.

Conclusão

Por mais que a Transformação Digital venha acompanhada da digitalização de processos e documentos nas empresas, muitos cenários ainda exigem a utilização de documentos físicos, entretanto, é importante que as informações presentes nos documentos físicos sejam integradas com os meios digitais. Esse cenário faz, serviços como o Amazon Textract, adquirirem um papel fundamental no processo de digitalização de empresas de diferentes tamanhos e segmentos.

A utilização do Amazon Textract em conjunto com outros serviços dentro de uma arquitetura, possibilita que o usuário vá muito além de simplesmente extrair e armazenar dados dos seus documentos físicos, possibilitando integrá-los com outras aplicações para serem analisados e trabalhados.

Como sugestão de leitura, segue essa pagina que aborda os diferentes aspectos da construção de Data Lakes na AWS, link aqui.

Você pode encontrar a demo da arquitetura proposta no artigo nesse link.

Sobre o Autor

Gabriel é arquiteto de soluções Startups na AWS, com formação em Administração de Empresas pela Universidade de São Paulo e MBA em Gestão de Arquitetura e Infraestrutura pela FIAP. Em quase 10 anos de experiência no mercado de Cloud Computing e de implantação de software, apoiou empresas de diferentes segmentos no mapeamento das necessidades de TI e na implantação de novas tecnologias. Entusiasta da transformação digital, é participante recorrente em eventos de tecnologia e painéis de discussão.