Skip to content

Mac0-M/Thai-Election-OCR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

Thai-Election-OCR

🏆 โปรเจกต์นี้ ถูกออกแบบและพัฒนาขึ้นเพื่อใช้ส่งเข้าร่วมการแข่งขันในโครงการ 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:

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 ซึ่งบรรจุข้อมูลคะแนนที่สกัดได้สำเร็จ

⚠️ การจัดการข้อผิดพลาด (Error Handling)

ข้อจำกัด API (Rate Limits): โค้ดมี Semaphore เพื่อควบคุมจำนวนการยิง API พร้อมกัน และใช้ระบบ Exponential Backoff เพื่อหน่วงเวลาและส่งใหม่เมื่อเจอ HTTP 429 (Too Many Requests) หรือ 408 (Timeout)

ข้อผิดพลาดการเซฟไฟล์ทับ: หากไฟล์ submission.csv ปลายทางกำลังถูกเปิดใช้งานอยู่ (เช่น เปิดค้างไว้ในโปรแกรม Excel) และสคริปต์ไม่สามารถบันทึกทับได้ ระบบจะแจ้งเตือนและบันทึกไฟล์สำรองชื่อ submission_backup.csv ให้โดยอัตโนมัติ

About

โปรเจกต์นี้พัฒนาขึ้นเพื่อสกัดข้อมูลผลการนับคะแนนจากการเลือกตั้งทั่วไปของไทย ปี 2569 โดยมุ่งเน้นไปที่เอกสารรายงานผลการนับคะแนน (ฟอร์ม ส.ส. 6/1) ระบบถูกออกแบบมาเพื่อแก้ปัญหาความล่าช้าและข้อผิดพลาดจากการกรอกข้อมูลด้วยมนุษย์ โดยการผสานเทคโนโลยีคอมพิวเตอร์วิทัศน์ (Computer Vision) ด้วย OpenCV เข้ากับโมเดล

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors