ผู้เขียนบทความ
1.นายสรวิศ หล่อกาญจนาภา
2.นายเชาว์วัฒน์ นนทะสร
3.นายชโนดม นิลเพชร
4.นายฐิติพันธ์ ขันตี
คณะวิศวกรรมศาสตร์คอมพิวเตอร์
วิชา:0451320164 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2567
1.ความเป็นมา
ความเร็วในการใช้ยานพาหนะนั้นเป็นสิ่งสำคัญที่ต้องการการควบคุมอย่างยิ่ง เพราะถ้าหากใช้ความเร็วในพื้นที่ที่ไม่เหมาะสมเช่น ชุมชนแอแอัดหรือในสถานศึกษา อาจทำให้เกิดอุบัติเหตุร้ายแรงจนถึงขั้นเสียชีวิตได้
ด้วยเหตุนี้จึงเกิดเป็น โครงการระบบตรวจจับความเร็วยานพาหนะเพื่อเข้ามาช่วยตรวจสอบและป้องกันผู้ที่ใช้ความเร็วเกินกำหนด โดยการตรวจจับและบันทึกภาพเป็นหลักฐานทำให้ผู้ที่ใช้ยานพาหนะใช้ความเร็วลดลง เหมาะสมกับกับพื้นที่นั้นๆ
2.วัตถุประสงค์
2.1ตรวจจับและติดตามยานพาหนะ: ระบบถูกออกแบบมาเพื่อใช้ในการตรวจจับและติดตามยานพาหนะต่าง ๆ (เช่น รถยนต์ และมอเตอร์ไซค์) ในวิดีโอที่บันทึกไว้หรือในวิดีโอสด โดยใช้เทคโนโลยี YOLOv8 ในการจำแนกประเภทของวัตถุและ Tracker ในการติดตามการเคลื่อนที่ของยานพาหนะ
2.2คำนวณความเร็วของยานพาหนะ: ระบบจะคำนวณความเร็วของยานพาหนะที่เคลื่อนผ่านเส้นที่กำหนด โดยใช้การวัดเวลาและระยะทางที่ยานพาหนะเคลื่อนที่ ระบบสามารถแสดงความเร็วของยานพาหนะในหน่วยกิโลเมตรต่อชั่วโมง (km/h)
2.3บันทึกภาพยานพาหนะที่เกินความเร็วที่กำหนด: เมื่อยานพาหนะมีความเร็วเกินกว่าค่าที่กำหนด (เช่น 30 km/h) ระบบจะบันทึกภาพของยานพาหนะนั้น
3.ขอบเขต
3.1การตรวจจับยานพาหนะ: ระบบสามารถตรวจจับและติดตามยานพาหนะได้เฉพาะบางประเภทที่ระบุใน class_list
เช่น รถยนต์ มอเตอร์ไซค์ รถบรรทุก และยานพาหนะอื่น ๆ ที่อยู่ในรายการนี้เท่านั้น
3.2การคำนวณความเร็ว: ระบบคำนวณความเร็วของยานพาหนะที่ตรวจจับได้โดยอิงจากระยะทางที่คาดการณ์และเวลาที่ใช้ในการเคลื่อนที่ผ่านเส้นที่กำหนด ซึ่งระยะทางที่ใช้คำนวณเป็นค่าคงที่ที่ระบุไว้ในโค้ด อาจมีการคาดเคลื่อนของความเร็ว
3.3การตรวจจับในสภาพแวดล้อมจำกัด: ระบบออกแบบมาเพื่อใช้กับวิดีโอที่มีการบันทึกในสภาพแวดล้อมที่การเคลื่อนไหวของยานพาหนะเกิดขึ้นในระนาบเดียวกัน เช่น การเคลื่อนที่ผ่านกล้องในแนวราบ ไม่ได้ออกแบบมาเพื่อรองรับการตรวจจับในสภาพแวดล้อม 3 มิติที่ซับซ้อน
4.ประโยชน์ที่คิดว่าจะได้รับ
4.1การตรวจจับและติดตามยานพาหนะอัตโนมัติ: ระบบสามารถช่วยตรวจจับและติดตามยานพาหนะในวิดีโอแบบเรียลไทม์ไม่ต้องใช้คนมาคอยสังเกตุ
4.2การควบคุมความเร็วในพื้นที่สำคัญ: ระบบสามารถใช้ในการตรวจจับความเร็วของยานพาหนะในพื้นที่ที่มีการจำกัดความเร็ว เช่น ในมหาลัยเพื่อลดการเกิดอุบัติเหตุ
5. ความรู้ที่เกี่ยวข้อง
import ultralytics
ไลบรารี Ultralytics ซึ่งเป็นแพ็กเกจที่พัฒนา YOLO (You Only Look Once) สำหรับงาน Object Detection โดยเฉพาะในเวอร์ชัน YOLOv8 ไลบรารีนี้มีฟังก์ชันการทำงานที่ช่วยให้สามารถเรียกใช้งานโมเดล YOLO ได้อย่างง่ายดายสำหรับการตรวจจับวัตถุในภาพและวิดีโอ
import cv2
ไลบรารี OpenCV ใช้สำหรับการประมวลผลภาพและวิดีโอ OpenCV ช่วยในการจัดการภาพ เช่น การอ่าน การแสดงผล การตัดต่อภาพ และการวาดเส้นหรือกล่องรอบวัตถุในเฟรม ในโค้ดนี้ OpenCV ถูกใช้ในการเปิดไฟล์วิดีโอ, การตรวจจับและติดตามวัตถุ, การวาดเส้นบนเฟรม, และการบันทึกวิดีโอที่ประมวลผลแล้ว
import pandas as pd
ไลบรารี Pandas ซึ่งใช้ในการจัดการและวิเคราะห์ข้อมูลเชิงโครงสร้าง ในโค้ดนี้ Pandas ถูกใช้เพื่อแปลงข้อมูลของกรอบวัตถุ (Bounding Boxes) ที่ตรวจจับได้จาก YOLO ให้อยู่ในรูปแบบของ DataFrame ซึ่งทำให้ง่ายต่อการจัดการและประมวลผลข้อมูลวัตถุ
import os
ไลบรารี os เป็นไลบรารีมาตรฐานใน Python สำหรับการจัดการกับไฟล์และโฟลเดอร์ เช่น การสร้าง, ลบ, หรือการเข้าถึงไฟล์ต่าง ๆ ในโค้ดนี้ใช้ os.makedirs()
เพื่อสร้างโฟลเดอร์เก็บเฟรมภาพที่ตรวจจับได้
import time
ไลบรารี time สำหรับการจัดการเวลาและการจับเวลาต่าง ๆ ในโค้ดนี้ time.time()
ถูกใช้เพื่อตรวจสอบเวลาที่วัตถุใช้ในการผ่านสองเส้น (red line และ blue line) เพื่อคำนวณความเร็วของยานพาหนะ
from ultralytics import YOLO
นำเข้าโมดูล YOLO จากไลบรารี ultralytics เพื่อใช้ในการโหลดและใช้งานโมเดล YOLOv8 สำหรับการตรวจจับวัตถุ โค้ดนี้ใช้ YOLO('yolov8m.pt')
เพื่อโหลดโมเดล YOLOv8 ขนาดกลาง (YOLOv8m)
from tracker import
เป็นการสร้างคลาส Tracker
ที่มีหน้าที่ในการ ติดตามวัตถุ (Object Tracking) โดยใช้ตำแหน่งของวัตถุที่ตรวจจับได้ (Bounding Boxes) จากเฟรมของวิดีโอ โค้ดนี้จะติดตามวัตถุที่ตรวจจับในแต่ละเฟรมและเก็บข้อมูลเกี่ยวกับตำแหน่งของวัตถุในรูปแบบ Center Points (จุดศูนย์กลางของวัตถุ) รวมถึงกำหนด ID ให้กับวัตถุแต่ละชิ้น
import torch
ไลบรารี PyTorch ซึ่งเป็นเฟรมเวิร์กสำหรับการสร้างและประมวลผลโมเดลการเรียนรู้เชิงลึก (Deep Learning) ในโค้ดนี้ torch.cuda.is_available()
ถูกใช้เพื่อตรวจสอบว่า GPU พร้อมใช้งานหรือไม่ ถ้ามี GPU จะทำให้การประมวลผล YOLO เร็วขึ้น
6. ผลการดำเนินงาน
หลักการทำงานคือ นำเข้าวิดีโอหรือกล้องเข้าสู่โปรแกรมจากนั้นโมเดล Yolo8 ก็จะตรวจจับวัตถุและติดตามวัตถุโดยใช้คลาสtracker ติดตาม และใช้ฟังค์ชั่น calculate_speed คำนวณความเร็วโดยใช้ระยะทาง/เวลาจึงคำนวณออกมาเป็นความเร็ว หน่วยKm/H ใช้ฟังค์ชั่น save_high_speed_frame ในการตรวจสอบว่ารถคันไหนใช้ความเร็วเกินกำหนด หากตรวจพบก็จะบันทึกรูปภาพเฟรมนั้นพร้อมกับแสดงความเร็วที่รถคันนั้นใช้เก็บไว้ในฐานข้อมูล
Flowchart
Coding
import ultralytics
import cv2
import pandas as pd
import os
import time
from ultralytics import YOLO
from tracker import *
import torch
# ตรวจสอบการใช้งาน GPU
print(f"GPU Available: {torch.cuda.is_available()}")
# โหลดโมเดล YOLOv8
model = YOLO('yolov8m.pt')
class_list = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
'hair drier', 'toothbrush']
# ตัวแปรสำคัญ
tracker = Tracker()
count = 0
speeds = {}
down, up = {}, {}
counter_down, counter_up = [], []
red_line_y = 370 # เส้นสีแดง
blue_line_y = 400 # เส้นสีน้ำเงิน
offset = 3
# สร้างโฟลเดอร์เก็บเฟรมที่ตรวจจับได้
def setup_directories():
os.makedirs('detected_frames', exist_ok=True)
os.makedirs('D', exist_ok=True)
# ฟังก์ชันคำนวณความเร็ว
def calculate_speed(distance, elapsed_time):
speed_ms = distance / elapsed_time
return speed_ms * 3.6 # แปลงเป็น km/h
# ฟังก์ชันบันทึกภาพยานพาหนะที่เกินความเร็วที่กำหนด
def save_high_speed_frame(frame, speed, id, frame_count):
if speed > 30: # กำหนดความเร็วเกิน 30 km/h
# เขียนข้อความแสดงความเร็วลงบนภาพ
text = f'Speed: {int(speed)} Km/h'
cv2.putText(frame, text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
# บันทึกภาพพร้อมข้อความ
image_filename = f'D/frame_{frame_count}_id{id}.jpg'
cv2.imwrite(image_filename, frame)
# ฟังก์ชันสำหรับตรวจจับการผ่านเส้น
def check_line_crossing(cx, cy, id, frame, down, up, speeds, counter_down, counter_up, count):
if red_line_y < (cy + offset) and red_line_y > (cy - offset):
down[id] = time.time()
if id in down and blue_line_y < (cy + offset) and blue_line_y > (cy - offset):
elapsed_time = time.time() - down[id]
if id not in counter_down:
counter_down.append(id)
speed = calculate_speed(4, elapsed_time) # กำหนดระยะทาง
speeds[id] = speed
save_high_speed_frame(frame, speed, id, count)
if blue_line_y < (cy + offset) and blue_line_y > (cy - offset):
up[id] = time.time()
if id in up and red_line_y < (cy + offset) and red_line_y > (cy - offset):
elapsed_time = time.time() - up[id]
if id not in counter_up:
counter_up.append(id)
speed = calculate_speed(4, elapsed_time)
speeds[id] = speed
save_high_speed_frame(frame, speed, id, count)
# ฟังก์ชันประมวลผลวิดีโอ
def process_video(video_path):
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print("Error opening video file")
return
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 33.0, (1440, 920))
global count
while True:
ret, frame = cap.read()
if not ret:
break
count += 1
frame = cv2.resize(frame, (1440, 720))
# ตรวจจับวัตถุ
results = model.predict(frame)
boxes = results[0].boxes.data.detach().cpu().numpy()
px = pd.DataFrame(boxes).astype("float")
detected_list = []
for _, row in px.iterrows():
x1, y1, x2, y2, _, d = row.astype(int)
detected_class = class_list[d]
if detected_class in ['motorcycle', 'car']:
detected_list.append([x1, y1, x2, y2])
bbox_id = tracker.update(detected_list)
# ตรวจจับและแสดงข้อมูลยานพาหนะ
for bbox in bbox_id:
x3, y3, x4, y4, id = bbox
cx, cy = (x3 + x4) // 2, (y3 + y4) // 2
check_line_crossing(cx, cy, id, frame, down, up, speeds, counter_down, counter_up, count)
# วาดกรอบสี่เหลี่ยมและแสดงความเร็ว
cv2.rectangle(frame, (x3, y3), (x4, y4), (0, 255, 0), 2) # วาดกรอบสี่เหลี่ยมรอบวัตถุ
if id in speeds:
cv2.putText(frame, f'Speed ID {id}: {int(speeds[id])} Km/h', (x3, y3 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# วาดเส้นและแสดงข้อมูล
draw_lines_and_info(frame, len(counter_down), len(counter_up))
out.write(frame)
cv2.imshow('Frame', frame)
if cv2.waitKey(2) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
# ฟังก์ชันวาดเส้นและแสดงผล
def draw_lines_and_info(frame, count_down, count_up):
cv2.rectangle(frame, (0, 0), (200, 90), (0, 255, 255), -1)
cv2.putText(frame, f'Going Down - {count_down}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
cv2.putText(frame, f'Going Up - {count_up}', (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
cv2.line(frame, (700, red_line_y), (1020, red_line_y ), (0, 0, 255), 2)
cv2.line(frame, (700, blue_line_y), (1020, blue_line_y ), (255, 0, 0), 2)
# เริ่มการประมวลผล
setup_directories()
process_video("real1.mp4")
7. วิธีการใช้งานโปรแกรม
กดคลิ๊กเข้าไปที่ICON จากนั้นโปรแกรมจะรัน และผลลัพท์การจับความเร็วจะอยู่ในโฟลเดอร์ D
8. การทดลอง
การทดลองครั้งหลักๆที่เห็นผลแตกต่างกัน
ครั้งที่ | Detected วัตถุ | แสดงความเร็ว | จับภาพความเร็ว |
1 | – | – | – |
2 | / | / | – |
3 | / | / | / |
9. เทคนิกการประยุกต์เพื่อเพิ่มประสิทธิภาพมากขึ้น
1.สร้างเซิฟเวอร์เก็บภาพจับความเร็วขึ้นมาและแสดงผลข้อมูล เพื่อสามารถเรียกดูข้อมูลได้อย่างเรียลไทม์และสะดวก
2.ใช้กล้องที่มีคุณภาพเพื่อการบันทึกรูปที่ชัดเจน
10. สรุปผลและข้อเสนอแนะ
ระบบสามารถใช้งานการDetect วัตถุและตรวจจับความเร็วได้และสามารถบันทึกรูปภาพยานพาหนะที่ใช้ความเร็วเกินกำหนดได้
จากการทดลองลงพื้นที่
1.พบปัญหาทางด้านการเชื่อมต่ออินเตอร์เน็ต เนื่องจากบางพื้นที่สัญญาณWIFI ไม่มีความเสถียรมากพอทำให้การใช้กล้องในการเชื่อมต่อนั้นทำได้ยากเพราะการล่าช้าของเครือข่ายขัดขวางการทำงานของโปรแกรม
2.ปัญหาทางด้านกล้อง การใช้กล้องที่มีคุณภาพต่ำนั้นส่งผลต่อการประมวลผลภาพ เช่นภาพไม่คมชัด ภาพมีการสะดุดส่งผลต่อการประมวลผลทำให้อาจเกิดการประมวลผลผิดพลาดและรูปภาพที่บันทึกออกมาก็ไม่มีความคมชัด ไม่สามารถตรวจสอบเลขทะเบียนได้
3.ปัญหาทางด้านแสง ถ้าหากนำระบบไปใช้ประมวลผลภาพที่มืดๆ อาจจะเกิดการผิดพลาดหรือไม่ก็ประมวลผลไม่ได้เลย
4.บางมุม ตำแหน่งยากต่อการDetect วัตถุ ทำให้ไม่สามารถจับวัตถุได้
ข้อเสนอแนะ
-ควรใช้กล้องที่มีคุณภาพความละเอียดชัด และสามารถเชื่อมกับWIFIได้
-ควรใช้ในพื้นที่ที่มีสัญญาณเสถียร
-การจัดวางกล้องในมุมที่ตรวจจับวัตถุได้ชัดเจน
11. ข้อมูลอ้างอิง
วิดีโอการทำงานของระบบตรวจจับรถ