iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

今天是第十七天我們可以寫一個腳踏車辨識yolo程式碼是辨識腳踏車的速率,以下是程式碼

步驟 1: 安裝必要的套件

您需要安裝opencv-pythonyolov5這些套件。

pip install opencv-python yolov5

步驟 2: 載入YOLO模型

import torch
import cv2
import time

# 載入YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

步驟 3: 處理影片並偵測腳踏車位置

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()

步驟 4: 計算實際速度

上述程式碼中計算的是「像素/秒」的速率。如果我們想將這個速率轉換為實際的速度(例如公里/小時),您需要知道影片中的實際距離對應於多少像素,以及影片的幀率。

# 假設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} 公里/小時")

步驟 1: 安裝必要的套件

pip install opencv-python yolov5

這個指令會安裝OpenCV和YOLOv5所需的套件。OpenCV是用來處理影像和影片的,而YOLOv5是一個流行的物體偵測模型。

步驟 2: 載入YOLO模型

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)的模型。

步驟 3: 處理影片並偵測腳踏車位置

cap = cv2.VideoCapture('your_video.mp4')  # 載入影片
prev_time = 0
prev_position = None

這裡我們使用cv2.VideoCapture來開啟影片檔案。prev_timeprev_position是用來記錄前一幀的時間和腳踏車的位置,稍後會用來計算速率。

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

這個while迴圈會不斷讀取影片的每一幀,直到影片結束。cap.read()會返回兩個值,ret表示是否成功讀取幀,而frame是當前幀的影像資料。如果retFalse,表示影片結束或讀取失敗,迴圈會停止。

    # 使用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

這部分用來計算腳踏車的速率:

  1. 計算距離: 使用兩點之間的距離公式計算當前位置和前一幀位置之間的距離。
  2. 計算時間差: 計算當前時間與前一幀時間之間的差異。
  3. 計算速率: 用距離除以時間差得到速率,單位是「像素/秒」。

最後,我們更新prev_positionprev_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鍵則會退出迴圈並關閉視窗。

步驟 4: 計算實際速度

# 假設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來偵測腳踏車並計算其速度。我能夠處理更複雜的需求,例如多車偵測、不同攝像頭角度下的速度計算等,可以在這個程式碼上進一步擴展和調整。


上一篇
day 16 Lstm情緒分析安排景點系統
下一篇
day 18寫一個mock test斑馬魚的介面測試
系列文
LSTM結合Yolo v8對於多隻斑馬魚行為分析29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言