iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
AI/ ML & Data

基於人工智慧與深度學習對斑馬魚做行為分析系列 第 19

day 19 AI結合Lstm與yolo自動停腳踏車系統

  • 分享至 

  • xImage
  •  

今天是第十九天可以寫一個lstm結合yolo去自動停腳踏車系統,以下是程式碼

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

2. LSTM 模型

接下來,我們使用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)

3. 結合系統

現在,我們可以將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("無法停車,請手動調整位置")

1. YOLO 模型部分

這部分程式碼使用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的窗口。

2. LSTM 模型部分

這部分程式碼用於構建LSTM模型來預測腳踏車的行駛路徑及最終停車位置。

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
  • numpy:用於數值計算的庫。
  • tensorflow:深度學習庫,用於構建和訓練神經網絡模型。
  • SequentialLSTMDense:分別表示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模型來預測腳踏車的下一步位置。

3. 結合系統部分

這部分程式碼將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_positionparking_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來預測腳踏車的行駛路徑,實現自動停腳踏車功能。


上一篇
day 18 利用yolo結合AI辨識動物情緒
下一篇
Lstm預測籃球賽分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言