iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0

今天是第四天我們可以寫一些斑馬魚行為辨識的yolo,以下是程式碼

import cv2
import numpy as np

# 載入 YOLO 模型
net = cv2.dnn.readNet('yolo/yolov3.weights', 'yolo/yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 載入類別名稱
with open('yolo/coco.names', 'r') as f:
    classes = [line.strip() for line in f.readlines()]

# 讀取視頻文件
cap = cv2.VideoCapture('zebrafish.mp4')

while(cap.isOpened()):
    ret, frame = cap.read()
    if not ret:
        break
    
    height, width, channels = frame.shape

    # YOLO 預處理
    blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(output_layers)

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

    # 分析 YOLO 輸出
    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:
                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)

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

    for i in range(len(boxes)):
        if i in indexes:
            x, y, w, h = boxes[i]
            label = str(classes[class_ids[i]])
            confidence = confidences[i]
            color = (0, 255, 0)
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

    cv2.imshow('Zebrafish Behavior Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
  1. 載入 YOLO 模型和配置文件

    net = cv2.dnn.readNet('yolo/yolov3.weights', 'yolo/yolov3.cfg')
    

    readNet 函數從指定的權重文件和配置文件中載入 YOLO 模型。

  2. 獲取 YOLO 層的名稱

    layer_names = net.getLayerNames()
    output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    

    這段代碼獲取 YOLO 模型的所有層的名稱,並確定輸出層。

  3. 載入類別名稱

    with open('yolo/coco.names', 'r') as f:
        classes = [line.strip() for line in f.readlines()]
    

    coco.names 文件包含 YOLO 模型可以識別的物體類別名稱,這裡將其讀入 classes 列表。

  4. 讀取視頻文件

    cap = cv2.VideoCapture('zebrafish.mp4')
    

    使用 OpenCV 的 VideoCapture 函數讀取指定的視頻文件。

  5. 視頻幀處理

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

    這個 while 迴圈逐幀讀取視頻文件,直到視頻結束。

  6. YOLO 預處理

    blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
    net.setInput(blob)
    outs = net.forward(output_layers)
    

    將每一幀圖像轉換為 YOLO 所需的 blob 格式,並傳入模型進行前向傳播以獲得輸出。

  7. 分析 YOLO 輸出

    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            if confidence > 0.5:
                ...
    

    解析 YOLO 模型的輸出,篩選出信心度超過 0.5 的檢測結果,計算邊界框的位置。

  8. 非極大值抑制

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

    使用非極大值抑制來消除重疊的邊界框,保留最有信心的檢測結果。

  9. 畫出邊界框和類別標籤

    for i in range(len(boxes)):
        if i in indexes:
            ...
            cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2)
            cv2.putText(frame, f"{label} {confidence:.2f}", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    

    在每一幀圖像中畫出邊界框並標註檢測到的類別和信心度。

  10. 顯示視頻

    cv2.imshow('Zebrafish Behavior Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    

    將處理過的幀顯示在窗口中,按下 'q' 鍵可以退出。

  11. 釋放資源

    cap.release()
    cv2.destroyAllWindows()
    

    釋放視頻資源並關閉所有窗口。

這段程式碼實現了從視頻中逐幀讀取圖像,使用 YOLO 模型進行目標檢測,並將檢測結果顯示在視頻中的功能。


上一篇
day 3 yolo 停車場車牌辨識
下一篇
day 5 yolo多隻斑馬魚的行為分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言