Skip to content

codedbypu/Thai-Election-OCR-Pipeline

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

🗳️ Thai Election Vote Extractor (SuperAI SS6)

🏆 โปรเจคนี้เป็นผลงานจากการแข่งขัน Mini Hackathon ในโครงการ SuperAI Engineer Season 6

ผมได้พัฒนาระบบดึงข้อมูลจากเอกสารผลการเลือกตั้ง (สส.6/1) แบบอัตโนมัติ โดยเน้นไปที่การออกแบบ Pipeline การจัดการภาพ (Computer Vision) เพื่อแก้ปัญหาเอกสารสแกนที่อ่านยากหรือมีรอยพับจากการสแกน และสกัดข้อมูลผ่าน Vision LLM (Typhoon OCR)

📌 Concept

ระบบสกัดข้อมูลคะแนนเสียงเลือกตั้งไทยปี 2026 จากภาพสแกนเอกสารแบบฟอร์ม สส.6/1 ให้อยู่ในรูปแบบโครงสร้างข้อมูลที่นำไปใช้ต่อได้

โปรเจคนี้เป็น Test-set-only competition (ไม่มี Training Data ให้) จึงมุ่งเน้นไปที่:

  • การจัดการภาพสแกนที่บิดเบี้ยวและมีสถาพไม่สมบูรณ์ (Image Pre-processing)
  • การดึงเฉพาะตัวเลขคะแนนเสียงที่ถูกต้อง (OCR & Data Parsing)
  • การประมวลผลหลังการอ่าน (Post-processing) เช่น การแปลงคำอ่านภาษาไทยเป็นตัวเลข

🏗️ Architecture & Pipeline Design

ระบบทำงานผ่าน Pipeline แบบอัตโนมัติ 3 ขั้นตอนหลัก ที่ออกแบบมาเพื่อดึงข้อมูลตารางโดยเฉพาะ:

🔹 Phase 1: Image Pre-processing (OpenCV)

  • Garbage Filtering: ตรวจจับและข้ามหน้ากระดาษเปล่า หรือหน้าที่ไม่มีตารางคะแนน เพื่อประหยัดเวลาและโควต้า API
  • Deskewing: ตรวจจับเส้นและปรับหมุนภาพให้ตรง
  • Enhancement: ปรับคอนทราสต์และเพิ่มความคมชัด (Sharpening) ให้ตัวหนังสือ
  • Table Cropping: ค้นหาพิกัดและตัดภาพมาเฉพาะส่วนตารางคะแนน เพื่อลดภาระ (Noise) ให้กับ OCR

🔹 Phase 2: OCR & Data Extraction (Typhoon API)

  • ส่งภาพตารางที่ผ่านการ Clean แล้วไปยัง Typhoon OCR (Vision LLM)
  • Fallback Mechanism: หากผลคะแนนที่อ่านมาได้ รวมกันแล้วไม่ตรงกับยอดรวม (Checksum Error) ระบบจะทำการส่ง "ภาพต้นฉบับ (Raw Image)" ไปให้ OCR แก้ตัวใหม่อีกรอบเพื่อป้องกันข้อผิดพลาดจาก Image Pre-processing

🔹 Phase 3: Post-processing & Validation

  • ทำความสะอาดผลลัพธ์ HTML ที่สกัดมาจาก OCR
  • สกัดเฉพาะตัวเลขด้วย Regex พร้อมฟังก์ชันพิเศษที่ช่วยแปลง "คำอ่านภาษาไทย" (เช่น หนึ่งร้อยยี่สิบ) เป็นตัวเลขอารบิก ในกรณีที่ตัวเลขในกระดาษอ่านไม่ออก
  • Map ข้อมูลคะแนนเสียงที่ได้ลงใน Submission Template ตาม id

✨ Key Features & Technical Highlights

  • Automated Fallback System: ระบบตรวจสอบความถูกต้องของผลรวมคะแนน (Validation) หากไม่ผ่านจะมีการสลับ Strategy การทำงานอัตโนมัติ
  • Smart Garbage Detection: กรองภาพขยะทิ้งด้วยการวัดความแปรปรวนของสีและขอบภาพ (Edge density) ช่วยเพิ่มความเร็วให้ Pipeline
  • Thai Text-to-Number Conversion: อัลกอริทึม Custom Regex สำหรับแปลงตัวอักษรคำอ่านภาษาไทยให้เป็นตัวเลข เพื่ออุดรอยรั่วเวลา OCR อ่านตัวเลขแหว่ง
  • Multi-threading Execution: ใช้ concurrent.futures จัดการประมวลผลและยิง API หลายภาพพร้อมกัน ช่วยลดระยะเวลาทำงานโดยรวม

🛠️ Tech Stack

  • Language: Python 3 (รันและพัฒนาบน Google Colab)
  • Computer Vision: OpenCV, numpy (Morphology, Canny Edge, Hough Lines)
  • OCR / Vision LLM: Typhoon OCR API
  • Data Processing: pandas, BeautifulSoup4, re (Regex)
  • Concurrency: concurrent.futures.ThreadPoolExecutor

🚀 How to Run

เนื่องจากไม่มีโฟลเดอร์ Data ให้ หากต้องการนำไปรันเพื่อทดสอบ จำเป็นต้องเตรียมโครงสร้างโฟลเดอร์ให้ถูกต้องดังนี้:

1. โครงสร้างโฟลเดอร์ (Directory Strucหture)

├── data/
│   ├── images/                    # ใส่ภาพสแกนเอกสาร PNG ที่นี่
│   └── submission_template.csv # ไฟล์ Template อ้างอิง
├── output/                        # โฟลเดอร์สำหรับเก็บผลลัพธ์และ log
└── thai_election_OCR_pipeline.ipynb        # โค้ดหลัก

2. ติดตั้ง Dependencies

pip install openai python-levenshtein lxml opencv-python-headless tqdm pandas beautifulsoup4 requests

3. ตั้งค่า API Key

ตั้งค่า Environment Variable สำหรับ API Key ของ Typhoon ก่อนรัน (บน Colab สามารถใช้ userdata.get() ได้เลย)

export TYPHOON_OCR_API_KEY="your-api-key-here"

4. รัน Pipeline

รันไฟล์ .ipynb ระบบจะเคลียร์ภาพและประมวลผล ผลลัพธ์สุดท้ายจะถูกบันทึกเป็นไฟล์ .csv ในโฟลเดอร์ output/

About

Automated OCR pipeline for extracting Thai election vote counts (Form สส.6/1) - SuperAI SS6 Hackathon Project.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors