iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
AI/ ML & Data

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

day 25 人工智慧對於斑馬魚睡眠品質分析

  • 分享至 

  • xImage
  •  

今天是第二十五天我們可以寫一個lstm結合yolo去分析斑馬魚的睡眠品質分析,進而去探討人類的睡眠品質分析,以下是程式碼

1. 安裝必要的依賴包

首先,你需要安裝YOLOv8和相關的深度學習框架(如TensorFlow或PyTorch):

pip install ultralytics
pip install tensorflow keras opencv-python

2. 數據收集與標註

此部分假設你已經收集並標註了斑馬魚行為的視頻數據。你需要將這些視頻轉換為YOLOv8可以處理的格式,並確保有對應的標籤文件。

3. YOLOv8模型構建與行為檢測

from ultralytics import YOLO
import cv2
import numpy as np

# 加載預訓練的YOLOv8模型
model = YOLO("yolov8n.pt")

# 定義行為類別
behavior_classes = ["active", "inactive", "feeding", "resting"]

# 使用YOLOv8進行斑馬魚行為檢測
def detect_behavior(frame):
    results = model(frame)
    detections = []
    for result in results:
        boxes = result.boxes.xyxy.cpu().numpy()  # bounding box坐標
        scores = result.boxes.conf.cpu().numpy()  # 置信度
        classes = result.boxes.cls.cpu().numpy()  # 類別
        detections.append((boxes, scores, classes))
    return detections

# 讀取視頻並進行行為檢測
cap = cv2.VideoCapture('zebrafish_video.mp4')
behaviors = []

while(cap.isOpened()):
    ret, frame = cap.read()
    if not ret:
        break
    
    # 檢測行為
    detections = detect_behavior(frame)
    behaviors.append(detections)  # 保存每一幀的檢測結果

cap.release()
cv2.destroyAllWindows()

4. LSTM模型構建與訓練

這部分將使用YOLOv8檢測到的行為數據來訓練LSTM模型,以預測斑馬魚的睡眠狀態。這裡假設你已經有足夠的時間序列數據進行訓練。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# 假設你的數據集包含以下形式的標註
# behaviors: (samples, timesteps, features)
# labels: (samples, timesteps, 1)  # 每一幀的睡眠狀態標籤

# 構建LSTM模型
def create_complex_lstm_model(input_shape):
    model = Sequential()
    model.add(LSTM(128, return_sequences=True, input_shape=input_shape))
    model.add(Dropout(0.2))
    model.add(LSTM(128, return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(64))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))  # 二元分類:睡眠或清醒
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

input_shape = (behaviors.shape[1], behaviors.shape[2])  # timesteps, features
lstm_model = create_complex_lstm_model(input_shape)

# 訓練模型
history = lstm_model.fit(behaviors, labels, epochs=20, batch_size=32, validation_split=0.2)

# 保存模型
lstm_model.save('zebrafish_sleep_model.h5')

5. 評估與預測

一旦模型訓練完成,你可以使用測試數據集進行評估,並且在實際數據上進行預測。

# 評估模型
loss, accuracy = lstm_model.evaluate(test_behaviors, test_labels)
print(f"Test Accuracy: {accuracy * 100:.2f}%")

# 使用模型進行預測
predictions = lstm_model.predict(new_behaviors)
predicted_sleep_states = (predictions > 0.5).astype(int)

1. YOLOv8模型構建與行為檢測

模型載入與行為檢測

from ultralytics import YOLO
import cv2
import numpy as np

# 加載預訓練的YOLOv8模型
model = YOLO("yolov8n.pt")
  • YOLOv8模型載入: 使用 YOLO("yolov8n.pt") 加載YOLOv8的預訓練模型。yolov8n.pt 是一個輕量級版本,適合快速推理。YOLOv8專門用於對象檢測,因此這裡的模型會檢測斑馬魚的行為。

行為檢測函數

def detect_behavior(frame):
    results = model(frame)
    detections = []
    for result in results:
        boxes = result.boxes.xyxy.cpu().numpy()  # bounding box坐標
        scores = result.boxes.conf.cpu().numpy()  # 置信度
        classes = result.boxes.cls.cpu().numpy()  # 類別
        detections.append((boxes, scores, classes))
    return detections
  • detect_behavior(frame): 這個函數接收一個影格(frame)作為輸入,並使用YOLOv8模型對影格進行分析。
  • results = model(frame): 使用模型來處理影格,返回檢測結果。results 包含YOLOv8檢測的所有對象。
  • detections.append(...): 解析檢測結果,提取每個檢測對象的邊界框 (boxes)、置信度 (scores)、以及對象類別 (classes),並將它們儲存在 detections 列表中。

視頻讀取與處理

cap = cv2.VideoCapture('zebrafish_video.mp4')
behaviors = []

while(cap.isOpened()):
    ret, frame = cap.read()
    if not ret:
        break
    
    # 檢測行為
    detections = detect_behavior(frame)
    behaviors.append(detections)  # 保存每一幀的檢測結果

cap.release()
cv2.destroyAllWindows()
  • 視頻讀取: 使用 cv2.VideoCapture 打開並讀取視頻文件 zebrafish_video.mp4
  • 逐幀處理: 使用 cap.read() 逐幀讀取視頻。每一幀都被送入 detect_behavior 函數進行行為檢測,並將檢測結果存入 behaviors 列表中。
  • 釋放資源: 在處理完視頻後,釋放視頻資源並關閉所有窗口。

2. LSTM模型構建與訓練

LSTM模型結構

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

def create_complex_lstm_model(input_shape):
    model = Sequential()
    model.add(LSTM(128, return_sequences=True, input_shape=input_shape))
    model.add(Dropout(0.2))
    model.add(LSTM(128, return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(64))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))  # 二元分類:睡眠或清醒
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model
  • LSTM模型結構: 使用Keras構建一個多層LSTM模型。該模型用於處理時間序列數據,並預測斑馬魚的睡眠狀態(如清醒或睡眠)。
    • LSTM層: 每個LSTM層包含128或64個單元。return_sequences=True 表示該層會返回整個序列,這對於構建深層LSTM網絡是必要的。
    • Dropout層: Dropout是一種正則化技術,用來減少過擬合。每層LSTM後都加入了Dropout層,隨機丟棄20%的神經元。
    • Dense層: 最後的全連接層將LSTM的輸出映射到單一的預測結果。sigmoid 激活函數用於二元分類,輸出值在0到1之間。

訓練模型

input_shape = (behaviors.shape[1], behaviors.shape[2])  # timesteps, features
lstm_model = create_complex_lstm_model(input_shape)

# 訓練模型
history = lstm_model.fit(behaviors, labels, epochs=20, batch_size=32, validation_split=0.2)

# 保存模型
lstm_model.save('zebrafish_sleep_model.h5')
  • 輸入形狀: input_shape 是模型的輸入形狀,包括時間步長(timesteps)和特徵數量(features),這些信息來自行為檢測結果。
  • 模型訓練: 使用 fit 函數訓練模型。behaviors 是輸入數據,labels 是對應的睡眠狀態標籤。訓練過程設置了20個訓練輪次(epochs)和32個批次大小(batch size),並且使用了20%的數據作為驗證集來監控模型的表現。
  • 模型保存: 訓練完成後,將模型保存到 zebrafish_sleep_model.h5 文件中,以便後續使用。

3. 模型評估與預測

# 評估模型
loss, accuracy = lstm_model.evaluate(test_behaviors, test_labels)
print(f"Test Accuracy: {accuracy * 100:.2f}%")

# 使用模型進行預測
predictions = lstm_model.predict(new_behaviors)
predicted_sleep_states = (predictions > 0.5).astype(int)
  • 模型評估: 使用 evaluate 函數在測試數據集上評估模型的表現。loss 表示損失值,accuracy 是模型在測試數據集上的準確率。
  • 模型預測: 使用訓練好的LSTM模型對新數據進行預測。predictions 是模型的預測結果,值在0到1之間。通過將這些值與0.5進行比較,可以將結果轉換為二元分類(0或1),代表斑馬魚的睡眠狀態。

這個程式碼展示了如何結合YOLOv8和LSTM來檢測斑馬魚的行為並預測其睡眠狀態。這種方法可以進一步應用於更複雜的生物行為分析或擴展至其他物種的研究。


上一篇
day 24 人工智慧自動判斷斑馬魚血液及魚身健康度分析
下一篇
day 26lstm人工智慧斑馬魚水溫分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言