今天是第十七天我們可以寫一個腳踏車辨識yolo程式碼是辨識腳踏車的速率,以下是程式碼
您需要安裝opencv-python
與yolov5
這些套件。
pip install opencv-python yolov5
import torch
import cv2
import time
# 載入YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
cap = cv2.VideoCapture('your_video.mp4') # 載入影片
prev_time = 0
prev_position = None
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 使用YOLO進行偵測
results = model(frame)
detections = results.xyxy[0] # 獲取偵測結果
# 遍歷每個偵測的物體
for detection in detections:
x1, y1, x2, y2, conf, cls = detection
# 如果偵測到的物體是腳踏車
if cls == 1: # 1 通常代表 'bicycle' 類別
current_time = time.time()
current_position = ((x1 + x2) / 2, (y1 + y2) / 2) # 計算腳踏車中心點
# 如果有之前的位置和時間
if prev_position is not None:
# 計算距離
distance = ((current_position[0] - prev_position[0]) ** 2 + (current_position[1] - prev_position[1]) ** 2) ** 0.5
# 計算時間差
time_diff = current_time - prev_time
# 計算速率 (像素/秒)
speed = distance / time_diff
print(f"腳踏車速率: {speed:.2f} 像素/秒")
# 更新前一幀的位置和時間
prev_position = current_position
prev_time = current_time
# 顯示影像
cv2.imshow('YOLOv5 Bicycle Speed Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
上述程式碼中計算的是「像素/秒」的速率。如果我們想將這個速率轉換為實際的速度(例如公里/小時),您需要知道影片中的實際距離對應於多少像素,以及影片的幀率。
# 假設1像素等於實際的0.01米
pixels_to_meters = 0.01
# 假設影片是每秒30幀
fps = 30
# 將速率轉換為米/秒
speed_mps = speed * pixels_to_meters * fps
# 將米/秒轉換為公里/小時
speed_kmph = speed_mps * 3.6
print(f"腳踏車速率: {speed_kmph:.2f} 公里/小時")
pip install opencv-python yolov5
這個指令會安裝OpenCV和YOLOv5所需的套件。OpenCV是用來處理影像和影片的,而YOLOv5是一個流行的物體偵測模型。
import torch
import cv2
import time
# 載入YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
這段程式碼首先載入了一些必要的模組:
torch
: PyTorch是YOLOv5依賴的深度學習框架。cv2
: 這是OpenCV的模組,用於處理影像和影片。time
: 用於計算時間間隔,以便後續計算速率。接著,我們透過torch.hub.load
函數來載入YOLOv5模型。'ultralytics/yolov5'
表示YOLOv5的模型倉庫,而'yolov5s'
指定了使用小型(s)的模型。
cap = cv2.VideoCapture('your_video.mp4') # 載入影片
prev_time = 0
prev_position = None
這裡我們使用cv2.VideoCapture
來開啟影片檔案。prev_time
和prev_position
是用來記錄前一幀的時間和腳踏車的位置,稍後會用來計算速率。
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
這個while
迴圈會不斷讀取影片的每一幀,直到影片結束。cap.read()
會返回兩個值,ret
表示是否成功讀取幀,而frame
是當前幀的影像資料。如果ret
是False
,表示影片結束或讀取失敗,迴圈會停止。
# 使用YOLO進行偵測
results = model(frame)
detections = results.xyxy[0] # 獲取偵測結果
這裡使用載入的YOLOv5模型對每一幀進行物體偵測。results
是偵測的結果,包含所有偵測到的物體。results.xyxy[0]
提取了這些偵測物體的邊界框資料。
for detection in detections:
x1, y1, x2, y2, conf, cls = detection
# 如果偵測到的物體是腳踏車
if cls == 1: # 1 通常代表 'bicycle' 類別
current_time = time.time()
current_position = ((x1 + x2) / 2, (y1 + y2) / 2) # 計算腳踏車中心點
這段程式碼會遍歷所有偵測到的物體,提取每個物體的邊界框(x1, y1, x2, y2
)、信心度(conf
)、以及類別(cls
)。YOLOv5使用類別代碼來表示物體,cls == 1
通常表示偵測到的是腳踏車。
接著,我們計算腳踏車的中心點位置,current_position
儲存的是該位置的x和y座標。
if prev_position is not None:
# 計算距離
distance = ((current_position[0] - prev_position[0]) ** 2 + (current_position[1] - prev_position[1]) ** 2) ** 0.5
# 計算時間差
time_diff = current_time - prev_time
# 計算速率 (像素/秒)
speed = distance / time_diff
print(f"腳踏車速率: {speed:.2f} 像素/秒")
# 更新前一幀的位置和時間
prev_position = current_position
prev_time = current_time
這部分用來計算腳踏車的速率:
最後,我們更新prev_position
和prev_time
,以便下一幀可以使用。
# 顯示影像
cv2.imshow('YOLOv5 Bicycle Speed Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
這段程式碼會將每一幀的影像顯示在一個名為“YOLOv5 Bicycle Speed Detection”的視窗中。cv2.waitKey(1)
使視窗等待1毫秒,如果按下q
鍵則會退出迴圈並關閉視窗。
# 假設1像素等於實際的0.01米
pixels_to_meters = 0.01
# 假設影片是每秒30幀
fps = 30
# 將速率轉換為米/秒
speed_mps = speed * pixels_to_meters * fps
# 將米/秒轉換為公里/小時
speed_kmph = speed_mps * 3.6
print(f"腳踏車速率: {speed_kmph:.2f} 公里/小時")
在這裡,我們將速率從「像素/秒」轉換為「公里/小時」。首先假設每個像素等於實際的0.01米,並且影片的幀率是30fps(每秒30幀)。然後,將速度從像素/秒轉換為米/秒,最後再轉換為公里/小時。
這個範例展示了如何使用YOLO來偵測腳踏車並計算其速度。我能夠處理更複雜的需求,例如多車偵測、不同攝像頭角度下的速度計算等,可以在這個程式碼上進一步擴展和調整。