AI-For-Beginners/translations/th/lessons/4-ComputerVision/06-IntroCV/README.md

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 เพื่อแยกสัญลักษณ์เบรลล์แต่ละตัวสำหรับการจำแนกผลลัพธ์ด้วยโครงข่ายประสาทเทียม
Braille Image Braille Image Pre-processed Braille Symbols

ภาพจาก OpenCV.ipynb

  • การตรวจจับการเคลื่อนไหวในวิดีโอด้วยความแตกต่างของเฟรม หากกล้องอยู่กับที่ เฟรมจากกล้องควรมีความคล้ายคลึงกันมาก โดยการลบอาร์เรย์ของเฟรมสองเฟรมที่ต่อเนื่องกัน เราจะได้ค่าความแตกต่างของพิกเซล ซึ่งควรต่ำสำหรับเฟรมที่นิ่ง และสูงขึ้นเมื่อมีการเคลื่อนไหวในภาพ

Image of video frames and frame differences

ภาพจาก OpenCV.ipynb

  • การตรวจจับการเคลื่อนไหวด้วย Optical Flow Optical flow ช่วยให้เราเข้าใจว่าพิกเซลแต่ละจุดในเฟรมวิดีโอเคลื่อนที่อย่างไร มีสองประเภทของ optical flow:

    • Dense Optical Flow คำนวณเวกเตอร์ฟิลด์ที่แสดงว่าพิกเซลแต่ละจุดเคลื่อนที่ไปที่ใด
    • Sparse Optical Flow ใช้คุณลักษณะเด่นในภาพ (เช่น ขอบ) และสร้างเส้นทางการเคลื่อนที่ของมันจากเฟรมหนึ่งไปยังอีกเฟรมหนึ่ง

Image of Optical Flow

ภาพจาก OpenCV.ipynb

✍️ ตัวอย่างโน้ตบุ๊ก: OpenCV ลองใช้ OpenCV ในการปฏิบัติ

มาลองทำการทดลองกับ OpenCV โดยสำรวจ OpenCV Notebook

สรุป

บางครั้ง งานที่ซับซ้อน เช่น การตรวจจับการเคลื่อนไหวหรือการตรวจจับปลายนิ้ว สามารถแก้ไขได้ด้วยการมองเห็นด้วยคอมพิวเตอร์เพียงอย่างเดียว ดังนั้น การรู้เทคนิคพื้นฐานของการมองเห็นด้วยคอมพิวเตอร์และสิ่งที่ไลบรารีอย่าง OpenCV สามารถทำได้จึงเป็นประโยชน์อย่างมาก

🚀 ความท้าทาย

ชม วิดีโอนี้ จาก AI Show เพื่อเรียนรู้เกี่ยวกับโครงการ Cortic Tigers และวิธีที่พวกเขาสร้างโซลูชันแบบบล็อกเพื่อทำให้การมองเห็นด้วยคอมพิวเตอร์เป็นเรื่องง่ายสำหรับทุกคน ลองค้นคว้าเกี่ยวกับโครงการอื่น ๆ ที่ช่วยให้ผู้เรียนใหม่เข้าสู่สาขานี้

แบบทดสอบหลังเรียน

การทบทวนและการศึกษาด้วยตนเอง

อ่านเพิ่มเติมเกี่ยวกับ optical flow ในบทแนะนำที่ยอดเยี่ยมนี้

การบ้าน

ในห้องปฏิบัติการนี้ คุณจะถ่ายวิดีโอที่มีท่าทางง่าย ๆ และเป้าหมายของคุณคือการดึงการเคลื่อนไหวขึ้น/ลง/ซ้าย/ขวาโดยใช้ optical flow

Palm Movement Frame

ข้อจำกัดความรับผิดชอบ:
เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่แม่นยำ เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดซึ่งเกิดจากการใช้การแปลนี้