🏆 โปรเจคนี้เป็นผลงานจากการแข่งขัน Mini Hackathon ในโครงการ SuperAI Engineer Season 6
ผมได้พัฒนาระบบดึงข้อมูลจากเอกสารผลการเลือกตั้ง (สส.6/1) แบบอัตโนมัติ โดยเน้นไปที่การออกแบบ Pipeline การจัดการภาพ (Computer Vision) เพื่อแก้ปัญหาเอกสารสแกนที่อ่านยากหรือมีรอยพับจากการสแกน และสกัดข้อมูลผ่าน Vision LLM (Typhoon OCR)
ระบบสกัดข้อมูลคะแนนเสียงเลือกตั้งไทยปี 2026 จากภาพสแกนเอกสารแบบฟอร์ม สส.6/1 ให้อยู่ในรูปแบบโครงสร้างข้อมูลที่นำไปใช้ต่อได้
โปรเจคนี้เป็น Test-set-only competition (ไม่มี Training Data ให้) จึงมุ่งเน้นไปที่:
- การจัดการภาพสแกนที่บิดเบี้ยวและมีสถาพไม่สมบูรณ์ (Image Pre-processing)
- การดึงเฉพาะตัวเลขคะแนนเสียงที่ถูกต้อง (OCR & Data Parsing)
- การประมวลผลหลังการอ่าน (Post-processing) เช่น การแปลงคำอ่านภาษาไทยเป็นตัวเลข
ระบบทำงานผ่าน Pipeline แบบอัตโนมัติ 3 ขั้นตอนหลัก ที่ออกแบบมาเพื่อดึงข้อมูลตารางโดยเฉพาะ:
- Garbage Filtering: ตรวจจับและข้ามหน้ากระดาษเปล่า หรือหน้าที่ไม่มีตารางคะแนน เพื่อประหยัดเวลาและโควต้า API
- Deskewing: ตรวจจับเส้นและปรับหมุนภาพให้ตรง
- Enhancement: ปรับคอนทราสต์และเพิ่มความคมชัด (Sharpening) ให้ตัวหนังสือ
- Table Cropping: ค้นหาพิกัดและตัดภาพมาเฉพาะส่วนตารางคะแนน เพื่อลดภาระ (Noise) ให้กับ OCR
- ส่งภาพตารางที่ผ่านการ Clean แล้วไปยัง Typhoon OCR (Vision LLM)
- Fallback Mechanism: หากผลคะแนนที่อ่านมาได้ รวมกันแล้วไม่ตรงกับยอดรวม (Checksum Error) ระบบจะทำการส่ง "ภาพต้นฉบับ (Raw Image)" ไปให้ OCR แก้ตัวใหม่อีกรอบเพื่อป้องกันข้อผิดพลาดจาก Image Pre-processing
- ทำความสะอาดผลลัพธ์ HTML ที่สกัดมาจาก OCR
- สกัดเฉพาะตัวเลขด้วย Regex พร้อมฟังก์ชันพิเศษที่ช่วยแปลง "คำอ่านภาษาไทย" (เช่น หนึ่งร้อยยี่สิบ) เป็นตัวเลขอารบิก ในกรณีที่ตัวเลขในกระดาษอ่านไม่ออก
- Map ข้อมูลคะแนนเสียงที่ได้ลงใน Submission Template ตาม
id
- 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 หลายภาพพร้อมกัน ช่วยลดระยะเวลาทำงานโดยรวม
- 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
เนื่องจากไม่มีโฟลเดอร์ Data ให้ หากต้องการนำไปรันเพื่อทดสอบ จำเป็นต้องเตรียมโครงสร้างโฟลเดอร์ให้ถูกต้องดังนี้:
├── data/
│ ├── images/ # ใส่ภาพสแกนเอกสาร PNG ที่นี่
│ └── submission_template.csv # ไฟล์ Template อ้างอิง
├── output/ # โฟลเดอร์สำหรับเก็บผลลัพธ์และ log
└── thai_election_OCR_pipeline.ipynb # โค้ดหลัก
pip install openai python-levenshtein lxml opencv-python-headless tqdm pandas beautifulsoup4 requestsตั้งค่า Environment Variable สำหรับ API Key ของ Typhoon ก่อนรัน (บน Colab สามารถใช้ userdata.get() ได้เลย)
export TYPHOON_OCR_API_KEY="your-api-key-here"รันไฟล์ .ipynb ระบบจะเคลียร์ภาพและประมวลผล ผลลัพธ์สุดท้ายจะถูกบันทึกเป็นไฟล์ .csv ในโฟลเดอร์ output/