競賽項目 深度學習的視頻多目標跟蹤實現

文章目錄

  • 1 前言
  • 2 先上成果
  • 3 多目標跟蹤的兩種方法
    • 3.1 方法1
    • 3.2 方法2
  • 4 Tracking By Detecting的跟蹤過程
    • 4.1 存在的問題
    • 4.2 基于軌跡預測的跟蹤方式
  • 5 訓練代碼
  • 6 最后

1 前言

🔥 優質競賽項目系列,今天要分享的是

基于深度學習的視頻多目標跟蹤實現

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

2 先上成果

在這里插入圖片描述

3 多目標跟蹤的兩種方法

3.1 方法1

基于初始化幀的跟蹤,在視頻第一幀中選擇你的目標,之后交給跟蹤算法去實現目標的跟蹤。這種方式基本上只能跟蹤你第一幀選中的目標,如果后續幀中出現了新的物體目標,算法是跟蹤不到的。這種方式的優點是速度相對較快。缺點很明顯,不能跟蹤新出現的目標。

3.2 方法2

基于目標檢測的跟蹤,在視頻每幀中先檢測出來所有感興趣的目標物體,然后將其與前一幀中檢測出來的目標進行關聯來實現跟蹤的效果。這種方式的優點是可以在整個視頻中跟蹤隨時出現的新目標,當然這種方式要求你前提得有一個好的“目標檢測”算法。

學長主要分享Option2的實現原理,也就是Tracking By Detecting的跟蹤方式。

4 Tracking By Detecting的跟蹤過程

**Step1:**使用目標檢測算法將每幀中感興趣的目標檢測出來,得到對應的(位置坐標, 分類, 可信度),假設檢測到的目標數量為M;

**Step2:**通過某種方式將Step1中的檢測結果與上一幀中的檢測目標(假設上一幀檢測目標數量為N)一一關聯起來。換句話說,就是在M*N個Pair中找出最像似的Pair。

對于Step2中的“某種方式”,其實有多種方式可以實現目標的關聯,比如常見的計算兩幀中兩個目標之間的歐幾里得距離(平面兩點之間的直線距離),距離最短就認為是同一個目標,然后通過匈牙利算法找出最匹配的Pair。當讓,你還可以加上其他的判斷條件,比如我用到的IOU,計算兩個目標Box(位置大小方框)的交并比,該值越接近1就代表是同一個目標。還有其他的比如判斷兩個目標的外觀是否相似,這就需要用到一種外觀模型去做比較了,可能耗時更長。

在關聯的過程中,會出現三種情況:

1)在上一幀中的N個目標中找到了本次檢測到的目標,說明正常跟蹤到了;

2)在上一幀中的N個目標中沒有找到本次檢測到的目標,說明這個目標是這一幀中新出現的,所以我們需要把它記錄下來,用于下下一次的跟蹤關聯;

3)在上一幀中存在某個目標,這一幀中并沒有與之關聯的目標,那么說明該目標可能從視野中消失了,我們需要將其移除。(注意這里的可能,因為有可能由于檢測誤差,在這一幀中該目標并沒有被檢測到)

在這里插入圖片描述

4.1 存在的問題

上面提到的跟蹤方法在正常情況下都能夠很好的工作,但是如果視頻中目標運動得很快,前后兩幀中同一個目標運動的距離很遠,那么這種跟蹤方式就會出現問題。

在這里插入圖片描述
如上圖,實線框表示目標在第一幀的位置,虛線框表示目標在第二幀的位置。當目標運行速度比較慢的時候,通過之前的跟蹤方式可以很準確的關聯(A, A’)和(B,
B’)。但是當目標運行速度很快(或者隔幀檢測)時,在第二幀中,A就會運動到第一幀中B的位置,而B則運動到其他位置。這個時候使用上面的關聯方法就會得到錯誤的結果。

那么怎樣才能更加準確地進行跟蹤呢?

4.2 基于軌跡預測的跟蹤方式

既然通過第二幀的位置與第一幀的位置進行對比關聯會出現誤差,那么我們可以想辦法在對比之前,先預測目標的下一幀會出現的位置,然后與該預測的位置來進行對比關聯。這樣的話,只要預測足夠精確,那么幾乎不會出現前面提到的由于速度太快而存在的誤差

在這里插入圖片描述

如上圖,我們在對比關聯之前,先預測出A和B在下一幀中的位置,然后再使用實際的檢測位置與預測的位置進行對比關聯,可以完美地解決上面提到的問題。理論上,不管目標速度多么快,都能關聯上。那么問題來了,怎么預測目標在下一幀的位置?

方法有很多,可以使用卡爾曼濾波來根據目標前面幾幀的軌跡來預測它下一幀的位置,還可以使用自己擬合出來的函數來預測下一幀的位置。實際過程中,我是使用擬合函數來預測目標在下一幀中的位置。

在這里插入圖片描述
如上圖,通過前面6幀的位置,我可以擬合出來一條(T->XY)的曲線(注意不是圖中的直線),然后預測目標在T+1幀的位置。具體實現很簡單,Python中的numpy庫中有類似功能的方法。

5 訓練代碼

這里記錄一下訓練代碼,來日更新

?

 if FLAGS.mode == 'eager_tf':# Eager mode is great for debugging# Non eager graph mode is recommended for real trainingavg_loss = tf.keras.metrics.Mean('loss', dtype=tf.float32)avg_val_loss = tf.keras.metrics.Mean('val_loss', dtype=tf.float32)for epoch in range(1, FLAGS.epochs + 1):for batch, (images, labels) in enumerate(train_dataset):with tf.GradientTape() as tape:outputs = model(images, training=True)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_lossgrads = tape.gradient(total_loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))logging.info("{}_train_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_loss.update_state(total_loss)for batch, (images, labels) in enumerate(val_dataset):outputs = model(images)regularization_loss = tf.reduce_sum(model.losses)pred_loss = []for output, label, loss_fn in zip(outputs, labels, loss):pred_loss.append(loss_fn(label, output))total_loss = tf.reduce_sum(pred_loss) + regularization_losslogging.info("{}_val_{}, {}, {}".format(epoch, batch, total_loss.numpy(),list(map(lambda x: np.sum(x.numpy()), pred_loss))))avg_val_loss.update_state(total_loss)logging.info("{}, train: {}, val: {}".format(epoch,avg_loss.result().numpy(),avg_val_loss.result().numpy()))avg_loss.reset_states()avg_val_loss.reset_states()model.save_weights('checkpoints/yolov3_train_{}.tf'.format(epoch))

6 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相關文章

全網最牛,Appium自動化測試框架-關鍵字驅動+數據驅動實戰(二)

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 util 包 util 包…

數據可視化工具LightningChart .NET正式發布v10.5.1——擁有全新的3D新功能

LightningChart.NET完全由GPU加速,并且性能經過優化,可用于實時顯示海量數據-超過10億個數據點。 LightningChart包括廣泛的2D,高級3D,Polar,Smith,3D餅/甜甜圈,地理地圖和GIS圖表以及適用于科學…

網絡安全專業術語英文縮寫對照表

因在閱讀文獻過程中經常遇到各種專業縮寫,所以把各種縮寫總結了一下。 因能力有限,錯誤在所難免,歡迎進行糾錯與補充:https://github.com/piaolin/CSAbbr 滲透相關 縮寫全稱解釋備注XSSCross Site Script Attack跨站腳本攻擊為…

ResNet創新點總結

ResNet(Residual Networks)是深度學習中的一個重要架構,其創新點主要體現在解決了深層神經網絡訓練中的梯度消失和梯度爆炸問題,從而使得可以構建更深的神經網絡。以下是 ResNet 的創新點總結: ??1. 殘差連接&#x…

nlohmann json:通過items遍歷object/array

//官方的例子 #include <iostream> #include <nlohmann/json.hpp>using json = nlohmann::json;int main() {// create JSON valuesjson j_object = {{"one", 1}, {"two", 2}};json j_array = {1, 2, 4, 8, 16};// example for an objectfor (…

java畢業設計-智慧食堂管理系統-內容快覽

首頁 智慧食堂管理系統是一種可以提高食堂運營效率的管理系統。它將前端代碼使用Vue實現&#xff0c;后端使用Spring Boot實現。這個系統的目的是簡化食堂管理&#xff0c;提高食堂服務質量。在現代快節奏的生活中&#xff0c;人們對餐飲服務提出了更高的要求&#xff0c;食堂管…

Flink-間隔聯結

間隔聯結只支持事件時間間隔聯結如果遇到遲到數據&#xff0c;則會關聯不上&#xff0c;比如來了一個5秒的數據&#xff0c;它可以關聯前2秒的數據&#xff0c;后3秒的數據&#xff0c;就是可以關聯3秒到8秒的數據&#xff0c;然后又來了一個6秒的數據&#xff0c;可以關聯4秒到…

Docker安裝elasticsearch分布式搜索

文章目錄 ??安裝elasticsearch??1.部署單點es&#x1f338;1.1.創建網絡&#x1f338;1.2.下載鏡像&#x1f338;1.3.運行 ??2.部署kibana&#x1f338;2.1.部署&#x1f338;2.2.DevTools ??3.安裝IK分詞器&#x1f338;3.1.在線安裝ik插件&#xff08;較慢&#xff0…

Rx.NET in Action 中文介紹 前言及序言

Rx 處理器目錄 (Catalog of Rx operators) 目標可選方式Rx 處理器(Operator)創建 Observable Creating Observables直接創建 By explicit logicCreate Defer根據范圍創建 By specificationRangeRepeatGenerateTimerInterval Return使用預設 Predefined primitivesThrow …

答疑:Arduino IDE配置其他開發板下載速度慢

基于案例&#xff1a;Linux環境Arduino IDE中配置ATOM S3 通常&#xff0c;網絡問題較多&#xff0c;可以使用一些技巧。 https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json 沒有配置&#xff0c;不支持M5Stack&#xff08;ESP32&…

HCIA靜態路由與動態路由

目錄 一、靜態路由 定義&#xff1a; 適用環境 二、動態路由 定義&#xff1a; 特點&#xff1a; 動態路由協議: 三、缺點&#xff1a; 1&#xff09;靜態路由缺點: 2&#xff09;動態路由的缺點: 四、靜態路由與動態路由的區別 靜態路由: 動態路由: 一、靜態路…

字節原來這么容易進,是面試官放水,還是公司實在是太缺人?

本人211非科班&#xff0c;之前在字節和騰訊實習過&#xff0c;這次其實沒抱著什么特別大的希望投遞&#xff0c;沒想到字節可以再給我一次機會&#xff0c;還是挺開心的。 本來以為有個機會就不錯啦&#xff01;沒想到能成功上岸&#xff0c;在這里要特別感謝幫我內推的同學&…

【Python】進階之 MySQL入門教程

文章目錄 數據庫概述Mysql概述Mysql安裝與使用Navicat安裝和使用Mysql終端指令操作Mysql和python交互訂單管理案例實現 數據庫概述 數據庫的由來 發展歷程說明人工管理階段用紙帶等進行數據的存儲文件系統階段數據存儲在文件中數據庫階段解決了文件系統問題高級數據庫階段分布式…

IDEA 設置字體大小無效

設置字體大小&#xff0c;一般都是從file>settings>editor>font>Size里設置&#xff0c;一般都有效。 但是&#xff0c;如果是更換了主體&#xff0c;則需要從主體顏色菜單那里這是&#xff0c;你看這個頁面&#xff0c;上面黃色三角也提示你了&#xff0c;要去顏色…

學習筆記整理-DOM-03-定時器

一、定時器 1. setInterval()函數 setInterval()函數可以重復調用一個函數&#xff0c;在每次調用之間具有固定的時間間隔。 setInterval(function () { // 這個函數將自動被以固定間隔時間調用 }, 2000);第一個參數是函數第二個參數是間隔時間&#xff0c;以毫秒為單位&…

SpringBoot中間件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件總線的方式可以實現消息的發布/訂閱功能&#xff0c;EventBus是一個輕量級的消息服務組件&#xff0c;適用于Android和Java。 // 1.注冊事件通過 EventBus.getDefault().register(); // 2.發布事件 EventBus.getDefault().post(“事件內容”); …

深入理解spring面經

1 了解SpringMVC的處理流程嗎&#xff1f; 用戶發送請求至前端控制器DispatcherServlet。DispatcherServlet通過處理器映射器HandlerMapping找到對應的處理器。DispatcherServlet將請求提交給對應的處理器Controller。Controller處理完請求后返回ModelAndView。DispatcherServ…

面試攻略,Java 基礎面試 100 問(十三)

什么時候用 assert&#xff1f; assertion(斷言)在軟件開發中是一種常用的調試方式&#xff0c;很多開發語言中都支持這種機制。一般來說&#xff0c;assertion 用于保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能&#xff0c;在軟件發布…

支持對接鴻蒙系統的無線模塊及其常見應用介紹

近距離的無線通信得益于萬物互聯網的快速發展&#xff0c;基于集成部近距離無線連接&#xff0c;為固定和移動設備建立通信的藍牙技術也已經廣泛應用于汽車領域、工業生產及醫療領域。為協助物聯網企業終端產品能快速接入鴻蒙生態系統&#xff0c;SKYLAB聯手國產芯片廠家研發推…

找不到mfc140u.dll怎么辦?mfc140u.dll丟失怎樣修復?簡單三招搞定

最近我遇到了一個問題&#xff0c;發現我的電腦上出現了mfc140u.dll文件丟失的錯誤提示。這個錯誤導致一些應用程序無法正常運行&#xff0c;讓我感到非常困擾。經過一番研究和嘗試&#xff0c;我終于成功修復了這個問題&#xff0c;并從中總結出了一些心得。 mfc140u.dll丟失原…