Published on

Python for Computer Vision

Authors
python computer vision

Computer Vision คืออะไร?

Computer Vision เป็นศาสตร์ที่ทำให้คอมพิวเตอร์สามารถมองเห็น ตีความ และทำความเข้าใจรูปภาพ ในทำนองเดียวกับที่มนุษย์สามารถมองเห็นสิ่งรอบๆตัวได้ ในบทความนี้จะพูดถึงว่า ทำอย่างไรให้คอมพิวเตอร์ถึงสามารถมองเห็นภาพได้ สามารถวิเคราะห์ได้อย่างไรบ้าง และสามารถต่อยอดด้าน AI ได้อย่างไร พร้อมตัวอย่างวิดีสอนและ Code ซึ่งให้ทุกคนสามารถทดลองเขียนตามได้

Computer สามารถมองเห็นภาพได้อย่างไร?

ทุกคนนึกถึงรูปภาพความละเอียด 640x480 ถ้าเรามองเป็นช่องสี่เหลี่ยมภาพนี้จะมีช่องแนวนอนทั้งหมด 640ช่อง แนวตั้ง 480ช่อง และถ้านำมาคูณกันก็จะได้ 307,200 ช่อง หรือเราเรียกหน่วยช่องเหล่านี้ว่า pixel ซึ่งในแต่ละ Pixel จะมีค่าตัวเลข 0-255 สำหรับบ่งบอกเฉดสีของภาพนั้นๆ ถ้าเป็นภาพขาวดำเลข 0 ก็จะหมายถึงสีดำ และ 255 คือสีขาว ส่วนกรณีที่เป็นภาพสีจะมีองค์ประกอบของสี 3 สีรวมกันได้แก่ Red, Green, Blue หรือเรียกสั้นๆว่า RGB ดังนั้นขนาดของภาพจะเป็น 640x480x3 หากในมุมของสีแดงมีค่า 255 หมายถึงสีแดงสด ถ้า 0 ก็ดำเช่นกัน หากทั้ง 3 แกน เป็น 255 หมดเลยก็จะทำให้ได้สีขาว ตามองค์ประกอบสี

ตัวอย่างการอ่านและแสดงผลรูปภาพ

ติดตั้ง opencv

pip install opencv-python

ตัวอย่างการอ่านไฟล์รูปภาพและแสดงผล

ex_imread.py
import cv2

img = cv2.imread("image.jpg")
# do something
cv2.imshow("Image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imread() เป็นคำสั่งสำหรับอ่านไฟล์ภาพมาเป็นข้อมูลตัวตามที่เราบอกไว้ข้างต้น เก็บไว้ในตัวแปรก img จากนั้นก็เป็นหน้าที่เราที่จะใช้ Python ในการคำนวณเลขเหล่านั้นให้ได้ภาพตามที่เราต้องการ สุดท้ายสมมุติว่าเราประมวลผลเสร็จ เราก็แสดงผลรูปภาพด้วยคำสั่ง cv2.imshow()

Do something ทำอะไรได้บ้าง

หลังจากที่เราได้ค่าตัวเลขมาเสร็จเรียบร้อยแล้ว ก็จะเข้าสู่ขั้นตอนการประมวลผล ให้ได้ผลลัพธ์ตามที่เราต้องการ ตัวอย่างเช่น

  • Brightness / Darkness ปรับความสว่างและความมืดของภาพ การทำให้ตัวเลขมากขึ้นเราจะได้ภาพที่สว่างขึ้น ค่าตัวเลขน้อยลงก็จะมืดลง ซึ่งทำได้ทั้งวิธีการบวกและคูณ
  • Resizing การปรับขนาดรูปภาพ
  • Rotation การหมุนรูปภาพ
  • Flipping พลิกรูปภาพ
  • Edge Detection การหาขอบภาพของวัตถุ เทคนิคนี้จะเป็นการหาผลต่างเทียบกับ pixel ข้างๆ ต่างกันมากกอาจจะบอกได้ว่าขอบของวัตถุ เช่นเสื้อสีขาวกับพื้นหลังสีดำ สีขาว (255) - สีขาว (255) = 0 และ สีดำ (0) - สีดำ (0) = 0 หากจุดที่เกิด สีขาว (255) - สีดำ (0) = สีขาว (255) ก็จะบอกถึงขอบภาพ
  • Circle Detection หาพื้นที่วงกลมในภาพ มักจะใช้ในการตรวจจับและนับเหรียญ 1 5 และ 10 บาท นี้เป็นเพียงตัวอย่างโปรแกรมที่มนุษย์สามารถกำหนดเงื่อนไขเพื่อทำงานตามที่ต้องการได้ แต่ยังโจทย์อีกมากมายที่สามารถนำ AI มาช่วยเพื่อเพิ่มความสามารถเหล่านี้

สามารถต่อยอดด้าน AI ได้อย่างไร

AI มามีบทบาททางด้าน Computer Vision เป็นอย่างมาก เนื่องจากข้อมูลรูปภาพมักจะมีจำนวนตัวเลขหลายๆล้าน pixel แม้แต่โจทย์ง่ายๆอย่างเช่น ใบหน้าคนอยู่ตำแหน่งไหนของภาพ ก็เป็นเรื่องยากมากๆที่มนุษย์จะสามารถเขียนเงื่อนไขกำหนดลักษณะของใบหน้าคนได้ แต่ความโชคดีที่เราสามารถหารูปภาพใบหน้าคนได้จำนวนมากได้ไม่ยาก และใบหน้าทุกๆคนก็มักจะมี pattern ซ้ำๆกัน เช่น มี2หู 2ตา มีจมูกอยู่ตรงกลางใบหน้า มี1ปากอยู่ใต้จมูก ซึ่งตรงกับความสามารถของ AI ได้อย่างลงตัว โดยที่เราสามารถสอนให้มันเรียน pattern ด้วยข้อมูลจำนวนมากได้ เย้!!

  • Optical Charactor Recognition (OCR) การประมวลผลรูปภาพเพื่ออ่านตัวอักษรที่อยู่ในภาพ
  • Face Detection การหาตำแหน่งใบหน้าคนในภาพ
  • Face Recognition การจดจำใบหน้าคน
  • Image Generative การสร้างรูปภาพ หากใครเคยลองเล่น DALL-E ที่เราใส่ข้อความให้น้อง AI น้องก็สามารถสร้างรูปภาพตามคำบอกของเราได้

และวันนี้ผมยังมีวิดีโอสอนเขียน opencv อย่างง่ายๆเพื่อใช้เพื่อนๆสามารถทดลองเล่นกับ AI ได้อีกด้วย ถึง 3 ตัว ผมแนะนำให้เพื่อนๆ Save หน้านี้เก็บไว้เลยนะครับ เพราะเครื่องมือเหล่านี้สามารถนำไปต่อยอดงานด้านรูปภาพได้อีกมากมาย

  1. Face Detection การตรวจจับใบหน้า สามารถต่อยอดสร้างโปรแกรมตรวจจับการใส่หน้ากาก นับจำนวนคน จดจำใบหน้า
  2. Hand Detection การตรวจจับมือ สามารถต่อยอดสร้างโปรแกรมอ่านภาษามือ
  3. Pose Detection การตรวจจับท่าทาง สามารถต่อยอดสร้างโปรแกรมหาตำแหน่ง สร้าง Heatmap บอกได้ว่าคนอยู่บริเวณไหนบ่อยและนานที่สุด ตรวจจับท่าทางของคนที่ผิดสังเกต

มาลองเขียน Python cvzone ใช้งาน AI รวมกับ Opencv

cvzone เป็น library หนึ่งที่ไปครอบ library ที่ชื่อ Mediapipe ทำให้เราสามารถนำ AI มาใช้งานร่วมกับ opencv ได้อย่างง่ายดายมากๆ และวิดีด้านล่างนี้จะพาทุกคนใช้งาน AI ร่วมกับการประมวลผลวิดีโอ

EP.1 Video Tutorial: FPS

วิดีโอสอนการ setup เบื่องต้นที่จะใช้งานต่อใน EP ต่อๆไป, การเขียนคำสั่งอ่านภาพ realtime จากกล้อง และแสดงค่า FPS ย่อมาจาก Frames per Second ที่เป็นหน่วยวัดความเร็วในการแสดงผลจำนวนภาพใน 1 วินาที

ตัวอย่าง Cope FPS

เราอ่านภาพจากกล้องด้วยคำสั่ง cap.read() จากนั้นนำภาพที่ได้ไปประทับ FPS ด้วยคำสั่ง fpsReader.update()

fps.py
from cvzone import FPS
import cv2

cap = cv2.VideoCapture(0)
fpsReader = FPS()

while True:
    ret, frame = cap.read()
    fps, frame = fpsReader.update(frame)

    cv2.imshow("Image", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

EP.2 Video Tutorial: Face Detection

วิดีโอสอนการใช้งาน Face Detection พร้อมตัวอย่าง Code

ตัวอย่าง Cope Face Detection

เราหาตำแหน่งของใบหน้าได้ด้วยเข้าคำสั่ง detector.findFaces() จะได้ข้อมูลรูปภาพที่ตรวจพบตำแหน่งใบหน้าและข้อมูลตำแหน่งต่างๆ bboxs

face_detection.py
import cv2
from cvzone.FaceDetectionModule import FaceDetector

cap = cv2.VideoCapture(0)
detector = FaceDetector()
while True:
    success, img = cap.read()
    img, bboxs = detector.findFaces(img)

    if bboxs:
        # bboxInfo - "id","bbox","score","center"
        center = bboxs[0]["center"]
        cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)

    cv2.imshow("Image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

EP.3 Video Tutorial: Hand Detection

วิดีโอสอนการใช้งาน Hand Detection พร้อมตัวอย่าง Code

ตัวอย่าง Cope Hand Detection

เราหาตำแหน่งของมือได้ด้วยเข้าคำสั่ง detector.findHands() จะได้ข้อมูลรูปภาพที่ตรวจพบตำแหน่งใบมือและข้อมูลตำแหน่งต่างๆของมือ hands

hand_detection.py
from cvzone.HandTrackingModule import HandDetector
import cv2

cap = cv2.VideoCapture(0)
detector = HandDetector(detectionCon=0.8, maxHands=2)
while True:

    success, img = cap.read()
    hands, img = detector.findHands(img)  # with draw
    # hands = detector.findHands(img, draw=False)  # without draw

    cv2.imshow("Image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

EP.4 Video Tutorial: Pose Detection

วิดีโอสอนการใช้งาน Pose Detection พร้อมตัวอย่าง Code

ตัวอย่าง Cope Pose Detection

เป็นการหาตำแหน่งของมนุษย์และตำแหน่งของร่างกาย โดยใช้คำสั่ง detector.findPose() จะได้ข้อมูลรูปภาพและข้อมูลตำแหน่งต่างๆ bboxInfo

pose_detection.py
from cvzone.PoseModule import PoseDetector
import cv2

cap = cv2.VideoCapture(0)
detector = PoseDetector()
while True:
    success, img = cap.read()
    img = detector.findPose(img)
    lmList, bboxInfo = detector.findPosition(img, bboxWithHands=False)
    if bboxInfo:
        center = bboxInfo["center"]
        cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)

    cv2.imshow("Image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

เป็นไงกันบ้างครับ จบกันไปแล้วกับตัวอย่าง Python for Computer Vision เพื่อพัฒนาบทความให้ดียิ่งขึ้นทุกท่านสามารถพูดคุย แสดงความเห็นได้ที่ DataHungry ฝากติดตามด้วยนะครับ