ผู้เขียนบทความ
1.นายนที บัวผุด COE#16
2.นายปิยะ นาคราช COE#16
3.นายธิภัชกร จันทภาโส COE#16
4.นายนิษณาต พันฤทธิ์ดำ COE#16
คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-20164 การโปรแกรมคอมพิวเตอร์ชั้นสูง
1. ความเป็นมา
เมื่อการตรวจสอบแบบเรียลไทม์กลายเป็นสิ่งสำคัญมากขึ้น ความต้องการโซลูชันที่มีประสิทธิภาพและคุ้มค่ามากขึ้นในการวิเคราะห์การไหลของผู้คนและขนาดฝูงชนก็เพิ่มขึ้นด้วย วิธีการดั้งเดิมอาจมีค่าใช้จ่ายสูงและไม่ยืดหยุ่น แต่การพัฒนาในด้านการมองเห็นคอมพิวเตอร์ เช่น โมเดลการตรวจจับวัตถุ YOLO นำเสนอทางเลือกที่ทรงพลัง YOLO โดดเด่นในด้านการตรวจจับวัตถุแบบเรียลไทม์ ทำให้เหมาะสำหรับการวิเคราะห์สตรีมวิดีโอสด
2. วัตถุประสงค์
แอปพลิเคชันนี้สร้างขึ้นด้วย Python และ Flask ซึ่งช่วยให้สามารถรวม YOLO สำหรับการตรวจจับวัตถุได้อย่างราบรื่น ระบบจะประมวลผลสตรีมวิดีโอเพื่อตรวจจับและนับจำนวนผู้คน ทำให้เหมาะสมกับการใช้งานต่างๆ เช่น การติดตามการไหลของผู้คนในร้านค้าปลีก เป็นต้น
3. ขอบเขต
โปรแกรมสามารถผลิตผลลัทพ์ จำนวนคนที่ เดินเข้า หรือ ออก จากบริเวณที่ ข้อมูล วีดีโอ (สตรีมสด หรือ ย้อนหลัง) ได้อย่างแม่นยำ ในระดับความผิดพลาดที่รับได้ โดยที่ผู้ใช้งานสามารถ กำหนด การตั้งค่า ผ่านตัว app โดยไม่ต้องแก้ไขโปรแกรมโดยตรง
4. ประโยชน์ที่คาดว่าจะได้รับ
ผู้ใช้ได้รับข้อมูล จำนวนคนที่ เดินเข้า หรือ ออก จากบริเวณที่ ข้อมูล วีดีโอ ได้อย่างแม่นยำ และสามารถนำไปใช้ต่อได้ เช่นการทำสถติ หรือ ด้านความปลอดภัย
5. ความรู้ที่เกี่ยวข้อง
การทำงานร่วมกันของโมดูลเหล่านี้ ได้แก่ cv2, YOLOv8, Ultralytics, จะเน้นไปที่การตรวจจับวัตถุ การประมวลผลภาพ และการคำนวณเชิงตัวเลข ซึ่งจะอธิบายการทำงานของแต่ละโมดูลและความเชื่อมโยงกันดังนี้
OpenCV (cv2):
เป็นไลบรารีสำหรับการประมวลผลภาพและวิดีโอ มีฟังก์ชันหลากหลายสำหรับการเปิดไฟล์ภาพ การแปลงภาพ (เช่น การแปลงเป็นระดับสีเทา), การลดเสียงรบกวน, การจับวัตถุที่เคลื่อนไหว, และการแสดงผลภาพ หรือวิดีโอจากกล้องหรือไฟล์
YOLOv8 (Ultralytics):
YOLOv8 เป็นโมเดลตรวจจับวัตถุที่มีความเร็วและความแม่นยำสูง ถูกพัฒนาโดย Ultralytics มันสามารถตรวจจับวัตถุหลาย ๆ ชนิดในภาพเดียวกันได้ในเวลาจริง (real-time) โดยใช้การตรวจจับผ่านกรอบสี่เหลี่ยมล้อมรอบวัตถุ
Ultralytics:
เป็นไลบรารีที่ทำหน้าที่จัดการโมเดล YOLOv8 ซึ่งมาพร้อมกับเครื่องมือในการเทรน ตรวจสอบ และใช้งาน YOLOv8 ได้อย่างง่ายดาย ผู้ใช้สามารถสร้างโมเดลใหม่หรือโหลดโมเดลที่ได้รับการฝึกมาแล้วเพื่อทดสอบกับข้อมูลใหม่ โดย Ultralytics ช่วยให้การพัฒนาเป็นเรื่องง่ายผ่านการจัดการเรื่องการโหลดโมเดล การประมวลผล และการตั้งค่าต่าง ๆ
6. วิธีการใช้งานโปรแกรม
- ติดตั้ง python
- โปรแกรมสามารถทำงานได้ใน python 3.9 – 3.12 โดยในที่นี่จะใช้ python 3.12.7
- ติดตั้ง model
- โปรแกรมใช้ model ของ YOLOv8 ให้โหลดไฟล์ model ไว้ที่ โฟลเดอร์ model. ตัวโปรแกรมถูกเขียนและทดลองด้วย model yolov8n (https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt) แต่สามรถใช้ model ขนาดใหญ่กว่า เพื่อความแม่นยำที่มากกว่าได้ (แลกมาด้วยการที่โปรแกรมจะใช้ทรัพยากรมากขึ้น) https://docs.ultralytics.com/models/yolov8/#supported-tasks-and-modes
- โปรแกรมใช้ model ของ YOLOv8 ให้โหลดไฟล์ model ไว้ที่ โฟลเดอร์ model. ตัวโปรแกรมถูกเขียนและทดลองด้วย model yolov8n (https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt) แต่สามรถใช้ model ขนาดใหญ่กว่า เพื่อความแม่นยำที่มากกว่าได้ (แลกมาด้วยการที่โปรแกรมจะใช้ทรัพยากรมากขึ้น) https://docs.ultralytics.com/models/yolov8/#supported-tasks-and-modes
- ติดตั้ง package จำเป็น
$ pip install opencv-python numpy ultralytics
7. อธิบายโปรแกรม
โปรแกรมเริ่มด้วยการ โหลด model จากไฟล์ และ ต้นทางของ video ที่จะประมวลผล. ในตัวอย่าง จะใช้ model yolov8n และ video mp4 ทั้งสองตัวเลือกนี่สามารถปรับแต่งได้ ไม่ว่าจะเปลี่ยน model เป็นตัวอื่นที่มีขนาดใหญ่กว่า หรือ ใช้ video สด จากกล้องผ่าน streaming protocol ต่างๆ เช่น rtps , rtp เป็นต้น
# load yolo model
model = YOLO("weights/yolov8n.pt")
# load video source
cap = cv.VideoCapture( "vids/yt_0.mp4" )
จากนั้นสร้าง ObjectCounter ซึ่งเป็น class ช่วยเหลือของ ultralytics ที่ไว้ใช้สำหรับการ ตรวจจับ และ นับวัตถุโดยเฉพาะ. โดยตั้งให้ track เฉพาะคน โดยสามารถปรับแต่งตำแหน่งที่ model จะใช้จับว่า คน กำลังเข้าหรือออกจากพื้นที่
# initialize ObjectCounter to count select object
counter = solutions.ObjectCounter(
# detect via OBB method
region = [(0, 250), (2000, 300)],
# class name to use in show mode
names = model.names,
# show tracking via window
show = True,
# tracking line thickness
line_thickness=1,
# track human ( class = 0 )
classes = [ 0 ]
)
เมื่อ setup เสร็จ โปรแกรมจะทำการ loop ดึงภาพมาจาก video ที่เราให้ไว้เรื่อยๆจนกว่าจะหมด และ ส่งภาพนั้นเข้า ObjecectCounter ให้ประมวลผม
while cap.isOpened():
# get current image frame
valid , im0 = cap.read()
if not valid:
print("Video end")
break
# resize image to 720p for better performance
# im0 = cv.resize(im0, (1280 , 720))
# update count
im0 = counter.count( im0 )
if cv.waitKey(1) & 0xFF == ord("q"):
break
แสดงผลจำนวนคนเข้าออก
# output
print("===== Summary= ===")
print('PEOPLE IN -> ', counter.in_count)
print('PEOPLE OUT -> ', counter.out_count)
โค้ดเต็ม
# full code
import cv2 as cv
# ultralytics to handle YOLO model and object counting algorithm
from ultralytics import YOLO , solutions
def main():
# load yolo model
model = YOLO("weights/yolov8n.pt")
# load video source
cap = cv.VideoCapture( "vids/yt_0.mp4" )
# check if video source loaded
if cap.isOpened() == False:
raise Exception("Error opening video file")
# initialize ObjectCounter to count select object
counter = solutions.ObjectCounter(
# detect via OBB method
region = [(0, 250), (2000, 300)],
# class name to use in show mode
names = model.names,
# show tracking via window
show = True,
# tracking line thickness
line_thickness=1,
# track human ( class = 0 )
classes = [ 0 ]
)
while cap.isOpened():
# get current image frame
valid , im0 = cap.read()
if not valid:
print("Video end")
break
# update count
im0 = counter.count( im0 )
if cv.waitKey(1) & 0xFF == ord("q"):
break
# output
print("===== Summary= ===")
print('PEOPLE IN -> ', counter.in_count)
print('PEOPLE OUT -> ', counter.out_count)
pass
if __name__ == '__main__':
main()
7. ผลการทดลอง
สรุปผล จากการทดลองผลปรากฎว่าการใช้งานโปรแกรมนั้นมีประสิทธิภาพ โปรแกรมสามารถจับภาพวิดีโอคนเข้า-ออกได้เป็นอย่างดีแต่ทั้งนี้ก็ขึ้นอยู่กับวิดีโอที่เลือกใช้ ปัจจัยต่างๆ เช่น มุมที่ถ่ายอาจไม่เห็นคนไม่ชัดเจน, กล้องมีวัตถุอื่นที่เคลื่อนไหวเมื่อใช้ model ขนาดเล็กอาจจะทำให้ model สับสน, วิดีโอในถ้ามืดเกินไปก็อาจทำให้จับภาพไม่ได้ หรือ การใช้ model ที่มีขนาดใหญ่และกินทรัพยาการมากว่าที่คอมพิวเตอร์จะประมวลไหวส่งผลให้เกิด lag และความล่าช้า แต่โดยรวมแล้วในมุมกล้องที่ดี , การเลือก model และ ตำแหน่งที่ใช้ตรวจจับคน ที่เหมาะสมก็สามารถทำให้โปรแกรมทำงานได้อย่างมีประสิทธิภาพ
ข้อเสนอแนะ ควรจัดหามุมกล้องที่ดี
8. ข้อมูลอ้างอิง
ใช้ใน Python เป็นไลบรารีโอเพนซอร์สที่ใช้สำหรับงานด้านการประมวลผลภาพและการมองเห็นของคอมพิวเตอร์ (Computer Vision) มีเครื่องมือที่หลากหลายสำหรับการจัดการกับภาพและวิดีโอ รวมถึงการตรวจจับวัตถุ การตรวจสอบใบหน้า การตรวจจับการเคลื่อนไหว และอื่น ๆ OpenCV ถูกใช้อย่างแพร่หลายในงานวิจัย, วิศวกรรม, AI, และงานด้านการเรียนรู้ของเครื่อง (Machine Learning) เนื่องจากรองรับการทำงานที่ซับซ้อนและสามารถทำงานได้อย่างมีประสิทธิภาพสูง https://phyblas.hinaboshi.com/oshi01
โมดูล Ultralytics เป็นไลบรารีที่พัฒนาเพื่อใช้งานโมเดล YOLO (You Only Look Once) ซึ่งเป็นหนึ่งในโมเดลยอดนิยมสำหรับการตรวจจับวัตถุในภาพและวิดีโอ โมเดล YOLO มีชื่อเสียงในเรื่องของความเร็วและความแม่นยำ โดยสามารถทำงานแบบเรียลไทม์ได้เป็นอย่างดี https://github.com/ultralytics/ultralytics