摘要:在本博文中,我們深入探討了基於YOLOv8/v7/v6/v5的夜視行人檢測系統,這一系統整合了多版本的YOLO演算法,核心採用YOLOv8,並整合了YOLOv7、YOLOv6、YOLOv5演算法,用於進行細緻的效能指標對比分析。我們詳盡地回顧了國內外在該領域的研究現狀,深入討論了資料集處理方法、演算法原理、模型構建及訓練過程,同時展示瞭如何透過Streamlit構建互動式Web應用介面。該Web應用介面支援上傳影像、影片以及實時攝像頭資料進行夜視行人檢測,使使用者能夠上傳不同版本的訓練模型(YOLOv8/v7/v6/v5)進行推理預測,且介面設計靈活易於修改。為了方便讀者深入理解和實踐,本博文還附帶了完整的網頁設計方案、深度學習模型的程式碼以及訓練資料集的下載連結,旨在提供一個全面而詳細的學習和應用平臺。
@
- 1. 網頁功能與效果
- 2. 緒論
- 2.1 研究背景及意義
- 2.2 國內外研究現狀
- 2.3 要解決的問題及其方案
- 2.3.1 要解決的問題
- 2.3.2 解決方案
- 2.4 博文貢獻與組織結構
- 3. 資料集處理
- 4. 原理與程式碼介紹
- 4.1 YOLOv8演算法原理
- 4.2 模型構建
- 4.3 訓練程式碼
- 5. 實驗結果與分析
- 5.1 訓練曲線
- 5.2 混淆矩陣
- 5.3 YOLOv8/v7/v6/v5對比實驗
- 6. 系統設計與實現
- 6.1 系統架構概覽
- 6.2 系統流程
- 程式碼下載連結
- 7. 結論與未來工作
➷點選跳轉至文末所有涉及的完整程式碼檔案下載頁☇
完整資源中包含資料集及訓練程式碼,環境配置與介面中文字、圖片、logo等的修改方法請見影片,專案完整檔案下載請見演示與介紹影片的簡介處給出:➷➷➷
演示與介紹影片 :https://www.bilibili.com/video/BV1qr42147YC/
YOLOv8/v7/v6/v5專案合集下載:https://mbd.pub/o/bread/mbd-ZZ2YmJtp
YOLOv8和v5專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Ykpds
YOLOv7專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl5lq
YOLOv6專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl55p
若您想獲得博文中涉及的實現完整全部資原始檔(包括測試圖片、影片,py, UI檔案,訓練資料集、訓練程式碼、介面程式碼等),這裡已打包上傳至博主的麵包多平臺,見可參考部落格與影片,已將所有涉及的檔案同時打包到裡面,點選即可執行,完整檔案截圖如下:
1. 網頁功能與效果
(1)開啟攝像頭實時檢測:本系統允許使用者透過網頁直接開啟攝像頭,實現對實時影片流中夜視行人的檢測。系統將自動識別並分析畫面中的夜視行人,並將檢測結果實時顯示在使用者介面上,為使用者提供即時的反饋。
(2)選擇圖片檢測:使用者可以上傳本地的圖片檔案到系統中進行夜視行人檢測。系統會分析上傳的圖片,識別出圖片中的夜視行人,並在介面上展示帶有夜視行人標籤和置信度的檢測結果,讓使用者能夠清晰地瞭解到每個夜視行人狀態。
(3)選擇影片檔案檢測:系統支援使用者上傳影片檔案進行夜視行人檢測。上傳的影片將被系統逐幀分析,以識別和標記影片中每一幀的夜視行人。使用者可以觀看帶有夜視行人檢測標記的影片,瞭解影片中夜視行人的變化。
(4)選擇不同訓練好的模型檔案:系統整合了多個版本的YOLO模型(如YOLOv8/v7/v6/v5),使用者可以根據自己的需求選擇不同的模型進行夜視行人檢測。這一功能使得使用者能夠靈活地比較不同模型的表現,以選擇最適合當前任務的模型。
在我們的系統中,開啟攝像頭實時檢測功能允許使用者直接透過網頁介面訪問攝像頭,實時顯示和識別畫面中的夜視行人,提供即時反饋。而選擇圖片檢測與選擇影片檔案檢測功能則讓使用者能夠上傳本地的圖片或影片檔案,系統將自動分析並展示識別結果,無論是靜態影像還是動態影片均能精確識別。
為了滿足不同場景下的需求,系統還設計了選擇不同訓練好的模型檔案功能,使用者可以根據自己的需要選擇不同版本的YOLO模型進行識別,從而在準確度和處理速度之間找到最佳平衡。在效果展示方面,系統支援檢測畫面和原始畫面的同時或單獨顯示,增強了使用者體驗,使使用者能夠直觀地比較檢測結果與原始畫面之間的差異。透過可點選下拉框單獨標記特定目標並顯示結果的設計,使用者可以專注於感興趣的夜視行人型別,提高了識別的針對性和效率。同時,所有檢測結果都會儲存在頁面表格顯示,並且使用者還可以動態調整檢測演算法的置信度閾值和IOU閾值,這些靈活的配置選項大大提升了系統的實用性和準確性。
最後,為了便於使用者將檢測結果用於進一步分析或存檔,系統提供了功能強大的結果匯出選項。使用者可以將檢測結果的表格輸出到csv檔案,或將標記後的檢測結果匯出為avi影像檔案,這些匯出功能的加入極大地增強了系統的應用價值。綜上所述,基於YOLOv8/v7/v6/v5的夜視行人檢測系統透過其全面的功能和卓越的使用者體驗,不僅能夠滿足專業領域內的高標準需求,也為廣大使用者提供了一種便捷、高效的夜視行人檢測工具。
2. 緒論
2.1 研究背景及意義
夜視行人檢測技術在安全監控、自動駕駛系統、夜間救援操作等領域扮演著至關重要的角色。隨著人工智慧和計算機視覺技術的迅速發展,基於深度學習的目標檢測演算法,特別是YOLO(You Only Look Once)系列演算法,已成為解決夜視行人檢測問題的有效手段。夜間行人檢測面臨的挑戰主要源於低光照環境下目標的識別難度大、行人與背景的對比度低以及複雜環境中的各種干擾。這些因素都大大增加了檢測的難度,對演算法效能提出了更高的要求。
近年來,研究社群針對夜視行人檢測進行了廣泛的研究。YOLO系列演算法的不斷迭代和改進為夜視場景下的行人檢測提供了新的解決方案[1]。例如,YOLOv4的引入大幅提高了檢測的準確性和速度,而YOLOv5及其後續版本則進一步最佳化了模型結構[2][3],提高了模型的泛化能力和在低光照條件下的表現。除了YOLO系列,其他如Faster R-CNN、SSD等演算法也在不斷地最佳化中,旨在提高夜視環境下的檢測效能[4]。
同時,其他研究團隊專注於透過融合多種感知資訊來提升夜視行人檢測的效能。例如,一些研究結合了紅外成像技術與傳統的可見光成像技術,透過深度學習模型進行特徵融合,顯著提高了在極低照度條件下的行人檢測能力[5]。此類方法通常依賴於先進的融合網路架構,如注意力機制和多模態特徵融合網路,以實現不同型別影像資料的有效融合。
在這一背景下,本部落格的目的是探討基於YOLOv8/v7/v6/v5的夜視行人檢測系統的研究背景及其意義。透過綜合運用最新的深度學習演算法、最佳化的資料集處理方法以及先進的技術手段,本研究旨在解決夜間行人檢測中遇到的一系列挑戰,提高檢測的準確性、效率和魯棒性。我們的工作不僅關注演算法本身的改進,也著眼於如何將這些技術應用到實際場景中,為相關領域的發展做出貢獻。
2.2 國內外研究現狀
在夜視行人檢測的領域內,近年來的研究進展主要集中在提高檢測演算法的準確度、速度以及對低照度環境的適應性上。隨著深度學習技術的快速發展,一系列基於深度學習的演算法被提出,並不斷針對夜視場景進行最佳化。
首先,YOLO系列作為實時目標檢測的先驅,其最新版本YOLOv81在夜視行人檢測中表現出色。YOLOv8繼承了YOLOv4和v5的優點,如使用跨階段部分網路(CSPNet)來降低計算複雜度,同時引入了更高效的特徵融合技術以及針對小目標的改進演算法,這對於在夜視條件下檢測行人尤為重要。
同時,其他研究團隊專注於透過融合多種感知資訊來提升夜視行人檢測的效能。例如,一些研究結合了紅外成像技術與傳統的可見光成像技術,透過深度學習模型進行特徵融合,顯著提高了在極低照度條件下的行人檢測能力。此類方法通常依賴於先進的融合網路架構,如注意力機制和多模態特徵融合網路,以實現不同型別影像資料的有效融合。
另外,隨著對抗性攻擊和防禦技術在深度學習領域的研究興起,一些工作開始探索對抗性訓練在提高夜視行人檢測魯棒性方面的應用。這些研究表明,透過在訓練過程中引入對抗性擾動,可以使得深度學習模型更加魯棒,從而提高在複雜夜視場景下的檢測效能。
資料集的構建和擴充套件也是當前研究的熱點之一。由於高質量的夜視行人檢測資料集相對稀缺,一些工作致力於透過合成資料增強、跨域適應等技術,擴大訓練資料的規模和多樣性,從而提升模型的泛化能力和在實際應用中的表現。
綜合以上演算法的創新點,我們可以看到目標檢測技術在網路架構、損失函式設計、訓練策略以及應用方法上都有了顯著的進步。對於夜視行人檢測這一具體任務,這些演算法的創新之處為解決實際問題提供了多樣化的思路和方法。無論是YOLO系列在實時性和精確度的平衡上,還是Transformer系列在處理全域性資訊上的優勢,亦或是RetinaNet在解決類別不平衡問題上的創新,都極大地豐富了夜視行人檢測技術的研究和應用前景。
2.3 要解決的問題及其方案
2.3.1 要解決的問題
在開發基於YOLOv8/v7/v6/v5的夜視行人檢測系統時,我們面臨了一系列具體的挑戰和問題,同時也設計了相應的解決方案來應對這些問題。以下是系統開發過程中的主要關注點及其解決策略:
- 夜視行人檢測的準確性和速度
夜間行人檢測的主要挑戰在於如何在低光照條件下實現高準確度的識別與實時處理。由於夜間光照不足,行人的可見特徵減少,這就要求我們的模型能夠在這種條件下依然準確識別行人。此外,考慮到實際應用場景(如安全監控、自動駕駛等)往往要求實時或接近實時的處理速度,最佳化模型的推理速度也至關重要。
- 環境適應性和模型泛化能力
不同的夜間環境(如城市道路、鄉村小徑等)會呈現不同的光照條件和背景複雜度。此外,天氣變化(如雨、霧)也會影響檢測效果。因此,我們的系統需要具備強大的環境適應性和模型泛化能力,以保證在各種夜間條件下都能維持高準確率。
- 使用者互動介面的直觀性和功能性
基於Streamlit開發的Web應用介面需要簡潔直觀,使使用者能夠輕鬆上傳影像、影片或透過攝像頭實時獲取影像進行行人檢測。同時,介面還應支援不同模型檔案的切換功能,讓使用者可以根據需要選擇不同版本的YOLO模型進行檢測。
- 資料處理能力和儲存效率
系統需處理大量的影像和影片資料,這就要求具備高效的資料處理能力。同時,考慮到儲存效率和資料安全性,我們需要設計高效的資料儲存解決方案,並實施適當的資料保護措施。
- 系統的可擴充套件性和維護性
未來可能需要擴充套件系統以支援更多的功能或整合新的檢測模型。因此,系統的架構設計需考慮到可擴充套件性和維護性,確保能夠輕鬆地新增新功能或更新模型。
2.3.2 解決方案
針對夜視行人檢測系統的設計與實現,我們提出了一系列解決方案,旨在應對準確性、速度、環境適應性、使用者互動以及資料處理等方面的挑戰。這些解決方案結合了當前最先進的深度學習技術和使用者友好的網頁設計,確保了系統既高效又實用。
-
深度學習模型的選擇和最佳化: 選用了YOLOv8/v7/v6/v5系列模型作為我們系統的核心,這些模型因其在速度和準確度之間良好的平衡而著稱。考慮到夜視行人檢測的特殊需求,我們對模型進行了專門的最佳化,以適應低光照環境下的檢測任務。為了提升模型在各種夜間光照條件下的泛化能力,我們採用了多種資料增強技術,包括隨機裁剪、縮放、旋轉和色彩調整等,模擬不同夜間環境中的行人影像。然後透過在大規模視覺資料集上預訓練的模型作為起點,我們採用遷移學習技術,針對夜視行人檢測的特定資料集進行微調,這樣不僅加快了模型的訓練速度,也顯著提高了識別效能。
-
技術框架和開發工具: 我們選擇PyTorch作為深度學習的主要框架,並利用Streamlit來設計一個美觀、直觀且功能豐富的網頁介面。這使得使用者可以輕鬆地上傳圖片、影片或透過實時攝像頭進行夜視行人檢測,同時也能夠便捷地切換不同的模型檔案以適應不同的識別需求。PyCharm作為我們的開發IDE,為我們的程式碼編寫、除錯和版本控制提供了極大的便利。
-
功能實現和系統設計: 我們的系統支援多種輸入源,並實現了動態模型切換功能,這不僅提高了系統的靈活性和適用範圍,也最佳化了使用者體驗。為了保護使用者資訊,我們還特別設計了安全的使用者登入和註冊介面,採用了加密技術進行資訊保護,並支援使用者管理和許可權控制。
-
資料處理和儲存策略: 利用PyTorch的資料載入和預處理機制,實現了高效的資料處理流程,確保了系統的實時響應能力。同時,設計了高效的資料儲存方案,對檢測結果和歷史資料進行有效組織和索引,便於使用者查詢和分析。
透過實施上述解決方案,我們成功開發出了一個既準確又高效的夜視行人檢測系統。該系統不僅能滿足不同使用者在多變環境下的應用需求,還提供了友好的使用者體驗和強大的資料處理能力,展現了深度學習技術在實際應用中的巨大潛力。
2.4 博文貢獻與組織結構
本文的核心貢獻可以概括為以下幾個方面:
-
綜合性文獻綜述:本文提供了一個廣泛而深入的文獻綜述,涵蓋了目標檢測領域的最新進展,尤其是YOLO系列在夜視行人檢測任務中的應用。這為研究者和開發者提供了寶貴的參考,幫助他們更好地理解當前技術的發展趨勢和挑戰。
-
資料集處理:針對夜視行人檢測的特殊要求,本文介紹了一系列資料集處理和最佳化技術,包括影像增強、資料增強等,旨在提高模型在低光照條件下的效能。
-
演算法選擇與最佳化:本文不僅介紹了選擇YOLOv8/v7/v6/v5等演算法的理由,還詳細對比了這些演算法在夜視行人檢測任務上的效果。透過實驗驗證,本文為選擇最合適的模型提供了有力的證據和指導。
-
網頁設計與實現:文章詳細介紹瞭如何使用Streamlit設計一個美觀、使用者友好的網頁應用,使非技術使用者也能輕鬆進行夜視行人檢測。這部分的內容不僅包括介面設計的細節,還包括後端與深度學習模型整合的技術指導。
-
實驗結果與分析:透過對YOLOv7/v6/v5等演算法進行細緻的比較分析,本文提供了一系列實驗結果,證明了所選模型在夜視行人檢測任務上的有效性和優越性。
-
資源共享:為了促進研究和開發的進一步工作,本文提供了完整的資料集和程式碼資源包,包括模型訓練和預測的完整程式碼,以及資料處理和最佳化的指令碼。
後續章節的組織結構如下: 緒論:介紹研究背景、目的和本文的主要貢獻;演算法原理:詳細介紹YOLOv8/v7/v6/v5等演算法的工作原理及其在夜視行人檢測中的應用;資料集處理:討論使用的資料集及其預處理、增強方法。程式碼介紹:提供模型訓練和預測的詳細程式碼說明,包括環境搭建、引數配置和執行步驟。實驗結果與分析:展示不同模型在夜視行人檢測任務上的實驗結果,並進行比較分析。系統設計與實現:介紹基於Streamlit的夜視行人檢測系統的設計與實現細節。結論與未來工作:總結本文的研究成果,並討論未來的研究方向和潛在的改進空間。
3. 資料集處理
在本文中,我們詳細介紹了一個專為夜視行人檢測任務而構建的資料集,這個資料集是我們研究工作的基石。資料集包含了總計5,725張影像,其中4,032張用於模型訓練,1,104張用於驗證,以及589張用於最終測試。透過這樣的分配,我們確保了模型在訓練過程中可以學習到豐富的特徵,並且在後期能夠透過獨立的測試集合進行公正的效能評估。博主使用的類別如下:
Chinese_name = {'person': "行人"}
影像均在不同的夜間環境下捕獲,包含城市街道、郊外道路和其它場合的場景。這種多樣性確保了資料集能夠模擬真實世界中的各種夜視條件,為模型提供了廣泛的學習樣本。每張影像中的行人都被精確地標註,以紅色矩形框表示。這些標註不僅準確地描繪了行人的位置,也提供了關於目標尺寸、姿態和比例的重要資訊。
深入分析資料集的分佈情況,我們發現行人的檢測框大多集中在影像的中心區域。這種分佈特性指導我們在預處理階段,可能需要針對影像中心區域進行最佳化處理,以便更好地捕捉和識別行人。同時,標註框的尺寸分析顯示,大多數檢測框的高度大於寬度,呈現出人類直立姿態的自然比例。不過,這些框的尺寸相對較小,這表明我們需要確保模型能夠有效地檢測到在影像中可能顯得較遠或較小的行人目標。
為了加強模型的泛化能力,我們對資料集應用了一系列的預處理和增強技術。預處理步驟包括對影像進行標準化,以消除不同攝像裝置帶來的差異。資料增強包括隨機裁剪、縮放、旋轉以及色彩調整等方法,這些方法能夠模擬行人在各種夜間光照和環境條件下的外觀,從而提高模型對不同環境的適應性和魯棒性。
本資料集的構建綜合考慮了實際應用中行人檢測的各種挑戰,特別是在夜間條件下的各種複雜場景。這使得我們的夜視行人檢測系統不僅能夠在實驗條件下表現良好,而且在部署到真實世界場景時,也能展現出強大的檢測和追蹤能力。透過這些影像和標註資料的詳細介紹,我們希望為讀者提供一個全面的資料集概覽,以便更好地理解模型訓練和評估的背景。
4. 原理與程式碼介紹
4.1 YOLOv8演算法原理
在探討YOLOv8演算法的原理時,我們首先需要理解YOLO(You Only Look Once)系列演算法的核心理念,即在單次前向傳播過程中同時進行目標的定位和分類。這種一步到位的檢測方式使得YOLO演算法在速度和效率上有著顯著的優勢。YOLOv8作為這一系列中的最新迭代,不僅繼承了前代YOLO演算法的這些優點,而且在結構設計和效能上都有了顯著的改進,從而進一步提升了檢測的準確性和速度。
YOLOv8演算法的結構可以分為三個主要部分:Backbone(主幹網路)、Neck(連線網路)和Head(檢測頭)。在Backbone部分,YOLOv8採用了CSP(Cross Stage Partial networks)結構,這種結構有效地平衡了模型的學習能力和引數量。CSP結構透過部分跨階段連線,促進了梯度的直接傳播,這對於深層網路的學習是極為有益的。它還減少了計算量,因為它允許網路在少量的引數下進行更深層次的特徵學習。
Neck部分則是負責提取不同尺度特徵並進行融合的關鍵模組。YOLOv8的Neck部分利用了SPP(Spatial Pyramid Pooling)結構和FPN(Feature Pyramid Networks)技術。SPP能夠提取多尺度的上下文資訊,這對於檢測不同尺寸的目標至關重要。而FPN採用了一個自頂向下的結構,將高層的語義資訊傳遞到低層,從而實現了從粗到細的特徵融合。
在Head部分,YOLOv8採取了自適應標籤分配(adaptive label assignment)策略,這是一種更為靈活的標籤分配方式,允許模型根據目標的不同特性自動調整標籤。這意味著演算法能夠根據目標的大小、形狀以及其在影像中的上下文資訊,動態地選擇最合適的錨點,這種策略能夠有效地減少標籤分配誤差,提升模型的效能。
YOLOv8還引入了AutoML技術,在演算法的設計和最佳化過程中自動尋找最優的模型引數和結構。這種技術可以減輕手動調參的工作量,確保了YOLOv8在不同的檢測場景下都能達到最佳效能。此外,YOLOv8還支援雲端訓練和邊緣計算,使得演算法可以在資源受限的裝置上進行訓練和推斷,同時還可以利用雲端的強大計算能力進行大規模的訓練任務。
綜上所述,YOLOv8透過其獨特的結構設計,不僅繼承了YOLO系列的高速檢測特性,而且還透過CSP網路結構和先進的特徵融合技術,顯著提升了對於各種尺寸目標的檢測能力。這些技術的融合使得YOLOv8在目標檢測任務中,無論是在準確度還是速度上,都表現出了卓越的效能。
4.2 模型構建
在本章節中,我們將深入介紹構建夜視行人檢測模型的程式碼流程和結構。本系統的模型構建過程利用了Python程式語言的高階功能,結合了計算機視覺庫OpenCV和機器學習庫PyTorch,透過精心設計的類和方法實現了一個高效且準確的夜視行人檢測模型。
首先,我們利用OpenCV,這是一個強大的計算機視覺庫,它為我們處理影像和影片提供了必要的工具。OpenCV在模型訓練和評估中的作用不可或缺,尤其是在進行影像的預處理和增強時。隨後,我們將模型的核心建立在PyTorch框架之上。PyTorch是目前深度學習研究和實踐中最受歡迎的框架之一,因其出色的靈活性和強大的功能被廣泛使用。在程式碼中,我們透過select_device函式選擇最合適的硬體裝置來執行我們的模型,這保證了無論在GPU還是CPU上,模型都能以最佳狀態執行。
import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device
在程式碼中,我們設定了使用GPU或CPU作為模型運算的裝置,這一選擇取決於PyTorch能否檢測到可用的GPU。在初始化(init)過程中,我們為模型設定了預設引數,並準備了類別名稱列表。這些名稱是用於在預測時標註出各個檢測到的物體的類別。我們使用Chinese_name字典將類別ID對映為對應的中文名稱,使得模型的輸出更易於理解。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
'device': device,
'conf': 0.25,
'iou': 0.5,
'classes': None,
'verbose': False
}
透過count_classes函式,我們可以統計每個類別的出現次數,為評估模型在不同類別上的效能提供了便利。這在實際應用中尤為重要,因為它幫助我們瞭解模型對於資料集中的各個類別是否存在偏差。
def count_classes(det_info, class_names):
count_dict = {name: 0 for name in class_names}
for info in det_info:
class_name = info['class_name']
if class_name in count_dict:
count_dict[class_name] += 1
count_list = [count_dict[name] for name in class_names]
return count_list
我們定義的YOLOv8v5Detector類,承擔了模型載入、影像預處理、預測和後處理的任務。這個類繼承自一個抽象的Detector基類,體現了物件導向程式設計的一個優點——程式碼複用。透過繼承,我們能夠將通用的邏輯(如載入模型、預處理影像等)放在基類中,而將特定的邏輯(如呼叫YOLO模型進行預測)在子類中實現。在load_model方法中,模型從給定的路徑載入。載入後,我們對模型進行預熱,即在選擇的裝置上執行一個前向傳播,以確保模型執行時的效能。在preprocess方法中,我們將影像轉換為模型預期的格式,雖然這裡的程式碼保持原始影像不變,但這提供了進行如歸一化、縮放或裁剪等預處理步驟的可能性。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
def load_model(self, model_path):
self.device = select_device(self.params['device'])
self.model = YOLO(model_path)
names_dict = self.model.names
self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
def postprocess(self, pred):
results = []
for res in pred[0].boxes:
for box in res:
class_id = int(box.cls.cpu())
bbox = box.xyxy.cpu().squeeze().tolist()
bbox = [int(coord) for coord in bbox]
result = {
"class_name": self.names[class_id],
"bbox": bbox,
"score": box.conf.cpu().squeeze().item(),
"class_id": class_id,
}
results.append(result)
return results
def set_param(self, params):
self.params.update(params)
predict方法是模型預測的核心,它將預處理後的影像作為輸入,呼叫YOLO模型進行物體檢測,並返回檢測結果。在postprocess方法中,我們對模型的輸出進行解析和格式化,將其轉換為包含類別名稱、邊界框座標、置信度分數以及類別ID的字典列表。這樣的輸出格式便於後續的分析和視覺化。透過呼叫set_param方法,使用者可以根據需要動態調整模型引數,如置信度閾值和IOU閾值,進一步最佳化模型的效能。
整體而言,這段程式碼透過精心設計的類結構和方法,實現了一個完整的夜視行人檢測流程,從影像輸入到預測輸出,每一個環節都經過了最佳化和定製,以確保模型能夠在實際應用中達到最佳的識別效果。
4.3 訓練程式碼
在深入探究構建深度學習模型的程式碼時,理解每一行程式碼的目的及其在整個訓練流程中的作用至關重要。本部落格將詳細分析用於夜視行人檢測的YOLO模型的訓練過程。以下表格詳細介紹了YOLOv8模型訓練中使用的一些重要超引數及其設定:
超引數 | 設定 | 說明 |
---|---|---|
學習率(lr0 ) |
0.01 | 決定了模型權重調整的步長大小,在訓練初期有助於快速收斂。 |
學習率衰減(lrf ) |
0.01 | 控制訓練過程中學習率的降低速度,有助於模型在訓練後期細緻調整。 |
動量(momentum ) |
0.937 | 加速模型在正確方向上的學習,並減少震盪,加快收斂速度。 |
權重衰減(weight_decay ) |
0.0005 | 防止過擬合,透過在損失函式中新增正則項減少模型複雜度。 |
熱身訓練週期(warmup_epochs ) |
3.0 | 初始幾個週期內以較低的學習率開始訓練,逐漸增加到預定學習率。 |
批次大小(batch ) |
16 | 每次迭代訓練中輸入模型的樣本數,影響GPU記憶體使用和模型效能。 |
輸入影像大小(imgsz ) |
640 | 模型接受的輸入影像的尺寸,影響模型的識別能力和計算負擔。 |
環境設定與模型載入:首先,我們需要匯入用於構建和訓練模型的必要庫。這包括os和torch,後者是構建深度學習模型的主要工具,提供了GPU加速及自動微分等強大功能。yaml用於處理配置檔案,這些檔案通常包含有關訓練資料、模型引數等重要資訊。YOLO類來自ultralytics庫,是針對YOLO模型訓練和推理流程的一個封裝。abs_path函式用於處理檔案路徑,確保無論在哪個工作環境中,程式碼都能正確地找到檔案位置。
import os
import torch
import yaml
from ultralytics import YOLO # 用於載入YOLO模型
from QtFusion.path import abs_path # 用於獲取檔案的絕對路徑
接下來,我們定義了用於訓練過程的關鍵變數。device變數確保模型能夠利用GPU進行訓練,如果GPU不可用,則回退到CPU。
device = "0" if torch.cuda.is_available() else "cpu"
資料集準備:變數workers定義了在資料載入過程中用於加速讀取的程序數。而batch設定了每個批次處理的影像數量,這直接影響記憶體消耗和訓練速度。資料集的路徑是透過data_path變數指定的,它使用abs_path函式從相對路徑轉換為絕對路徑,並透過replace函式統一了路徑格式。在實際訓練過程中,這保證了模型能夠正確地訪問到資料集。
workers = 1 # 工作程序數
batch = 8 # 每批處理的影像數量
data_name = "NightVision"
data_path = abs_path('datasets/NightVision/nightvision.yaml', path_type='current') # 資料集的yaml的絕對路徑
unix_style_path = data_path.replace(os.sep, '/')
我們透過讀取並更新資料集的YAML配置檔案,來確保資料路徑的準確性。這個步驟對於訓練過程至關重要,因為所有的訓練影像、標籤和驗證影像都依賴於這些路徑的設定。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
訓練模型:最後,我們載入了預訓練的YOLO模型,並呼叫其train方法開始訓練流程。這裡,我們指定了資料配置檔案、訓練裝置、工作程序數、輸入影像大小、訓練輪數、批次大小和訓練任務的名稱。這些引數共同構成了訓練環境的基礎,並直接影響到訓練效率和模型效能。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 載入預訓練的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 載入預訓練的YOLOv8模型
# Training.
results = model.train( # 開始訓練模型
data=data_path, # 指定訓練資料的配置檔案路徑
device=device, # 自動選擇進行訓練
workers=workers, # 指定使用2個工作程序載入資料
imgsz=640, # 指定輸入影像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='train_v5_' + data_name # 指定訓練任務的名稱
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 載入預訓練的YOLOv8模型
results2 = model.train( # 開始訓練模型
data=data_path, # 指定訓練資料的配置檔案路徑
device=device, # 自動選擇進行訓練
workers=workers, # 指定使用2個工作程序載入資料
imgsz=640, # 指定輸入影像的大小為640x640
epochs=120, # 指定訓練100個epoch
batch=batch, # 指定每個批次的大小為8
name='train_v8_' + data_name # 指定訓練任務的名稱
)
此程式碼段揭示瞭如何使用YOLO模型的訓練機制,其中包含了多個層面的設定。所有這些設定都被細緻地調整和最佳化,以期在實際應用中獲得最好的夜視行人檢測效果。透過該訓練流程,研究人員和實踐者可以對YOLO模型進行訓練和微調,進而在各種環境中實現準確的夜視行人檢測。
5. 實驗結果與分析
5.1 訓練曲線
在我們的夜視行人檢測專案中,利用YOLOv8模型的訓練是實現高準確度檢測的關鍵環節。透過對模型訓練過程中的損失函式和效能指標進行深入分析,我們能夠洞察模型的學習效率以及潛在的最佳化方向。
具體來看,訓練的box_loss從一個較高的值逐漸下降,並在後期趨於平穩。這意味著模型在定位行人邊界框的任務上逐漸變得更加精確。類似地,cls_loss,即分類損失,也表現出了同樣的下降趨勢,說明模型在區分行人和背景方面的能力在增強。dfl_loss,代表目標的方向和關鍵點的定位損失,在訓練過程中同樣顯著下降,表明模型對於行人的姿態和方向變得更敏感。
驗證損失(val/box_loss、val/cls_loss和val/dfl_loss)雖然波動性更大,但整體趨勢仍然是下降的,尤其是在早期迭代時。這些波動可能源於驗證集樣本的多樣性和複雜性。即便如此,驗證損失的下降表明模型在未見過的資料上的泛化能力正在提升。
關於模型效能的指標,我們看到precision和recall兩個指標在訓練過程中有著顯著的上升趨勢,接近於穩定在較高的水平。高precision表明模型在判定一個區域包含行人時較少出錯,而高recall表示模型能夠檢測到大多數實際的行人目標。這對於夜視行人檢測來說尤為重要,因為在夜間條件下減少誤報和漏檢對於系統的實用性至關重要。
另外兩個重要的評價指標mAP50和mAP50-95也隨著迭代次數的增加而上升。mAP50是指在50%的IoU(交併比)閾值時的平均精度,它的上升表明模型在較寬鬆的匹配標準下表現良好。而mAP50-95,是在從50%到95%不同IoU閾值的平均精度,它的提高表明模型在更嚴格的標準下同樣表現出色。特別是在夜視條件下,這意味著模型對行人的檢測不僅頻繁而且準確,能夠處理各種大小和姿態的行人目標。
總體來說,這些損失和效能指標的圖表展示了YOLOv8模型在夜視行人檢測任務上訓練過程中的優秀效能,以及在應對這一挑戰性任務時的穩定進步。透過對這些指標的細緻分析,我們可以進一步最佳化模型架構和訓練策略,以達到更高的檢測精度和實用性。
5.2 混淆矩陣
混淆矩陣是評估分類模型效能的重要工具,它顯示了模型預測和實際標籤之間的關係。在我們的夜視行人檢測任務中,混淆矩陣提供了一個清晰的檢視,反映了模型在區分行人和背景類別上的效果。
觀察上圖的混淆矩陣,我們可以看出模型在檢測“person”類別(即行人)時表現出色。矩陣的左上角單元格顯示,模型將88%的行人正確分類,這一高比例的真正例(True Positives)表明模型具有強大的行人識別能力。右上角的單元格顯示了模型在預測背景時的準確性,達到了100%,這表明模型在判斷一個區域不包含行人時非常準確,沒有將任何背景誤判為行人。
然而,左下角的單元格顯示了12%的行人被錯誤地分類為背景(False Negatives)。雖然這個誤判率不算高,但仍顯示出模型在特定情況下可能會錯過一些行人目標。這可能是由於夜間影像的質量、行人在場景中的覆蓋程度或模型對某些特徵的敏感性不足造成的。
混淆矩陣的歸一化處理使得評估結果不受類別樣本不均衡的影響,從而可以公正地比較不同類別的檢測效能。歸一化也有助於我們更準確地解讀模型的效能,特別是在不同類別的樣本數量可能有顯著差異時。
在實際應用中,這樣的混淆矩陣表明模型在夜間環境中對行人的檢測已經相當準確,且非常少地將背景誤分類為行人。這種準確性對於夜間監控系統尤為重要,因為它減少了誤報,使得監控更加可靠。但是,模型仍然需要在減少漏檢方面進行改進,因為每一個漏檢的行人都可能是監控系統的一個重大疏漏。
總的來說,透過深入分析混淆矩陣,我們可以確認模型在夜視行人檢測任務上的高精度,並可以基於這些結果來進一步最佳化模型,比如透過改進影像預處理、調整分類閾值或增強模型對特定特徵的學習。這些細緻的分析為提升夜視行人檢測系統的效能奠定了堅實的基礎。
5.3 YOLOv8/v7/v6/v5對比實驗
(1)實驗設計:
本實驗旨在評估和比較YOLOv5、YOLOv6、YOLOv7和YOLOv8幾種模型在夜視行人目標檢測任務上的效能。為了實現這一目標,博主分別使用使用相同的資料集訓練和測試了這四個模型,從而可以進行直接的效能比較。該資料集包含夜視行人的影像。本文將比較分析四種模型,旨在揭示每種模型的優缺點,探討它們在工業環境中實際應用的場景選擇。
模型 | 影像大小 (畫素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 引數數量 (百萬) | FLOPs (十億) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指標:
- F1-Score:F1-Score 作為衡量模型效能的重要指標,尤其在處理類別分佈不均的資料集時顯得尤為關鍵。它透過結合精確率與召回率,提供了一個單一的度量標準,能夠全面評價模型的效能。精確率衡量的是模型在所有被標記為正例中真正屬於正例的比例,而召回率則關注於模型能夠識別出的真正正例佔所有實際正例的比例。F1-Score透過兩者的調和平均,確保了只有當精確率和召回率同時高時,模型的效能評估才會高,從而確保了模型對於正例的預測既準確又完整。
- mAP(Mean Average Precision):在目標檢測任務中,Mean Average Precision(mAP)是評估模型效能的重要標準。它不僅反映了模型對單個類別的識別精度,而且還考慮了所有類別的平均表現,因此提供了一個全域性的效能度量。在計算mAP時,模型對於每個類別的預測被單獨考慮,然後計算每個類別的平均精度(AP),最後這些AP值的平均數形成了mAP。
名稱 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.899 | 0.910 | 0.885 | 0.907 |
F1-Score | 0.86 | 0.86 | 0.86 | 0.87 |
(3)實驗結果分析:
在本研究中,我們設計了一系列的實驗來評估和對比YOLO系列幾個版本在夜視行人檢測任務上的效能。實驗目的是要確定哪個版本的YOLO模型在處理低光照、高動態範圍的場景中檢測行人時最為有效。實驗設定保持一致,所有模型均在同一資料集上訓練和評估,以確保比較的公正性。在度量指標方面,我們選擇了F1-Score和mAP(mean Average Precision)作為評估標準。F1-Score是精確度和召回率的調和平均,而mAP則是在多個IoU(交併比)閾值下平均精度的平均值,兩者共同衡量了模型的檢測效能。
在我們的實驗中,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n這四個模型展示了其在夜視行人檢測任務上的實力。實驗結果顯示,YOLOv6n在mAP指標上以0.910的成績領先,緊隨其後的是YOLOv8n和YOLOv5nu,分別以0.907和0.899的成績表現出強勁的檢測能力。而YOLOv7-tiny則略低一些,為0.885。這個結果表明,在更廣泛的IoU閾值下,YOLOv6n和YOLOv8n能夠更加準確地識別行人目標。mAP的高分意味著這些模型在定位準確性和預測信心方面達到了較高的水準,這在夜間行人檢測的複雜條件下尤其重要。
至於F1-Score,所有四個模型都展現出相似的表現,其中YOLOv5nu、YOLOv6n和YOLOv7-tiny都得到了0.86的分數,而YOLOv8n以略高的0.87領先。F1-Score的統一表明,在精確度和召回率之間,這些模型取得了良好的平衡。特別是,YOLOv8n在綜合這兩方面上的微小優勢,可能源於它在網路架構或最佳化演算法上的改進。
YOLOv7-tiny作為小型化的版本,其效能略低可能是由於模型簡化導致的特徵提取能力下降。這種設計選擇使得模型更適合在資源受限的裝置上執行,雖然可能會以犧牲一定的檢測精度為代價。
這些實驗結果為我們提供了寶貴的見解,表明了不同的YOLO版本之間在夜視行人檢測任務上的效能差異,並指導我們如何根據具體的應用需求選擇合適的模型。透過深入分析這些指標,我們可以對模型進行細微的調整,以進一步提升夜視行人檢測的準確性和可靠性。
6. 系統設計與實現
6.1 系統架構概覽
在我們的部落格中,接下來我們深入探討基於YOLOv8/v7/v6/v5的夜視行人檢測系統的架構設計。本系統採用了模組化設計思想,旨在透過清晰定義的元件和介面來提升系統的可維護性和擴充套件性。下面是系統架構的關鍵組成部分:
-
檢測系統類(Detection_UI)
檢測系統類是整個夜視行人檢測系統的核心,它負責協調各個元件的互動。這個類透過整合不同的模組,提供了一個使用者友好的介面,用於上傳影像或影片,選擇模型引數,並展示識別結果。它利用了streamlit
框架來搭建可互動的Web介面,方便使用者操作。 -
YOLOv8/v5模型檢測器(YOLOv8v5Detector)
YOLOv8v5Detector類扮演了模型檢測器的角色,封裝了YOLO模型的載入、預處理、預測以及後處理等操作。這個類是我們系統的AI引擎,透過載入預訓練的YOLO模型權重來識別影像或影片中的夜視行人。利用這個模組,我們可以輕鬆地將最新的YOLO模型版本整合到我們的系統中,以便利用其強大的檢測能力。 -
日誌和結果處理
系統中整合了ResultLogger和LogTable兩個類,用於處理和記錄識別結果。ResultLogger提供了一個框架來記錄每次檢測的關鍵資訊,如識別到的夜視行人類別、置信度、位置等。LogTable則負責將這些資訊以表格的形式展示和儲存,便於使用者檢視和分析識別結果。 -
工具類和輔助方法
為了提高程式碼的複用性和減少冗餘,系統設計了一系列工具類和輔助方法。例如,abs_path和drawRectBox分別用於處理檔案路徑的獲取和在影像上繪製識別框。此外,get_camera_names、save_uploaded_file等方法則為系統提供了攝像頭管理和檔案處理的功能。 -
UI佈局和樣式
透過使用def_css_hitml方法,我們為系統定義了一套統一的CSS樣式,保證了使用者介面的美觀性和一致性。同時,setup_sidebar和setupMainWindow方法則分別負責側邊欄和主視窗的佈局設定,使得整個系統介面直觀易用。
6.2 系統流程
在探討基於YOLOv8/v7/v6/v5的夜視行人檢測系統的流程時,我們可以從程式碼中抽象出一系列關鍵步驟,這些步驟整合了從影像獲取、模型預測到結果展示的整個流程。以下是系統的主要流程步驟,它們體現了系統如何協調不同的元件以實現夜視行人檢測的功能。
-
初始化系統設定:系統啟動時,
SystemController
負責初始化所有需要的模組和引數。 -
模型和資料準備:在初始化過程中,系統會根據選擇的模型型別(例如YOLOv8/v5),載入對應的模型權重。同時,系統還會處理輸入資料,這可能包括從攝像頭捕獲的實時影像、上傳的圖片檔案或影片檔案。
-
側邊欄配置:使用者可以透過側邊欄進行一系列配置,包括選擇模型檔案、設定置信度閾值、IOU閾值、選擇輸入源(攝像頭或檔案)等。這些配置將直接影響檢測結果的準確性和效率。
-
執行檢測:使用者點選“開始執行”按鈕後,根據輸入源的不同,系統會呼叫
process_camera_or_file
方法。這個方法負責處理來自攝像頭的實時流或處理上傳的圖片和影片檔案。對於實時攝像頭輸入,系統會不斷從攝像頭捕獲幀,對每一幀呼叫frame_process
方法進行預處理、模型預測、後處理,並將結果顯示在頁面上。對於上傳的圖片檔案,系統將讀取圖片檔案,同樣透過frame_process
方法進行處理,並將檢測結果展示出來。對於上傳的影片檔案,系統會按幀讀取影片內容,每一幀都經過frame_process
方法處理,檢測結果隨影片播放展示。 -
顯示檢測結果:無論是實時影片流、圖片還是影片檔案,處理後的影像以及檢測到的物件資訊(如類別、置信度等)都會透過Streamlit的元件在使用者介面上展示。同時,系統提供了過濾功能,允許使用者專注於特定型別的檢測結果。
-
日誌記錄與匯出:系統會將檢測結果記錄到日誌中,並允許使用者匯出結果為CSV格式的檔案,方便後續分析和報告。
-
使用者介面互動:使用者還可以透過側邊欄和其他介面元素,如進度條、按鈕等,與系統進行實時交雲,調整設定或重新執行檢測。
這一系列流程確保了夜視行人檢測系統能夠在各種夜間環境下準確快速地識別行人,為降低事故發生率和提高夜間行走人員的安全提供了技術支援。
程式碼下載連結
如果您希望獲取部落格中提及的完整資源包,包含測試圖片、影片、Python檔案(*.py)、網頁配置檔案、訓練資料集、程式碼及介面設計等,可訪問博主在麵包多平臺的上傳內容。相關的部落格和影片資料提供了所有必要檔案的下載連結,以便一鍵執行。完整資源的預覽如下圖所示:
資源包中涵蓋了你需要的訓練測試資料集、訓練測試程式碼、UI介面程式碼等完整資源,完整專案檔案的下載連結可在下面的影片簡介中找到➷➷➷
演示與介紹影片 :https://www.bilibili.com/video/BV1qr42147YC/
YOLOv8/v7/v6/v5專案合集下載:https://mbd.pub/o/bread/mbd-ZZ2YmJtp
YOLOv8和v5專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Ykpds
YOLOv7專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl5lq
YOLOv6專案完整資源下載:https://mbd.pub/o/bread/mbd-ZZ2Yl55p
完整安裝執行教程:
這個專案的執行需要用到Anaconda和Pycharm兩個軟體,下載到資原始碼後,您可以按照以下連結提供的詳細安裝教程操作即可執行成功,如仍有執行問題可私信博主解決:
- Pycharm和Anaconda的安裝教程:https://deepcode.blog.csdn.net/article/details/136639378;
軟體安裝好後需要為本專案新建Python環境、安裝依賴庫,並在Pycharm中設定環境,這幾步採用下面的教程可選線上安裝(pip install直接線上下載包)或離線依賴包(博主提供的離線包直接裝)安裝兩種方式之一:
- Python環境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可選一種);
- 離線依賴包的安裝指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可選一種);
如使用離線包方式安裝,請下載離線依賴庫,下載地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取碼:mt8u)。
7. 結論與未來工作
本文透過深入研究並實踐了基於YOLOv8/v7/v6/v5的深度學習模型在夜視行人檢測領域的應用,成功開發了一個結合了這些先進演算法的夜視行人檢測系統。透過對多個版本的YOLO模型進行細緻的比較和最佳化,我們不僅顯著提升了在低光照環境下行人檢測的準確率和實時性,還提高了系統的整體穩定性和可靠性。這一成果在安全監控、自動駕駛輔助系統以及夜間行人保護等領域具有重要的實際應用價值。
經過一系列的實驗驗證,我們所開發的系統在夜視行人檢測的準確性和處理速度上都達到了令人滿意的水平。此外,我們還提供了完整的資料集處理流程、模型訓練和預測的程式碼,使後續的研究者和開發者能夠便捷地復現和參考,為未來在該領域的探索提供了堅實的基礎。儘管取得了一定的成果,但夜視行人檢測作為一個複雜多變的任務,仍然面臨著許多挑戰和改進空間。在未來的工作中,我們計劃從以下幾個方向進行探索:
- 模型最佳化:繼續探索更深層次的網路結構和最佳化策略,如神經網路架構搜尋(NAS)技術,以進一步提升模型的效能和效率。
- 多模態融合:考慮結合紅外、熱成像等其他模態資訊,採用多模態學習方法進行行人檢測,以更全面地適應不同的夜間環境和複雜場景。
- 跨域適應性:研究在不同環境條件下(如不同城市、不同季節的夜間環境)的行人檢測,透過領域自適應技術提高模型在多變環境中的泛化能力。
- 使用者互動體驗:進一步最佳化系統的使用者介面和互動設計,使其更加友好和直觀,以滿足更廣泛使用者的需求。
- 實際應用擴充:探索夜視行人檢測在更多實際應用場景中的應用,如城市安全監控、智慧交通管理等,以發揮其最大的社會和經濟價值。
總之,隨著技術的不斷進步和應用場景的不斷擴充,基於深度學習的夜視行人檢測技術將在保障人身安全、促進智慧交通發展等領域發揮更加重要的作用。我們相信,在不久的將來,這一技術將帶來更廣泛的社會影響和經濟效益。
Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. ↩︎
Murthy, Jamuna S., et al. "Objectdetect: A real-time object detection framework for advanced driver assistant systems using yolov5." Wireless Communications and Mobile Computing 2022 (2022). ↩︎
Tan, Mingxing, and Quoc Le. "Efficientnet: Rethinking model scaling for convolutional neural networks." International conference on machine learning. PMLR, 2019. ↩︎
Zhang, Shifeng, et al. "Bridging the gap between anchor-based and anchor-free detection via adaptive training sample selection." Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2020. ↩︎
He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. ↩︎