Blockdit Logo
Blockdit Logo (Mobile)
สำรวจ
ลงทุน
คำถาม
เข้าสู่ระบบ
มีบัญชีอยู่แล้ว?
เข้าสู่ระบบ
หรือ
ลงทะเบียน
เขียนโค๊ดกับมากะปิ
•
ติดตาม
28 พ.ค. 2022 เวลา 16:57 • การศึกษา
เล่าเรื่องประสบการณ์เริ่มทำ opencv ทำนายตัวเลข ครั้งแรก
เกริ่นก่อนว่า ผมทำ machine learning ในรูปแบบของการรับ input จาก excel หรือ ฐานข้อมูลที่ถูกจัดการสำเร็จรูปอยู่แล้ว เช่น ตัวอักษร รายรับรายจ่าย ตัวเลข
แต่ผมไม่เคยรับ input จาก VDO มาก่อน
เริ่มเรื่องเลย ผมซื้อหนังสือมาเล่มหนึ่งชื่อ
หนังสือ เรียนรู้ Data Science และ AI Machine Learning ด้วย Python
เขียนโดย ดร.กอบเกียรติ สระอุบล
ผมแนะนำให้ซื้ออ่านหนังสือเล่มนี้นะครับ เพราะ เขาให้เทคนิคในการเขียน code ไว้เยอะพอสมควร การอธิบายที่เข้าใจง่าย และ มีความละเอียดในระดับหนึ่ง
เริ่มลองจากหนังสือ
ผมลองจากในหนังสือ ตอนแรกผมเข้าใจว่า เขาเอา dataset มาจาก image แต่ตอนเริ่มเขา import มาจาก opencv ทำให้ข้อมูลถูกแปลงจากภาพมาเป็นตัวเลขอยู่แล้ว
ผมก็ลองทำไปเรื่อย ๆ จนได้เหมือนเขา ทีนี้เราอยากอัพเวลตัวเอง เลยตัดสินใจ อ่านหนังสือต่อ เขาก็สอนการสร้าง dataset ขึ้นมา 2,3 ตัว
ผมมองว่าถ้าต้องมานั่งเก็บแบบเขาเป็นร้อยเป็นพันข้อมูลคงตายกันพอดี ผมเลยตัดสินใจโหลด dataset จาก kaggle และ สร้าง function ใหม่เลย
คือตัวเลขจะมี 0 - 9 ผมก็สร้าง Folder ชื่อ 0 -9 ตามตัวเลขที่เก็บ จากนั้นเราก็ import os มาเพื่อให้หา directory และให้มันเข้าไปโหลดรูปมาแต่ในละ directory จากนั้นก็สร้างเงื่อนไขว่า ถ้ารูปที่ 1 มาจาก Folder ชื่อ 0 ให้ list ที่สร้างมาอีกตัวเก็บค่า 0 ประมาณนี้
จากนั้นก็ลองทำเหมือนกับหนังสือ และใช้ MLP เป็น algorithm ที่เอาไว้ในการ Train
ด้วยความสงสัยเลยอยากทำ vdo ที่ทำนายตัวเลข
ผมเลยเปิดอ่านหนังสือต่อ แล้วไปเจอการ detect หน้าผมเลยตั้งโจทย์กับตัวเองว่า จะลองมาปรับการการทำนายเลข
ปรากฎปัญหาที่ผมเจอคือ การที่ตัว detect หน้าใน vdo ก่อนที่จะเอาไปใช้ในการทำนาย ดันเป็นตัวที่ถูก import มา ทำให้ผมตัน เพราะผมต้องไปหา .xml ที่ detect เฉพาะตัวเลข และการทำก็ยากในระดับนึง
การแก้ปัญหา
ผมตัดสินใจไปขอคำแนะนำจากเพื่อนที่เคยศึกษาเรื่อง computer vision เพื่อนผมเลยแนะนำ คลิป opencv ที่ใช้การ detect สีและมาสร้างเป็น contour
ผมลองเอาไปทำตาม จริงๆ การทำนั้นก็ไม่ยากเพราะ code ก็เข้าใจง่าย คือถ้าดูจากในคลิปจะเข้าใจเลย
พอลองแล้ว ปรากฎว่าการจับตัวเลขนั้นนิ่งขึ้น แต่ข้อเสียคือถ้ารอบ ๆ มีสีที่เรา detect มันก็จะจับไปโดยอัตโนมัติ
ผมเลยลองปรับ area หรือระยะการมองเห็นของสี หรือก็คือ ถ้าสีมีขนาดเล็กมันจะไม่แสดงให้เรา ถ้ามันมีขนาดใหญ่ เช่น เราเอาภาพที่มีสีที่เราจะจับไปใกล้กล้อง มันก็จะจับภาพให้
ปัญหาถัดมา
พอผมได้ vdo ที่จับภาพเรียบร้อยแล้ว ต่อมาคือผมจะต้อง capture vdo มาเป็นรูปภาพและเอารูปนี้ไป ทำนาย โดยทีนี้ผมใช้ model ที่ train จากงานเก่ามาใช้ หรือก็คือเอาจากการทดลองแรกที่เป็นรูปมาใช้
ปรากฎว่า ภาพที่ capture นั้นมีขนาดเท่ากับความกว้างยาวของจอ ซึ่งมันมีผลต่อการทำนาย เพราะ ถ้าข้อมูลฝึก มีขนาด 800x600 แต่เราใส่ 1080x960 มันเป็นข้อมูลคนละประเภทกัน ทำให้การทำนายมีสิทธิ ออกมาแย่
สิ่งที่ผมต้องแก้คือ เราต้องเอาขนาดที่ cap มา 800x600 มาตัดเอาเฉพาะส่วนตัวเลขเท่านั้น
ผมไปถามเพื่อนผมอีกว่าทำไงดี มันเลยแนะนำด้วยวิธี ตีกรอบ สี่เหลี่ยม และ capture เฉพาะ กรอบก็พอ
มันได้ผล การหาตำแหน่งของตัวเลขที่ตรวจจับมันไม่ยากเพราะว่า function ของ opencv มีให้หมดแล้ว
ผมได้ขนาดรูปและแปลง pixel จนเป็นตัวเลขเรียบร้อย
ปัญหาที่ตามมา
ขนาดของ pixel ที่ทดสอบส่วนใหญ่ ไม่ตรงกับ pixel ใน dataset หรือก็คือ ขนาด pixel ของ dataset เล็กเกิน
ผมแก้ปัญหานี้ด้วยการสร้าง dataset ใหม่ ด้วยวิธีดังนี้
เราสามารถ detect สีได้ และ capture เป็นภาพเฉพาะตัวเลข และ แปลงเป็น pixel ได้แล้ว ดังนั้นเราก็แค่สร้าง function ของตัวเองที่พอกดปุ่มแล้วมันจะ save และสร้างรูปเก็บไว้ใน folder และก็สร้าง Folder ให้มีลักษณะเหมือนงานเก่าที่ การตั้งชื่อมีผลต่อการทำงานนั้นเอง
โอเคร เราได้ dataset และ การ predict รวมถึง capture แล้วทีนี้ก็พร้อมทำงาน
ผลการทำงานนั้น ถ้าเป็นตัวเลขโดดจะมีประสิทธิภาพ ทั้งนี้เนื่องจากการเก็บข้อมูลมีน้อยเกินไป ระยะการซูมก็มีผลต่อการทำนายเหมือนกัน ถ้าเราเก็บข้อมูลที่ซูมภาพใกล้ พอเอาข้อมูลใหม่ไปทำนายถ้าซูมใกล้จะตรงพอไกลมันจะเปลี่ยนค่า
สามารถดาวโหลดและลองใช้กันได้นะครับ ผมทำใส่ไว้ใน github พร้อมกับรายละเอียด การทำงานรวมถึงส่วนตรงที่สามารถ customize ได้
เยี่ยมชม
github.com
IntroductionMachinelearning/Project/Digit Recognize at master · chatchaijunpatch/IntroductionMachinelearning
Contribute to chatchaijunpatch/IntroductionMachinelearning development by creating an account on GitHub.
สำหรับครั้งหน้า ผมว่าจะเอาวิธีแปลงไฟล์จาก .HEIC แปลงเป็น .png หรือ .jpeg มาสอนกัน ถือว่าเราเปลี่่ยนเนื้อหากันบ้างครับ ฮา
การศึกษา
1 บันทึก
4
1
4
โฆษณา
ดาวน์โหลดแอปพลิเคชัน
© 2025 Blockdit
เกี่ยวกับ
ช่วยเหลือ
คำถามที่พบบ่อย
นโยบายการโฆษณาและบูสต์โพสต์
นโยบายความเป็นส่วนตัว
แนวทางการใช้แบรนด์ Blockdit
Blockdit เพื่อธุรกิจ
ไทย