bytetrack漏檢補齊

bytetrack漏檢補齊

1.人流慢速運動,跟蹤效果比較好,偶爾有漏檢,跟蹤可以自動補齊。

2.快速運動,頻繁遮擋,效果可能不好

*如果漏檢,倒著跟蹤,把丟失的檢測框拷貝出來,保留進行跟蹤。

有時候效果不是很好

from collections import defaultdict
import cv2
import numpy as np
import torchvision
from ultralytics import YOLO
import pickle
import torch
from torchvision.ops import box_iou
from log import logger
import time
import os
from addict import Dict
from track.byte_tracker import BYTETracker
import mathdef get_color(idx):idx = idx * 5color = ((37 * idx) % 255, (17 * idx) % 255, (29 * idx) % 255)return colorclass YOLO_Class():def __init__(self, model_path, device="cuda:0"):self.model = YOLO(model_path)  # YOLO?12 檢測 + 跟蹤self.par_args = Dict({"track_thresh": 0.5, "track_buffer": 30, "match_thresh": 0.9, "min_box_area": 10, "mot20": False})self.tracker = BYTETracker(self.par_args, frame_rate=20)def yolo_byte_track(self,detect_bboxes, frame):title_color = (0, 255, 255)person_sum = 0# print(f"bboxes: {detect_bboxes}")if len(detect_bboxes) > 0:if len(detect_bboxes) > 4:self.par_args.track_buffer = 60self.par_args.match_thresh = 1.6else:self.par_args.track_buffer = 30self.par_args.match_thresh = 0.9online_targets = self.tracker.update(np.array(detect_bboxes), [frame.shape[0], frame.shape[1]],(frame.shape[0], frame.shape[1]), self.par_args)# print("len(det)", len(detect_bboxes), "len track", len(online_targets))for index, t in enumerate(online_targets):tlwh = t.tlwhx1, y1, w, h = tlwhif w > 0 and h > 0:bbbb = t.track_idperson_sum = max(person_sum, bbbb)box_color = get_color(t.track_id)intbox = tuple(map(int, (x1, y1, x1 + w, y1 + h)))cv2.rectangle(frame, intbox[0:2], intbox[2:4], color=box_color, thickness=2)hull = [[x1, y1], [x1 + w, y1], [x1 + w, y1 + h], [x1, y1 + h]]# for index, point in enumerate(track_dict[bbbb]):# dist = cv2.pointPolygonTest(np.array(hull).astype(np.int32), tuple(point), True)#<0 out >0 in# if index==len(track_dict[t.track_id])-4 and t.track_id < 3:#     print('----------------', abs(point[0] - (x1 + w / 2)), abs(point[1]-(y1+h)))# cv2.rectangle(frame, (intbox[2],intbox[1]), (int(intbox[2]+70),int(intbox[1]+80)), color=box_color , thickness=1)cv2.putText(frame, f'{bbbb} {t.score:.2f} ', (intbox[0], intbox[1] - 5), cv2.FONT_HERSHEY_PLAIN,1.8, title_color, thickness=2)return framedef get_bytetrack_bbox(self, video_path, video_id, output_path="", debug:bool=False):debug_dir = f"yolov12/debug/{video_id}" if debug else Noneos.makedirs(debug_dir, exist_ok=True)  # 確保調試目錄存在# ----------------- 基本參數 -----------------track_history = defaultdict(list)  # 保存每個 track 的歷史中心點cap = cv2.VideoCapture(video_path)if not cap.isOpened():raise RuntimeError(f"無法打開視頻: {video_path}")fps = cap.get(cv2.CAP_PROP_FPS) or 30  # 有些文件讀不到 FPS,給默認w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))logger.info(f"視頻總幀數: {total_frames}, fps: {fps}, 寬: {w}, 高: {h}")frame_id = 0fourcc = cv2.VideoWriter_fourcc(*"mp4v")out = cv2.VideoWriter(output_path, fourcc, fps, (w, h))if not out.isOpened():raise RuntimeError("VideoWriter 初始化失敗,請檢查編碼器 fourcc 或路徑。")last_box=[]while cap.isOpened():ok, frame = cap.read()if not ok:break# YOLO11 跟蹤(persist=True 保持 track ID)t0 = time.time()results = detect_image_yolo(self.model,frame)pic_h,pic_w = frame.shape[:2]  # if frame_id%4==3:#     results = np.delete(results, 1, axis=0)pad_count = len(last_box) - len(results)if pad_count>0 and 0:tracker2 = BYTETracker(self.par_args, frame_rate=3)track_now = tracker2.update(results, (pic_h,pic_w),(pic_h,pic_w), self.par_args)track_last = tracker2.update(last_box, (pic_h,pic_w),(pic_h,pic_w), self.par_args)last_ids = set(t.track_id for t in track_last)b_ids = set(t.track_id for t in track_now)# 找出 a 中比 b 多出來的所有 track_idextra_ids = last_ids - b_ids# 根據 track_id 提取出對應的完整對象(如 STrack)extra_targets = [t for t in track_last if t.track_id in extra_ids]for t in extra_targets:x1, y1, w, h = t.tlwhprint('add box', frame_id,x1, y1, w, h)box_lost=np.asarray([x1, y1, x1 + w, y1 + h,t.score,0])results = np.vstack([results, box_lost])last_box=resultst1 = time.time()frame = self.yolo_byte_track(results, frame)print(f"{frame_id} det_track time {time.time() - t0:.3f}s track_time {time.time() - t1:.3f}s")if np.prod(frame.shape[:2]) > 1000 * 1300:x_scale = np.sqrt(1000 * 1200 / np.prod(frame.shape[:2]))frame = cv2.resize(frame, None, fx=x_scale, fy=x_scale, interpolation=cv2.INTER_AREA)cv2.imshow("YOLO Track", frame)if cv2.waitKey(0) & 0xFF == 27:   # Esc to quitbreak# 寫入輸出視頻out.write(frame)frame_id += 1def detect_image_yolo(yolo_model,image, imgsz=640, conf=0.4, min_area=60*40, max_len=0):with torch.no_grad():results = yolo_model(image, verbose=False, imgsz=imgsz, conf=conf)cls = results[0].boxes.cls.int().cpu()indices = torch.where(cls == 0)[0]  # 只保留 person 類別if len(indices) == 0:return np.empty((0, 6))  # 返回空但保持 shape 正確labels = results[0].boxes.cls[indices]boxes = results[0].boxes.xyxy[indices]scores = results[0].boxes.conf[indices]if len(boxes) == 0:return np.empty((0, 6))boxes = boxes.float()keep_indices = torchvision.ops.nms(boxes, scores, iou_threshold=0.5)boxes = boxes[keep_indices]scores = scores[keep_indices]labels = labels[keep_indices]#面積過濾areas = (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])area_mask = areas >= min_areaboxes = boxes[area_mask]scores = scores[area_mask]labels = labels[area_mask]if len(boxes) == 0:return np.empty((0, 6))# 轉換為 numpy 并拼接成 ByteTrack 格式boxes = boxes.cpu().numpy()scores = scores.cpu().numpy()labels = labels.cpu().numpy()dets = np.concatenate([boxes, scores[:, None], labels[:, None]], axis=1)  # [N, 6]return detsif __name__ == "__main__":mp4_path = r"C:\Users\Administrator\Videos\yundong\20250226162704517\20250226162704517.mp4"mp4_path = r"F:\data\lanqiu\150_30\150_30.mp4"mp4_path = r"E:\data\tiaosheng\0706\5s.mp4"video_id = os.path.basename(mp4_path).split(".")[0]  # 從路徑中提取視頻 IDyolo_path= r"F:\BaiduNetdiskDownload\tiaosheng_new\model\best_new.pt"yolo_cls = YOLO_Class(yolo_path)yolo_cls.get_bytetrack_bbox(mp4_path, video_id, output_path=f"{video_id}_tracked.mp4", debug=True)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914672.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914672.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914672.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝Keycloak并啟動服務(macOS)

前提&#xff1a;電腦已經安裝Java 17 1、下載Keycloak 2、下載完后解壓縮&#xff0c;使用文本編輯器修改配置文件&#xff08;keycloak/conf/keycloak.conf&#xff09; # Basic settings for running in production. Change accordingly before deploying the server. # …

汽車動力轉向器落錘沖擊試驗臺

落錘沖擊試驗臺主要用于扣件減振量的測試&#xff0c;采用電動錨鏈提錘結構&#xff0c;控制精度高&#xff0c;定位準確。采用伺服電機減速機驅動&#xff0c;避免提錘加速和到位減速時的沖擊&#xff0c;具有多重安全保護功能&#xff0c;防止二次沖擊裝置。主機框架采用上下…

Linux系統集群部署模塊之Keepalived雙機熱備

目錄 概述 一、keepalived安裝 二、配置文件 三、 其他配置項說明 四、名詞解釋 五、高階使用 1、介紹 2、keepalived主要作用 3、工作在三層、四層和七層原理 4、健康狀態檢測方式 4.1 HTTP服務狀態檢測 4.2 TCP端口狀態檢測&#xff08;使用TCP端口服務基本上都可…

TDengine 使用最佳實踐(1)

目錄 數據建模 單列模型 多列模型 分庫分表 邊界限制 資源規劃 CPU 主頻 CPU 核數 內存分類 內存計算 CPU 內存比例 磁盤 網絡 下一篇 TDengine 使用最佳實踐&#xff08;1&#xff09; 關于 TDengine TDengine 是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺&am…

Java行為型模式---責任鏈模式

責任鏈模式基礎概念責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是將請求的發送者和接收者解耦&#xff0c;使多個對象都有機會處理請求。這些對象連接成一條鏈&#xff0c;請求沿著鏈傳遞&#xff0c;直到有…

嵌入式學習筆記- 結構體名字被賦值時是整體內容賦值

結構體變量名被賦值時&#xff0c;?不是賦值的地址&#xff0c;而是執行對整個結構體內容的復制&#xff08;值拷貝&#xff09;?直接賦值是成員級復制? 當使用 s2 s1; 形式的賦值時&#xff08;其中 s1 和 s2 是同類型結構體變量&#xff09;&#xff0c;系統會?逐成員復…

基于UDP/IP網絡游戲加速高級擁塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP網絡游戲加速高級擁塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目標檢測】06-模型部署(C++)

上一節課,我們學習了模型的預測。那么,如何用C++部署呢? 克隆項目 進入cmd,進入自己的項目文件夾,然后git clone項目: git clone https://github.com/Geekgineer/YOLOs-CPP 進入到YOLOs-CPP文件夾: 配置環境 ONNX Runtime 后續構建項目的時候,會自動下載,因此,我…

【第零章編輯器開發與拓展】

前言&#xff1a;對編輯器拓展與開發可以節省很多時間&#xff0c;提高開發效率&#xff0c;比如技能編輯器&#xff0c;關卡編輯器這種。當然這只是編輯器開發的一些典型應用&#xff0c;它能做不止這些。學習完這個之后&#xff0c;我們可以開發項目需要的工具。我本意在編輯…

使用 mongoimport 導入本地 JSON 文件到 MongoDB 及數據查看指南

在項目中&#xff0c;我們經常需要將本地 JSON 文件批量導入 MongoDB 數據庫。本文以 Ubuntu 22.04 環境為例&#xff0c;詳細記錄了如何安裝 mongoimport 工具、正確導入多個 JSON 文件&#xff0c;以及查看導入后的數據。一、環境介紹操作系統&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python數據處理Excel報表自動化生成與分析

Python實現Excel報表自動化系統全流程指南本文將詳細介紹如何使用Python實現一個完整的Excel報表自動化系統&#xff0c;涵蓋從數據清洗、分析到可視化報表生成的全流程。本教程面向Python初學者&#xff0c;通過實際案例講解pandas和openpyxl庫的核心用法。系統概述Excel報表自…

【第六節】docker可視化工具portainer安裝

該文章參考了這篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一個基于網頁的docker可視化管理工具&#xff0c;試想一下我們怎么登錄路由器管理界面的&#xff0c;異曲同工。那么就需要在服務器的docker內安裝portainer&#xff0c;然后在我們的開發機或者說工作…

使用 Certbot 申請和自動續簽 Let’s Encrypt 的免費 SSL 證書

一. Let’s Encrypt 介紹 Let’s Encrypt 是當前最常用的免費 HTTPS 證書生成工具之一。該服務由非營利組織提供&#xff0c;致力于為全球范圍內的網站提供便捷的自動化證書頒發服務。雖然 Let’s Encrypt 證書的有效期只有90天&#xff0c;但是可以自動續期&#xff0c;這使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器詳解 它確保集群中所有(或部分)節點上都運行一個 Pod 的副本。當有新節點加入集群時&#xff0c;DaemonSet 會自動在新節點上創建 Pod&#xff1b;當節點從集群中移除時&#xff0c;這些 Pod 也會被垃圾回收。 DaemonSet 的核心特性 每個節點一個 P…

內測分發平臺應用的異地容災和負載均衡處理和實現思路

內測分發平臺應用的異地容災和負載均衡處理和實現思路如下&#xff1a;一、異地容災1.風險評估和需求分析&#xff1a;對現有的IT基礎設施進行全面的風險評估和需求分析&#xff0c;評估潛在風險和災害的可能性&#xff0c;以及確定業務和數據的關鍵性。2.設計備份架構&#xf…

【Vue】瀏覽器緩存 sessionStorage、localStorage、Cookie

嘿&#xff0c;各位 Vue 開發者們&#xff01;今天咱們來好好聊聊瀏覽器里的三種緩存方式&#xff1a;sessionStorage、localStorage 和 Cookie。在實際開發中&#xff0c;合理運用這些緩存能讓我們的應用性能大幅提升&#xff0c;同時避免一些不必要的問題。下面就跟著我的筆記…

c#如何將不同類型的數據存儲到一起

在 C# 中&#xff0c;存儲不同類型的數據有多種方式&#xff0c;具體選擇取決于你的需求&#xff08;類型安全、性能、靈活性等&#xff09;。以下是常見的解決方案及其適用場景&#xff1a;1. 使用 object 類型&#xff08;裝箱 / 拆箱&#xff09;將所有數據轉換為基類 objec…

超唯美治愈風卡通插畫PPT模版

海洋卡通風治愈系PPT模版&#xff0c;兒童可愛治愈可愛PPT模版&#xff0c;治愈風商務通用PPT模版&#xff0c;治愈系課件PPT模版&#xff0c;治愈風插畫PPT模版&#xff0c;超唯美治愈風PPT模版&#xff0c;可愛插畫治愈系女孩PPT模版 超唯美治愈風卡通插畫PPT模版&#xff1a…

el-tooltip 快速滾動的時候出現殘影如何解決 vue3

<el-tooltip:disabled"isScrolling" <!-- 新增滾動狀態綁定 -->:popper-options"{ modifiers: [{ name: computeStyles, options: { adaptive: false }] }"effect"dark":content"label.name"placement"right-start"…

【經典面經】C++新特性 TCP完整收發數據 TLS1.2 TLS1.3

文章目錄cpp新特性C11C14C17C20tcp如何保證完整收發數據結論1. **面向連接的三次握手**2. **字節序號與確認機制**3. **校驗和&#xff08;Checksum&#xff09;**4. **超時重傳與快速重傳**5. **滑動窗口&#xff08;流量控制&#xff09;**6. **數據重組與排序**7. **四次揮手…