那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于YOLOv5的視頻計數 — 汽車計數實現

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

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

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

  • 需求

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

  • 檢測過濾

  • 啟發(fā)式:實現

  • 結論

需求

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

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

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

  • Matplotlib(可選):我們將使用此實用程序在多邊形內進行點驗證。

如代碼片段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ā)用于從視頻中計數對象的啟發(fā)式的時間了。

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

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

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

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

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

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

此為止,我們已經知道了需求是什么,以及我們將實施用于計數對象的啟發(fā)式的方法。現在可以加載模型:Yolov5 Nano

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

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)

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

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

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

檢測過濾

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

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

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

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

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

啟發(fā)式:實現

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

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

一旦我們定義了多邊形,我們唯一需要做的就是驗證每個對象的參考點是否在多邊形內。如果在多邊形內,我們就會增加一個計數器,如果不在,我們就繼續(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行,我們定義了關鍵函數:is_valid_detection(),它旨在驗證參考點(xc, yc)是否在多邊形內。這個函數在第37行調用,如果為真,它會增加有效檢測計數器,否則什么也不做。

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

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)

結論

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


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

    關注

    32

    文章

    2261

    瀏覽量

    94983
  • 模型
    +關注

    關注

    1

    文章

    3306

    瀏覽量

    49223
  • 目標檢測
    +關注

    關注

    0

    文章

    211

    瀏覽量

    15664

原文標題:基于YOLOv5的視頻計數 — 汽車計數實現

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

    Yolov5算法解讀

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

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

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

    在RK3568教學實驗箱上實現基于YOLOV5的算法物體識別案例詳解

    一、實驗目的 本節(jié)視頻的目的是了解YOLOv5模型的用途及流程,并掌握基于YOLOV5算法實現物體識別的方法。 二、實驗原理 YOLO(You Only Look Once?。?
    發(fā)表于 12-03 14:56

    龍哥手把手教你學視覺-深度學習YOLOV5

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

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

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

    如何YOLOv5測試代碼?

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

    yolov5模型onnx轉bmodel無法識別出結果如何解決?

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

    YOLOv5在OpenCV上的推理程序

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

    YOLOv5 7.0版本下載與運行測試

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

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

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

    使用旭日X3派的BPU部署Yolov5

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

    yolov5和YOLOX正負樣本分配策略

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

    YOLOv5網絡結構訓練策略詳解

    前面已經講過了Yolov5模型目標檢測和分類模型訓練流程,這一篇講解一下yolov5模型結構,數據增強,以及訓練策略。
    的頭像 發(fā)表于 09-11 11:15 ?2386次閱讀
    <b class='flag-5'>YOLOv5</b>網絡結構訓練策略詳解

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

    RK3588 技術分享 | 在Android系統(tǒng)中使用NPU實現Yolov5分類檢測-迅為電子
    的頭像 發(fā)表于 08-23 14:58 ?850次閱讀
    RK3588 技術分享 | 在Android系統(tǒng)中使用NPU<b class='flag-5'>實現</b><b class='flag-5'>Yolov5</b>分類檢測-迅為電子
    鑫鼎国际| 大发888海立方| 澳门百家乐官网搏牌规则| 百家乐真人游戏| 博久百家乐论坛| 百家乐官网真钱路怎么看| bet365维护| 百家乐发牌靴发牌盒| 百家乐官网棋| 百家乐官网下载游戏| 百家百家乐视频游戏世界| 网上百家乐辅助软件| 试玩百家乐官网1000| 皇冠百家乐官网皇冠网| 上游棋牌下载| 新全讯网3344666| 百家乐技巧辅助软件| 奔驰百家乐游戏| 波浪百家乐官网游戏中| 百家乐官网博彩开户博彩通| 博九娱乐城| 立博网址| 大发888怎么进不去| 月华百家乐的玩法技巧和规则| 做生意的风水摆件| 百家乐官网博弈之赢者理论坛| 波音百家乐官网网上娱乐| 云博娱乐城| 大发888博彩娱乐城| 实战百家乐十大取胜原因百分百战胜百家乐不买币不吹牛只你能做到按我说的.百家乐基本规则 | 云霄县| 百家乐龙虎台布价格| 百家乐开户百家乐技巧| 百家乐有真假宝单吗| 百家乐转盘技巧| 百家乐玩法秘决| 百家乐官网桌手机套| 百家乐官网必胜课| 诚信百家乐官网平台| 百家乐官网扑克多少张| 金木棉百家乐官网网络破解|