0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于YOLOv5的視頻計數(shù) — 汽車計數(shù)實(shí)現(xiàn)

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-11-25 12:11 ? 次閱讀

視頻中計數(shù)對象可能看起來有挑戰(zhàn)性,但借助Python和OpenCV的強(qiáng)大功能,變得令人意外地易于實(shí)現(xiàn)。在本文中,我們將探討如何使用YOLO(You Only Look Once)目標(biāo)檢測模型在視頻流或文件中計數(shù)對象。我們將該過程分解為簡單的步驟,使初學(xué)者能夠輕松跟隨。

本文將分為以下幾個部分:

  • 需求

  • 啟發(fā)式:汽車計數(shù)

  • 檢測過濾

  • 啟發(fā)式:實(shí)現(xiàn)

  • 結(jié)論

需求

在我們深入了解該過程之前,讓我們確保已安裝所需的庫。主要需要:

  • PyTorch:通過PyTorch Hub,我們將訪問Ultralytics存儲庫以下載Yolov5模型。

  • OpenCV:用于加載、操作和顯示視頻的所有實(shí)用程序。

  • Matplotlib(可選):我們將使用此實(shí)用程序在多邊形內(nèi)進(jìn)行點(diǎn)驗(yàn)證。

如代碼片段1所示,requirements.txt文件中列出了這些要求。

opencv-python==4.8.1.78
torch==2.1.0
matplotlib==3.8.0
ultralytics==8.0.203
pandas==2.1.2
requests==2.31.0

一旦我們查看了主要要求,就該了解我們將開發(fā)用于從視頻中計數(shù)對象的啟發(fā)式的時間了。

啟發(fā)式:汽車計數(shù)

在此示例中,我們將使用一個視頻場景,其中將對汽車進(jìn)行計數(shù)。圖2顯示了一個示例幀。

7e1fc1da-8b45-11ee-939d-92fbcf53809c.jpg用于計數(shù)汽車的視頻幀

為了計數(shù)汽車,我們將使用Yolov5來檢測視頻中的對象?;跈z測到的對象,我們將過濾與汽車、公共汽車和卡車有關(guān)的類別。由于檢測基于邊界框(具有坐標(biāo)xmin、ymin、xmax、ymax的多邊形),我們將需要獲取每個邊界框的中心點(diǎn)(xc, yc),該中心點(diǎn)將是我們對象的參考點(diǎn)。

最后,我們將繪制一個多邊形,該多邊形將是計數(shù)對象的參考,也就是說,如果對象的參考點(diǎn)在多邊形內(nèi),我們將增加對象計數(shù)器,否則計數(shù)器不受影響。在下圖中,我們可以看到多邊形和多邊形內(nèi)的汽車數(shù)量的表示。

7e2d92d8-8b45-11ee-939d-92fbcf53809c.jpg檢測(綠色點(diǎn))、多邊形(紅色線)和計數(shù)器

此為止,我們已經(jīng)知道了需求是什么,以及我們將實(shí)施用于計數(shù)對象的啟發(fā)式的方法?,F(xiàn)在可以加載模型:Yolov5 Nano

在本例中,我們將使用Yolov5的nano版本(即yolov5n),我們將通過PyTorch Hub從Ultralytics存儲庫中擴(kuò)展它。同樣,為了加載和在每一幀上生成迭代器,我們將使用OpenCV(即cv2),下述代碼是具體的實(shí)現(xiàn)方式:

import cv2
import torch


VIDEO_PATH="data/traffic.mp4"
HUB="ultralytics/yolov5"
YOLO="yolov5n"


def count_cars(cap: cv2.VideoCapture):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)


    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        # Detection filtering and heuristic
        # will be implemented here.


        cv2.imshow("frame", frame)


        if cv2.waitKey(10) & 0xFF == ord('q'):
             break


    cap.release()




if __name__ == '__main__':


    cap = cv2.VideoCapture(VIDEO_PATH)
    count_cars(cap)

正如我們所看到的,我們已經(jīng)定義了count_cars()函數(shù),我們將在整個項(xiàng)目中對其進(jìn)行更新。在4-6行,我們定義了視頻所在路徑、hub和模型名稱的變量。從那里,讓我們迅速跳到31-32行,在那里通過初始化cap對象加載視頻,然后將其傳遞給count_cars()函數(shù)。

返回到第10行,通過PyTorch Hub,我們下載并初始化了yolov5n模型。隨后,在第12行,我們生成一個迭代器,只要有要顯示的幀,它就會保持活動狀態(tài)。一旦幀完成,與迭代器相關(guān)的對象就會被釋放(第26行)。

在第13行,我們讀取幀,驗(yàn)證是否成功讀取,并顯示它們(第21行)。在這一部分,將出現(xiàn)一個窗口,用于查看從此迭代器顯示的視頻。最后,第23行是在按q鍵時刪除彈出窗口。

檢測過濾

過濾檢測是指從Yolo預(yù)測中提取感興趣的類別的過程。在這種情況下,我們將過濾掉分?jǐn)?shù)大于0.5且類別為汽車、公共汽車或卡車的檢測。同樣,我們將需要找到邊界框的中心點(diǎn),我們將其用作對象的參考點(diǎn)。下面代碼顯示了這兩個函數(shù)的實(shí)現(xiàn)。

import pandas as pd


def get_bboxes(preds: object):
    df = preds.pandas().xyxy[0]
    df = df[df["confidence"] >= 0.5]
    df = df[df["name"].isin(["car", "bus", "truck"])]


    return df[["xmin", "ymin", "xmax", "ymax"]].values.astype(int)


def get_center(bbox):
    center = ((bbox[0] + bbox[2]) // 2, (bbox[1] + bbox[3]) // 2)
    return center

正如我們所看到的,我們定義了兩個函數(shù)get_bboxes()和get_center()。get_bboxes()函數(shù)(第3行)旨在提取所有分?jǐn)?shù)大于0.5并過濾掉已經(jīng)提到的類別的預(yù)測,返回一個坐標(biāo)形式的邊界框的numpy數(shù)組[xmin, ymin, xmax, ymax]。

get_center()函數(shù)(第10行)接收一個帶有邊界框坐標(biāo)的numpy數(shù)組,并使用方程xc, yc = (xmin + xmax) // 2, (ymin + ymax) // 2分別計算中心點(diǎn)。

在這一點(diǎn)上,我們已經(jīng)下載了模型,過濾了預(yù)測,并獲得了每個對象的中心點(diǎn)?,F(xiàn)在,我們唯一需要的是生成決定啟發(fā)式區(qū)域的多邊形。因此,讓我們繼續(xù)下一節(jié)!

啟發(fā)式:實(shí)現(xiàn)

我們將定義的多邊形可能會因視頻、透視等而有所不同。在這種情況下,例如此示例,我們將使用8個點(diǎn),如下圖所示:

7e453ba4-8b45-11ee-939d-92fbcf53809c.jpg具有坐標(biāo)的多邊形

一旦我們定義了多邊形,我們唯一需要做的就是驗(yàn)證每個對象的參考點(diǎn)是否在多邊形內(nèi)。如果在多邊形內(nèi),我們就會增加一個計數(shù)器,如果不在,我們就繼續(xù)。

import cv2
import numpy as np
import matplotlib.path as mplPath


POLYGON = np.array([
    [333, 374],
    [403, 470],
    [476, 655],
    [498, 710],
    [1237, 714],
    [1217, 523],
    [1139, 469],
    [1009, 393],
])




def is_valid_detection(xc, yc):
    return mplPath.Path(POLYGON).contains_point((xc, yc))


def count_cars(cap: object):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)


    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        preds = model(frame)
        bboxes = get_bboxes(preds)


        detections = 0
        for box in bboxes:
            xc, yc = get_center(box)


            if is_valid_detection(xc, yc):
                detections += 1

讓我們注意到在第5行,我們定義了多邊形。在第17行,我們定義了關(guān)鍵函數(shù):is_valid_detection(),它旨在驗(yàn)證參考點(diǎn)(xc, yc)是否在多邊形內(nèi)。這個函數(shù)在第37行調(diào)用,如果為真,它會增加有效檢測計數(shù)器,否則什么也不做。

最后,為了可視化,我們將添加一些OpenCV行來顯示計數(shù)器、每輛檢測到的汽車的參考點(diǎn)和多邊形。

def count_cars(cap: object):


    model = torch.hub.load(HUB, model=YOLO, pretrained=True)
    
    while cap.isOpened():
        status, frame = cap.read()


        if not status:
            break


        preds = model(frame)
        bboxes = get_bboxes(preds)


        detections = 0
        for box in bboxes:
            xc, yc = get_center(box)
            
            if is_valid_detection(xc, yc):
                detections += 1
                
            # Draw poit of reference for each detection
            cv2.circle(img=frame, center=(xc, yc), radius=5, color=(0,255,0), thickness=-1)
            # Draw bounding boxes for each detection
            cv2.rectangle(img=frame, pt1=(box[0], box[1]), pt2=(box[2], box[3]), color=(255, 0, 0), thickness=1)
        # Draw the counter
        cv2.putText(img=frame, text=f"Cars: {detections}", org=(100, 100), fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=3, color=(0,0,0), thickness=3)
        # Draw the polygon
        cv2.polylines(img=frame, pts=[POLYGON], isClosed=True, color=(0,0,255), thickness=4)
        # Display frame
        cv2.imshow("frame", frame)

結(jié)論

在本文中,我們看到了如何從視頻中實(shí)現(xiàn)一個對象計數(shù)器。我們開發(fā)了一種計算汽車、卡車和公共汽車的實(shí)現(xiàn),基于一個定義的多邊形,即如果對象在多邊形內(nèi),計數(shù)器就會增加。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2248

    瀏覽量

    94180
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3062

    瀏覽量

    48575
  • 目標(biāo)檢測
    +關(guān)注

    關(guān)注

    0

    文章

    197

    瀏覽量

    15571

原文標(biāo)題:基于YOLOv5的視頻計數(shù) — 汽車計數(shù)實(shí)現(xiàn)

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    YOLOv5】LabVIEW+YOLOv5快速實(shí)現(xiàn)實(shí)時物體識別(Object Detection)含源碼

    前面我們給大家介紹了基于LabVIEW+YOLOv3/YOLOv4的物體識別(對象檢測),今天接著上次的內(nèi)容再來看看YOLOv5。本次主要是和大家分享使用LabVIEW快速實(shí)現(xiàn)
    的頭像 發(fā)表于 03-13 16:01 ?2038次閱讀

    Yolov5算法解讀

    yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然在不斷進(jìn)行升級迭代。 Yolov5YOLOv5s、YOLOv5
    的頭像 發(fā)表于 05-17 16:38 ?8022次閱讀
    <b class='flag-5'>Yolov5</b>算法解讀

    YOLOv5】LabVIEW+TensorRT的yolov5部署實(shí)戰(zhàn)(含源碼)

    今天主要和大家分享在LabVIEW中使用純TensoRT工具包快速部署并實(shí)現(xiàn)yolov5的物體識別
    的頭像 發(fā)表于 08-21 22:20 ?1222次閱讀
    【<b class='flag-5'>YOLOv5</b>】LabVIEW+TensorRT的<b class='flag-5'>yolov5</b>部署實(shí)戰(zhàn)(含源碼)

    龍哥手把手教你學(xué)視覺-深度學(xué)習(xí)YOLOV5

    可以實(shí)現(xiàn)理想的檢測效果。在本套視頻,有別于常見的深度學(xué)習(xí)教程以理論為主進(jìn)行全面講解,以沒有任何深度學(xué)習(xí)理論基礎(chǔ)的學(xué)員學(xué)習(xí)角度,以實(shí)際應(yīng)用為目標(biāo),講解如何設(shè)計一個完整的yolov5工業(yè)外觀檢測,手把手教學(xué)
    發(fā)表于 09-03 09:39

    怎樣使用PyTorch Hub去加載YOLOv5模型

    在Python>=3.7.0環(huán)境中安裝requirements.txt,包括PyTorch>=1.7。模型和數(shù)據(jù)集從最新的 YOLOv5版本自動下載。簡單示例此示例從
    發(fā)表于 07-22 16:02

    如何YOLOv5測試代碼?

    使用文檔“使用 YOLOv5 進(jìn)行對象檢測”我試圖從文檔第 10 頁訪問以下鏈接(在 i.MX8MP 上部署 yolov5s 的步驟 - NXP 社區(qū)) ...但是這樣做時會被拒絕訪問。該文檔沒有說明需要特殊許可才能下載 test.zip 文件。NXP 的人可以提供有關(guān)如
    發(fā)表于 05-18 06:08

    yolov5模型onnx轉(zhuǎn)bmodel無法識別出結(jié)果如何解決?

    問題描述: 1. yolov5模型pt轉(zhuǎn)bmodel可以識別出結(jié)果。(轉(zhuǎn)化成功,結(jié)果正確) 2. yolov5模型pt轉(zhuǎn)onnx轉(zhuǎn)bmodel可以無法識別出結(jié)果。(轉(zhuǎn)化成功,結(jié)果沒有) 配置: 1.
    發(fā)表于 09-15 07:30

    基于YOLOv5的目標(biāo)檢測文檔進(jìn)行的時候出錯如何解決?

    你好: 按Milk-V Duo開發(fā)板實(shí)戰(zhàn)——基于YOLOv5的目標(biāo)檢測 安裝好yolov5環(huán)境,在執(zhí)行main.py的時候會出錯,能否幫忙看下 main.py: import torch
    發(fā)表于 09-18 07:47

    YOLOv5在OpenCV上的推理程序

    YOLOv5官方給出的YOLOv5在OpenCV上推理的程序相對來說是比較通俗易懂的,條理清晰,有基本的封裝,直接可用!但是我也發(fā)現(xiàn),模型的推理時間跟前后處理的時間相差無幾,特別是當(dāng)視頻流有多個檢測到的對象時候,整個幀率會有明顯
    的頭像 發(fā)表于 11-02 10:16 ?1776次閱讀

    YOLOv5 7.0版本下載與運(yùn)行測試

    支持實(shí)例分割了,從此YOLOv5實(shí)現(xiàn)了圖像分類、對象檢測、實(shí)例分割三個支持,從訓(xùn)練到部署。
    的頭像 發(fā)表于 11-30 15:55 ?3568次閱讀

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下載并轉(zhuǎn)換YOLOv5預(yù)訓(xùn)練模型的詳細(xì)步驟,請參考:《基于OpenVINO?2022.2和蝰蛇峽谷優(yōu)化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的頭像 發(fā)表于 02-15 16:53 ?4399次閱讀

    使用旭日X3派的BPU部署Yolov5

    本次主要介紹在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運(yùn)行yolov5并使用pytoch的pt模型文件轉(zhuǎn)ONNX。
    的頭像 發(fā)表于 04-26 14:20 ?808次閱讀
    使用旭日X3派的BPU部署<b class='flag-5'>Yolov5</b>

    yolov5和YOLOX正負(fù)樣本分配策略

    整體上在正負(fù)樣本分配中,yolov7的策略算是yolov5和YOLOX的結(jié)合。因此本文先從yolov5和YOLOX正負(fù)樣本分配策略分析入手,后引入到YOLOv7的解析中。
    發(fā)表于 08-14 11:45 ?2123次閱讀
    <b class='flag-5'>yolov5</b>和YOLOX正負(fù)樣本分配策略

    YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練策略詳解

    前面已經(jīng)講過了Yolov5模型目標(biāo)檢測和分類模型訓(xùn)練流程,這一篇講解一下yolov5模型結(jié)構(gòu),數(shù)據(jù)增強(qiáng),以及訓(xùn)練策略。
    的頭像 發(fā)表于 09-11 11:15 ?1953次閱讀
    <b class='flag-5'>YOLOv5</b>網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練策略詳解

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測-迅為電子

    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU實(shí)現(xiàn)Yolov5分類檢測-迅為電子
    的頭像 發(fā)表于 08-23 14:58 ?468次閱讀
    RK3588 技術(shù)分享 | 在Android系統(tǒng)中使用NPU<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>Yolov5</b>分類檢測-迅為電子