🏆 โปรเจกต์นี้ ถูกออกแบบและพัฒนาขึ้นเพื่อใช้ส่งเข้าร่วมการแข่งขันในโครงการ Super AI Engineer (Hackathon) เท่านั้น
ระบบสกัดข้อมูล OCR ใบรายงานผลการนับคะแนนเลือกตั้ง (ส.ส. 6/1) ปี 2569
ออกแบบมาเพื่อดึงข้อมูลแบบมีโครงสร้างจากภาพสแกนเอกสารผลการเลือกตั้ง (ฟอร์ม สส.6/1) สำหรับการเลือกตั้งทั่วไปของไทย
โปรเจกต์นี้ใช้เทคโนโลยีคอมพิวเตอร์วิทัศน์ (OpenCV) เพื่อทำความสะอาดและเตรียมภาพสแกนเอกสาร ก่อนจะส่งไปให้ Typhoon OCR API ดึงข้อมูลตารางออกมา โดยมีระบบตรวจสอบความถูกต้องในตัว เช่น แปลงคำอ่านตัวเลขภาษาไทยเป็นตัวเลขอารบิก ตรวจสอบผลรวมคะแนน และจัดรูปแบบผลลัพธ์ออกเป็นไฟล์ CSV พร้อมส่ง
✨ ฟีเจอร์หลัก
การเตรียมรูปภาพขั้นสูง (Advanced Image Preprocessing):
ตรวจจับและครอบตัด (Crop) เฉพาะส่วนที่เป็นตารางอัตโนมัติ
แก้ความเอียงของภาพสแกน (Deskew)
ปรับความคมชัด ลดจุดรบกวน (Noise) โดยใช้ CLAHE และการทำ Sharpening
ขีดเส้นกริด (แนวนอน/แนวตั้ง) ทับโครงสร้างตารางเดิม เพื่อช่วยให้ AI (OCR) อ่านขอบเขตตารางได้แม่นยำขึ้น
การวิเคราะห์และตรวจสอบข้อมูลอัจฉริยะ (Intelligent Data Parsing & Validation):
แยกตรรกะการประมวลผลสำหรับ ส.ส. เขต และ ส.ส. บัญชีรายชื่อ (Party List) ออกจากกัน
สามารถแปลงตัวเลขที่เขียนเป็นตัวอักษรไทย (เช่น "หนึ่งร้อย") เป็นตัวเลขจำนวนเต็ม เพื่อนำมาตรวจสอบความถูกต้อง (Cross-validation) กับช่องตัวเลข
ตรวจสอบผลรวมคะแนนและการเรียงลำดับเบอร์พรรคอัตโนมัติ
ระบบกู้คืน (Fallback): หากภาพที่ปรับแต่งแล้วอ่านผลรวมคะแนนไม่ตรง ระบบจะดึงภาพต้นฉบับมาลองส่ง OCR ใหม่อัตโนมัติ
ประสิทธิภาพสูง (High Performance):
ประมวลผลแบบคู่ขนาน (Multi-threading) ทั้งในขั้นตอนการแต่งภาพและการเรียกใช้ API
มีระบบรอและส่งใหม่ (Exponential Backoff) เมื่อระบบเจอข้อจำกัดการเรียก API (Rate limit) หรือ Timeout
ระบบแคช (Cache) บันทึกไฟล์ HTML ผลลัพธ์ลงเครื่อง เพื่อป้องกันการเรียก API ซ้ำซ้อนและช่วยประหยัดโควต้า
หน้าตา UI สวยงามน่าใช้: แสดงแถบความคืบหน้า (Progress bar) และการแจ้งเตือนสถานะต่างๆ ผ่านไลบรารี rich
🛠️ สิ่งที่ต้องมีและการติดตั้ง
แนะนำให้ใช้ Python 3.8+
ติดตั้งไลบรารี (Dependencies) ที่จำเป็นทั้งหมด:
pip install opencv-python-headless numpy pillow pandas tqdm beautifulsoup4 typhoon-ocr rich
⚙️ การตั้งค่าและการเตรียมความพร้อม
ก่อนที่จะเริ่มรันสคริปต์ คุณจำเป็นต้องระบุ Typhoon OCR API Key ของคุณลงไปในโค้ดก่อน:
api_key = "sk-ใส่_API_KEY_ของคุณที่นี่" os.environ["TYPHOON_OCR_API_KEY"] = api_key.strip()
🚀 วิธีการใช้งาน
หากคุณใช้งานผ่าน Jupyter Notebook หรือ Google Colab ให้รัน (Execute) เซลล์ทั้งหมดตามลำดับจากบนลงล่าง
ลำดับการทำงานของระบบเมื่อกดรัน:
ขั้นตอนการเตรียมภาพ: ระบบจะสแกนหาภาพทั้งหมดจากโฟลเดอร์ images/ ทำการปรับความชัด ลดความเอียง และบันทึกภาพที่ปรับแต่งแล้วไปที่โฟลเดอร์ images_clean/
ขั้นตอน OCR: ภาพที่ผ่านการปรับแต่งจะถูกส่งไปที่ Typhoon OCR API ผลลัพธ์ที่ได้กลับมาจะเป็นตาราง HTML ดิบ ซึ่งจะถูกนำไปเซฟเก็บไว้ที่โฟลเดอร์ ocr_raw_results/ เพื่อเป็นแคช
ขั้นตอนสกัดและตรวจสอบข้อมูล: ระบบจะอ่านโค้ด HTML ตรวจสอบยอดรวมคะแนนของแต่ละใบ และจับคู่คะแนนที่ได้กับ ID ที่อยู่ในไฟล์เทมเพลต CSV
ขั้นตอนส่งออกข้อมูล: จัดทำไฟล์ submission.csv ซึ่งบรรจุข้อมูลคะแนนที่สกัดได้สำเร็จ
ข้อจำกัด API (Rate Limits): โค้ดมี Semaphore เพื่อควบคุมจำนวนการยิง API พร้อมกัน และใช้ระบบ Exponential Backoff เพื่อหน่วงเวลาและส่งใหม่เมื่อเจอ HTTP 429 (Too Many Requests) หรือ 408 (Timeout)
ข้อผิดพลาดการเซฟไฟล์ทับ: หากไฟล์ submission.csv ปลายทางกำลังถูกเปิดใช้งานอยู่ (เช่น เปิดค้างไว้ในโปรแกรม Excel) และสคริปต์ไม่สามารถบันทึกทับได้ ระบบจะแจ้งเตือนและบันทึกไฟล์สำรองชื่อ submission_backup.csv ให้โดยอัตโนมัติ