18 KiB
บทนำสู่การมองเห็นด้วยคอมพิวเตอร์
Computer Vision เป็นสาขาหนึ่งที่มีเป้าหมายเพื่อให้คอมพิวเตอร์สามารถเข้าใจภาพดิจิทัลในระดับสูงได้ คำว่า เข้าใจ ในที่นี้มีความหมายที่หลากหลาย เช่น การค้นหาวัตถุในภาพ (object detection), การเข้าใจเหตุการณ์ที่เกิดขึ้น (event detection), การบรรยายภาพด้วยข้อความ หรือการสร้างฉากในรูปแบบ 3 มิติ นอกจากนี้ยังมีงานเฉพาะทางที่เกี่ยวข้องกับภาพมนุษย์ เช่น การประเมินอายุและอารมณ์, การตรวจจับและระบุตัวบุคคล, และการประเมินท่าทางในรูปแบบ 3 มิติ เป็นต้น
แบบทดสอบก่อนเรียน
หนึ่งในงานที่ง่ายที่สุดของการมองเห็นด้วยคอมพิวเตอร์คือ การจำแนกประเภทของภาพ (image classification)
การมองเห็นด้วยคอมพิวเตอร์มักถูกมองว่าเป็นส่วนหนึ่งของ AI ในปัจจุบัน งานส่วนใหญ่ในสาขานี้ถูกแก้ไขด้วยการใช้โครงข่ายประสาทเทียม เราจะได้เรียนรู้เพิ่มเติมเกี่ยวกับโครงข่ายประสาทเทียมชนิดพิเศษที่ใช้ในงานนี้ นั่นคือ convolutional neural networks ในส่วนนี้
อย่างไรก็ตาม ก่อนที่เราจะส่งภาพเข้าสู่โครงข่ายประสาทเทียม ในหลายกรณี การใช้เทคนิคเชิงอัลกอริทึมเพื่อปรับปรุงภาพก่อนจะเป็นประโยชน์
มีไลบรารี Python หลายตัวที่สามารถใช้สำหรับการประมวลผลภาพ:
- imageio ใช้สำหรับการอ่าน/เขียนภาพในรูปแบบต่าง ๆ และยังรองรับ ffmpeg ซึ่งเป็นเครื่องมือที่มีประโยชน์สำหรับการแปลงเฟรมวิดีโอเป็นภาพ
- Pillow (หรือที่รู้จักในชื่อ PIL) มีความสามารถมากกว่า และยังรองรับการปรับแต่งภาพ เช่น การเปลี่ยนรูป การปรับจานสี และอื่น ๆ
- OpenCV เป็นไลบรารีประมวลผลภาพที่ทรงพลัง เขียนด้วยภาษา C++ และกลายเป็นมาตรฐานสำหรับการประมวลผลภาพ มีอินเทอร์เฟซ Python ที่สะดวก
- dlib เป็นไลบรารี C++ ที่มีการใช้อัลกอริทึมการเรียนรู้ของเครื่องหลายตัว รวมถึงอัลกอริทึมสำหรับการมองเห็นด้วยคอมพิวเตอร์บางตัว มีอินเทอร์เฟซ Python และสามารถใช้สำหรับงานที่ท้าทาย เช่น การตรวจจับใบหน้าและจุดเด่นบนใบหน้า
OpenCV
OpenCV ถือเป็นมาตรฐานสำหรับการประมวลผลภาพ มีอัลกอริทึมที่มีประโยชน์มากมายที่พัฒนาในภาษา C++ และสามารถเรียกใช้งานจาก Python ได้เช่นกัน
แหล่งข้อมูลที่ดีสำหรับการเรียนรู้ OpenCV คือ คอร์ส Learn OpenCV ในหลักสูตรของเรา เป้าหมายไม่ได้อยู่ที่การเรียนรู้ OpenCV แต่เพื่อแสดงตัวอย่างการใช้งานและวิธีการใช้งานในบางกรณี
การโหลดภาพ
ภาพใน Python สามารถแสดงผลได้อย่างสะดวกด้วย NumPy arrays ตัวอย่างเช่น ภาพขาวดำขนาด 320x200 พิกเซล จะถูกเก็บในอาร์เรย์ขนาด 200x320 และภาพสีที่มีขนาดเดียวกันจะมีรูปร่างเป็น 200x320x3 (สำหรับช่องสี 3 ช่อง) การโหลดภาพสามารถทำได้ด้วยโค้ดดังนี้:
import cv2
import matplotlib.pyplot as plt
im = cv2.imread('image.jpeg')
plt.imshow(im)
โดยปกติ OpenCV ใช้การเข้ารหัสสีแบบ BGR (Blue-Green-Red) สำหรับภาพสี ในขณะที่เครื่องมือ Python อื่น ๆ ใช้ RGB (Red-Green-Blue) เพื่อให้ภาพแสดงผลได้ถูกต้อง คุณจำเป็นต้องแปลงภาพไปยังพื้นที่สี RGB โดยการสลับมิติในอาร์เรย์ NumPy หรือเรียกใช้ฟังก์ชัน OpenCV:
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
ฟังก์ชัน cvtColor เดียวกันนี้ยังสามารถใช้สำหรับการแปลงพื้นที่สีอื่น ๆ เช่น การแปลงภาพเป็นขาวดำ หรือพื้นที่สี HSV (Hue-Saturation-Value)
OpenCV ยังสามารถใช้โหลดเฟรมวิดีโอทีละเฟรม ตัวอย่างสามารถดูได้ในแบบฝึกหัด OpenCV Notebook
การประมวลผลภาพ
ก่อนที่จะส่งภาพเข้าสู่โครงข่ายประสาทเทียม คุณอาจต้องการใช้ขั้นตอนการประมวลผลล่วงหน้าหลายขั้นตอน OpenCV สามารถทำสิ่งต่าง ๆ ได้มากมาย เช่น:
- การปรับขนาดภาพ โดยใช้
im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS) - การเบลอภาพ โดยใช้
im = cv2.medianBlur(im,3)หรือim = cv2.GaussianBlur(im, (3,3), 0) - การเปลี่ยน ความสว่างและความคมชัด ของภาพสามารถทำได้ด้วยการจัดการอาร์เรย์ NumPy ตามที่อธิบายไว้ใน Stackoverflow note นี้
- การใช้ thresholding โดยเรียกใช้ฟังก์ชัน
cv2.threshold/cv2.adaptiveThresholdซึ่งมักจะดีกว่าการปรับความสว่างหรือความคมชัด - การใช้ การแปลงภาพ ต่าง ๆ:
- Affine transformations มีประโยชน์เมื่อคุณต้องการรวมการหมุน การปรับขนาด และการบิดเบือนภาพ โดยรู้ตำแหน่งต้นทางและปลายทางของจุดสามจุดในภาพ การแปลงแบบนี้จะรักษาเส้นขนานให้คงอยู่
- Perspective transformations มีประโยชน์เมื่อคุณรู้ตำแหน่งต้นทางและปลายทางของจุดสี่จุดในภาพ เช่น การถ่ายภาพเอกสารสี่เหลี่ยมด้วยกล้องสมาร์ทโฟนจากมุมหนึ่ง และต้องการทำให้ภาพเอกสารเป็นสี่เหลี่ยม
- การเข้าใจการเคลื่อนไหวในภาพโดยใช้ optical flow
ตัวอย่างการใช้งาน Computer Vision
ใน OpenCV Notebook เราได้แสดงตัวอย่างบางกรณีที่การมองเห็นด้วยคอมพิวเตอร์สามารถใช้แก้ปัญหาเฉพาะทางได้:
- การประมวลผลภาพถ่ายหนังสือเบรลล์ เราเน้นวิธีการใช้ thresholding, การตรวจจับคุณลักษณะ, การแปลงมุมมอง และการจัดการ NumPy เพื่อแยกสัญลักษณ์เบรลล์แต่ละตัวสำหรับการจำแนกผลลัพธ์ด้วยโครงข่ายประสาทเทียม
![]() |
![]() |
![]() |
|---|
ภาพจาก OpenCV.ipynb
- การตรวจจับการเคลื่อนไหวในวิดีโอด้วยความแตกต่างของเฟรม หากกล้องอยู่กับที่ เฟรมจากกล้องควรมีความคล้ายคลึงกันมาก โดยการลบอาร์เรย์ของเฟรมสองเฟรมที่ต่อเนื่องกัน เราจะได้ค่าความแตกต่างของพิกเซล ซึ่งควรต่ำสำหรับเฟรมที่นิ่ง และสูงขึ้นเมื่อมีการเคลื่อนไหวในภาพ
ภาพจาก OpenCV.ipynb
-
การตรวจจับการเคลื่อนไหวด้วย Optical Flow Optical flow ช่วยให้เราเข้าใจว่าพิกเซลแต่ละจุดในเฟรมวิดีโอเคลื่อนที่อย่างไร มีสองประเภทของ optical flow:
- Dense Optical Flow คำนวณเวกเตอร์ฟิลด์ที่แสดงว่าพิกเซลแต่ละจุดเคลื่อนที่ไปที่ใด
- Sparse Optical Flow ใช้คุณลักษณะเด่นในภาพ (เช่น ขอบ) และสร้างเส้นทางการเคลื่อนที่ของมันจากเฟรมหนึ่งไปยังอีกเฟรมหนึ่ง
ภาพจาก OpenCV.ipynb
✍️ ตัวอย่างโน้ตบุ๊ก: OpenCV ลองใช้ OpenCV ในการปฏิบัติ
มาลองทำการทดลองกับ OpenCV โดยสำรวจ OpenCV Notebook
สรุป
บางครั้ง งานที่ซับซ้อน เช่น การตรวจจับการเคลื่อนไหวหรือการตรวจจับปลายนิ้ว สามารถแก้ไขได้ด้วยการมองเห็นด้วยคอมพิวเตอร์เพียงอย่างเดียว ดังนั้น การรู้เทคนิคพื้นฐานของการมองเห็นด้วยคอมพิวเตอร์และสิ่งที่ไลบรารีอย่าง OpenCV สามารถทำได้จึงเป็นประโยชน์อย่างมาก
🚀 ความท้าทาย
ชม วิดีโอนี้ จาก AI Show เพื่อเรียนรู้เกี่ยวกับโครงการ Cortic Tigers และวิธีที่พวกเขาสร้างโซลูชันแบบบล็อกเพื่อทำให้การมองเห็นด้วยคอมพิวเตอร์เป็นเรื่องง่ายสำหรับทุกคน ลองค้นคว้าเกี่ยวกับโครงการอื่น ๆ ที่ช่วยให้ผู้เรียนใหม่เข้าสู่สาขานี้
แบบทดสอบหลังเรียน
การทบทวนและการศึกษาด้วยตนเอง
อ่านเพิ่มเติมเกี่ยวกับ optical flow ในบทแนะนำที่ยอดเยี่ยมนี้
การบ้าน
ในห้องปฏิบัติการนี้ คุณจะถ่ายวิดีโอที่มีท่าทางง่าย ๆ และเป้าหมายของคุณคือการดึงการเคลื่อนไหวขึ้น/ลง/ซ้าย/ขวาโดยใช้ optical flow
ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้




