Optical Character Recognition (OCR) dengan Document AI dan Python

1. Ringkasan

Pengantar Lab

Apa itu Document AI?

Document AI adalah solusi pemahaman dokumen yang mengambil data tidak terstruktur (misalnya dokumen, email, invoice, formulir, dll.) dan mempermudah data untuk dipahami, dianalisis, serta digunakan. API ini menyediakan struktur melalui klasifikasi konten, ekstraksi entitas, penelusuran lanjutan, dan lainnya.

Di lab ini, Anda akan mempelajari cara melakukan Pengenalan Karakter Optik menggunakan Document AI API dengan Python.

Kami akan menggunakan file PDF dari novel klasik "Winnie the Pooh" oleh AA Milne, yang baru-baru ini menjadi bagian dari Domain Publik di Amerika Serikat. File ini dipindai dan didigitalkan oleh Google Buku.

Yang akan Anda pelajari

  • Cara mengaktifkan Document AI API
  • Cara mengautentikasi permintaan API
  • Cara menginstal library klien untuk Python
  • Cara mengurai teks dari file PDF
  • Cara menjalankan permintaan asinkron menggunakan Google Cloud Storage

Yang Anda butuhkan

  • Project Google Cloud
  • Browser, seperti Chrome atau Firefox
  • Pemahaman tentang Python (3.7+)

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

cae48e4b2e19921d.png

Pada dialog berikutnya, setujui persyaratan layanan dengan mengklik tombol "Setuju dan Lanjutkan":

27d87930a0daf2f8.png

Setelah menyetujui persyaratan layanan, Anda akan dialihkan ke halaman ringkasan penagihan yang menyertakan panel seperti ini di dekat pojok kanan bawah:

2076ea7aa9bf3f65.png

Terakhir, ketika membuat project pertama, Anda akan melihat dialog yang memungkinkan Anda menetapkan akun penagihan ke project Anda. Pilih akun penagihan yang terkait dengan kredit gratis Anda, lalu klik tombol buat:

dd3b0e795843296.png

Singkatnya, sekarang Anda memiliki akun penagihan dan project, dan kedua entity tersebut ditautkan sedemikian rupa sehingga semua pekerjaan yang Anda lakukan di codelab hari ini akan didanai oleh kredit gratis Anda**.**

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.)

Pilih Project

Project Baru

Mendapatkan Project ID

Ingat Project ID, nama unik di semua project Google Cloud. (Maaf, ID Project di atas telah digunakan dan tidak akan berfungsi untuk Anda). Anda harus memberikan ID ini nanti sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Pastikan untuk mengikuti petunjuk di bagian "Membersihkan". Bagian ini memberi tahu Anda cara mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis seharga $300 USD.

Mulai Cloud Shell

Saat menggunakan Google Cloud, Anda dapat mengoperasikannya dari jarak jauh menggunakan laptop, codelab ini menggunakan Google Cloud Shell, lingkungan command line yang dijalankan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell Mengaktifkan Cloud Shell

Mengaktifkan Cloud Shell

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

Pengantar Cloud Shell

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell. Cloud Shell

Cloud Shell memberi Anda akses terminal ke mesin virtual yang dihosting di cloud. Mesin virtual ini mencakup semua alat pengembangan yang akan Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke Project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*      <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3 Mengaktifkan Document AI API

Sebelum dapat mulai menggunakan Document AI, Anda harus mengaktifkan API. Buka Cloud Console di browser Anda.

  1. Dengan menggunakan Kotak Penelusuran di bagian atas konsol, telusuri "Document AI API", lalu klik Aktifkan untuk menggunakan API di project Google Cloud Anda

Telusuri API

  1. Atau, API dapat diaktifkan menggunakan perintah gcloud berikut.
gcloud services enable documentai.googleapis.com

Anda akan melihat yang seperti ini:

Operation "operations/..." finished successfully.

Sekarang, Anda dapat menggunakan Document AI.

4. Membuat dan Menguji Prosesor

Anda harus membuat instance prosesor Document OCR terlebih dahulu yang akan melakukan ekstraksi. Hal ini dapat diselesaikan menggunakan Cloud Console atau Processor Management API.

Cloud Console

  1. Di console, buka Ringkasan Document AI Platform
  2. Klik Create Processor, lalu pilih Document OCRProsesor
  3. Tentukan nama prosesor dan pilih region Anda dari daftar.
  4. Klik Buat untuk membuat prosesor
  5. Salin ID Prosesor Anda. Anda harus menggunakan ini dalam kode nanti. ID Prosesor

Anda dapat menguji prosesor di console dengan mengupload dokumen. Klik Upload Dokumen Pengujian dan pilih dokumen untuk diuraikan.

Anda dapat mendownload file PDF di bawah, yang berisi 3 halaman pertama novel kami.

Halaman Judul

Output Anda akan terlihat seperti ini: Buku yang Diuraikan

Library Klien Phyton

Ikuti codelab ini untuk mempelajari cara mengelola prosesor Document AI dengan Library Klien Python:

Mengelola prosesor Document AI dengan Python - Codelab

5. Melakukan Autentikasi permintaan Firebase

Untuk membuat permintaan ke Document AI API, Anda harus menggunakan Akun Layanan. Akun Layanan merupakan milik project Anda dan digunakan oleh library Klien Python untuk membuat permintaan API. Seperti akun pengguna lainnya, akun layanan diwakili oleh alamat email. Di bagian ini, Anda akan menggunakan Cloud SDK untuk membuat akun layanan, lalu membuat kredensial yang diperlukan untuk melakukan autentikasi sebagai akun layanan.

Pertama, tetapkan variabel lingkungan dengan PROJECT_ID yang akan Anda gunakan di seluruh codelab ini:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

Selanjutnya, buat akun layanan baru untuk mengakses Document AI API dengan menggunakan:

gcloud iam service-accounts create my-docai-sa \
  --display-name "my-docai-service-account"

Selanjutnya, buat kredensial yang digunakan kode Python Anda untuk login sebagai akun layanan baru. Buat kredensial ini dan simpan sebagai file JSON "~/key.json" dengan menggunakan perintah berikut:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

Terakhir, tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS, yang digunakan oleh library untuk menemukan kredensial Anda. Untuk membaca selengkapnya tentang autentikasi formulir ini, lihat panduan. Variabel lingkungan harus ditetapkan ke jalur lengkap file JSON kredensial yang Anda buat, dengan menggunakan:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

6. Instal library klien

Instal library klien:

pip3 install --upgrade google-cloud-documentai
pip3 install --upgrade google-cloud-storage

Anda akan melihat yang seperti ini:

...
Installing collected packages: google-cloud-documentai
Successfully installed google-cloud-documentai-1.2.0
.
.
Installing collected packages: google-cloud-storage
Successfully installed google-cloud-storage-1.43.0

Sekarang, Anda siap untuk menggunakan Document AI API.

Mulai Python Interaktif

Dalam tutorial ini, Anda akan menggunakan penafsir Python interaktif yang disebut IPython. Mulai sesi dengan menjalankan ipython di Cloud Shell. Perintah ini menjalankan penafsir Python dalam sesi interaktif.

ipython

Anda akan melihat sesuatu seperti ini:

Python 3.7.3 (default, Jul 25 2020, 13:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.30.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

7. Download Contoh PDF

Kami memiliki dokumen contoh yang berisi 3 halaman pertama novel.

Anda dapat mendownload PDF menggunakan link berikut. Kemudian, upload ke instance cloudshell.

Anda juga dapat mendownloadnya dari Bucket Google Cloud Storage publik kami menggunakan gsutil.

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh_3_Pages.pdf .

8 Membuat Permintaan Dokumen Proses Sinkron

Pada langkah ini, Anda akan memproses 3 halaman pertama novel menggunakan endpoint sinkron. Metode ini paling cocok untuk dokumen yang lebih kecil yang disimpan secara lokal. Lihat daftar prosesor lengkap untuk mengetahui ukuran halaman dan ukuran file maksimum bagi setiap jenis prosesor.

Salin kode berikut ke sesi iPython:

from google.cloud import documentai_v1 as documentai

def process_document(project_id: str, location: str,
                     processor_id: str, file_path: str,
                     mime_type: str) -> documentai.Document:
    """
    Processes a document using the Document AI API.
    """

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient()

    # The full resource name of the processor, e.g.:
    # projects/project-id/locations/location/processor/processor-id
    # You must create new processors in the Cloud Console first
    resource_name = documentai_client.processor_path(
        project_id, location, processor_id)

    # Read the file into memory
    with open(file_path, "rb") as image:
        image_content = image.read()

        # Load Binary Data into Document AI RawDocument Object
        raw_document = documentai.RawDocument(
            content=image_content, mime_type=mime_type)

        # Configure the process request
        request = documentai.ProcessRequest(
            name=resource_name, raw_document=raw_document)

        # Use the Document AI client to process the sample form
        result = documentai_client.process_document(request=request)

        return result.document

def main():
    """
    Run the codelab.
    """
    project_id = 'YOUR_PROJECT_ID'
    location = 'YOUR_PROJECT_LOCATION'  # Format is 'us' or 'eu'
    processor_id = 'YOUR_PROCESSOR_ID'  # Create processor in Cloud Console

    file_path = 'Winnie_the_Pooh_3_Pages.pdf'  # The local file in your current working directory
    # Refer to https://cloud.google.com/document-ai/docs/processors-list for the supported file types
    mime_type = 'application/pdf'

    document = process_document(project_id=project_id, location=location,
                                processor_id=processor_id, file_path=file_path,
                                mime_type=mime_type)

    print("Document processing complete.")
    print(f"Text: {document.text}")

Panggil fungsi utama, dan Anda akan melihat teks yang diekstrak dan dicetak di console.

main()

Anda akan melihat output berikut jika menggunakan dokumen contoh kami:

Document processing complete.
Text: CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
Here is Edward Bear, coming
downstairs now, bump, bump, bump, on the back
of his head, behind Christopher Robin. It is, as far
as he knows, the only way of coming downstairs,
but sometimes he feels that there really is another
way, if only he could stop bumping for a moment
and think of it. And then he feels that perhaps there
isn't. Anyhow, here he is at the bottom, and ready
to be introduced to you. Winnie-the-Pooh.
When I first heard his name, I said, just as you
are going to say, "But I thought he was a boy?"
"So did I," said Christopher Robin.
"Then you can't call him Winnie?"
"I don't."
"But you said "

...

Digitized by
Google

9. Membuat Permintaan Dokumen Proses Asinkron

Sekarang, misalnya Anda ingin membaca teks dari seluruh novel.

  • Metode process_documents() memiliki batasan jumlah halaman dan ukuran file yang dapat dikirim dan hanya mengizinkan satu file dokumen per panggilan API.
  • Metode batch_process_documents() memungkinkan pemrosesan asinkron dari file yang lebih besar dan pemrosesan batch untuk beberapa file.

Pada langkah ini, kita akan memproses seluruh novel "Winnie the Pooh" dengan Document AI Async API dan mengeluarkan teks ke dalam Bucket Google Cloud Storage.

Upload PDF ke Cloud Storage

Metode batch_process_documents() saat ini menerima file dari Google Cloud Storage. Anda dapat merujuk documentai_v1.types.BatchProcessRequest untuk mengetahui informasi selengkapnya tentang struktur objek.

Untuk contoh ini, Anda dapat menyalin file dari contoh bucket data kami...

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf gs://YOUR_BUCKET_NAME/

...atau Anda dapat mendownload file sampel novel dari link di bawah ini dan menguploadnya ke bucket Anda sendiri.

Anda juga akan memerlukan Bucket GCS untuk menyimpan output API.

Menggunakan metode batch_process_documents()

Salin kode berikut ke sesi iPython:

import re

from google.api_core.operation import Operation
from google.cloud import documentai_v1 as documentai
from google.cloud import storage

def batch_process_documents(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    input_mime_type: str,
    gcs_output_uri: str,
) -> Operation:
    """
    Constructs a request to process a document using the Document AI
    Asynchronous API.
    """
    # You must set the api_endpoint if you use a location other than 'us', e.g.:
    opts = {}
    if location == "eu":
        opts = {"api_endpoint": "eu-documentai.googleapis.com"}

    # Instantiates a client
    documentai_client = documentai.DocumentProcessorServiceClient(client_options=opts)

    # The full resource name of the processor, e.g.:
    # projects/project-id/locations/location/processor/processor-id
    # You must create new processors in the Cloud Console first
    resource_name = documentai_client.processor_path(project_id, location, processor_id)

    # Cloud Storage URI for the Input Document
    input_document = documentai.GcsDocument(
        gcs_uri=gcs_input_uri, mime_type=input_mime_type
    )

    # Load GCS Input URI into a List of document files
    input_config = documentai.BatchDocumentsInputConfig(
        gcs_documents=documentai.GcsDocuments(documents=[input_document])
    )

    # Cloud Storage URI for Output directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri
    )

    # Load GCS Output URI into OutputConfig object
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    # Configure Process Request
    request = documentai.BatchProcessRequest(
        name=resource_name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # Future for long-running operations returned from Google Cloud APIs.
    operation = documentai_client.batch_process_documents(request)

    return operation

def get_documents_from_gcs(
    gcs_output_uri: str, operation_name: str
) -> [documentai.Document]:
    """
    Download the document output from GCS.
    """

    # The GCS API requires the bucket name and URI prefix separately
    match = re.match(r"gs://([^/]+)/(.+)", gcs_output_uri)
    output_bucket = match.group(1)
    prefix = match.group(2)

    # The output files will be in a new subdirectory with the Operation ID as the name
    operation_id = re.search("operations\/(\d+)", operation_name, re.IGNORECASE).group(1)

    output_directory = f"{prefix}/{operation_id}"

    storage_client = storage.Client()

    # List of all of the files in the directory `gs://gcs_output_uri/operation_id`
    blob_list = list(storage_client.list_blobs(output_bucket, prefix=output_directory))

    output_documents = []

    for blob in blob_list:
        # Document AI should only output JSON files to GCS
        if ".json" in blob.name:
            document = documentai.types.Document.from_json(blob.download_as_bytes())
            output_documents.append(document)
        else:
            print(f"Skipping non-supported file type {blob.name}")

    return output_documents

def main():
    """
    Run the codelab.
    """

    project_id = 'YOUR_PROJECT_ID'
    location = 'YOUR_PROJECT_LOCATION'  # Format is 'us' or 'eu'
    processor_id = 'YOUR_PROCESSOR_ID'  # Create processor in Cloud Console

    # Format 'gs://input_bucket/directory/file.pdf'
    gcs_input_uri = "INPUT_BUCKET_URI"
    input_mime_type = "application/pdf"

    # Format 'gs://output_bucket/directory'
    gcs_output_uri = "YOUR_OUTPUT_BUCKET_URI"

    # Batch Process returns a Long Running Operation (LRO)
    operation = batch_process_documents(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        input_mime_type=input_mime_type,
        gcs_output_uri=gcs_output_uri,
    )

    # Format: projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID
    operation_name = operation.operation.name

    # Continually polls the operation until it is complete.
    # This could take some time for larger files
    print(f"Waiting for operation {operation_name} to complete...")
    result = operation.result(timeout=300)

    # NOTE: Can also use callbacks for asynchronous processing
    #
    # def my_callback(future):
    #   result = future.result()
    #
    # operation.add_done_callback(my_callback)

    print("Document processing complete.")

    # Get the Document Objects from the Output Bucket
    document_list = get_documents_from_gcs(
        gcs_output_uri=gcs_output_uri, operation_name=operation_name
    )

    for document in document_list:
        print(document.text)

Panggil fungsi utama, dan Anda akan melihat teks novel lengkap yang diekstrak dan dicetak di konsol.

main()

Mungkin butuh waktu beberapa saat untuk menyelesaikan karena file jauh lebih besar dari contoh sebelumnya. (Oh, merepotkan...)

Namun, dengan API asinkron, Anda akan menerima ID Operasi yang dapat digunakan untuk mendapatkan output dari GCS setelah tugas selesai.

This is a reproduction of a library book that was digitized
by Google as part of an ongoing effort to preserve the
information in books and make it universally accessible.
TM
Google books
https://books.google.com

.....

He nodded and went
out ... and in a moment
I heard Winnie-the-Pooh
-bump, bump, bump-go-ing up the stairs behind
him.
Digitized by
Google

10. Selamat

Anda telah berhasil menggunakan Document AI untuk mengekstrak teks dari novel menggunakan API sinkron dan asinkron.

Sebaiknya Anda bereksperimen dengan dokumen lain dan menjelajahi pemroses lain yang tersedia di platform.

Pembersihan

Agar tidak menimbulkan tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini:

  • Di Cloud Console, buka halaman Mengelola resource.
  • Dalam daftar project, pilih project Anda lalu klik Hapus.
  • Pada dialog, ketik project ID, lalu klik Matikan untuk menghapus project.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.