今天是第十九天可以寫一個lstm結合yolo去自動停腳踏車系統,以下是程式碼
首先,我們需要用YOLO模型來檢測腳踏車和停車位。YOLO會將圖像中所有的物體分成不同的框並標記出來。
import torch
import cv2
# 載入YOLO模型 (使用YOLOv5為例)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# 讀取影像
image_path = 'bike_parking.jpg'
image = cv2.imread(image_path)
# 使用YOLO進行偵測
results = model(image)
# 取得偵測結果
detections = results.pandas().xyxy[0] # 返回資料框
# 繪製偵測框
for _, row in detections.iterrows():
xmin, ymin, xmax, ymax, label, confidence = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']), row['name'], row['confidence']
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (255, 0, 0), 2)
cv2.putText(image, f'{label} {confidence:.2f}', (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 顯示圖片
cv2.imshow('Detected Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下來,我們使用LSTM來預測腳踏車的行駛路徑和最終的停車位置。LSTM適合處理時間序列數據,因此可以用於預測腳踏車的移動趨勢。
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 假設這是歷史移動路徑的數據(時間序列)
# input_seq 代表車輛的 x, y 座標歷史數據
input_seq = np.array([[100, 120], [105, 130], [110, 135], [115, 140], [120, 145]])
# 重塑數據為LSTM輸入格式
input_seq = input_seq.reshape((1, input_seq.shape[0], input_seq.shape[1]))
# 構建LSTM模型
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(input_seq.shape[1], input_seq.shape[2])))
model.add(Dense(2))
model.compile(optimizer='adam', loss='mse')
# 訓練模型
# 假設 target_seq 代表預測的最終停車位置
target_seq = np.array([[125, 150]])
model.fit(input_seq, target_seq, epochs=200, verbose=0)
# 預測下一步
predicted_position = model.predict(input_seq)
print("預測的最終停車位置:", predicted_position)
現在,我們可以將YOLO和LSTM結合起來,當YOLO偵測到腳踏車時,使用LSTM預測其行進方向及最終停車位置。
# YOLO 偵測腳踏車及停車位
bike_position = None
parking_spot = None
for _, row in detections.iterrows():
if row['name'] == 'bicycle':
bike_position = (int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']))
elif row['name'] == 'parking':
parking_spot = (int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']))
if bike_position and parking_spot:
# 提取歷史路徑資料並預測停車位置
input_seq = np.array([[100, 120], [105, 130], [110, 135], [115, 140], [120, 145]])
input_seq = input_seq.reshape((1, input_seq.shape[0], input_seq.shape[1]))
predicted_position = model.predict(input_seq)
# 檢查預測位置是否在停車位內
if parking_spot[0] <= predicted_position[0][0] <= parking_spot[2] and parking_spot[1] <= predicted_position[0][1] <= parking_spot[3]:
print("可以自動停車")
else:
print("無法停車,請手動調整位置")
這部分程式碼使用YOLOv5來偵測圖像中的物體(如腳踏車和停車位)。
import torch
import cv2
# 載入YOLO模型 (使用YOLOv5為例)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
torch
:是PyTorch的庫,用於深度學習模型的構建與推理。cv2
:OpenCV庫,用於圖像處理操作。model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
:這行代碼使用PyTorch的torch.hub.load
方法來載入YOLOv5的預訓練模型。yolov5s
表示我們使用的是YOLOv5的輕量級版本。# 讀取影像
image_path = 'bike_parking.jpg'
image = cv2.imread(image_path)
image_path
:圖像的路徑,這裡假設圖像檔案名為bike_parking.jpg
。image = cv2.imread(image_path)
:使用OpenCV的imread
方法來讀取圖像。# 使用YOLO進行偵測
results = model(image)
results = model(image)
:將圖像傳遞給YOLO模型,模型將輸出包含偵測到的物體信息的結果。# 取得偵測結果
detections = results.pandas().xyxy[0] # 返回資料框
detections = results.pandas().xyxy[0]
:將偵測結果轉換為Pandas DataFrame的形式,xyxy
代表物體邊界框的左上角和右下角的座標。# 繪製偵測框
for _, row in detections.iterrows():
xmin, ymin, xmax, ymax, label, confidence = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']), row['name'], row['confidence']
cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (255, 0, 0), 2)
cv2.putText(image, f'{label} {confidence:.2f}', (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
for _, row in detections.iterrows()
:逐行遍歷偵測結果。xmin, ymin, xmax, ymax, label, confidence
:分別是邊界框的左上角和右下角的座標、物體標籤(如腳踏車或停車位)、偵測置信度。cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (255, 0, 0), 2)
:在圖像上畫出偵測到的物體的邊界框,框的顏色為藍色,粗細為2。cv2.putText(image, f'{label} {confidence:.2f}', (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
:在邊界框上方添加標籤和置信度。# 顯示圖片
cv2.imshow('Detected Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow('Detected Image', image)
:顯示帶有偵測框的圖像。cv2.waitKey(0)
:等待使用者按下任意鍵關閉圖片。cv2.destroyAllWindows()
:關閉所有OpenCV的窗口。這部分程式碼用於構建LSTM模型來預測腳踏車的行駛路徑及最終停車位置。
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
numpy
:用於數值計算的庫。tensorflow
:深度學習庫,用於構建和訓練神經網絡模型。Sequential
、LSTM
、Dense
:分別表示Keras中的序列模型、LSTM層和全連接層。# 假設這是歷史移動路徑的數據(時間序列)
# input_seq 代表車輛的 x, y 座標歷史數據
input_seq = np.array([[100, 120], [105, 130], [110, 135], [115, 140], [120, 145]])
input_seq
:這是一組代表腳踏車歷史移動路徑的座標數據。# 重塑數據為LSTM輸入格式
input_seq = input_seq.reshape((1, input_seq.shape[0], input_seq.shape[1]))
input_seq = input_seq.reshape((1, input_seq.shape[0], input_seq.shape[1]))
:將數據重塑為LSTM所需的輸入格式,即 (樣本數, 時間步數, 特徵數)
。# 構建LSTM模型
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(input_seq.shape[1], input_seq.shape[2])))
model.add(Dense(2))
model.compile(optimizer='adam', loss='mse')
model = Sequential()
:初始化一個序列模型。model.add(LSTM(50, activation='relu', input_shape=(input_seq.shape[1], input_seq.shape[2])))
:添加一個LSTM層,輸入維度為時間步數和特徵數,LSTM單元數為50,激活函數為ReLU。model.add(Dense(2))
:添加一個全連接層,輸出維度為2,代表預測的x, y座標。model.compile(optimizer='adam', loss='mse')
:配置模型的訓練設定,使用Adam優化器和均方誤差(MSE)損失函數。# 訓練模型
# 假設 target_seq 代表預測的最終停車位置
target_seq = np.array([[125, 150]])
model.fit(input_seq, target_seq, epochs=200, verbose=0)
target_seq = np.array([[125, 150]])
:這是我們的目標值,即預測的最終停車位置。model.fit(input_seq, target_seq, epochs=200, verbose=0)
:訓練模型,使用200個訓練週期(epochs)。# 預測下一步
predicted_position = model.predict(input_seq)
predicted_position = model.predict(input_seq)
:使用訓練好的LSTM模型來預測腳踏車的下一步位置。這部分程式碼將YOLO和LSTM結合起來,實現自動停車功能。
# YOLO 偵測腳踏車及停車位
bike_position = None
parking_spot = None
for _, row in detections.iterrows():
if row['name'] == 'bicycle':
bike_position = (int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']))
elif row['name'] == 'parking':
parking_spot = (int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax']))
bike_position
、parking_spot
:分別存儲偵測到的腳踏車和停車位的位置。for _, row in detections.iterrows()
:迭代偵測結果,根據物體類別分配座標信息。if bike_position and parking_spot:
# 提取歷史路徑資料並預測停車位置
input_seq = np.array([[100, 120], [105, 130], [110, 135], [115, 140], [120, 145]])
input_seq = input_seq.reshape((1, input_seq.shape[0], input_seq.shape[1]))
predicted_position = model.predict(input_seq)
# 檢查預測位置是否在停車位內
if parking_spot[0] <= predicted_position[0][0] <= parking_spot[2] and parking_spot[1] <= predicted_position[0][1] <= parking_spot[3
]:
print("腳踏車成功停車!")
else:
print("腳踏車停車失敗。")
if bike_position and parking_spot:
:檢查是否成功偵測到腳踏車和停車位。input_seq
:使用之前定義的歷史移動路徑。predicted_position = model.predict(input_seq)
:預測腳踏車的下一步位置。if parking_spot[0] <= predicted_position[0][0] <= parking_spot[2] and parking_spot[1] <= predicted_position[0][1] <= parking_spot[3]:
:檢查預測的位置是否在停車位內。print("腳踏車成功停車!")
:如果預測位置在停車位內,顯示停車成功訊息。print("腳踏車停車失敗。")
:如果預測位置不在停車位內,顯示停車失敗訊息。這段程式碼總結了如何使用YOLO偵測物體並結合LSTM來預測腳踏車的行駛路徑,實現自動停腳踏車功能。