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

17 KiB

บทนำสู่การมองเห็นด้วยคอมพิวเตอร์

Computer Vision เป็นสาขาหนึ่งที่มีเป้าหมายเพื่อให้คอมพิวเตอร์สามารถเข้าใจภาพดิจิทัลในระดับสูงได้ คำว่า เข้าใจ ในที่นี้มีความหมายกว้างมาก เช่น การค้นหาวัตถุในภาพ (object detection), การเข้าใจเหตุการณ์ที่เกิดขึ้น (event detection), การอธิบายภาพด้วยข้อความ หรือการสร้างฉากในรูปแบบ 3D นอกจากนี้ยังมีงานเฉพาะที่เกี่ยวข้องกับภาพมนุษย์ เช่น การประมาณอายุและอารมณ์, การตรวจจับและระบุตัวตนใบหน้า, และการประมาณท่าทางในรูปแบบ 3D เป็นต้น

แบบทดสอบก่อนเรียน

หนึ่งในงานที่ง่ายที่สุดของการมองเห็นด้วยคอมพิวเตอร์คือ การจำแนกภาพ

การมองเห็นด้วยคอมพิวเตอร์มักถูกมองว่าเป็นส่วนหนึ่งของ AI ในปัจจุบัน งานส่วนใหญ่ในสาขานี้ถูกแก้ไขโดยใช้เครือข่ายประสาทเทียม เราจะเรียนรู้เพิ่มเติมเกี่ยวกับเครือข่ายประสาทเทียมชนิดพิเศษที่ใช้ในงานนี้ convolutional neural networks ในส่วนนี้

อย่างไรก็ตาม ก่อนที่คุณจะส่งภาพไปยังเครือข่ายประสาทเทียม ในหลายกรณีการใช้เทคนิคเชิงอัลกอริทึมเพื่อปรับปรุงภาพก็เป็นสิ่งที่สมเหตุสมผล

มีไลบรารี Python หลายตัวที่สามารถใช้สำหรับการประมวลผลภาพ:

  • imageio ใช้สำหรับการอ่าน/เขียนภาพในรูปแบบต่าง ๆ และยังรองรับ ffmpeg ซึ่งเป็นเครื่องมือที่มีประโยชน์ในการแปลงเฟรมวิดีโอเป็นภาพ
  • Pillow (หรือที่รู้จักในชื่อ PIL) มีความสามารถมากกว่า และยังรองรับการปรับแต่งภาพ เช่น การเปลี่ยนรูปภาพ, การปรับพาเลต และอื่น ๆ
  • OpenCV เป็นไลบรารีการประมวลผลภาพที่ทรงพลังซึ่งเขียนด้วย C++ และกลายเป็นมาตรฐาน de facto สำหรับการประมวลผลภาพ มีอินเทอร์เฟซ Python ที่สะดวก
  • dlib เป็นไลบรารี C++ ที่มีการใช้อัลกอริทึมการเรียนรู้ของเครื่องหลายตัว รวมถึงอัลกอริทึมการมองเห็นด้วยคอมพิวเตอร์บางตัว มีอินเทอร์เฟซ Python และสามารถใช้สำหรับงานที่ท้าทาย เช่น การตรวจจับใบหน้าและจุดสำคัญบนใบหน้า

OpenCV

OpenCV ถือว่าเป็นมาตรฐาน de facto สำหรับการประมวลผลภาพ มีอัลกอริทึมที่มีประโยชน์มากมายที่ถูกพัฒนาใน C++ คุณสามารถเรียกใช้ OpenCV จาก Python ได้เช่นกัน

แหล่งเรียนรู้ที่ดีเกี่ยวกับ OpenCV คือ คอร์ส Learn OpenCV ในหลักสูตรของเรา เป้าหมายไม่ใช่การเรียนรู้ OpenCV แต่เพื่อแสดงตัวอย่างบางกรณีที่สามารถใช้งานได้ และวิธีการใช้งาน

การโหลดภาพ

ภาพใน Python สามารถแสดงผลได้อย่างสะดวกในรูปแบบของอาร์เรย์ NumPy ตัวอย่างเช่น ภาพสีเทาที่มีขนาด 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 นี้
  • การใช้ thresholding โดยเรียกใช้ฟังก์ชัน cv2.threshold/cv2.adaptiveThreshold ซึ่งมักจะดีกว่าการปรับความสว่างหรือความคมชัด
  • การใช้ การแปลงต่าง ๆ กับภาพ:
    • Affine transformations มีประโยชน์หากคุณต้องการรวมการหมุน, การปรับขนาด และการเอียงภาพ และคุณทราบตำแหน่งต้นทางและปลายทางของจุดสามจุดในภาพ การแปลงแบบ Affine จะรักษาเส้นคู่ขนานให้ยังคงคู่ขนาน
    • 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

✍️ ตัวอย่าง Notebook: OpenCV ลองใช้งาน OpenCV

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

สรุป

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

🚀 ความท้าทาย

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

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

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

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

การบ้าน

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

Palm Movement Frame