模型訓練伺服器搭建目標檢測訓練
Ⅰ MMDetection v2 目標檢測(4):模型訓練和測試
本文以 Faster R-CNN 為例,介紹如何使用 MMDetection v2 ,在 VOC 格式的自定義數據集上,訓練和測試模型。
2021.9.1 更新: 適配 MMDetection v2.16
目錄:
伺服器的環境配置:
命令格式:
命令參數:
示例:
訓練完成後,生成的模型檢查點和日誌文件,存放在 ./work_dirs 目錄下。
命令參數:
命令格式:
命令參數:
示例:
測試結果文件評估
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
測試喊明告結果文件評估
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
繪制學習曲線
命令格式:
命令參數:
示例:
計算訓練時間
命令格式:
命令槐緩參數:
示例:
計算模型復雜度
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
命令格式:
命令參數:
示例:
瀏覽訓練集圖像
命令格式:
命令參數:
示例:
列印完整配置
命令格式鄭明:
命令參數:
示例:
有幫助的話,點個贊再走吧,謝謝~
參考:
Ⅱ 學習機器視覺是不是需要有伺服器啊
您好,學習機器視覺不一定需要有伺服器,但是對於大規模的數據處理和模型訓練,伺服器可以提供更好的計算性能和存儲資源,從而加快學習速度和提高模型的准確性。
在學習機器視覺的過程中,需要大量的數據集和算力來訓練模型。如果使用個人電腦進行訓練,可能會面臨計算速度慢、內存不足等問題,而伺服器可以提供更好的硬體資源來支持數據處理和模型訓練。
另磨局仿外,伺服器還可以提供更好的數據安全性和可靠性。如果將數據存儲在個人電腦中,可能會面臨數據丟失或泄露的風險,而服瞎纖務器可以提供更好的數據備份和安全措施,保障數據的安全性和可靠性。
綜上所述,學習機器視覺不一定需要有伺服器,但是伺服器可以提供更好的計算性臘猜能、存儲資源、數據安全性和可靠性,從而提高學習效率和保障數據安全。
Ⅲ Halcon deep learning之目標檢測筆記(二)
在上一步,完成了網路的創建和數據的預處理。接下來准備對這個網路進行訓練,通過訓練得譽冊到一個族團可以用於目標檢測的深度學習網路模型。這里首先要確定上一步輸出的模型和數據集的存放路徑是可用的,否則訓練環兆虛橘節會因為缺少輸入而報錯。
Halcon的參考樣例detect_pills_deep_learning_2_train.hdev詳述了這一過程,這里做一些學習記錄。
設置輸入路徑,主要是兩個,一是上一步的預訓練的以.hdl結尾的模型,另一個是數據集和樣本數據字典的存放路徑。
輸出路徑也是兩個,一是存放最佳評估模型的路徑,一個是最終訓練完成的模型路徑。
首先用check_files_availability驗證預處理模型和數據集路徑是否正確。沒有問題的話可以開始讀取。
使用read_dl_model讀取前一步初始化後的網路模型,得到模型的句柄DLModelHandle。
接著用read_dict讀取預處理後的數據集,得到數據字典句柄DLDataset。
設置模型參數主要通過set_dl_model_param運算元,以修改屬性值的方式改變關鍵參數的值。該運算元原型如下:
set_dl_model_param( : : DLModelHandle, GenParamName, GenParamValue : )
輸入三個參數:
注意,如果將'runtime'的值改為了』gpu』,則要確定cuDNN和cuBLAS已經成功安裝了。
通過set_dl_model_param運算元,可以將本文開頭提到的設置的模型的基本參數傳遞給模型句柄DLModelHandle。如將'batch_size'設為之前的batch_size的值等等。
1)創建訓練參數。
這里使用create_dl_train_param運算元創建一個訓練參數的字典,用於存放訓練參數和訓練效果可視化的參數。這些參數可以做個說明:
2)訓練網路
接下來是最耗時的部分,即使用train_dl_model運算元進行深度學習網路模型的訓練。運算元如下:
train_dl_model( : : DLDataset, DLModelHandle, TrainParam, StartEpoch : TrainResults, TrainInfos,EvaluationInfos)
前四個參數是輸入參數,後三個是輸出參數。
接著到了第三步,即驗證模型的部分。
Ⅳ 目標檢測演算法的分步介紹(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
對原文的表達有部分改動
在本文中,我們將更深入地研究可用於目標檢測的各種演算法。我們將從 RCNN 家族的演算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發布的文章中,我們將介紹更高級的演算法,如 YOLO、SSD 等。
下圖是說明目標檢測演算法如何工作的一個流行示例。圖像中的每個物體,從一個人到一隻風箏,都以一定的精度被定位和識別。
讓我們從最簡單的深度學習方法開始,也是一種廣泛使用的方法,用於檢測圖像中的目標——卷積神經網路( CNN)。CNN 的內部工作原理如下:
我們將圖像傳遞給網路,然後通過各種卷積和池化層處理,發送給全連接層。最後,我們以目標類別的形式獲得輸出。這相當簡單,不是嗎?對於每個輸入圖像,我們得到一個相應的類作為輸出。我們可以使用這種技術來檢測圖像中的各種目標嗎?讓我們看看如何使用 CNN 解決一般的目標檢測問題。
使用這種方法的問題在於圖像中的目標可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標可能覆蓋圖像的大部分,而在某些情況下,目標可能僅覆蓋圖像的一小部分。目標的形狀也可能不同(在現實生活中經常發生)。由於這些因素,我們將需要大量的區域,從而導致大量的計算時間。因此,為了解決這個問題並減少區域數量,我們可以使用基於區域的 CNN,它使用提案法選擇區域。讓我們了解這個基於區域的 CNN 可以為我們做什麼。
與在大量區域上工作不同的是,RCNN 演算法是在圖像中選取一堆框並檢查這些框中是否有任何一個包含任何目標。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什麼是 selective search 以及它如何識別不同的 regions。基本上四個模式可以構成一個物體:不同的尺度、顏色、紋理和外殼。selective search 識別圖像中的這些模式,並在此基礎上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個例子:
到目前為止,我們已經看到了 RCNN 如何實現目標檢測。但是這種技術有其自身的局限性。由於以下步驟,訓練 RCNN 模型既昂貴又緩慢:
所有這些過程結合起來使 RCNN 非常慢。對每張新圖像進行預測大約需要 40-50 秒,這實質上使得模型在面對龐大的數據集時變得笨重且幾乎無法構建。
好消息是——我們有另一種目標檢測技術,它修復了我們在 RCNN 中看到的大部分問題。
我們還能做些什麼來減少 RCNN 演算法通常需要的計算時間?我們是否可以每張圖像只運行一次並獲取所有感興趣的區域(包含某個目標的區域)。
RCNN 的作者 Ross Girshick 提出了這個想法,即每張圖像只運行一次 CNN,然後找到一種方法在 2,000 個區域之間共享該計算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,後者反過來生成卷積特徵圖。使用這些地圖,提取提議的區域。然後我們使用 RoI 池化層將所有提議的區域重塑為固定大小,以便可以將其饋入全連接網路。
讓我們將其分解為簡化概念的步驟:
因此,Fast RCNN 不是使用三個不同的模型(如 RCNN),而是使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回識別類的邊界框。
為了進一步分解,我將對每個步驟進行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個主要問題,1. 將每個圖像的一個而不是 2,000 個區域傳遞給 ConvNet。2. 使用一個而不是三個不同的模型來提取特徵、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區域的建議方法,這是一個緩慢且耗時的過程。每張圖像檢測目標大約需要 2 秒,這與 RCNN 相比要好得多。但是當我們考慮大型現實生活數據集時,即使是 Fast RCNN 看起來也不那麼快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區別在於 Fast RCNN 使用 selective search 來生成感興趣的區域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特徵圖作為輸入並生成一組目標提議,每個提議的目標以分數作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個區域提議網路(RPN)實際上是如何工作的。
首先,Faster RCNN 從 CNN 獲取特徵圖並將它們傳遞給區域提議網路。 RPN 在這些特徵圖上使用一個滑動窗口,在每個窗口,它生成 k 個不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個圖像中,具有不同的形狀和大小。對於每個 Anchor,RPN 預測兩件事:
我們現在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之後,有可能存在沒有分配給它們的類別提議。我們可以獲取每個建議並對其進行裁剪,以便每個建議都包含一個目標。這就是 RoI 池化層所做的。它為每個錨點提取固定大小的特徵圖:
然後將這些特徵圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對目標進行分類並預測已識別目標的邊界框。
到目前為止,我們討論的所有目標檢測演算法都使用區域來識別目標。網路不會一次性查看完整圖像,而是依次關注圖像的各個部分。這會造成兩個並發症:
Ⅳ 目標檢測系列(一):R-CNN
目標檢測(object detection)是計算機視覺中非常重要的一個領域。在卷積神經網路出現之前,都利用一些傳統方法手動提取圖像特徵進行目標檢測及定位,這些方法不僅耗時而且性能較低。而在卷積神經網路出現之後,目標檢測伍宏神領域發生了翻天覆地的變化。最著名的目標檢測系統有RCNN系列、YOLO和SSD,本文將介紹RCNN系列的開篇作RCNN。
RCNN系列的技術演進過程可參見 基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN 。
目標檢測分為兩步:第一步是對圖像進行分類,即圖像中的內容是什麼;第二步則是對圖像進行定位,找出圖像中物體的具體位置。簡單來說就是圖像裡面有什麼,位置在哪。
然而,由於不同圖片中物體出現的大小可能不同(多尺度),位置也可能不同,而且擺放角度,姿態等都可以不同,同時一張圖片中還可以出現多個類別。這使得目標檢測任務異常艱難。
上面任務用專業的說法就是:圖像識別+定位
兩個不同的分支分別完成不同的功能,分類和定位。回歸(regression)分支與分類分支(classification)共享網路卷積部分的參數值。
還是剛才的分類識別+回歸定位思路。只是現在我們提前先取好不同位置的框,然後將這個框輸入到網路中而不是像思路一將原始圖像直接輸入到網路中。然後計算出這個框的得分,取得分最高的框。
如上,對於同一個圖像中貓的識別定位。分別取了四個角四個框進行分類和回歸。其得分分別為0.5,0.75,0.6,0.8,因此右下角得分最高,選擇右下角的黑框作為目標位置的預測(這里即完成了絕告定位任務)。
這里還有一個問題——檢測位置時的框要怎麼取,取多大?在上面我們是在257x257的圖像中取了221x221的4個角。以不同大小的窗口從左上角到右下角依次掃描的話,數據量會非常大。而且,如果考慮多尺度問題的話,還需要在將圖像放縮到不同水腔虧平的大小來進行計算,這樣又大大增加了計算量。如何取框這個問題可以說是目標檢測的核心問題之一了,RCNN,fast RCNN以及faster RCNN對於這個問題的解決辦法不斷地進行優化,這個到了後面再講。
總結一下思路:
對於一張圖片,用各種大小的框將圖片截取出來,輸入到CNN,然後CNN會輸出這個框的類別以及其位置得分。
對於檢測框的選取,一般是採用某種方法先找出可能含有物體的框(也就是候選框,比如1000個候選框),這些框是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉所有框了。
講完了思路,我們下面具體仔細來看看RCNN系列的實現,本篇先介紹RCNN的方法。
R-CNN相比於之前的各種目標檢測演算法,不僅在准確率上有了很大的提升,在運行效率上同樣提升很大。R-CNN的過程分為4個階段:
在前面我們已經簡單介紹了selective search方法,通過這個方法我們篩選出了2k左右的候選框。然而搜索出的矩形框大小是不同的。而在AlexNet中由於最後全連接層的存在,對於圖像尺寸有固定的要求,因此在將候選框輸入之前,作者對這些候選框的大小進行了統一處理——放縮到了統一大小。文章中作者使用的處理方法有兩種:
(1)各向異性縮放
因為圖片扭曲可能會對後續CNN模型訓練產生影響,於是作者也測試了各向同性縮放的方法。有兩種方法:
此外,作者對於bounding box還嘗試了padding處理,上面的示意圖中第1、3行就是結合了padding=0,第2、4行結果採用padding=16的結果。經過最後的試驗,作者發現採用各向異性縮放、padding=16的精度最高。
卷積神經網路訓練分為兩步:(1)預訓練;(2)fine-tune。
先在一個大的數據集上面訓練模型(R-CNN中的卷機模型使用的是AlexNet),然後利用這個訓練好的模型進行fine-tune(或稱為遷移學習),即使用這個預訓練好的模型參數初始化模型參數,然後在目標數據集上面進行訓練。
此外,在訓練時,作者還嘗試採用不同層數的全連接層,發現一個全連接層比兩個全連接層效果要好,這可能是因為使用兩個全連接層後過擬合導致的。
另一個比較有意思的地方是:對於CNN模型,卷積層學到的特徵其實就是基礎的共享特徵提取層,類似於傳統的圖像特徵提取演算法。而最後的全連接層學到的則是針對特定任務的特徵。譬如對於人臉性別識別來說,一個CNN模型前面的卷積層所學習到的特徵就類似於學習人臉共性特徵,然後全連接層所學習的特徵就是針對性別分類的特徵了。
最後,利用訓練好的模型對候選框提取特徵。
關於正負樣本的問題:由於選取的bounding box不可能與人工label的完全相同,因此在CNN訓練階段需要設置IOU閾值來為bounding box打標簽。在文章中作者將閾值設置為0.5,即如果候選框bounding box與人工label的區域重疊面積大於0.5,則將其標注為物體類別(正樣本),否則我們就把他當做背景類別(負樣本)。
作者針對每一個類別都訓練了一個二分類的SVM。這里定義正負樣本的方法與上面卷積網路訓練的定義方法又不相同。作者在文章中嘗試了多種IoU閾值(0.1~0.5)。最後通過訓練發現,IoU閾值為0.3的時候效果最好(選擇為0精度下降了4個百分點,選擇0.5精度下降了5個百分點)。即當IoU小於0.3的時候我們將其視為負樣本,否則為正樣本。
目標檢測問題的衡量標準是重疊面積:許多看似准確的檢測結果,往往因為候選框不夠准確,重疊面積很小。故需要一個位置精修步驟。
在實現邊界回歸的過程中發現了兩個微妙的問題。第一是正則化是重要的:我們基於驗證集,設置λ=1000。第二個問題是,選擇使用哪些訓練對(P,G)時必須小心。直觀地說,如果P遠離所有的檢測框真值,那麼將P轉換為檢測框真值G的任務就沒有意義。使用像P這樣的例子會導致一個無望的學習問題。因此,只有當提案P至少在一個檢測框真值附近時,我們才執行學習任務。「附近」即,將P分配給具有最大IoU的檢測框真值G(在重疊多於一個的情況下),並且僅當重疊大於閾值(基於驗證集,我們使用的閾值為0.6)。所有未分配的提案都被丟棄。我們為每個目標類別執行一次,以便學習一組特定於類別的檢測框回歸器。
在測試時,我們對每個提案進行評分,並預測其新的檢測框一次。原則上,我們可以迭代這個過程(即重新評估新預測的檢測框,然後從它預測一個新的檢測框,等等)。但是,我們發現迭代不會改進結果。
使用selective search的方法在測試圖片上提取2000個region propasals ,將每個region proposals歸一化到227x227,然後再CNN中正向傳播,將最後一層得到的特徵提取出來。然後對於每一個類別,使用為這一類訓練的SVM分類器對提取的特徵向量進行打分,得到測試圖片中對於所有region proposals的對於這一類的分數,再使用貪心的非極大值抑制(NMS)去除相交的多餘的框。再對這些框進行canny邊緣檢測,就可以得到bounding-box(then B-BoxRegression)。
參考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-將CNN引入目標檢測的開山之作-曉雷的文章
基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 論文翻譯
Ⅵ keras如何快速入門
作者 | 楊照璐(微信號lwyzl0821)
編輯 | 言有三
這一次我們講講keras這個簡單、流行的深度學習框架,一個圖像分類任務從訓練到測試出結果的全流程。
相關的代碼、數據都在我們 Git 上,希望大家 Follow 一下這個 Git 項目,後面會持續更新不同框架下的任務。
Keras是一個非常流行、簡單的深度學習框架,它的設計參考了torch,用Python語言編寫,是一個高度模塊化的神經網路庫,支持GPU和CPU。能夠在TensorFlow,CNTK或Theano之上運行。 Keras的特點是能夠快速實現模型的搭建, 簡單方便地讓你實現從想法到實驗驗證的轉化,這都是高效地進行科學研究的關鍵。
Keras的安裝非常簡單,但是需要先安裝一個後端框架作為支撐,TensorFlow, CNTK,Theano都可以,但是官網上強烈建議使用TensorFlow作為Keras的後端進行使用。本例以TensorFlow 1.4.0 版本作為Keras的後端進行測試。
通過上面兩條命令就可以完成TensorFlow和Keras的安裝,此處需要注意的一點是Keras的版本和TensorFlow的版本要對應,否則會出現意外的錯誤。具體版本對應關系可在網上進行查詢。
3.1 MNIST實例
MNIST手寫字元分類被認為是深度學習框架里的「Hello Word!」,下面簡單介紹一下MNIST數據集案例的測試。Keras的官方github的example目錄下提供了幾個MNIST案例的代碼,下載mnist_mlp.py,mnist_cnn.py文件,本地運行即可,其他文件讀者也可以自行測試。
3.2 數據定義
前面我們介紹了MNIST數據集實例,很多讀者在學習深度學習框架的時候都卡在了這一步,運行完MNIST實例之後無從下手,很大原因可能是因為不知道怎麼處理自己的數據集,這一節我們通過一個簡單的圖像二分類案例,介紹如何實現一個自定義的數據集。
數據處理有幾種方式,一種是像MNIST、CIFAR數據集,這些數據集的特點是已經為用戶打包封裝悄穗賀好了數據。用戶只要load_data即可實現數據導入。其實就是事先把數據進行解析,然後保存到.pkl 或者.h5等文件中,然後在訓練模型的時候直接導入,輸入到網路中;另一種是直接從本地讀取文件,解析成網路需要的格式,輸入網路進行訓練。但是實際情況是,為了某一個項目我們不可能總是找到相應的打包好的數據集供使用,這時候自己建立一個dataset就十分重要。
Keras提供了一個圖像數據的數據增強文件,調用這個文件我們可以實現網路數據載入的功能。
此處採用keras的processing模塊里的ImageDataGenerator類定義一個圖像分類任務的dataset生成器:
下面簡單地介紹一下上面的代碼,完整代碼請移步Git工程。
Keras的processing模塊中提供了一個能夠實時進行數據增強的圖像生成類ImagGenerator,該類下面有一個函數flow_from_directory,顧名思義該函數就是從文件夾中獲取圖像數據。關於ImageGenerator更多的使用可以參考官方源碼。數據啟派集結構組織如下:
此處還需要注意的一點是,我們現在進行的是簡單的圖像分類任務訓練,假如要完成語義分割,目標檢測等任務,則需要自定義一個類(繼承ImageDataGenerator),具體實現可以查詢相關代碼進行參考。
Keras網路模型搭建有兩種形式,Sequential 順序模型和使用函數式API的 Model 類模型。本教程的例子採用一個簡單的三層卷積,以及兩層全連接和一個分類層組成的網路模族鉛型。由於函數式API更靈活方便,因此下面採用函數式方法搭建模型,模型定義如下:
4.1 函數式API
即輸出是12通道,卷積核大小3*3,步長為2,padding='same'表示邊緣補零
axis表示需要歸一化的坐標軸,bn_axis=3,由於採用TensorFlow作為後端,因此這句代碼表示在通道數坐標軸進行歸一化。
x = Flatten()(x) 表示將卷積特徵圖進行拉伸,以便和全連接層Dense()進行連接。
Dense()實現全連接層的功能,1200是輸出維度,『relu'表示激活函數,使用其他函數可以自行修改。
最後一層採用『softmax』激活函數實現分類功能。
最終返回Model,包含網路的輸入和輸出。
4.2 模型編譯
網路搭建完成,在網路訓練前需要進行編譯,包括學習方法、損失函數、評估標准等,這些參數分別可以從optimizer、loss、metric模塊中導入。具體代碼如下:
其中callbacks模塊包含了TensorBoard, ModelCheckpoint,LearningRateScheler等功能,分別可以用來可視化模型,設置模型檢查點,以及設置學習率策略。
5.1 模型訓練
Keras模型訓練過程非常簡單,只需一行代碼,設置幾個參數即可,具體代碼如下:
首先指定數據生成器,train_generator, 前面介紹過;steps_per_epoch是每次epoch循環的次數,通過訓練樣本數除以batch_size得到;epochs是整個數據集重復多少次訓練。
Keras是高度封裝的,在模型訓練過程中,看不到網路的預測結果和網路的反向傳播過程,只需定義好損失函數,事實上,網路定義中的模型輸出會包含網路的輸入和輸出。
5.2 訓練過程可視化
keras可以採用tensorboard實現訓練過程的可視化。執行完下面的命令就可以在瀏覽器訪問http://127.0.0.1:6006查看效果。
tensorboard --logdir 日誌文件路徑(默認路徑=『./logs』』)
上面是分別是訓練和測試過程的loss和accuracy。
5.3 模型測試
model = simpleconv3()
model.load_weights(model_path, by_name=True)
image_path = '../../../../datas/head/train/0/1left.jpg'
img = Image.open(image_path)
img = img_to_array(img)
img = cv2.resize(img, image_size)
img = np.expand_dims(img, axis=0)
img = preprocess_input(img)
result = model.predict(img, batch_size=1)
print(result)
以上代碼簡單介紹一下:模型測試流程非常清晰,首先載入模型,載入參數>>將數據輸入網路>>模型預測。
模型訓練完成後,僅需用model.save_weights('models/model.h5')一句代碼就可以完成模型的保存。同樣,模型的導入採用model.load_weights(model_path, by_name=True),需要注意的是要設置by_name=True,這樣就能保證和模型名稱一樣的參數都能載入到模型,當然模型定義要和參數是匹配的,假如要進行fine-tune我們只需保證需要重新訓練或者新加的網路層的名稱和預載入模型參數名稱不一樣就可以。
以上內容涵蓋了採用keras進行分類任務的全部流程,從數據導入、模型搭建、模型訓練、測試,模型保存和導入幾個方面分別進行了介紹。當然這只是一些基本的應用,還有一些高級、個性化功能需要我們進一步學習,有機會,下一次介紹一下自定義網路層、設置check_point、特徵可視化等特性。
Ⅶ YOLO 目標檢測實戰項目『原理篇』
在目標檢測中,IoU 為預測框 (Prediction) 和真實框 (Ground truth) 的交並比。如下圖所示,在關於小貓的目標檢測中,紫線邊框為預測框 (Prediction),紅線邊框為真實框 (Ground truth)。
在目標檢測任務中,通常取 IoU≥0.5,認為召回。如果 IoU 閾值設置更高,召回率將會降低,但定位框則更加精確。
理想的情況,當然是預測框與真實框重疊越多越好,如果兩者完全重疊,則交集與並集面積相同,此時 IoU 等於 1。
之前的目標檢測方法需要先產生候選區再檢測的方法雖然有相對較高的檢測准確率,但運行速度較慢。
YOLO 將識別與定位合二為一,結構簡便,檢測速度快,更快的 Fast YOLO 可以達到 155FPS。
YOLO 網路借鑒了 GoogLeNet 分類網路結構,不同的是 YOLO 使用 1x1 卷積層和 3x3 卷積層替代 inception mole。如下圖所示,整個檢測網路包括 24 個卷積層和 2 個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。
如上圖所示,損失函數分為坐標預測(藍色框)、含有物體的邊界框的 confidence 預測(紅色框)、不含有物體的邊界框的 confidence 預測(黃色框)、分類預測(紫色框)四個部分。
由於不同大小的邊界框對預測偏差的敏感度不同,小的邊界框對預測偏差的敏感度更大。為了均衡不同尺寸邊界框對預測偏差的敏感度的差異。作者巧妙的對邊界框的 w,h 取均值再求 L2 loss. YOLO 中更重視坐標預測,賦予坐標損失更大的權重,記為 coord,在 pascal voc 訓練中 coodd=5 ,classification error 部分的權重取 1。
某邊界框的置信度定義為:某邊界框的 confidence = 該邊界框存在某類對象的概率 pr (object)* 該邊界框與該對象的 ground truth 的 IOU 值 ,若該邊界框存在某個對象 pr (object)=1 ,否則 pr (object)=0 。由於一幅圖中大部分網格中是沒有物體的,這些網格中的邊界框的 confidence 置為 0,相比於有物體的網格,這些不包含物體的網格更多,對梯度更新的貢獻更大,會導致網路不穩定。為了平衡上述問題,YOLO 損失函數中對沒有物體的邊界框的 confidence error 賦予較小的權重,記為 noobj,對有物體的邊界框的 confidence error 賦予較大的權重。在 pascal VOC 訓練中 noobj=0.5 ,有物體的邊界框的 confidence error 的權重設為 1.
YOLOv1 雖然檢測速度快,但在定位方面不夠准確,並且召回率較低。為了提升定位準確度,改善召回率,YOLOv2 在 YOLOv1 的基礎上提出了幾種改進策略
YOLOv2 中在每個卷積層後加 Batch Normalization (BN) 層,去掉 dropout. BN 層可以起到一定的正則化效果,能提升模型收斂速度,防止模型過擬合。YOLOv2 通過使用 BN 層使得 mAP 提高了 2%。
目前的大部分檢測模型都會使用主流分類網路(如 vgg、resnet)在 ImageNet 上的預訓練模型作為特徵提取器,而這些分類網路大部分都是以小於 256x256 的圖片作為輸入進行訓練的,低解析度會影響模型檢測能力。YOLOv2 將輸入圖片的解析度提升至 448x448,為了使網路適應新的解析度,YOLOv2 先在 ImageNet 上以 448x448 的解析度對網路進行 10 個 epoch 的微調,讓網路適應高解析度的輸入。通過使用高解析度的輸入,YOLOv2 的 mAP 提升了約 4%。
YOLOv1 利用全連接層直接對邊界框進行預測,導致丟失較多空間信息,定位不準。YOLOv2 去掉了 YOLOv1 中的全連接層,使用 Anchor Boxes 預測邊界框,同時為了得到更高解析度的特徵圖,YOLOv2 還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一個中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都為奇數。YOLOv2 通過縮減網路,使用 416x416 的輸入,模型下采樣的總步長為 32,最後得到 13x13 的特徵圖, 然後對 13x13 的特徵圖的每個 cell 預測 5 個 anchor boxes ,對每個 anchor box 預測邊界框的位置信息、置信度和一套分類概率值。使用 anchor boxes 之後,YOLOv2 可以預測 13x13x5=845 個邊界框,模型的召回率由原來的 81% 提升到 88%,mAP 由原來的 69.5% 降低到 69.2%. 召回率提升了 7%,准確率下降了 0.3%。
YOLOv2 採用 Darknet-19,其網路結構如下圖所示,包括 19 個卷積層和 5 個 max pooling 層,主要採用 3x3 卷積和 1x1 卷積, 這里 1x1 卷積可以壓縮特徵圖通道數以降低模型計算量和參數 ,每個卷積層後使用 BN 層 以加快模型收斂同時防止過擬合。最終採用 global avg pool 做預測。採用 YOLOv2,模型的 mAP 值沒有顯著提升,但計算量減少了。
在 Faster R-CNN 和 SSD 中,先驗框都是手動設定的,帶有一定的主觀性。YOLOv2 採用 k-means 聚類演算法對訓練集中的邊界框做了聚類分析,選用 boxes 之間的 IOU 值作為聚類指標。綜合考慮模型復雜度和召回率,最終選擇 5 個聚類中心,得到 5 個先驗框,發現其中中扁長的框較少,而瘦高的框更多,更符合行人特徵。通過對比實驗,發現用聚類分析得到的先驗框比手動選擇的先驗框有更高的平均 IOU 值,這使得模型更容易訓練學習。
Faster R-CNN 使用 anchor boxes 預測邊界框相對先驗框的偏移量,由於沒有對偏移量進行約束,每個位置預測的邊界框可以落在圖片任何位置,會導致模型不穩定,加長訓練時間。YOLOv2 沿用 YOLOv1 的方法,根據所在網格單元的位置來預測坐標,則 Ground Truth 的值介於 0 到 1 之間。網路中將得到的網路預測結果再輸入 sigmoid 函數中,讓輸出結果介於 0 到 1 之間。設一個網格相對於圖片左上角的偏移量是 cx,cy。先驗框的寬度和高度分別是 pw 和 ph,則預測的邊界框相對於特徵圖的中心坐標 (bx,by) 和寬高 bw、bh 的計算公式如下圖所示。
YOLOv2 結合 Dimention Clusters, 通過對邊界框的位置預測進行約束,使模型更容易穩定訓練,這種方式使得模型的 mAP 值提升了約 5%。
YOLOv2 借鑒 SSD 使用多尺度的特徵圖做檢測,提出 pass through 層將高解析度的特徵圖與低解析度的特徵圖聯系在一起,從而實現多尺度檢測。YOLOv2 提取 Darknet-19 最後一個 max pool 層的輸入,得到 26x26x512 的特徵圖。經過 1x1x64 的卷積以降低特徵圖的維度,得到 26x26x64 的特徵圖,然後經過 pass through 層的處理變成 13x13x256 的特徵圖(抽取原特徵圖每個 2x2 的局部區域組成新的 channel,即原特徵圖大小降低 4 倍,channel 增加 4 倍),再與 13x13x1024 大小的特徵圖連接,變成 13x13x1280 的特徵圖,最後在這些特徵圖上做預測。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.
YOLOv2 中使用的 Darknet-19 網路結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2 採用多尺度輸入的方式訓練,在訓練過程中每隔 10 個 batches , 重新隨機選擇輸入圖片的尺寸,由於 Darknet-19 下采樣總步長為 32,輸入圖片的尺寸一般選擇 32 的倍數 {320,352,…,608}。採用 Multi-Scale Training, 可以適應不同大小的圖片輸入,** 當採用低解析度的圖片輸入時,mAP 值略有下降,但速度更快,當採用高解析度的圖片輸入時,能得到較高 mAP 值,但速度有所下降。**
YOLOv2 借鑒了很多其它目標檢測方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度檢測。除此之外,YOLOv2 在網路設計上做了很多 tricks, 使它能在保證速度的同時提高檢測准確率,Multi-Scale Training 更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。
YOLO v2 對 YOLO v1 的缺陷進行優化,大幅度高了檢測的性能,但仍存在一定的問題, 如無法解決重疊問題的分類等 。
將 256x256 的圖片分別輸入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 為基礎網路的分類模型中,實驗得到的結果如下圖所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 與 ResNet-152 性能相似但速度幾乎是其 2 倍。注意到,Darknet-53 相比於其它網路結構實現了每秒最高的浮點計算量,說明其網路結構能更好的利用 GPU。
YOLOv3 借鑒了 FPN 的思想,從不同尺度提取特徵。相比 YOLOv2,YOLOv3 提取最後 3 層特徵圖,不僅在每個特徵圖上分別獨立做預測,同時通過將小特徵圖上采樣到與大的特徵圖相同大小,然後與大的特徵圖拼接做進一步預測。用維度聚類的思想聚類出 9 種尺度的 anchor box,將 9 種尺度的 anchor box 均勻的分配給 3 種尺度的特徵圖 .
在實際應用場合中,一個物體有可能輸入多個類別,單純的單標簽分類在實際場景中存在一定的限制。舉例來說,一輛車它既可以屬於 car(小汽車)類別,也可以屬於 vehicle(交通工具),用單標簽分類只能得到一個類別。因此在 YOLO v3 在網路結構中把原先的 softmax 層換成了邏輯回歸層,從而實現把單標簽分類改成多標簽分類。用多個 logistic 分類器代替 softmax 並不會降低准確率,可以維持 YOLO 的檢測精度不下降。
對於對象檢測,不僅要考慮精度,還要考慮實時運行的性能,雖然現在算力大幅度上升,但是普通的設備跑起來還是有點吃力。提高精度和加快速率仍是目標檢測的重大課題,道阻且長!
參考:
YOLOv1 參考
YOLOv2 參考
YOLOv3 參考
https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非極大抑制
Ⅷ 詳細解讀TPH-YOLOv5 | 讓目標檢測任務中的小目標無處遁形
1 簡介
針對無人機捕獲場景的目標檢測是最近比較流行的一項任務。由於無人機在不同高度飛行,目標尺度變化較大,這樣給模型的優化也帶來了很大的負擔。此外,在無人機進行高速低空飛行時,也會帶來密集目標的運動模糊問題。
圖1 小目標與密集問題
為了解決上述2個問題,本文提出了 TPH-YOLOv5 。 TPH-YOLOv5 在YOLOv5的基礎上增加了一個prediction heads 來檢測不同尺度的目標。然後通過探索Self-Attention的預測潛力使用了Transformer Prediction Heads(TPH)代侍戚野替原來的prediction heads。同時作者還集成了卷積塊Attention模型(CBAM)來尋找密集場景下的注意力區域。
為了進一步改進 TPH-YOLOv5 ,作者還提供了大量有用的策略,如數據增強、多尺度測試、多模型集成和使用額外的分類器。
在VisDrone2021數據集上的大量實驗表明,TPH-YOLOv5在無人機捕獲場景上具有良好的性能和可解釋性。在DET-test-challenge數據集上,TPH-YOLOv5的AP結果為39.18%,比之前的SOTA方法(DPNetV3)提高了1.81%。在VisDrone Challenge 2021中,TPH-YOLOv5與YOLOv5相比提高了約7%。
本文的貢獻如下:
2 前人工作總結 2.1 Data Augmentation
數據增強的意義主要是擴展數據集,使模型對不同環境下獲得的圖像具有較高的魯棒性。
Photometric和geometric被研究人員廣泛使用。對於Photometric主要是對圖像的色相、飽和度和值進行了調整。在處理geometric時主要是添加隨機縮放、裁剪、平移、剪切和旋轉。
除了上述的全局像素增強方法外,還有一些比較獨特的數據增強方法。一些研究者提出了將多幅圖像結合在一起進行數據增強的方法,如MixUp、CutMix和Mosaic。
MixUp從訓練圖像中隨機選取2個樣本進行隨機加權求和,樣本的標簽也對應於加權求和。不同於通常使用零像素mask遮擋圖像的遮擋工作,CutMix使用另一個圖像的區域覆蓋被遮擋的區域。Mosaic是CutMix的改進版。拼接4幅圖像,極大地豐富了被檢仔型測物體的背景。此外,batch normalization計算每層上4張不同圖像的激活統計量。
在TPH-YOLOv5的工作中主要是結合了MixUp、Mosaic以及傳統方法進行的數據增強。
2.2 Multi-Model Ensemble Method
我們都知道深度學習模型是一種非線性方法。它們提供了更大的靈活性,並可以根據訓練數據量的比例進行擴展。這種靈活性的一個缺點是,它們通過隨機訓練演算法進行學習,這意味著它們對訓練數據的細節非常敏感,每次訓練時可能會得到一組不同的權重,從而導致不同的預測。 這給模型帶來了一個高方差 。
減少模型方差的一個成功方法是訓練多個模型而不是單一模型,並結合這些模老喊型的預測。
針對不同的目標檢測模型,有3種不同的ensemble boxes方法:非最大抑制(NMS)、Soft-NMS、Weighted Boxes Fusion(WBF)。
在NMS方法中,如果boxes的overlap, Intersection Over Union(IoU)大於某個閾值,則認為它們屬於同一個對象。對於每個目標NMS只留下一個置信度最高的box刪除其他box。因此,box過濾過程依賴於這個單一IoU閾值的選擇,這對模型性能有很大的影響。
Soft-NMS是對NMS進行輕微的修改,使得Soft-NMS在標准基準數據集(如PASCAL VOC和MS COCO)上比傳統NMS有了明顯的改進。它根據IoU值對相鄰邊界box的置信度設置衰減函數,而不是完全將其置信度評分設為0並將其刪除。
WBF的工作原理與NMS不同。NMS和Soft-NMS都排除了一些框,而WBF將所有框合並形成最終結果。因此,它可以解決模型中所有不準確的預測。本文使用WBF對最終模型進行集成,其性能明顯優於NMS。
2.3 Object Detection
基於CNN的物體檢測器可分為多種類型:
一些檢測器是專門為無人機捕獲的圖像設計的,如RRNet、PENet、CenterNet等。但從組件的角度來看,它們通常由2部分組成,一是基於CNN的主幹,用於圖像特徵提取,另一部分是檢測頭,用於預測目標的類和Box。
此外,近年來發展起來的目標檢測器往往在backbone和head之間插入一些層,人們通常稱這部分為檢測器的Neck。接下來分別對這3種結構進行詳細介紹:
Backbone
常用的Backbone包括VGG、ResNet、DenseNet、MobileNet、EfficientNet、CSPDarknet53、Swin-Transformer等,均不是自己設計的網路。因為這些網路已經證明它們在分類和其他問題上有很強的特徵提取能力。但研究人員也將微調Backbone,使其更適合特定的垂直任務。
Neck
Neck的設計是為了更好地利用Backbone提取的特徵。對Backbone提取的特徵圖進行不同階段的再處理和合理使用。通常,一個Neck由幾個自底向上的路徑和幾個自頂向下的路徑組成。Neck是目標檢測框架中的關鍵環節。最早的Neck是使用上下取樣塊。該方法的特點是沒有特徵層聚合操作,如SSD,直接跟隨頭部後的多層次特徵圖。
常用的Neck聚合塊有:FPN、PANet、NAS-FPN、BiFPN、ASFF、SAM。這些方法的共性是反復使用各種上下采樣、拼接、點和或點積來設計聚合策略。Neck也有一些額外的塊,如SPP, ASPP, RFB, CBAM。
Head
作為一個分類網路,Backbone無法完成定位任務,Head負責通過Backbone提取的特徵圖檢測目標的位置和類別。
Head一般分為2種:One-Stage檢測器和Two-Stage檢測器。
兩級檢測器一直是目標檢測領域的主導方法,其中最具代表性的是RCNN系列。與Two-Stage檢測器相比One-Stage檢測器同時預測box和目標的類別。One-Stage檢測器的速度優勢明顯,但精度較低。對於One-Stage檢測器,最具代表性的型號是YOLO系列、SSD和RetaNet。
3TPH-YOLOv53.1 Overview of YOLOv5
YOLOv5有4種不同的配置,包括YOLOv5s,YOLOv5m, YOLOv5l和YOLOv5x。一般情況下,YOLOv5分別使用CSPDarknet53+SPP為Backbone,PANet為Neck, YOLO檢測Head。為了進一步優化整個架構。由於它是最顯著和最方便的One-Stage檢測器,作者選擇它作為Baseline。
圖2 THP-YOLOv5整體架構
當使用VisDrone2021數據集訓練模型時,使用數據增強策略(Mosaic和MixUp)發現YOLOv5x的結果遠遠好於YOLOv5s、YOLOv5m和YOLOv5l, AP值的差距大於1.5%。雖然YOLOv5x模型的訓練計算成本比其他3種模型都要高,但仍然選擇使用YOLOv5x來追求最好的檢測性能。此外,根據無人機捕獲圖像的特點,對常用的photometric和geometric參數進行了調整。
3.2 TPH-YOLOv5
TPH-YOLOv5的框架如圖3所示。修改了原來的YOLOv5,使其專一於VisDrone2021數據集:
圖3 TPH-YOLOv5模型結構 微小物體的預測頭
作者統計了VisDrone2021數據集,發現它包含了很多非常小的目標,所以增加了一個用於微小物體檢測的預測頭。結合其他3個預測頭,4頭結構可以緩解劇烈的目標尺度變化帶來的負面影響。如圖3所示,添加的預測頭(Head 1)是由low-level、高解析度的feature map生成的,對微小物體更加敏感。增加檢測頭後,雖然增加了計算和存儲成本,但對微小物體的檢測性能得到了很大的提高。
Transformer encoder block
圖4 Transformer Block
用Transformer encoder塊替換了YOLOv5原版中的一些卷積塊和CSP bottleneck blocks。其結構如圖4所示。與CSPDarknet53中原有的bottleneck blocks相比,作者認為Transformer encoder block可以捕獲全局信息和豐富的上下文信息。
每個Transformer encoder block包含2個子層。第1子層為multi-head attention layer,第2子層(MLP)為全連接層。每個子層之間使用殘差連接。Transformer encoder block增加了捕獲不同局部信息的能力。它還可以利用自注意力機制來挖掘特徵表徵潛能。在VisDrone2021數據集中,Transformer encoder block在高密度閉塞對象上有更好的性能。
基於YOLOv5,作者只在頭部部分應用Transformer encoder block形成transformer Prediction head(TPH)和backbone端。因為網路末端的特徵圖解析度較低。將TPH應用於低解析度特徵圖可以降低計算和存儲成本。此外,當放大輸入圖像的解析度時可選擇去除早期層的一些TPH塊,以使訓練過程可用。
Convolutional block attention mole (CBAM)
CBAM是一個簡單但有效的注意力模塊。它是一個輕量級模塊,可以即插即用到CNN架構中,並且可以以端到端方式進行訓練。給定一個特徵映射,CBAM將沿著通道和空間兩個獨立維度依次推斷出注意力映射,然後將注意力映射與輸入特徵映射相乘,以執行自適應特徵細化。
圖5 CBAM注意力機制
CBAM模塊的結構如圖5所示。通過本文的實驗,在不同的分類和檢測數據集上將CBAM集成到不同的模型中,模型的性能得到了很大的提高,證明了該模塊的有效性。
在無人機捕獲的圖像中,大覆蓋區域總是包含令人困惑的地理元素。使用CBAM可以提取注意區域,以幫助TPH-YOLOv5抵制令人困惑的信息,並關注有用的目標對象。
Self-trained classifier
用TPH-YOLOv5對VisDrone2021數據集進行訓練後,對test-dev數據集進行測試,然後通過可視化失敗案例分析結果,得出TPH-YOLOv5定位能力較好,分類能力較差的結論。作者進一步探索如圖6所示的混淆矩陣,觀察到一些硬類別,如三輪車和遮陽三輪車的精度非常低。
圖6 檢測混淆矩陣
因此,作者提出了一個Self-trained classifier。首先,通過裁剪ground-truth邊界框並將每個圖像patch的大小調整為64 64來構建訓練集。然後選擇ResNet18作為分類器網路。實驗結果表明,在這個Self-trained classifier的幫助下,所提方法對AP值提高了約0.8%~1.0%。
4實驗與結論
最終在test-set-challenge上取得了39.18的好成績,遠遠高於VisDrone2020的最高成績37.37。
圖9 檢測結果圖