10分鐘學會使用YOLO及Opencv實現目標評估(下)

電腦雜談  發布時間:2020-02-14 09:01:58  來源:網絡整理

opencv目標識別程序_opencv識別特定物體_利用opencv進行人臉檢測識別

摘要:本文介紹使用opencv和yolo完成視頻流目標評估,代碼解釋具體,附源碼,上手快。

在上一節內容中,介紹了怎樣將YOLO應用于圖像目標評估中opencv目標識別程序,那么在學會檢測單張圖像后,我們也可以運用YOLO算法推動視頻流中的目標檢測。

首先打開yolo_video.py文件并插入以下代碼:

# import the necessary packages
import numpy as np
import argparse
import imutils
import time
import cv2
import os
 
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True,
    help="path to input video")
ap.add_argument("-o", "--output", required=True,
    help="path to output video")
ap.add_argument("-y", "--yolo", required=True,
    help="base path to YOLO directory")
ap.add_argument("-c", "--confidence", type=float, default=0.5,
    help="minimum probability to filter weak detections")
ap.add_argument("-t", "--threshold", type=float, default=0.3,
    help="threshold when applyong non-maxima suppression")
args = vars(ap.parse_args())

同樣,首先從導出相關數據包跟命令行參數開始。與之前不同的是,此腳本沒有--image參數,取而代之的是量個視頻模式:

視頻的輸入可以是相機拍攝的短視頻以及是網上搜索到的視頻。另外,也可以借助將多張圖片合成為一個短視頻也可以。本博客使用的是在PyImageSearch上找到來自imutils的VideoStream類的示例。

下面的代碼與處理圖形時候同樣:

# load the COCO class labels our YOLO model was trained on
labelsPath = os.path.sep.join([args["yolo"], "coco.names"])
LABELS = open(labelsPath).read().strip().split("\n")
 
# initialize a list of colors to represent each possible class label
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3),
    dtype="uint8")
 
# derive the paths to the YOLO weights and model configuration
weightsPath = os.path.sep.join([args["yolo"], "yolov3.weights"])
configPath = os.path.sep.join([args["yolo"], "yolov3.cfg"])
 
# load our YOLO object detector trained on COCO dataset (80 classes)
# and determine only the *output* layer names that we need from YOLO
print("[INFO] loading YOLO from disk...")
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
ln = net.getLayerNames()
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

在這里,加載標簽并生成相應的形狀,然后讀取YOLO模型并確認輸出層名稱。

接下來,將處理一些特定于視頻的任務:

# initialize the video stream, pointer to output video file, and
# frame dimensions
vs = cv2.VideoCapture(args["input"])
writer = None
(W, H) = (None, None)
 
# try to determine the total number of frames in the video file
try:
    prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \
        else cv2.CAP_PROP_FRAME_COUNT
    total = int(vs.get(prop))
    print("[INFO] {} total frames in video".format(total))
 
# an error occurred while trying to determine the total
# number of frames in the video file
except:
    print("[INFO] could not determine # of frames in video")
    print("[INFO] no approx. completion time can be provided")
    total = -1

opencv識別特定物體_利用opencv進行人臉檢測識別_opencv目標識別程序

在上述代碼塊中:

之后逐個處理幀:

# loop over frames from the video file stream
while True:
    # read the next frame from the file
    (grabbed, frame) = vs.read()
 
    # if the frame was not grabbed, then we have reached the end
    # of the stream
    if not grabbed:
        break
 
    # if the frame dimensions are empty, grab them
    if W is None or H is None:
        (H, W) = frame.shape[:2]

上述定義了一個while循環,然后從第一幀開始進行處理opencv目標識別程序,并且會檢測它能否是視頻的最終一幀。接下來,如果已經清楚幀的尺寸,就會獲取一下對應的尺寸。

接下來,使用當前幀作為輸入執行YOLO的前向釋放:

ect Detection with OpenCVPython
    # construct a blob from the input frame and then perform a forward
    # pass of the YOLO object detector, giving us our bounding boxes
    # and associated probabilities
    blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416),
        swapRB=True, crop=False)
    net.setInput(blob)
    start = time.time()
    layerOutputs = net.forward(ln)
    end = time.time()
    # initialize our lists of detected bounding boxes, confidences,
    # and class IDs, respectively
    boxes = []
    confidences = []
    classIDs = []

在這里,構建一個blob并將其釋放通過網絡,從而取得預測。然后再次初始化之前在圖像目標測量中使用過的三個列表:boxes、confidences、classIDs:

  # loop over each of the layer outputs
    for output in layerOutputs:
        # loop over each of the detections
        for detection in output:
            # extract the class ID and confidence (i.e., probability)
            # of the current object detection
            scores = detection[5:]
            classID = np.argmax(scores)
            confidence = scores[classID]
 
            # filter out weak predictions by ensuring the detected
            # probability is greater than the minimum probability
            if confidence > args["confidence"]:
                # scale the bounding box coordinates back relative to
                # the size of the image, keeping in mind that YOLO
                # actually returns the center (x, y)-coordinates of
                # the bounding box followed by the boxes' width and
                # height
                box = detection[0:4] * np.array([W, H, W, H])
                (centerX, centerY, width, height) = box.astype("int")
 
                # use the center (x, y)-coordinates to derive the top
                # and and left corner of the bounding box
                x = int(centerX - (width / 2))
                y = int(centerY - (height / 2))
 
                # update our list of bounding box coordinates,
                # confidences, and class IDs
                boxes.append([x, y, int(width), int(height)])
                confidences.append(float(confidence))
                classIDs.append(classID)


本文來自電腦雜談,轉載請注明本文網址:
http://www.772070.live/a/jisuanjixue/article-140719-1.html

相關閱讀
發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

  • 黃大輿
    黃大輿

    美狗再不收斂

  • 李淑君
    李淑君

    美艦在我軍的嚴厲警告下夾著尾巴逃跑了

  • 旦增索朗
    旦增索朗

    及時為IBM排憂解難

熱點圖片
拼命載入中...
天津快乐十分20选8技巧