- Published on
Python for Computer Vision
- Authors
- Name
- Wuttichai Kaewlomsap
- @wuttichaihung
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
ตัวอย่างการอ่านไฟล์รูปภาพและแสดงผล
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 หน้านี้เก็บไว้เลยนะครับ เพราะเครื่องมือเหล่านี้สามารถนำไปต่อยอดงานด้านรูปภาพได้อีกมากมาย
- Face Detection การตรวจจับใบหน้า สามารถต่อยอดสร้างโปรแกรมตรวจจับการใส่หน้ากาก นับจำนวนคน จดจำใบหน้า
- Hand Detection การตรวจจับมือ สามารถต่อยอดสร้างโปรแกรมอ่านภาษามือ
- 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()
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
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
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
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 ฝากติดตามด้วยนะครับ