สร้างระบบสกัดข้อมูลจากใบแจ้งหนี้ด้วย 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 ลงใน
PATHenvironment variable - macOS: ใช้ Homebrew:
brew install tesseract - Linux (Debian/Ubuntu):
sudo apt-get update && sudo apt-get install tesseract-ocr
- Windows: ดาวน์โหลดและติดตั้งจาก Tesseract at UB Mannheim อย่าลืมเพิ่ม Tesseract ลงใน
- ติดตั้ง 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 ทำงานได้แม่นยำยิ่งขึ้น หากใบแจ้งหนี้มีหลายภาษา ให้ระบุภาษาทั้งหมดที่เกี่ยวข้อง
การจัดการกับรูปแบบใบแจ้งหนี้ที่หลากหลาย
ใบแจ้งหนี้มีรูปแบบที่หลากหลาย ซึ่งเป็นความท้าทายที่สำคัญในการสร้างระบบสกัดข้อมูลที่เชื่อถือได้ เราต้องพิจารณาถึงปัจจัยต่างๆ เช่น เลย์เอาต์ของเอกสาร, ฟอนต์, ขนาดตัวอักษร, และคุณภาพของภาพ
แนวทางในการจัดการกับความหลากหลายของรูปแบบ:
- การประมวลผลภาพล่วงหน้า:
- การปรับปรุงความคมชัด: ใช้ฟังก์ชันปรับปรุงความคมชัดของ
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 - การปรับปรุงความคมชัด: ใช้ฟังก์ชันปรับปรุงความคมชัดของ
- การใช้ 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 - การใช้ Template Matching:
- สร้าง template สำหรับรูปแบบใบแจ้งหนี้ที่แตกต่างกัน และใช้ template matching เพื่อระบุรูปแบบของใบแจ้งหนี้
- เมื่อระบุรูปแบบได้แล้ว เราสามารถใช้ตำแหน่งที่แน่นอนใน template เพื่อสกัดข้อมูล
- การใช้ 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) เพื่อสรุปและสร้างเอกสาร