Python Capture เป็น Desktop application สําหรับรับภาพโปรแกรมภาษา Python ที่เขียนด้วยลายมือบนกระดาษที่ทำเป็นช่องตารางเตรียมไว้ จากนั้นประมวลผลภาพถ่ายนั้น แปลงเป็น source code แล้วแสดงผลการรัน แสดงจุดผิดพลาด และคะแนนที่ได้รับ โดยตรวจสอบความถูกต้องของ source code ด้วยระบบ grader
ส่วน UI เป็นส่วนหลักของโปรแกรม ในที่นี้ได้เขียนส่วน UI ด้วยภาษา Java ผู้ใช้จะทำการเลือกไฟล์โจทย์-เฉลย และไฟล์รูปภาพ จากนั้นจะทำการส่งไฟล์รูปภาพไปยังส่วน OCR เพื่อทำการแปลงรูปภาพเป็นตัวอักษรต่อไป
หมายเหตุ : เนื่องจากโปรแกรมนี้สร้างขึ้นเพื่อทดลองการทำงานเท่านั้น จึง fix directory ของ tesseract และ exe ที่เกี่ยวข้อง หากจะนำไปพัฒนาต่อ จะต้องคำนึงถึงปัจจัยนี้ด้วย
ส่วน OCR จะรับรูปภาพจากส่วน UI และนำมาประมวลผลด้วยวิธีการทาง Computer Vision และ Recognition แล้วได้ผลลัพธ์เป็นไฟล์ตัวอักษรของภาพนั้น จากนั้นจะส่งไฟล์ตัวอักษรกลับไปที่ส่วน UI สำหรับรายละเอียดขั้นตอนการทำงานและทฤษฎีที่เกี่ยวข้องในของส่วน OCR จะอธิบายในหัวข้อถัดไป
เมื่อส่วน UI ได้ผลลัพธ์ที่เป็นไฟล์ตัวอักษรจากส่วน OCR แล้ว จะส่งต่อไปยังส่วน grader ซึ่งในที่นี้เขียนด้วยภาษา Java ส่วน grader จะนำไฟล์ตัวอักษรซึ่งเป็นโปรแกรมภาษา Python มาทำการ compile หาก compile ไม่ผ่าน จะมีการแจ้งให้ทราบถึงจุดที่ผิด เมื่อ compile ผ่านแล้ว จะนำไฟล์โจทย์-เฉลย ที่ได้เลือกไว้ มาใช้เป็น input และตรวจสอบ output ของโปรแกรม เมื่อครบทุกชุดข้อมูลทดสอบแล้ว จะแสดงผลการตรวจโดยมีผลที่เป็นไปได้คือ ถูก (P) ผิด (-) ใช้เวลาเกินที่กำหนด (T) และ runtime-error (X)
ส่วน segmentation จะรับรูปภาพ จากนั้นนำมา preprocess เพื่อให้สามารถนำไปเป็น input ของส่วน recognition ได้ต่อไป โดยจะทำการปรับคุณสมบัติของภาพให้เหมาะสม และแบ่งไฟล์ภาพต้นฉบับออกเป็นช่องย่อย ๆ ตามช่องตาราง ในที่นี้ได้เขียนโปรแกรมด้วยภาษา C++ โดยใช้ OpenCV library และสร้างเป็น Application .exe ให้สามารถใช้งานได้สะดวก
ส่วน recognition จะทำการแปลงไฟล์ภาพย่อย ๆ ของแต่ละช่อง ให้กลายเป็นตัวอักษร ในที่นี้ใช้โปรแกรม OCR สำเร็จรูป tesseract ในการทำ recognition และได้ทำการ train ด้วย train data ที่สร้างขึ้นจากการเก็บข้อมูลลายมือต่าง ๆ
ส่วน context-aware postprocessing เป็นการนำข้อความที่ได้จากการทำ recognition มาแก้ไขให้ถูกต้อง เนื่องจากอาจมีความผิดพลาดจากการทำ recognition อยู่บ้าง โดยมีเทคนิคต่าง ๆ ที่ใช้งานกัน เช่น การใช้ dictionary, bigrams, การพิจารณาจาก program syntax แต่ในที่นี้จะไม่พิจารณากระบวนการในส่วนนี้ เนื่องจากอยู่นอกขอบเขตของรายวิชา
ในช่วงแรกของการทำโครงงาน ได้ทดลองให้ tesseract ทำการ segment ตัวอักษรจากภาพทั้งหน้ากระดาษ จากผลการทดลองพบว่ามีอัตราการ segmentation ผิดพลาดเฉลี่ยร้อยละ 7.45 และมีบางภาพที่ผิดพลาดถึงร้อยละ 42.55 ดังนั้นจึงตัดสินใจทำการ segmentation เป็นช่อง ๆ เอง
ในการทดลองทำ recognition ด้วยโปรแกรม tesseract ได้แบ่งเป็น 6 กรณี คือ การ recognition โดยใช้ train data ที่มาจากลายมือตัวอย่างของ 1, 2, 5, 10, 15 และ 20 คนตามลำดับ ซึ่งผลการทดลองเป็นดังนี้
จำนวนลายมือที่ใช้ในการ train | ร้อยละของการ recognize ที่ถูกต้อง |
ร้อยละของการ recognize ถูกต้อง ถ้ายอมให้ผิดพลาดได้บางแบบ |
---|---|---|
1 | 49.13 | 60.42 |
2 | 48.80 | 60.41 |
5 | 53.95 | 65.13 |
10 | 52.02 | 64.30 |
15 | 49.82 | 62.85 |
20 | 50.38 | 62.57 |
จากข้อมูลพบว่า จำนวนลายมือที่ใช้ในการ train ไม่มีผลต่อความถูกต้องของการรู้จำมากนัก และกลุ่มตัวอักษรที่มีการ recognize ผิด ได้แก่ กลุ่มตัวอักษร Cc, DOo0, , Pp, S5, t+, Uu, Vv, Ww, Xx, Zz, il/\| (สำหรับข้อมูลในส่วนที่สอง อนุญาตให้การ recognize ในกลุ่มเดียวกันนี้ เป็นการ recognize ที่ถูกต้อง) และมีการรู้จำสัญลักษณ์เล็ก ๆ ไม่เจอบ้างเล็กน้อย และโดยรวมแล้วความผิดพลาดในการ recognize เกิดจากสัญลักษณ์พิเศษถึงกว่าร้อยละ 55 - 60
หมายเหตุ : ข้อมูลทางสถิติทั้งหมด จะอยู่ในไฟล์แยกต่างหาก ซึ่งจะประกอบด้วย confusion matrix, สรุปจำนวนการ recognition ที่ถูกและผิด และอัตราการ recognize noise จากช่องว่าง
จากการทำโครงงานและผลการทดลองพบว่า โปรแกรม Python Capture ที่พัฒนาขึ้นสามารถทำงานได้ตามที่ออกแบบไว้ ในส่วน UI และ grader สามารถทำงานได้ถูกต้องดี ในส่วน OCR การ segmentation มีความแม่นยำค่อนข้างสูง จะมีข้อผิดพลาดเฉพาะตัวอักษรที่เขียนติดขอบตารางเท่านั้น แต่ในส่วน recognition พบว่ามีความแม่นยำค่อนข้างต่ำ อยู่ที่ประมาณร้อยละ 48 - 54
โดยสรุปแล้วโปรแกรม Python Capture ที่พัฒนาขึ้นอาจจะยังไม่สามารถนำไปใช้ได้จริง แต่สามารถนำไปพัฒนาต่อโดยการปรับปรุงในส่วนการ recognition ให้มีความแม่นยำมากขึ้น อาจจะทำให้สามารถนำโปรแกรมไปใช้จริงได้ และนอกจากนี้ยังสามารถนำโปรแกรมไปเพิ่มเติมขอบเขตความสามารถได้ ซึ่งจะกล่าวในส่วนต่อไป
5630423721 | พัฒนพร อินต๊ะเสน |
5631002321 | กฤตย์ กังวาลพงศ์พันธุ์ |
5631008121 | กิตติภณ พละการ |
5631009821 | กิตติภพ พละการ |