跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

สร้างระบบสกัดข้อมูลจากใบแจ้งหนี้ด้วย Python และ Tesseract OCR

บทความนี้แนะนำวิธีการสร้างระบบสกัดข้อมูลจากใบแจ้งหนี้โดยใช้ Python และ Tesseract OCR โดยครอบคลุมตั้งแต่การติดตั้ง, การเขียนโค้ดเพื่อประมวลผลภาพและสกัดข้อความ, ไ...

สร้างระบบสกัดข้อมูลจากใบแจ้งหนี้ด้วย Python และ Tesseract OCR

ในบทความนี้ เราจะลงมือปฏิบัติจริงและสร้างโปรแกรมง่ายๆ เพื่อดึงข้อมูลสำคัญจากใบแจ้งหนี้โดยใช้ Python และ Tesseract OCR เราจะเน้นที่การทำความเข้าใจขั้นตอนการทำงาน, การจัดการกับความท้าทายที่อาจเกิดขึ้น, และแนวทางปฏิบัติที่ดีในการออกแบบระบบสกัดข้อมูล

การติดตั้งและใช้งาน Tesseract OCR

Tesseract OCR เป็นเอ็นจิน OCR แบบโอเพนซอร์สที่ได้รับความนิยมอย่างมากสำหรับการแปลงภาพเป็นข้อความ ก่อนอื่น เราต้องทำการติดตั้ง Tesseract OCR และ Python wrapper สำหรับ Tesseract ที่ชื่อว่า pytesseract

ขั้นตอนการติดตั้ง:

  • ติดตั้ง Tesseract OCR: วิธีการติดตั้งขึ้นอยู่กับระบบปฏิบัติการของคุณ
    • Windows: ดาวน์โหลดและติดตั้งจาก Tesseract at UB Mannheim อย่าลืมเพิ่ม Tesseract ลงใน PATH environment variable
    • macOS: ใช้ Homebrew: brew install tesseract
    • Linux (Debian/Ubuntu): sudo apt-get update && sudo apt-get install tesseract-ocr
  • ติดตั้ง pytesseract: ใช้ pip: pip install pytesseract Pillow (Pillow เป็นไลบรารีสำหรับจัดการรูปภาพ)

การตรวจสอบการติดตั้ง:

หลังจากติดตั้งแล้ว ให้ตรวจสอบว่า Tesseract สามารถใช้งานได้จาก command line โดยพิมพ์ tesseract --version หากแสดงเวอร์ชันของ Tesseract แสดงว่าการติดตั้งสำเร็จ

การเขียนโค้ด Python เพื่อประมวลผลภาพและสกัดข้อความ

เราจะเขียนโค้ด Python เพื่อโหลดภาพใบแจ้งหนี้, ประมวลผลภาพเบื้องต้น (เช่น ปรับปรุงความคมชัด), และใช้ Tesseract OCR เพื่อสกัดข้อความ

from PIL import Image
import pytesseract

# กำหนด path ไปยัง Tesseract executable (จำเป็นถ้าไม่ได้อยู่ใน PATH)
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def extract_text_from_image(image_path):
  """
  สกัดข้อความจากภาพโดยใช้ Tesseract OCR

  Args:
    image_path: path ไปยังไฟล์ภาพ

  Returns:
    ข้อความที่สกัดได้
  """
  try:
    img = Image.open(image_path)
    text = pytesseract.image_to_string(img, lang='tha+eng') # ระบุภาษาที่ต้องการ
    return text
  except FileNotFoundError:
    return "Error: Image file not found."
  except Exception as e:
    return f"Error: An error occurred during OCR processing: {e}"

# ตัวอย่างการใช้งาน
image_path = 'invoice.png' # เปลี่ยนเป็น path ของภาพใบแจ้งหนี้ของคุณ
extracted_text = extract_text_from_image(image_path)
print(extracted_text)

คำอธิบายโค้ด:

  • เรานำเข้าไลบรารี PIL (Pillow) สำหรับจัดการรูปภาพ และ pytesseract สำหรับการใช้งาน Tesseract OCR ผ่าน Python
  • ฟังก์ชัน extract_text_from_image รับ path ของไฟล์ภาพเป็น input และคืนค่าเป็นข้อความที่สกัดได้
  • pytesseract.image_to_string() เป็นฟังก์ชันหลักที่ใช้ในการสกัดข้อความจากภาพ พารามิเตอร์ lang ใช้สำหรับระบุภาษาของข้อความในภาพ (ในตัวอย่างนี้คือภาษาไทยและภาษาอังกฤษ)
  • เราจัดการกับข้อผิดพลาดที่อาจเกิดขึ้น เช่น ไฟล์ภาพไม่พบ หรือเกิดข้อผิดพลาดระหว่างการประมวลผล OCR

เหตุผลเชิงออกแบบและ Trade-offs:

  • การเลือกไลบรารี: เราเลือก PIL เพราะเป็นไลบรารีที่ใช้งานง่ายและมีฟังก์ชันการทำงานที่เพียงพอสำหรับการประมวลผลภาพเบื้องต้น หากต้องการฟังก์ชันการทำงานที่ซับซ้อนมากขึ้น อาจพิจารณาใช้ OpenCV
  • การจัดการข้อผิดพลาด: การจัดการข้อผิดพลาดเป็นสิ่งสำคัญเพื่อให้โปรแกรมทำงานได้อย่างราบรื่นและให้ข้อมูลที่เป็นประโยชน์แก่ผู้ใช้เมื่อเกิดข้อผิดพลาด
  • การระบุภาษา: การระบุภาษาที่ถูกต้องช่วยให้ Tesseract OCR ทำงานได้แม่นยำยิ่งขึ้น หากใบแจ้งหนี้มีหลายภาษา ให้ระบุภาษาทั้งหมดที่เกี่ยวข้อง

การจัดการกับรูปแบบใบแจ้งหนี้ที่หลากหลาย

ใบแจ้งหนี้มีรูปแบบที่หลากหลาย ซึ่งเป็นความท้าทายที่สำคัญในการสร้างระบบสกัดข้อมูลที่เชื่อถือได้ เราต้องพิจารณาถึงปัจจัยต่างๆ เช่น เลย์เอาต์ของเอกสาร, ฟอนต์, ขนาดตัวอักษร, และคุณภาพของภาพ

แนวทางในการจัดการกับความหลากหลายของรูปแบบ:

  1. การประมวลผลภาพล่วงหน้า:
    • การปรับปรุงความคมชัด: ใช้ฟังก์ชันปรับปรุงความคมชัดของ PIL หรือ OpenCV เพื่อให้ข้อความในภาพชัดเจนขึ้น
    • การปรับแก้การเอียง: หากภาพใบแจ้งหนี้เอียง ให้ทำการปรับแก้การเอียงก่อนที่จะทำการสกัดข้อความ
    • การแปลงเป็นภาพขาวดำ: การแปลงภาพเป็นภาพขาวดำ (grayscale) สามารถช่วยลด noise และปรับปรุงความแม่นยำของ OCR
        from PIL import ImageEnhance
    
        def preprocess_image(image_path):
          """
          ประมวลผลภาพล่วงหน้าเพื่อปรับปรุงคุณภาพของภาพ
    
          Args:
            image_path: path ไปยังไฟล์ภาพ
    
          Returns:
            ภาพที่ถูกประมวลผลแล้ว
          """
          img = Image.open(image_path)
    
          # ปรับปรุงความคมชัด
          enhancer = ImageEnhance.Contrast(img)
          img = enhancer.enhance(2.0) # ปรับค่า enhancement ตามความเหมาะสม
    
          # (Optional) แปลงเป็นภาพขาวดำ
          # img = img.convert('L')
    
          return img
        
  2. การใช้ Regular Expressions (Regex):
    • ใช้ Regex เพื่อค้นหาและสกัดข้อมูลที่มีรูปแบบเฉพาะ เช่น หมายเลขใบแจ้งหนี้, วันที่, และยอดรวม
    • Regex ช่วยให้เราสามารถระบุรูปแบบของข้อมูลที่เราต้องการได้อย่างแม่นยำ
        import re
    
        def extract_invoice_number(text):
          """
          สกัดหมายเลขใบแจ้งหนี้จากข้อความโดยใช้ Regular Expression
    
          Args:
            text: ข้อความที่สกัดได้จากภาพ
    
          Returns:
            หมายเลขใบแจ้งหนี้ (ถ้าพบ) หรือ None
          """
          pattern = r"Invoice\s*No\.\s*(\w+)" # ตัวอย่าง pattern สำหรับหมายเลขใบแจ้งหนี้
          match = re.search(pattern, text, re.IGNORECASE)
          if match:
            return match.group(1)
          else:
            return None
        
  3. การใช้ Template Matching:
    • สร้าง template สำหรับรูปแบบใบแจ้งหนี้ที่แตกต่างกัน และใช้ template matching เพื่อระบุรูปแบบของใบแจ้งหนี้
    • เมื่อระบุรูปแบบได้แล้ว เราสามารถใช้ตำแหน่งที่แน่นอนใน template เพื่อสกัดข้อมูล
  4. การใช้ Machine Learning (ML):
    • ฝึกโมเดล ML เพื่อจำแนกประเภทของใบแจ้งหนี้ และสกัดข้อมูลโดยอัตโนมัติ
    • โมเดล ML สามารถเรียนรู้จากข้อมูลจำนวนมากและปรับตัวเข้ากับรูปแบบใบแจ้งหนี้ที่หลากหลาย

ข้อควรพิจารณาเพิ่มเติม:

  • คุณภาพของภาพ: คุณภาพของภาพมีผลต่อความแม่นยำของ OCR อย่างมาก พยายามใช้ภาพที่มีความละเอียดสูงและคมชัด
  • การเลือกฟอนต์: Tesseract OCR ทำงานได้ดีกับฟอนต์ที่พบบ่อย หากใบแจ้งหนี้ใช้ฟอนต์ที่ผิดปกติ อาจจำเป็นต้องฝึก Tesseract OCR ด้วยฟอนต์นั้นๆ
  • การทดสอบและปรับปรุง: ทดสอบระบบสกัดข้อมูลกับใบแจ้งหนี้จำนวนมาก และปรับปรุงโค้ดอย่างต่อเนื่องเพื่อเพิ่มความแม่นยำและความครอบคลุม

แนวปฏิบัติที่ดี:

  • Modular Design: ออกแบบโค้ดให้เป็น modular เพื่อให้ง่ายต่อการบำรุงรักษาและปรับปรุง
  • Code Documentation: เขียน documentation ที่ชัดเจนเพื่อให้ผู้อื่นเข้าใจโค้ดของคุณได้ง่าย
  • Version Control: ใช้ version control (เช่น Git) เพื่อติดตามการเปลี่ยนแปลงของโค้ด

ในบทความนี้ เราได้เรียนรู้วิธีการสร้างระบบสกัดข้อมูลจากใบแจ้งหนี้โดยใช้ Python และ Tesseract OCR เราได้ครอบคลุมถึงการติดตั้ง Tesseract OCR, การเขียนโค้ด Python เพื่อประมวลผลภาพและสกัดข้อความ, และการจัดการกับรูปแบบใบแจ้งหนี้ที่หลากหลาย ในบทความถัดไป เราจะสำรวจการใช้ Large Language Models (LLMs) เพื่อสรุปและสร้างเอกสาร

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务