IT General
น้องๆ เคยสงสัยมั้ยว่าทำไมกล้องวงจรปิดถึงจับหน้าเราได้? ทำไมรถยนต์สมัยใหม่ถึงขับเองได้? คำตอบส่วนใหญ่อยู่ที่ Computer Vision นี่แหละ สมัยผมทำร้านเน็ต ผมเคยคิดเล่นๆ ว่าถ้ามีโปรแกรมที่จำหน้าลูกค้าขาประจำได้ จะดีแค่ไหน ไม่ต้องคอยถามชื่อให้เสียเวลา Computer Vision นี่แหละที่ทำให้ฝันเป็นจริงได้
Computer Vision หรือ CV คือศาสตร์ที่ทำให้คอมพิวเตอร์ "มองเห็น" และ "เข้าใจ" ภาพได้ เหมือนที่คนเรามองแล้วรู้ว่านี่คือแมว นี่คือหมา นี่คือรถยนต์ OpenCV (Open Source Computer Vision Library) เป็นเหมือนห้องสมุดขนาดใหญ่ ที่รวบรวมเครื่องมือและฟังก์ชันต่างๆ ที่จำเป็นต่อการพัฒนาโปรแกรม CV เอาไว้ให้เราใช้กันฟรีๆ
ทำไมมันถึงสำคัญน่ะเหรอ? ลองคิดดูสิครับ ตั้งแต่ระบบรักษาความปลอดภัย ระบบขนส่ง ระบบการแพทย์ ไปจนถึงวงการบันเทิง CV เข้าไปมีบทบาทหมดแล้ว มันช่วยเพิ่มประสิทธิภาพ ลดต้นทุน และสร้างโอกาสใหม่ๆ ได้อีกมากมาย
ภาพที่เราเห็นในคอมพิวเตอร์จริงๆ แล้วมันก็คือชุดตัวเลขครับ แต่ละตัวเลขแทนค่าความสว่างของสีในแต่ละจุด (pixel) ภาพสีก็จะมีหลาย layer เช่น RGB (Red, Green, Blue) แต่ละ layer ก็เก็บค่าความสว่างของสีนั้นๆ ยกตัวอย่างเช่น ภาพขาวดำ ค่าแต่ละ pixel จะมีตั้งแต่ 0 (ดำสนิท) ถึง 255 (ขาวสว่าง)
สมัยก่อนผมเคยลองเขียนโปรแกรมง่ายๆ เปลี่ยนภาพสีเป็นขาวดำเอง สนุกดี ได้เห็นเลยว่าแต่ละ pixel มันมีค่าอะไรบ้าง
Image Processing คือการปรับแต่งแก้ไขภาพ เช่น การปรับความสว่าง ความคมชัด การลด noise (จุดรบกวน) หรือการใส่ filter ต่างๆ พวก filter นี่แหละที่ทำให้เราสามารถตรวจจับขอบ (edge detection) หรือหาวัตถุในภาพได้
ผมเคยเจอเคสที่ลูกค้าอยากให้โปรแกรมอ่านป้ายทะเบียนรถ ตอนแรกภาพมันเบลอมาก มองอะไรไม่เห็นเลย ต้องใช้เทคนิค Image Processing เข้ามาช่วยปรับภาพให้คมชัดขึ้น ถึงจะอ่านทะเบียนได้
Feature Extraction คือการดึงเอา "จุดเด่น" ของภาพออกมา เช่น มุม ขอบ หรือรูปร่าง เพื่อเอาไปใช้ในการวิเคราะห์ต่อ ยกตัวอย่างเช่น ถ้าเราต้องการสร้างโปรแกรมจดจำใบหน้า เราจะต้องหาจุดเด่นบนใบหน้า เช่น ตำแหน่งของดวงตา จมูก ปาก แล้วเอาไปเปรียบเทียบกับฐานข้อมูล
OpenCV มีฟังก์ชันสำเร็จรูปให้เราใช้เยอะแยะเลยครับ ไม่ต้องเขียนเองทั้งหมด
เริ่มต้นง่ายๆ เลยครับ ติดตั้ง OpenCV ก่อน ถ้าใช้ Python ก็แค่ pip install opencv-python แค่นี้เอง
pip install opencv-python
จากนั้นก็ import เข้ามาในโปรแกรมได้เลย
import cv2
เริ่มต้นด้วยการอ่านภาพเข้ามา แล้วลองแสดงผลดู
import cv2
# อ่านภาพ
img = cv2.imread('my_image.jpg')
# แสดงภาพ
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
โค้ดข้างบนจะอ่านไฟล์ภาพชื่อ 'my_image.jpg' แล้วแสดงผลออกมาในหน้าต่าง ถ้าไม่มีภาพนี้ โปรแกรมจะ error นะครับ ลองเปลี่ยนเป็นชื่อไฟล์ภาพที่มีอยู่ในเครื่องเราดู
Face Detection เป็นหนึ่งใน use case ที่ฮิตที่สุดของ OpenCV ลองดูโค้ดนี้
import cv2
# Load the cascade
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Read the input image
img = cv2.imread('test.jpg')
# Convert into grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detect faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Draw rectangle around the faces
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# Display the output
cv2.imshow('img', img)
cv2.waitKey()
โค้ดนี้จะใช้ไฟล์ 'haarcascade_frontalface_default.xml' ซึ่งเป็นไฟล์ที่ train มาแล้วสำหรับการตรวจจับใบหน้า เราสามารถหาไฟล์นี้ได้ง่ายๆ ในอินเทอร์เน็ต หรือจาก OpenCV GitHub repository โค้ดจะอ่านภาพเข้ามา แปลงเป็นภาพขาวดำ แล้วใช้ cascade classifier ตรวจจับใบหน้า ถ้าเจอใบหน้า ก็จะวาดสี่เหลี่ยมรอบๆ
ลองเอาไปรันดูนะครับ สนุกมาก
Object Tracking คือการติดตามวัตถุที่สนใจในวิดีโอ OpenCV มี algorithm ให้เลือกใช้หลายแบบ เช่น MeanShift, CAMShift, หรือ CSRT แต่ละแบบก็มีข้อดีข้อเสียต่างกัน
สมัยก่อนผมเคยลองทำโปรเจกต์ติดตามลูกบอลในสนามบาสเก็ตบอล ใช้ algorithm ง่ายๆ อย่าง MeanShift ก็พอใช้ได้ แต่ถ้าลูกบอลมีการเคลื่อนที่เร็ว หรือมีวัตถุอื่นมาบัง ก็จะหลุด track ได้ง่ายๆ
ลองเข้าไปดูตัวอย่างโค้ดใน OpenCV documentation ได้เลยครับ มีให้ศึกษาเยอะแยะ SiamCafe Blog ก็มีบทความเกี่ยวกับ OpenCV ด้วยนะ
OpenCV ไม่ได้เป็น library ตัวเดียวที่ใช้ทำ Computer Vision นะครับ ยังมีตัวเลือกอื่นๆ อีก เช่น
OpenCV เหมาะสำหรับงานที่ต้องการความเร็ว และสามารถทำงานบนอุปกรณ์ที่มีทรัพยากรจำกัดได้ดี เช่น กล้องวงจรปิด หรือระบบฝังตัว
| Feature | OpenCV | TensorFlow | PyTorch |
|---|---|---|---|
| ใช้งานง่าย | สูง | ปานกลาง | ปานกลาง |
| ความเร็ว | สูง | ปานกลาง | ปานกลาง |
| Deep Learning | รองรับ (แต่ไม่เน้น) | สูง | สูง |
| Platform | หลากหลาย | หลากหลาย | หลากหลาย |
| License | BSD (Free) | Apache 2.0 (Free) | BSD (Free) |
เอาล่ะน้องๆ มาถึงส่วนสำคัญที่พี่บอมอยากแชร์จากประสบการณ์จริง สมัยทำร้านเน็ตคาเฟ่ SiamCafe.net ตั้งแต่ปี 2540 กว่าๆ โน่น (บ่งบอกอายุมาก 555) เรื่อง Computer Vision กับ OpenCV นี่ไม่ใช่แค่ทฤษฎีนะ มันคือการแก้ปัญหาหน้างานจริงๆ
สมัยก่อนเน็ตช้า คอมก็ไม่ได้แรงแบบนี้ แต่เราก็พยายามเอา OpenCV มาใช้ทำอะไรสนุกๆ เช่น ระบบนับจำนวนคนเข้าร้าน (แบบหยาบๆ) หรือระบบตรวจจับว่ามีใครแอบเล่นเกมโป๊รึเปล่า (อันนี้ยากหน่อย แต่ทำได้นะ!)
นี่คือเทคนิคที่พี่ว่าเวิร์ค และเอาไปปรับใช้ได้จริง ไม่ต้องเขียนโค้ดเทพอะไรมากมาย:
import cv2
import numpy as np
def sharpen_image(image):
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
return cv2.filter2D(image, -1, kernel)
# Example Usage
img = cv2.imread('image.jpg')
sharpened_img = sharpen_image(img)
cv2.imwrite('sharpened_image.jpg', sharpened_img)
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
def detect_faces(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
return image
# Example Usage
img = cv2.imread('image.jpg')
detected_faces_img = detect_faces(img)
cv2.imwrite('detected_faces.jpg', detected_faces_img)
import cv2
def detect_motion(frame1, frame2):
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh, None, iterations=3)
contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
return contours
# Example Usage (using video capture)
cap = cv2.VideoCapture(0) # 0 for default camera
ret, frame1 = cap.read()
ret, frame2 = cap.read()
while cap.isOpened():
contours = detect_motion(frame1, frame2)
for contour in contours:
(x, y, w, h) = cv2.boundingRect(contour)
if cv2.contourArea(contour) < 700: # Adjust threshold as needed
continue
cv2.rectangle(frame1, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Motion Detection', frame1)
frame1 = frame2
ret, frame2 = cap.read()
if cv2.waitKey(40) == 27: # Press ESC to exit
break
cap.release()
cv2.destroyAllWindows()
ถ้าพื้นฐาน programming แน่นๆ หน่อยก็ไม่ยากเกินไปหรอกน้อง แต่ถ้าไม่เคยเขียนโค้ดเลย อาจจะต้องใช้เวลาเรียนรู้เยอะหน่อย เริ่มจาก tutorial ง่ายๆ ก่อนก็ได้
ส่วนใหญ่เค้าใช้ Python กัน เพราะมันง่าย มี library ให้ใช้เยอะแยะ แต่ C++ ก็ยังเป็นที่นิยมอยู่ เพราะมันเร็วกว่า
โอ้ย! เยอะแยะเลยน้อง ตั้งแต่ระบบรักษาความปลอดภัย ระบบจดจำใบหน้า ระบบควบคุมหุ่นยนต์ ไปจนถึง application ในมือถือ
ฟรีครับ! เป็น Open Source Software เอาไปใช้ได้เลยไม่ต้องเสียเงิน
Computer Vision กับ OpenCV เป็น field ที่น่าสนใจ และมีประโยชน์มากๆ พี่ว่าน้องๆ ที่สนใจด้าน IT ควรลองศึกษาดูนะ มันอาจจะเปลี่ยนชีวิตน้องๆ ไปเลยก็ได้ iCafeForex ก็เป็นอีกหนึ่งช่องทางในการเรียนรู้เรื่องพวกนี้ได้เหมือนกัน อย่ากลัวที่จะลองผิดลองถูก เพราะนั่นคือวิธีเรียนรู้ที่ดีที่สุด SiamCafe Blog ก็มีบทความอื่นๆ ที่น่าสนใจ ลองเข้าไปอ่านดูนะ!