iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
AI/ ML & Data

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

day 24 人工智慧自動判斷斑馬魚血液及魚身健康度分析

  • 分享至 

  • xImage
  •  

今天是第二十四天我們可以寫一個人工智慧自動去判斷斑馬魚血液的流動與魚身的健康度分析,以下是程式碼
以下是結合LSTM和YOLO的程式碼,用於斑馬魚健康度分析系統。這個系統首先使用YOLO模型進行斑馬魚身體的檢測與分割,然後使用LSTM模型對檢測到的圖像序列進行時間序列分析,以判斷斑馬魚的健康狀況。

1. 安裝必要的套件

首先,確保安裝了YOLO和LSTM所需的Python套件。

pip install tensorflow opencv-python pillow

2. YOLO模型的實現

我們將使用YOLOv4來檢測斑馬魚的身體位置。

import cv2
import numpy as np
from tensorflow.keras.models import load_model
from PIL import Image

# 載入YOLOv4模型(這裡假設你已經有一個訓練好的YOLO模型)
yolo_model = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
layer_names = yolo_model.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in yolo_model.getUnconnectedOutLayers()]

def detect_fish(image_path):
    # 載入圖像並進行預處理
    image = cv2.imread(image_path)
    height, width, channels = image.shape
    blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    
    # YOLOv4 進行預測
    yolo_model.setInput(blob)
    outputs = yolo_model.forward(output_layers)
    
    boxes = []
    confidences = []
    class_ids = []

    for output in outputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:  # 只保留置信度超過50%的檢測
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)

    indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    for i in indices:
        i = i[0]
        box = boxes[i]
        x, y, w, h = box[0], box[1], box[2], box[3]
        # 擷取斑馬魚的區域
        crop_img = image[y:y+h, x:x+w]
        return crop_img

# 測試YOLO模型
detected_fish = detect_fish("zebrafish.jpg")
Image.fromarray(cv2.cvtColor(detected_fish, cv2.COLOR_BGR2RGB)).show()

3. LSTM模型的實現

使用LSTM來分析YOLO檢測到的斑馬魚圖像序列,以判斷其健康狀況。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, TimeDistributed, Flatten
import numpy as np

# 假設已經有一個YOLO檢測到的斑馬魚圖像序列
# 將圖像序列調整為 (num_sequences, sequence_length, image_height, image_width, num_channels)
# 例如:斑馬魚連續10幀的圖像,圖片尺寸為64x64,RGB圖像

def preprocess_image(image):
    image = cv2.resize(image, (64, 64))
    image = image.astype('float32') / 255.0  # 標準化
    return image

# 示例的圖像序列
image_sequence = [preprocess_image(detected_fish) for _ in range(10)]
image_sequence = np.array(image_sequence).reshape((1, 10, 64, 64, 3))

# 構建LSTM模型
model = Sequential()
model.add(TimeDistributed(Flatten(), input_shape=(10, 64, 64, 3)))
model.add(LSTM(50, return_sequences=True))
model.add(LSTM(50))
model.add(Dense(1, activation='sigmoid'))  # 假設二元分類:健康或不健康

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 模型預測
prediction = model.predict(image_sequence)
print("健康狀況預測:", "健康" if prediction[0] > 0.5 else "不健康")

1. YOLO模型部分

這部分負責從圖像中檢測斑馬魚並提取其區域。YOLO(You Only Look Once)是一種物體檢測模型,能夠快速且準確地檢測圖像中的物體。

1.1. 載入YOLO模型

import cv2
import numpy as np

# 載入YOLOv4模型(這裡假設你已經有一個訓練好的YOLO模型)
yolo_model = cv2.dnn.readNet("yolov4.weights", "yolov4.cfg")
layer_names = yolo_model.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in yolo_model.getUnconnectedOutLayers()]
  • cv2.dnn.readNet("yolov4.weights", "yolov4.cfg"):這行代碼從YOLO的權重文件和配置文件中載入YOLOv4模型。yolov4.weights是模型的權重文件,yolov4.cfg是模型的配置文件,描述了網絡的架構。
  • layer_names:獲取模型中所有層的名稱。
  • output_layers:獲取模型的輸出層名稱,用於獲取最終的檢測結果。

1.2. 檢測斑馬魚

def detect_fish(image_path):
    # 載入圖像並進行預處理
    image = cv2.imread(image_path)
    height, width, channels = image.shape
    blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
  • cv2.imread(image_path):從指定路徑載入圖像。
  • height, width, channels:取得圖像的高度、寬度和通道數。
  • cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False):將圖像轉換為YOLO模型所需的blob格式。0.00392是縮放因子,將像素值縮放到[0,1]範圍;(416, 416)是目標圖像大小,(0, 0, 0)是均值;True表示交換R和B通道,crop=False表示不裁剪圖像。
    # YOLOv4 進行預測
    yolo_model.setInput(blob)
    outputs = yolo_model.forward(output_layers)
  • yolo_model.setInput(blob):將預處理後的blob設置為模型的輸入。
  • outputs = yolo_model.forward(output_layers):進行前向傳播,獲取模型的輸出結果。

1.3. 處理檢測結果

    boxes = []
    confidences = []
    class_ids = []

    for output in outputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:  # 只保留置信度超過50%的檢測
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)
  • boxesconfidencesclass_ids:用來儲存檢測框的位置、置信度和類別ID。
  • detection[5:]:獲取每個檢測框的分類分數。前4個數值是邊界框的位置,從第5個開始是類別分數。
  • np.argmax(scores):獲取分數最高的類別ID。
  • confidence:該類別的置信度。
  • if confidence > 0.5:過濾掉置信度低於50%的檢測框。
  • center_xcenter_y:計算邊界框的中心坐標。
  • wh:計算邊界框的寬度和高度。
  • xy:計算邊界框的左上角坐標。
    indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    for i in indices:
        i = i[0]
        box = boxes[i]
        x, y, w, h = box[0], box[1], box[2], box[3]
        # 擷取斑馬魚的區域
        crop_img = image[y:y+h, x:x+w]
        return crop_img
  • cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4):進行非極大值抑制(NMS),去除重疊過多的檢測框。
  • for i in indices:處理NMS後的檢測框,擷取出斑馬魚的區域。

2. LSTM模型部分

這部分使用LSTM(長短期記憶)來分析圖像序列,以判斷斑馬魚的健康狀況。LSTM是一種處理時間序列數據的循環神經網絡(RNN)模型。

2.1. 預處理圖像

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, TimeDistributed, Flatten
import numpy as np

def preprocess_image(image):
    image = cv2.resize(image, (64, 64))
    image = image.astype('float32') / 255.0  # 標準化
    return image
  • cv2.resize(image, (64, 64)):將圖像調整為64x64大小。
  • image.astype('float32') / 255.0:將像素值標準化到[0,1]範圍,以便模型處理。

2.2. 構建LSTM模型

# 示例的圖像序列
image_sequence = [preprocess_image(detected_fish) for _ in range(10)]
image_sequence = np.array(image_sequence).reshape((1, 10, 64, 64, 3))
  • image_sequence:生成一個包含10幀圖像的序列,每幀圖像為64x64大小。這是一個模擬的圖像序列,實際應用中應根據實際圖像序列來生成。
model = Sequential()
model.add(TimeDistributed(Flatten(), input_shape=(10, 64, 64, 3)))
model.add(LSTM(50, return_sequences=True))
model.add(LSTM(50))
model.add(Dense(1, activation='sigmoid'))  # 假設二元分類:健康或不健康

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  • TimeDistributed層
    • TimeDistributed(Flatten(), input_shape=(10, 64, 64, 3)):將每幀圖像展平成一維向量,TimeDistributed層確保每幀圖像被獨立處理,並保持時間序列的順序。
  • LSTM層
    • LSTM(50, return_sequences=True):第一個LSTM層有50個單元,return_sequences=True表示返回每個時間步的輸出,以便傳遞到下一層LSTM。
    • LSTM(50):第二個LSTM層也有50個單元,這一層不返回序列,而是返回最後的時間步輸出的最終狀態。
  • Dense層
    • Dense(1, activation='sigmoid'):最後的全連接層,使用Sigmoid激活函數進行二元分類(健康或不健康)。
# 模型預測
prediction = model.predict(image_sequence)
print("健康狀況預測:", "健康" if prediction[0] > 0.5 else "不健康")
  • 模型預測:將圖像序列輸入到訓練好的LSTM模型中,進行預測。根據模型的輸出(0到1之間的概率)來判斷斑

馬魚的健康狀況。當預測值大於0.5時,輸出“健康”;否則輸出“不健康”。

總結

  1. YOLO模型

    • 負責檢測斑馬魚在圖像中的位置,並提取出斑馬魚的區域圖像。
    • 檢測過程中,YOLO模型進行圖像預處理、特徵提取,並使用非極大值抑制來清除冗餘的檢測框。
  2. LSTM模型

    • 使用從YOLO模型中提取的圖像序列來進行時間序列分析,以判斷斑馬魚的健康狀況。
    • LSTM模型處理圖像序列中的時間關聯性,通過分類來判斷健康狀況。

這樣的系統結合了物體檢測(YOLO)和時間序列分析(LSTM),能夠對斑馬魚的健康狀況進行全面的分析和預測。


上一篇
day 23人工智慧斑馬魚藥物分析
下一篇
day 25 人工智慧對於斑馬魚睡眠品質分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言