การสร้างโปรแกรมจดจำตัวอักษร
โปรแกรมจดจำตัวอักษร เป็นโปรแกรมที่นักศึกษานิยมใช้ทำโปรเจ็คจบกันมาก ดังนั้นบทความนี้จะแนะนำขั้นตอนการสร้างโปรแกรมจดจำตัวอักษรเอาไว้ให้ศึกษากันนะครับ
ขั้นตอนการสร้างโปรแกรมจดจำตัวอักษรนั้น แบ่งออกเป็น 3 ขั้นตอน ดังนี้
อีกอย่างคือ ตอนถ่ายภาพไม่ควรใช้มือจับ กล้องและตัวภาพที่จะถ่าย ต้องถูกติดตั้งอย่างเป็นระบบ โดยมีระยะห่างและแสงคงที่ เนื่องจากระยะห่างจะส่งผลต่อขนาดตัวอักษร ถ้าเราถ่ายไกล ตัวอักษรก็จะเล็ก ถ้าถ่ายใกล้ ตัวอักษรก็จะใหญ่ ส่วนแสงจะทำให้ค่า threshold เปลี่ยน ถ้าแสงไม่คงที่ เวลาเราแปลงเป็นภาพขาว-ดำ เราอาจจะมองไม่เห็นตัวอักษร หรือมองเห็นตัวอักษรไม่ใชัด
ดังนั้นเราควรติดตั้งกล้องโดยดูจากภาพจากในโปรแกรม และใช้ระยะห่างที่ทำให้เรามองเห็นตัวอักษรได้ชัดที่สุด
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
จากนั้นเราค่อยมาคัดแยกตัวอักษรที่ตัดแล้วด้วยมือเปล่า (ขั้นตอนนี้ต้องทำด้วยมนุษย์เท่านั้น) อย่างเช่น สร้างโฟลเดอร์ A-Z แล้วแยกภาพตัวอักษร A ทั้งหมดเอาไปไว้ในโฟลเดอร์ A ภาพตัวอักษร B เอาไว้ในโฟลเดอร์ B ทำแบบนี้ให้ครบทุกตัวอักษร โดยภาพตัวอักษรในแต่ละโฟลเดอร์ควรมีอย่างน้อยโฟลเดอร์ละ 100 ภาพ ถ้าหากตัวอักษรไหนมีไม่พอ ก็ให้ถ่ายภาพต้นฉบับใหม่ แล้วตัดเพิ่ม
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
แต่ก่อนที่เราจะฝึกสอน (เทรน) นิวรอลได้ เราก็ต้องแปลงข้อมูลรูปภาพเหล่านี้ให้เป็น "คุณลักษณะ" หรือที่เรียกว่า ฟีเจอร์ (Feature) ก่อน แล้วเราค่อยใช้ฟีเจอร์เหล่านี้ไปเทรนนิวรอลอีกที
ซึ่งฟีเจอร์ที่ว่า อาจจะเป็นอะไรก็ได้ตามที่เราต้องการ อย่างเช่น ถ้าใช้ฟีเจอร์ที่ง่ายที่สุด ก็คือเอาพิกเซลแต่ละพิกเซลของภาพมาเป็นฟีเจอร์ หรือจะหาค่าเฉลี่ยของพิกเซลขนาด 3x3 แล้วเอามาเป็นฟีเจอร์ก็ได้ พูดง่ายๆ คือ อะไรก็ได้ที่เราคิดว่ามันสามารถใช้เป็นเกณฑ์จำแนกภาพได้
ถ้าใครยังนึกไม่ออก ว่าฟีเจอร์คืออะไร ลองดูตัวอย่างนี้นะครับ สมมุติว่าผมจะใช้ข้อมูลดังต่อไปนี้เพื่อจำแนกประเภทรถ 3 ประเภท ได้แก่ รถจักระยานยนต์ รถเก๋ง รถกระบะ รถบรรทุก
เมื่อคุณอ่านข้อมูลต่อไปนี้แล้ว ให้ลองตอบดูนะครับว่าข้อมูลต่อไปนี้หมายถึงรถอะไร
1. จำนวนล้อ: 4
2. จำนวนประตู: 2
3. จำนวนที่นั่ง: 2
จากข้อมูลทั้ง 3 ข้อนี้ เราก็พอจะเดาได้ว่ารถดังกล่าวคือ รถกระบะ ใช่ไหมครับ ซึ่งข้อมูลทั้ง 3 นี่แหละที่เรียกว่า ฟีเจอร์ ซึ่งทุกคนสามารถระบุประเภทรถได้ทันทีเมื่อดูจากฟีเจอร์ โดยที่ไม่ได้เห็นรูปตัวอย่างของรถ ดังนั้นฟีเจอร์ ก็คือคุณสมบัติที่เราใช้แยกประเภทนั่นเองนะครับ
แน่นอนว่าแต่ละคนก็อาจจะใช้ฟีเจอร์ไม่เหมือนกัน อย่างเช่น ถ้าจะวิเคราะห์ประเภทรถ บางคนอาจจะใช้ 5 ฟีเจอร์ หรือ 10 ฟีเจอร์ ก็ได้ ไม่มีใครผิดครับ ขอแค่อ่านแล้วแยกประเภทได้ก็พอ
แต่สิ่งที่สำคัญคือ ไม่ว่าเราจะใช้ฟีเจอร์จำนวนกี่ตัว แต่จำนวนฟีเจอร์จะต้องเท่ากันเสมอ อย่างเช่น ถ้าตัวอักษรแรกมี 100 ฟีเจอร์ ตัวอักษรที่ 2 ก็ต้องมี 100 ฟีเจอร์เท่ากัน และทุกตัวหลังจากนั้น ก็ต้องมี 100 ฟีเจอร์เหมือนกัน ไม่ใช่ว่าตัวแรกมี 120 ฟีเจอร์ แล้วตัวถัดไปมี 80 ฟีเจอร์ แบบนี้ใช้ไม่ได้นะครับ
เมื่อเราได้ฟีเจอร์ครบทุกตัวอักษรแล้ว เราก็สามารถเทรนนิวรอลได้แล้ว เมื่อเทรนเสร็จก็ให้ save ตัวแปรนิวรอลเอาไว้นะครับ เวลาจะใช้งานจะได้นำไปใช้ได้เลย ไม่ต้องเทรนใหม่
*หมายเหตุ ไม่ต้องไปสงสัยนะครับว่าในไฟล์นิวรอลที่ save ไว้มีอะไรบ้าง คือถ้าอยากเปิดดูเพื่อศึกษาก็เปิดดูได้ แต่ผมบอกไว้เลยว่าถึงคุณจะไม่ได้เปิดดู คุณก็สามารถนำมันไปใช้งานได้อยู่ดี เพราะข้อมูลในนั้นเป็นรูปแบบที่ MATLAB ออกแบบมาเพื่อใช้กับคำสั่งของมันอยู่แล้ว ดังนั้นถึงคุณจะไม่รู้ว่าในนั้นมีอะไรบ้าง คุณก็ใช้งานมันได้อยู่ดี
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
ตัวอย่างผลลัพธ์
NN = [0,0,0,0.8,0.05,0.1,0,0,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
เราจะเห็นว่าผลลัพธ์นี้ไม่ได้บอกเราว่าฟีเจอร์นั้นคือ ตัว A หรือ B หรือ C โดยตรง แต่เราต้องมาแปลงข้อมูลที่ได้อีกที ซึ่งจากข้อมูลตัวอย่างนี้ ค่าที่มากที่สุดคือ 0.8 ซึ่งอยู่ในตำแหน่งที่ 4 และเรารู้ว่าตัวอักษรของเรา เรียงลำดับจาก A ไป Z ดังนั้นตัวอักษรลำดับที่ 4 ก็คือ ตัว D นั่นเอง เราจึงได้คำตอบว่าฟีเจอร์ที่ป้อนเข้าไปในนิวรอล คือฟีเจอร์ของตัวอักษร D ส่วนตำแหน่งอื่นๆ ที่มีค่า นั่นหมายความว่า นิวรอลคิดว่าฟีเจอร์นี้มีความคล้ายกับตัวอักษรพวกนั้น อย่างเช่นตำแหน่งที่ 5 มีค่าเท่ากับ 0.05 หมายความว่าฟีเจอร์นี้มีส่วนคล้ายตัว E อยู่ 5%
เพียงเท่านี้ เราก็จะได้โปรแกรมจดจำตัวอักษร 1 โปรแกรแล้วครับ
สรุปโปรแกรมทั้งหมดที่ต้องใช้
ขั้นตอนการสร้างโปรแกรมจดจำตัวอักษรนั้น แบ่งออกเป็น 3 ขั้นตอน ดังนี้
ขั้นตอนที่ 1 เตรียมรูปภาพ
ก่อนอื่นเราต้องเตรียมรูปภาพต้นฉบับ ซึ่งรูปต้นฉบับก็คือ รูปภาพที่เราจะใช้ในโปรแกรมของเรานั่นแหละครับ ตรงนี้สำคัญมากนะครับ ห้ามหารูปในอินเตอร์เน็ตมาใช้นะครับ เพราะตัวอักษรที่เราหามา ไม่มีทางที่จะเหมือนกับตัวอักษรที่เราใช้แบบ 100% แน่นอน อย่างเช่น อาจจะตัวหนากว่า หรือแบบอักษรไม่เหมือนกัน ซึ่งปัจจัยเหล่านี้ จะทำให้โปรแกรมจดจำตัวอักษรของเรามีความแม่นยำลดลงการเตรียมภาพต้นฉบับ
การเตรียมภาพต้นฉบับ ที่ดีที่สุดควรจะใช้กล้องเว็บแคม ที่เราจะใช้ในโปรแกรมของเราเท่านั้น ไม่ควรใช้ภาพที่ถ่ายจาก กล้องโทรศัพท์ กล้อง DSLR หรือ กล้องดิจิตอลอื่นๆ เพราะกล้องแต่ละตัวจะมีการปรับสี ปรับแสง ที่แตกต่างกัน ดังนั้นเราจึงควรใช้ภาพจากกล้องเว็บแคมของโปรแกรมจะดีที่สุด
การติดตั้งกล้องเพื่อบันทึกภาพ
อีกอย่างคือ ตอนถ่ายภาพไม่ควรใช้มือจับ กล้องและตัวภาพที่จะถ่าย ต้องถูกติดตั้งอย่างเป็นระบบ โดยมีระยะห่างและแสงคงที่ เนื่องจากระยะห่างจะส่งผลต่อขนาดตัวอักษร ถ้าเราถ่ายไกล ตัวอักษรก็จะเล็ก ถ้าถ่ายใกล้ ตัวอักษรก็จะใหญ่ ส่วนแสงจะทำให้ค่า threshold เปลี่ยน ถ้าแสงไม่คงที่ เวลาเราแปลงเป็นภาพขาว-ดำ เราอาจจะมองไม่เห็นตัวอักษร หรือมองเห็นตัวอักษรไม่ใชัด
ดังนั้นเราควรติดตั้งกล้องโดยดูจากภาพจากในโปรแกรม และใช้ระยะห่างที่ทำให้เรามองเห็นตัวอักษรได้ชัดที่สุด
โปรแกรมบันทึกภาพอัตโนมัติจากกล้องเว็บแคม ซึ่งภาพเหล่านี้ก็คือ "ภาพต้นฉบับ" นั่นเอง
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
- โปรแกรมเชื่อมต่อกล้องเว็บแคม ใช้สำหรับ Generate code สำหรับกล้องที่เราต้องการเชื่อมต่อ
- โปรกรมบันทึกภาพอัตโนมัติ ใช้สำหรับบันทึกภาพจากกล้องเว็บแคม
การเตรียมภาพตัวอักษร
เมื่อเราได้ภาพต้นฉบับมาแล้ว ขั้นตอนต่อไปคือ เราต้องเอาภาพต้นฉบับนั้นมาตัดแยกตัวอักษรจากนั้นเราค่อยมาคัดแยกตัวอักษรที่ตัดแล้วด้วยมือเปล่า (ขั้นตอนนี้ต้องทำด้วยมนุษย์เท่านั้น) อย่างเช่น สร้างโฟลเดอร์ A-Z แล้วแยกภาพตัวอักษร A ทั้งหมดเอาไปไว้ในโฟลเดอร์ A ภาพตัวอักษร B เอาไว้ในโฟลเดอร์ B ทำแบบนี้ให้ครบทุกตัวอักษร โดยภาพตัวอักษรในแต่ละโฟลเดอร์ควรมีอย่างน้อยโฟลเดอร์ละ 100 ภาพ ถ้าหากตัวอักษรไหนมีไม่พอ ก็ให้ถ่ายภาพต้นฉบับใหม่ แล้วตัดเพิ่ม
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
ขั้นตอนที่ 2 ฝึกสอนระบบรู้จำ
การรู้จำที่ว่าก็คือการใช้ Machine Learning (McL) เพื่อให้โปรแกรมจดจำรูปภาพตัวอักษรให้ได้ ซึ่ง McL ก็มีหลายวิธี แต่วิธีที่นิยมใช้กันบ่อยที่สุดในการทำโปรเจ็คก็คือ นิวรอลเน็ตเวิร์ค หรือ เครือข่ายประสาทเทียมแต่ก่อนที่เราจะฝึกสอน (เทรน) นิวรอลได้ เราก็ต้องแปลงข้อมูลรูปภาพเหล่านี้ให้เป็น "คุณลักษณะ" หรือที่เรียกว่า ฟีเจอร์ (Feature) ก่อน แล้วเราค่อยใช้ฟีเจอร์เหล่านี้ไปเทรนนิวรอลอีกที
ซึ่งฟีเจอร์ที่ว่า อาจจะเป็นอะไรก็ได้ตามที่เราต้องการ อย่างเช่น ถ้าใช้ฟีเจอร์ที่ง่ายที่สุด ก็คือเอาพิกเซลแต่ละพิกเซลของภาพมาเป็นฟีเจอร์ หรือจะหาค่าเฉลี่ยของพิกเซลขนาด 3x3 แล้วเอามาเป็นฟีเจอร์ก็ได้ พูดง่ายๆ คือ อะไรก็ได้ที่เราคิดว่ามันสามารถใช้เป็นเกณฑ์จำแนกภาพได้
ถ้าใครยังนึกไม่ออก ว่าฟีเจอร์คืออะไร ลองดูตัวอย่างนี้นะครับ สมมุติว่าผมจะใช้ข้อมูลดังต่อไปนี้เพื่อจำแนกประเภทรถ 3 ประเภท ได้แก่ รถจักระยานยนต์ รถเก๋ง รถกระบะ รถบรรทุก
เมื่อคุณอ่านข้อมูลต่อไปนี้แล้ว ให้ลองตอบดูนะครับว่าข้อมูลต่อไปนี้หมายถึงรถอะไร
1. จำนวนล้อ: 4
2. จำนวนประตู: 2
3. จำนวนที่นั่ง: 2
จากข้อมูลทั้ง 3 ข้อนี้ เราก็พอจะเดาได้ว่ารถดังกล่าวคือ รถกระบะ ใช่ไหมครับ ซึ่งข้อมูลทั้ง 3 นี่แหละที่เรียกว่า ฟีเจอร์ ซึ่งทุกคนสามารถระบุประเภทรถได้ทันทีเมื่อดูจากฟีเจอร์ โดยที่ไม่ได้เห็นรูปตัวอย่างของรถ ดังนั้นฟีเจอร์ ก็คือคุณสมบัติที่เราใช้แยกประเภทนั่นเองนะครับ
แน่นอนว่าแต่ละคนก็อาจจะใช้ฟีเจอร์ไม่เหมือนกัน อย่างเช่น ถ้าจะวิเคราะห์ประเภทรถ บางคนอาจจะใช้ 5 ฟีเจอร์ หรือ 10 ฟีเจอร์ ก็ได้ ไม่มีใครผิดครับ ขอแค่อ่านแล้วแยกประเภทได้ก็พอ
แต่สิ่งที่สำคัญคือ ไม่ว่าเราจะใช้ฟีเจอร์จำนวนกี่ตัว แต่จำนวนฟีเจอร์จะต้องเท่ากันเสมอ อย่างเช่น ถ้าตัวอักษรแรกมี 100 ฟีเจอร์ ตัวอักษรที่ 2 ก็ต้องมี 100 ฟีเจอร์เท่ากัน และทุกตัวหลังจากนั้น ก็ต้องมี 100 ฟีเจอร์เหมือนกัน ไม่ใช่ว่าตัวแรกมี 120 ฟีเจอร์ แล้วตัวถัดไปมี 80 ฟีเจอร์ แบบนี้ใช้ไม่ได้นะครับ
เมื่อเราได้ฟีเจอร์ครบทุกตัวอักษรแล้ว เราก็สามารถเทรนนิวรอลได้แล้ว เมื่อเทรนเสร็จก็ให้ save ตัวแปรนิวรอลเอาไว้นะครับ เวลาจะใช้งานจะได้นำไปใช้ได้เลย ไม่ต้องเทรนใหม่
*หมายเหตุ ไม่ต้องไปสงสัยนะครับว่าในไฟล์นิวรอลที่ save ไว้มีอะไรบ้าง คือถ้าอยากเปิดดูเพื่อศึกษาก็เปิดดูได้ แต่ผมบอกไว้เลยว่าถึงคุณจะไม่ได้เปิดดู คุณก็สามารถนำมันไปใช้งานได้อยู่ดี เพราะข้อมูลในนั้นเป็นรูปแบบที่ MATLAB ออกแบบมาเพื่อใช้กับคำสั่งของมันอยู่แล้ว ดังนั้นถึงคุณจะไม่รู้ว่าในนั้นมีอะไรบ้าง คุณก็ใช้งานมันได้อยู่ดี
โปรแกรมที่จำเป็นต้องใช้ในขั้นตอนนี้
- โปรแกรมเทรนนิวรอล (โปรแกรมนี้ใช้ได้ทั้งเทรน ทดสอบ และใช้งาน)
ขั้นตอนที่ 3 ทดสอบและใช้งาน
จริงๆ แล้วการทดสอบ และการใช้งานนั้นมีขั้นตอนคคล้ายๆ กัน ดังนี้การทดสอบนิวรอล
- อ่านไฟล์นิวรอลที่ save เอาไว้เข้ามาในโปรแกรม
- อ่านรูปภาพตัวอักษรที่ตัดแล้วเข้ามาในโปรแกรม
- หาฟีเจอร์ของรูปภาพ
- ใส่ฟีเจอร์เข้าไปในนิวรอล
- แปลงผลลัพธ์ของนิวรอลให้เป็นตัวอักษร
ตัวอย่างผลลัพธ์
NN = [0,0,0,0.8,0.05,0.1,0,0,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
เราจะเห็นว่าผลลัพธ์นี้ไม่ได้บอกเราว่าฟีเจอร์นั้นคือ ตัว A หรือ B หรือ C โดยตรง แต่เราต้องมาแปลงข้อมูลที่ได้อีกที ซึ่งจากข้อมูลตัวอย่างนี้ ค่าที่มากที่สุดคือ 0.8 ซึ่งอยู่ในตำแหน่งที่ 4 และเรารู้ว่าตัวอักษรของเรา เรียงลำดับจาก A ไป Z ดังนั้นตัวอักษรลำดับที่ 4 ก็คือ ตัว D นั่นเอง เราจึงได้คำตอบว่าฟีเจอร์ที่ป้อนเข้าไปในนิวรอล คือฟีเจอร์ของตัวอักษร D ส่วนตำแหน่งอื่นๆ ที่มีค่า นั่นหมายความว่า นิวรอลคิดว่าฟีเจอร์นี้มีความคล้ายกับตัวอักษรพวกนั้น อย่างเช่นตำแหน่งที่ 5 มีค่าเท่ากับ 0.05 หมายความว่าฟีเจอร์นี้มีส่วนคล้ายตัว E อยู่ 5%
การใช้งานนิวรอล
การใช้งานจริงจะต่างจากการทดสอบตรงที่ภาพที่อ่านเข้ามาในโปรแกรม ไม่ใช่ภาพที่ตัดเสร็จแล้ว แต่เป็นภาพต้นฉบับ ดังนั้นในการใช้งานจริงจะมีขั้นตอนการตัดภาพเพิ่มเข้ามา (แต่ไม่ต้องมีขั้นตอนการบันทึกภาพ และไม่ต้องมีขั้นตอนการอ่านภาพตัวอักษร) เมื่อตัดเสร็จแล้วค่อยนำไปหาฟีเจอร์ต่อ โดยรวมแล้วสามารถเขียนเป็นขั้นตอนได้ดังต่อไปนี้- อ่านภาพต้นฉบับ (จากไฟล์ หรือจากกล้องเว็บแคม)
- แปลงภาพต้นฉบับเป็นภาพขาว-ดำ แล้วตัดภาพออกเป็นตัวอักษร
- หาฟีเจอร์ของตัวอักษรทีละตัว
- ใส่ฟีเจอร์เข้าไปในนิวรอล
- วิเคราะห์ผลจากนิวรอล
- นำตัวอักษรที่วิเคราะห์ได้ มาเรียงต่อกันตามลำดับ
เพียงเท่านี้ เราก็จะได้โปรแกรมจดจำตัวอักษร 1 โปรแกรแล้วครับ
ตัวอย่างการใช้งานโปรแกรมเทรนนิวรอล
สรุปโปรแกรมทั้งหมดที่ต้องใช้
จบบทความ