Python Capture
Computer Vision Project (2110433)

Python Capture เป็น Desktop application สําหรับรับภาพโปรแกรมภาษา Python ที่เขียนด้วยลายมือบนกระดาษที่ทำเป็นช่องตารางเตรียมไว้ จากนั้นประมวลผลภาพถ่ายนั้น แปลงเป็น source code แล้วแสดงผลการรัน แสดงจุดผิดพลาด และคะแนนที่ได้รับ โดยตรวจสอบความถูกต้องของ source code ด้วยระบบ grader

วัตถุประสงค์


  • เพื่อลดภาระการตรวจข้อสอบของอาจารย์ในรายวิชาที่มีการเขียนโปรแกรมลงกระดาษคำตอบ
  • เพื่อเพิ่มประสิทธิภาพในการตรวจข้อสอบที่เป็นการเขียนโปรแกรม
  • เพื่อส่งเสริมให้ทุกคนสามารถเข้าถึงการเขียนโปรแกรมได้ง่ายขึ้น
  • เพื่อใช้เป็นเครื่องมือในการเรียนการสอนและการทบทวนบทเรียนในรายวิชาการเขียนโปรแกรม

Design & Methods


(การออกแบบระบบ)


โปรแกรม Python Capture แบ่งส่วนการทำงานออกเป็น 3 ส่วนย่อย ดังนี้


1. ส่วนติดต่อกับผู้ใช้ (User Interface - UI)

      ส่วน UI เป็นส่วนหลักของโปรแกรม ในที่นี้ได้เขียนส่วน UI ด้วยภาษา Java ผู้ใช้จะทำการเลือกไฟล์โจทย์-เฉลย และไฟล์รูปภาพ จากนั้นจะทำการส่งไฟล์รูปภาพไปยังส่วน OCR เพื่อทำการแปลงรูปภาพเป็นตัวอักษรต่อไป

หมายเหตุ : เนื่องจากโปรแกรมนี้สร้างขึ้นเพื่อทดลองการทำงานเท่านั้น จึง fix directory ของ tesseract และ exe ที่เกี่ยวข้อง หากจะนำไปพัฒนาต่อ จะต้องคำนึงถึงปัจจัยนี้ด้วย


2. ส่วน Optical Character Recognition (OCR)

      ส่วน OCR จะรับรูปภาพจากส่วน UI และนำมาประมวลผลด้วยวิธีการทาง Computer Vision และ Recognition แล้วได้ผลลัพธ์เป็นไฟล์ตัวอักษรของภาพนั้น จากนั้นจะส่งไฟล์ตัวอักษรกลับไปที่ส่วน UI สำหรับรายละเอียดขั้นตอนการทำงานและทฤษฎีที่เกี่ยวข้องในของส่วน OCR จะอธิบายในหัวข้อถัดไป


3. ส่วนตัวตรวจอัตโนมัติ (grader)

      เมื่อส่วน UI ได้ผลลัพธ์ที่เป็นไฟล์ตัวอักษรจากส่วน OCR แล้ว จะส่งต่อไปยังส่วน grader ซึ่งในที่นี้เขียนด้วยภาษา Java ส่วน grader จะนำไฟล์ตัวอักษรซึ่งเป็นโปรแกรมภาษา Python มาทำการ compile หาก compile ไม่ผ่าน จะมีการแจ้งให้ทราบถึงจุดที่ผิด เมื่อ compile ผ่านแล้ว จะนำไฟล์โจทย์-เฉลย ที่ได้เลือกไว้ มาใช้เป็น input และตรวจสอบ output ของโปรแกรม เมื่อครบทุกชุดข้อมูลทดสอบแล้ว จะแสดงผลการตรวจโดยมีผลที่เป็นไปได้คือ ถูก (P) ผิด (-) ใช้เวลาเกินที่กำหนด (T) และ runtime-error (X)

Theories and technique used


(ทฤษฎีและเทคนิคที่ใช้)


กระบวนการทำ Optical Character Recognition (OCR) สามารถแบ่งออกเป็นส่วนหลัก ๆ ได้ 3 ส่วน ดังรูป


โดยภาพรวมของแต่ละส่วนมีดังนี้

1. ส่วน segmentation

      ส่วน segmentation จะรับรูปภาพ จากนั้นนำมา preprocess เพื่อให้สามารถนำไปเป็น input ของส่วน recognition ได้ต่อไป โดยจะทำการปรับคุณสมบัติของภาพให้เหมาะสม และแบ่งไฟล์ภาพต้นฉบับออกเป็นช่องย่อย ๆ ตามช่องตาราง ในที่นี้ได้เขียนโปรแกรมด้วยภาษา C++ โดยใช้ OpenCV library และสร้างเป็น Application .exe ให้สามารถใช้งานได้สะดวก


2. ส่วน recognition

      ส่วน recognition จะทำการแปลงไฟล์ภาพย่อย ๆ ของแต่ละช่อง ให้กลายเป็นตัวอักษร ในที่นี้ใช้โปรแกรม OCR สำเร็จรูป tesseract ในการทำ recognition และได้ทำการ train ด้วย train data ที่สร้างขึ้นจากการเก็บข้อมูลลายมือต่าง ๆ


3. ส่วน context-aware postprocessing

      ส่วน context-aware postprocessing เป็นการนำข้อความที่ได้จากการทำ recognition มาแก้ไขให้ถูกต้อง เนื่องจากอาจมีความผิดพลาดจากการทำ recognition อยู่บ้าง โดยมีเทคนิคต่าง ๆ ที่ใช้งานกัน เช่น การใช้ dictionary, bigrams, การพิจารณาจาก program syntax แต่ในที่นี้จะไม่พิจารณากระบวนการในส่วนนี้ เนื่องจากอยู่นอกขอบเขตของรายวิชา

Demo


ผลการทดลอง

การ segmentation แบบทั้งหน้ากระดาษ


      ในช่วงแรกของการทำโครงงาน ได้ทดลองให้ tesseract ทำการ segment ตัวอักษรจากภาพทั้งหน้ากระดาษ จากผลการทดลองพบว่ามีอัตราการ segmentation ผิดพลาดเฉลี่ยร้อยละ 7.45 และมีบางภาพที่ผิดพลาดถึงร้อยละ 42.55 ดังนั้นจึงตัดสินใจทำการ segmentation เป็นช่อง ๆ เอง


ผลการทดลอง

การ recognition แบบแบ่งเป็นช่อง


      ในการทดลองทำ 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 ให้มีความแม่นยำมากขึ้น อาจจะทำให้สามารถนำโปรแกรมไปใช้จริงได้ และนอกจากนี้ยังสามารถนำโปรแกรมไปเพิ่มเติมขอบเขตความสามารถได้ ซึ่งจะกล่าวในส่วนต่อไป

แนวทางการพัฒนาต่อ


  • พัฒนาจากการตรวจบนกระดาษที่มีเส้น เป็นกระดาษที่ไม่มีเส้นได้
  • พัฒนาการรับภาพจากการสแกน เป็นภาพจากกล้องถ่ายรูป Smartphone ได้
  • พัฒนาการประมวลผล เป็นการแสดงผลแบบ real time
  • พัฒนาจาก desktop application เป็น web application หรือ mobile application
  • พัฒนาจาก local grader เป็น online grader
  • พัฒนาเพิ่มระบบการตรวจสอบ syntax ตามภาษาโปรแกรมที่ตรวจ และการทำ parse tree
  • พัฒนาความสามารถในการ recognition ด้วยการใช้ tesseract dictionary option เป็นต้น

รายชื่อสมาชิก


5630423721 พัฒนพร อินต๊ะเสน
5631002321 กฤตย์ กังวาลพงศ์พันธุ์
5631008121 กิตติภณ พละการ
5631009821 กิตติภพ พละการ