基于YOLOv8與ByteTrack的車輛行人多目標檢測與追蹤系統

作者主頁:編程千紙鶴

作者簡介:Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗,被多個學校常年聘為校外企業導師,指導學生畢業設計并參與學生畢業答辯指導,有較為豐富的相關經驗。期待與各位高校教師、企業講師以及同行交流合作

主要內容:Java項目、Python項目、前端項目、PHP、ASP.NET、人工智能與大數據、單片機開發、物聯網設計與開發設計、簡歷模板、學習資料、面試題庫、技術互助、就業指導等

業務范圍:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文降重、長期答辯答疑輔導、騰訊會議一對一專業講解輔導答辯、模擬答辯演練、和理解代碼邏輯思路等

收藏點贊不迷路? 關注作者有好處

文末獲取源碼?

項目編號:

一,環境介紹

語言環境:Python3.8

數據庫:Mysql: mysql5.7

開發技術:YOLOV8+Python+PyQT5

開發工具:IDEA或PyCharm

二,項目簡介

車輛行人多目標檢測與追蹤系統結合了先進的YOLOv8目標檢測技術與ByteTrack多目標跟蹤算法,能夠在實時視頻畫面中準確地檢測并跟蹤行人與車輛。這一系統對于改善交通安全、提高城市監控效率以及增強公共安全管理具有顯著的重要性。本文基于YOLOv8深度學習框架,通過5607張圖片,訓練了一個進行車輛與行人的目標檢測模型,準確率高達94%;然后結合ByteTrack多目標跟蹤算法,實現了目標的追蹤效果。最終基于此開發了一款帶UI界面的車輛行人多目標檢測與追蹤系統,可用于實時檢測場景中的車輛與行人檢測追蹤,可以更加方便的進行功能展示。該系統是基于pythonPyQT5開發的,支持視頻以及攝像頭進行多目標檢測追蹤,也可選擇指定目標追蹤,支持保存追蹤結果視頻。本文提供了完整的Python代碼和使用教程,給感興趣的小伙伴參考學習,完整的代碼資源文件獲取方式見文末

車輛行人多目標檢測與追蹤系統結合了先進的YOLOv8目標檢測技術ByteTrack多目標跟蹤算法,能夠在實時視頻畫面中準確地檢測并跟蹤行人與車輛。這一系統對于改善交通安全、提高城市監控效率以及增強公共安全管理具有顯著的重要性。實時的追蹤可以幫助相關部門快速響應各種交通和安全事件,降低事故發生風險,并為城市交通規劃和管理提供數據支持。

車輛行人多目標檢測與追蹤系統的應用場景主要包括

交通監控:實時監測城市交通流量、行人穿行情況,分析交通擁堵,優化交通信號控制。

事故分析與應對:在交通事故發生時提供準確的事故記錄,輔助事故原因分析和快速響應。

安全監督:用于公共場所和重要設施周邊的安全監控,檢測可疑行為,預防犯罪行為的發生。

自動駕駛輔助系統:整合至自動駕駛系統中,幫助車輛更好地理解周邊環境,避免與行人和其他車輛的碰撞。

城市規劃:通過長期數據收集分析人流和車流模式,為城市規劃和基礎設施建設提供決策支持。

零售與商業分析:在商業區域監測人流和車流量,為零售和商業活動的布局提供依據。?

總結來說,車輛行人多目標檢測與追蹤系統的應用可以在多個層面提高城市管理和居民的生活質量。該系統能夠為交通安全和城市安全提供有力支撐,是智慧城市建設和智能交通系統中不可或缺的一部分。通過對實時視頻畫面的深度分析,該系統不僅可以預防和減少交通事故,還能為未來城市的可持續發展提供數據驅動的見解。

三,系統展示

通過網絡上搜集關于車輛行人的各類圖片,并使用LabelMe標注工具對每張圖片中的目標邊框(Bounding Box)及類別進行標注。一共包含5607張圖片,其中訓練集包含4485張圖片驗證集包含1122張圖片,部分圖像及標注如下圖所示。

各損失函數作用說明:

定位損失box_loss:預測框與標定框之間的誤差(GIoU),越小定位得越準;分類損失cls_loss:計算錨框與對應的標定分類是否正確,越小分類得越準;動態特征損失(dfl_loss):DFLLoss是一種用于回歸預測框與目標框之間距離的損失函數。在計算損失時,目標框需要縮放到特征圖尺度,即除以相應的stride,并與預測的邊界框計算Ciou Loss,同時與預測的anchors中心點到各邊的距離計算回歸DFLLoss。這個過程是YOLOv8訓練流程中的一部分,通過計算DFLLoss可以更準確地調整預測框的位置,提高目標檢測的準確性。本文訓練結果如下:

我們通常用PR曲線來體現精確率和召回率的關系,本文訓練結果的PR曲線如下。mAP表示Precision和Recall作為兩軸作圖后圍成的面積,m表示平均,@后面的數表示判定iou為正負樣本的閾值。mAP@.5:表示閾值大于0.5的平均mAP,可以看到本文模型兩類目標檢測的mAP@0.5平均值為0.94,結果還是非常不錯的。

運行效果

四,核心代碼展示

#?所需加載的模型目錄
path?=?'models/best.pt'
#?需要檢測的圖片地址
img_path?=?"TestFiles/car_data_1_4648.jpg"#?加載預訓練模型
#?conf?0.25?object?confidence?threshold?for?detection
#?iou?0.7?intersection?over?union?(IoU)?threshold?for?NMS
model?=?YOLO(path,?task='detect')
#?model?=?YOLO(path,?task='detect',conf=0.5)#?檢測圖片
results?=?model(img_path)
res?=?results[0].plot()
cv2.imshow("YOLOv8?Detection",?res)
cv2.waitKey(0)class?ByteTrack:"""Initialize?the?ByteTrack?object.Parameters:track_thresh?(float,?optional):?Detection?confidence?thresholdfor?track?activation.track_buffer?(int,?optional):?Number?of?frames?to?buffer?when?a?track?is?lost.match_thresh?(float,?optional):?Threshold?for?matching?tracks?with?detections.frame_rate?(int,?optional):?The?frame?rate?of?the?video."""def?__init__(self,track_thresh:?float?=?0.25,track_buffer:?int?=?30,match_thresh:?float?=?0.8,frame_rate:?int?=?30,):self.track_thresh?=?track_threshself.match_thresh?=?match_threshself.frame_id?=?0self.det_thresh?=?self.track_thresh?+?0.1self.max_time_lost?=?int(frame_rate?/?30.0?*?track_buffer)self.kalman_filter?=?KalmanFilter()self.tracked_tracks:?List[STrack]?=?[]self.lost_tracks:?List[STrack]?=?[]self.removed_tracks:?List[STrack]?=?[]def?update_with_detections(self,?detections:?Detections)?->?Detections:"""Updates?the?tracker?with?the?provided?detections?andreturns?the?updated?detection?results.Parameters:detections:?The?new?detections?to?update?with.Returns:Detection:?The?updated?detection?results?that?now?include?tracking?IDs."""tracks?=?self.update_with_tensors(tensors=detections2boxes(detections=detections))detections?=?Detections.empty()if?len(tracks)?>?0:detections.xyxy?=?np.array([track.tlbr?for?track?in?tracks],?dtype=np.float32)detections.class_id?=?np.array([int(t.class_ids)?for?t?in?tracks],?dtype=int)detections.tracker_id?=?np.array([int(t.track_id)?for?t?in?tracks],?dtype=int)detections.confidence?=?np.array([t.score?for?t?in?tracks],?dtype=np.float32)else:detections.tracker_id?=?np.array([],?dtype=int)return?detectionsdef?update_with_tensors(self,?tensors:?np.ndarray)?->?List[STrack]:"""Updates?the?tracker?with?the?provided?tensors?and?returns?the?updated?tracks.Parameters:tensors:?The?new?tensors?to?update?with.Returns:List[STrack]:?Updated?tracks."""self.frame_id?+=?1activated_starcks?=?[]refind_stracks?=?[]lost_stracks?=?[]removed_stracks?=?[]class_ids?=?tensors[:,?5]scores?=?tensors[:,?4]bboxes?=?tensors[:,?:4]remain_inds?=?scores?>?self.track_threshinds_low?=?scores?>?0.1inds_high?=?scores?<?self.track_threshinds_second?=?np.logical_and(inds_low,?inds_high)dets_second?=?bboxes[inds_second]dets?=?bboxes[remain_inds]scores_keep?=?scores[remain_inds]scores_second?=?scores[inds_second]class_ids_keep?=?class_ids[remain_inds]class_ids_second?=?class_ids[inds_second]if?len(dets)?>?0:"""Detections"""detections?=?[STrack(STrack.tlbr_to_tlwh(tlbr),?s,?c)for?(tlbr,?s,?c)?in?zip(dets,?scores_keep,?class_ids_keep)]else:detections?=?[]"""?Add?newly?detected?tracklets?to?tracked_stracks"""unconfirmed?=?[]tracked_stracks?=?[]??#?type:?list[STrack]for?track?in?self.tracked_tracks:if?not?track.is_activated:unconfirmed.append(track)else:tracked_stracks.append(track)"""?Step?2:?First?association,?with?high?score?detection?boxes"""strack_pool?=?joint_tracks(tracked_stracks,?self.lost_tracks)#?Predict?the?current?location?with?KFSTrack.multi_predict(strack_pool)dists?=?matching.iou_distance(strack_pool,?detections)dists?=?matching.fuse_score(dists,?detections)matches,?u_track,?u_detection?=?matching.linear_assignment(dists,?thresh=self.match_thresh)for?itracked,?idet?in?matches:track?=?strack_pool[itracked]det?=?detections[idet]if?track.state?==?TrackState.Tracked:track.update(detections[idet],?self.frame_id)activated_starcks.append(track)else:track.re_activate(det,?self.frame_id,?new_id=False)refind_stracks.append(track)"""?Step?3:?Second?association,?with?low?score?detection?boxes"""#?association?the?untrack?to?the?low?score?detectionsif?len(dets_second)?>?0:"""Detections"""detections_second?=?[STrack(STrack.tlbr_to_tlwh(tlbr),?s,?c)for?(tlbr,?s,?c)?in?zip(dets_second,?scores_second,?class_ids_second)]else:detections_second?=?[]r_tracked_stracks?=?[strack_pool[i]for?i?in?u_trackif?strack_pool[i].state?==?TrackState.Tracked]dists?=?matching.iou_distance(r_tracked_stracks,?detections_second)matches,?u_track,?u_detection_second?=?matching.linear_assignment(dists,?thresh=0.5)for?itracked,?idet?in?matches:track?=?r_tracked_stracks[itracked]det?=?detections_second[idet]if?track.state?==?TrackState.Tracked:track.update(det,?self.frame_id)activated_starcks.append(track)else:track.re_activate(det,?self.frame_id,?new_id=False)refind_stracks.append(track)for?it?in?u_track:track?=?r_tracked_stracks[it]if?not?track.state?==?TrackState.Lost:track.mark_lost()lost_stracks.append(track)"""Deal?with?unconfirmed?tracks,?usually?tracks?with?only?one?beginning?frame"""detections?=?[detections[i]?for?i?in?u_detection]dists?=?matching.iou_distance(unconfirmed,?detections)dists?=?matching.fuse_score(dists,?detections)matches,?u_unconfirmed,?u_detection?=?matching.linear_assignment(dists,?thresh=0.7)for?itracked,?idet?in?matches:unconfirmed[itracked].update(detections[idet],?self.frame_id)activated_starcks.append(unconfirmed[itracked])for?it?in?u_unconfirmed:track?=?unconfirmed[it]track.mark_removed()removed_stracks.append(track)"""?Step?4:?Init?new?stracks"""for?inew?in?u_detection:track?=?detections[inew]if?track.score?<?self.det_thresh:continuetrack.activate(self.kalman_filter,?self.frame_id)activated_starcks.append(track)"""?Step?5:?Update?state"""for?track?in?self.lost_tracks:if?self.frame_id?-?track.end_frame?>?self.max_time_lost:track.mark_removed()removed_stracks.append(track)self.tracked_tracks?=?[t?for?t?in?self.tracked_tracks?if?t.state?==?TrackState.Tracked]self.tracked_tracks?=?joint_tracks(self.tracked_tracks,?activated_starcks)self.tracked_tracks?=?joint_tracks(self.tracked_tracks,?refind_stracks)self.lost_tracks?=?sub_tracks(self.lost_tracks,?self.tracked_tracks)self.lost_tracks.extend(lost_stracks)self.lost_tracks?=?sub_tracks(self.lost_tracks,?self.removed_tracks)self.removed_tracks.extend(removed_stracks)self.tracked_tracks,?self.lost_tracks?=?remove_duplicate_tracks(self.tracked_tracks,?self.lost_tracks)output_stracks?=?[track?for?track?in?self.tracked_tracks?if?track.is_activated]return?output_stracks#?創建跟蹤器
byte_tracker?=?sv.ByteTrack(track_thresh=0.25,?track_buffer=30,?match_thresh=0.8,?frame_rate=30)

五,相關作品展示

基于Java開發、Python開發、PHP開發、C#開發等相關語言開發的實戰項目

基于Nodejs、Vue等前端技術開發的前端實戰項目

基于微信小程序和安卓APP應用開發的相關作品

基于51單片機等嵌入式物聯網開發應用

基于各類算法實現的AI智能應用

基于大數據實現的各類數據管理和推薦系統

?

?

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

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

相關文章

【芯片驗證】面試題·對深度為60的數組進行復雜約束的技巧

朋友發給我的芯片驗證筆試題,覺得很有意思,和大家分享一下。 面試題目 class A中一個長度為60的隨機數組rand int arr[60],如何寫約束使得: 1.每個元素的值都在(0,100]之間,且互不相等; 2.最少有三個元素滿足勾股數要求,比如數組中包含3,4,5三個點; 請以解約束最快…

springmvc中使用interceptor攔截

HandlerInterceptor 是Spring MVC中用于在請求處理之前、之后以及完成之后執行邏輯的接口。它與Servlet的Filter類似&#xff0c;但更加靈活&#xff0c;因為它可以訪問Spring的上下文和模型數據。HandlerInterceptor 常用于日志記錄、權限驗證、性能監控等場景。 ### **1. 創…

【網絡協議】基于UDP的可靠協議:KCP

TCP是為流量設計的&#xff08;每秒內可以傳輸多少KB的數據&#xff09;&#xff0c;講究的是充分利用帶寬。而 KCP是為流速設計的&#xff08;單個數據包從一端發送到一端需要多少時間&#xff09;&#xff0c;以10%-20%帶寬浪費的代價換取了比 TCP快30%-40%的傳輸速度。TCP信…

【論文閱讀】Contrastive Clustering Learning for Multi-Behavior Recommendation

論文地址&#xff1a;Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年來&#xff0c;多行為推薦模型取得了顯著成功。然而&#xff0c;許多模型未充分考慮不同行為之間的共性與差異性&#xff0c;以…

藍橋杯2023年第十四屆省賽真題-子矩陣

題目來自DOTCPP&#xff1a; 暴力思路&#xff08;兩個測試點超時&#xff09;&#xff1a; 題目要求我們求出子矩陣的最大值和最小值的乘積&#xff0c;我們可以枚舉矩陣中的所有點&#xff0c;以這個點為其子矩陣的左上頂點&#xff0c;然后判斷一下能不能構成子矩陣。如果可…

centos 磁盤重新分割,將原來/home 下部分空間轉移到 / 根目錄下

上次重裝系統時&#xff0c;不小心將一半磁盤放在了 /home 下面&#xff0c;運行一段時間后&#xff0c;發現/home 空間沒有怎么用&#xff0c;反而是/ 目錄報警說磁盤用完了&#xff0c;準備將 /home下的空間分一部分給主目錄 / 先查看下 空間分布情況 df -lh 可以看到&…

【C#語言】C#同步與異步編程深度解析:讓程序學會“一心多用“

文章目錄 ?前言?一、同步編程&#xff1a;單線程的線性世界&#x1f31f;1、尋找合適的對象?1) &#x1f31f;7、設計應支持變化 ?二、異步編程&#xff1a;多任務的協奏曲?三、async/await工作原理揭秘?四、最佳實踐與性能陷阱?五、異步編程適用場景?六、性能對比實測…

Redis命令詳解--集合

Redis set 是string類型的無序集合。集合成員是唯一的&#xff0c;這就意味著集合中不能出現重復的數據&#xff0c;常用命令&#xff1a; SADD key member1 [member2...] 向集合添加一個或多個成員 SREM key member1 [member2...] 移除集合中一個或多個成員 SMEMBERS key 獲…

學習筆記 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件將 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改為 app.UseSwagger(); app.UseSwaggerUI(); 二.安裝ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

配置 VSCode 的 C# 開發環境

1. 安裝必要的依賴 1.1 VSCode 擴展 安裝 C# 相關插件&#xff08;如 C#、C# Extensions 等&#xff09;。 1.2 .NET SDK 下載地址&#xff1a;.NET SDK 下載頁面 1.3 安裝檢測 在命令行輸入以下命令&#xff0c;如果正確返回了版本號&#xff0c;則表示 .NET SDK 安裝成…

從零搭建微服務項目Pro(第6-1章——Spring Security+JWT實現用戶鑒權訪問與token刷新)

前言&#xff1a; 在現代的微服務架構中&#xff0c;用戶鑒權和訪問控制是非常重要的一部分。Spring Security 是 Spring 生態中用于處理安全性的強大框架&#xff0c;而 JWT&#xff08;JSON Web Token&#xff09;則是一種輕量級的、自包含的令牌機制&#xff0c;廣泛用于分…

使用HAI來打通DeepSeek的任督二脈

一、什么是HAI HAI是一款專注于AI與科學計算領域的云服務產品&#xff0c;旨在為開發者、企業及科研人員提供高效、易用的算力支持與全棧解決方案。主要使用場景為&#xff1a; AI作畫&#xff0c;AI對話/寫作、AI開發/測試。 二、開通HAI 選擇CPU算力 16核32GB&#xff0c;這…

【保姆級】阿里云codeup配置Git的CI/CD步驟

以下是通過阿里云CodeUp的Git倉庫進行CI/CD配置的詳細步驟&#xff0c;涵蓋前端&#xff08;Vue 3&#xff09;和后端&#xff08;Spring Boot&#xff09;項目的自動化打包&#xff0c;并將前端打包結果嵌入到Nginx的Docker鏡像中&#xff0c;以及將后端打包的JAR文件拷貝至Do…

LINUX網絡編程API原型詳細解析

1. 網絡體系 1.1. 簡介 網絡采用分而治之的方法設計&#xff0c;將網絡的功能劃分為不同的模塊&#xff0c;以分層的形式有機組合在一起。 每層實現不同的功能&#xff0c;其內部實現方法對外部其他層次來說是透明的。每層向上層提供服務&#xff0c;同時使用下層提供…

藍橋杯 之 暴力回溯

文章目錄 數字接龍小u的最大連續移動次數問題迷宮 在藍橋杯中&#xff0c;十分喜歡考察對于網格的回溯的問題&#xff0c;對于這類的問題&#xff0c;常常會使用到這個DFS和BFS進行考察&#xff0c;不過無論怎么考察&#xff0c;都只是會在最基礎的模本的基礎上&#xff0c;根據…

微信小程序的業務域名配置(通過ingress網關的注解)

一、背景 微信小程序的業務域名配置&#xff08;通過kong網關的pre-function配置&#xff09;是依靠kong實現&#xff0c;本文將通過ingress網關實現。 而我們的服務是部署于阿里云K8S容器&#xff0c;當然內核與ingress無異。 找到k8s–>網絡–>路由 二、ingress注解 …

Python數據可視化工具:六西格瑪及其基礎工具概覽

在當今數據驅動的時代&#xff0c;數據分析和可視化工具成為了各行業優化流程、提升質量的關鍵手段。六西格瑪&#xff08;Six Sigma&#xff09;作為一種以數據為基礎、追求完美質量的管理理念&#xff0c;其實施依賴于一系列基礎工具的靈活運用。而Python&#xff0c;憑借其強…

集群環境下Redis 商品庫存系統設計

目錄 環境實現基本結構代碼業務代碼主體庫存管理模塊 后續問題高并發臨界值與樂觀鎖問題 完整代碼總結后話 環境 我們現在要做商品秒殺系統。功能很簡單&#xff0c;就是庫存刪減。用戶先下單減庫存&#xff0c;之后再進行扣款。 實現 基本結構代碼 那么我們先看下如何搭建…

Spring MVC響應數據

handler方法分析 /*** TODO: 一個controller的方法是控制層的一個處理器,我們稱為handler* TODO: handler需要使用RequestMapping/GetMapping系列,聲明路徑,在HandlerMapping中注冊,供DS查找!* TODO: handler作用總結:* 1.接收請求參數(param,json,pathVariable,共享域等…

基于圖像識別的醫學影像大數據診斷系統的設計與實現

標題:基于圖像識別的醫學影像大數據診斷系統的設計與實現 內容:1.摘要 隨著醫學影像技術的快速發展&#xff0c;醫學影像數據量呈爆炸式增長&#xff0c;傳統的人工診斷方式在處理海量數據時效率低下且容易出現誤差。本研究的目的是設計并實現一個基于圖像識別的醫學影像大數據…