5000字多圖長文預警!手把手帶你調參Yolo v5(一)
來源:投稿 作者:王同學
編輯:學姐
本文篇幅較長,建議同學收藏起來慢慢看哦~
YOLO系列模型在目標檢測領域有著十分重要的地位,隨著版本不停的迭代,模型的性能在不斷地提升,源碼提供的功能也越來越多,「那么如何使用源碼就顯得十分的重要,接下來我會通過兩篇文章帶大家手把手去了解Yolov5(v6.1)的每一個參數的含義」, 并且通過具體的圖片例子讓大家明白每個參數改動將會給網絡帶來哪些影響。
1. 代碼獲取方式??
項目地址:https://github.com/ultralytics/yolov5
進入倉庫點擊tags可以查看項目目前提供的版本


我選擇的代碼是v6.1版本
2. 準備項目環(huán)境?
在配置Conda環(huán)境
后就可以進入項目了,可以通過作者提供的requirements.txt文件
進行快速安裝。
即在終端中鍵入如下指令:
requirements.txt文件
里面有一些包被注釋掉了,這些包是做一些額外的操作時候用的,不安裝并不會影響訓練和測試;但是有些工具是將.pt
文件轉換成.onnx
時必須安裝的;以后會介紹pt怎么轉換成onnx
,這些用的時候安裝就可以。

3. YOLOv5命令行預測方式介紹??
這里介紹一下官方給提供的預測方式,我們平時都是在Pycharm
中點擊“運行”
按鈕去預測模型,其實還可以通過命令行的方式去預測,預測后的結果會自動保存到runs/detect路徑
下;其實在這條指令后面還可以加上一些參數,具體怎么加后面會詳細說明。
「這里說一下 path/*.jpg ?,這個意思就是預測path文件夾下以.jpg結尾的文件」
4. detect.py文件解讀??
4.1 檢測一下看看效果
我們可以直接運行detect.py
文件試試效果,運行后系統(tǒng)會把檢測結果保存在runs\detect\exp2路徑
下

檢測效果就是這樣子的


這兩張是項目自帶的圖片,我們也可以把自己想測試的圖片或者視頻放到這個路徑下:

4.2 參數詳解
打開detect.py
直接看217行

4.2.1 “weights”

這個就是指定網絡權重的路徑,默認是“yolov5s.pt”
,官方提供了很多的版本,我們要更換的時候直接按照Model的名字更換就可以了;例如“yolov5m.pt”
“yolov5l.pt”
,他會自動的下載對應的權重,不需要我們去Github手動下載.(如果下載太慢或者失敗只能去官網下載了,下載好了直接放到根目錄下就可以)

這里說一下“default”:default
是默認的參數,即使我們在運行時不指定具體參數,那么系統(tǒng)也會執(zhí)行默認的值。
4.2.2 “source”

這個參數就是指定網絡輸入的路徑,默認指定的是文件夾,也可以指定具體的文件或者擴展名等

4.2.3 “data”

這個就是配置文件的一個路徑,配置文件里面包含了下載路徑和一些數據集基本信息,在訓練時如果不自己指定數據集,系統(tǒng)會自己下載coco128數據集

4.2.4 “imgsz, img, img-size”

這個意思就是模型在檢測圖片前會把圖片resize成640的size
,然后再喂進網絡里,并不是說會把們最終得到的結果resize成640大小
。
4.2.5 “conf-thres”

這個就是置信度的閾值,置信度這個概念我在我的博文“YOLOv1詳細解讀”里面詳細介紹了一下,感興趣的小伙伴可以看一下。
「通俗一點來說就是網絡對檢測目標相信的程度,如果這里設置“0”的話,那么網絡只要認為這他預測的這個目標有一點點的概率是正確的目標,他都會給框出來,我們可以通過這幾幅圖對比一下」。
我這里把conf-thres參數
依次設置成“0”, “0.25”,“0.8”
原圖:

conf-thres=0

conf-thres=0.25

conf-thres=0.8

我覺得還是根據自己的數據集情況自行調整
4.2.6 “iou-thres”

這個參數就是調節(jié)IoU
的閾值,這里簡單介紹一下NMS
和IoU
「4.2.6.1 NMS介紹」
在執(zhí)行目標檢測任務時,算法可能對同一目標有多次檢測。NMS 是一種讓你確保算法只對每個對象得到一個檢測框的方法。

在正式使用NMS之前,通常會有一個候選框預清理的工作(簡單引入一個置信度閾值),如下圖所示:

NMS 算法的大致過程:每輪選取置信度最大的 Bounding Box(簡稱 BBox)
接著關注所有剩下的BBox
中與選取的BBox
有著高重疊(IoU)的,它們將在這一輪被抑制。這一輪選取的BBox
會被保留輸出,且不會在下一輪出現。接著開始下一輪,重復上述過程:選取置信度最大BBox
,抑制高IoU BBox
。(關于Bounding Box Regression的詳細介紹,我強力推薦我的另一篇博文)
IoU可以理解預測框和真實框的交并比

NMS步驟:
第一步:對 BBox 按置信度排序,選取置信度最高的 BBox(所以一開始置信度最高的 BBox 一定會被留下來);
第二步:對剩下的 BBox 和已經選取的 BBox 計算 IOU,淘汰(抑制) IOU 大于設定閾值的 BBox(在圖例中這些淘汰的 BBox 的置信度被設定為0)。
第三步:重復上述兩個步驟,直到所有的 BBox 都被處理完,這時候每一輪選取的 BBox 就是最后結果。

在上面這個例子中,NMS只運行了兩輪就選取出最終結果:第一輪選擇了紅色BBox,淘汰了粉色BBox;第二輪選擇了黃色BBox,淘汰了紫色 BBox和青色BBox。注意到這里設定的IoU閾值是0.5,假設將閾值提高為0.7,結果又是如何?

可以看到,NMS 用了更多輪次來確定最終結果,并且最終結果保留了更多的 BBox,但結果并不是我們想要的。因此,在使用 NMS 時,IoU 閾值的確定是比較重要的,但一開始我們可以選定 default 值(論文使用的值)進行嘗試。
「4.2.6.2 不同閾值例子」如果看不懂的話就直接通過例子來理解一下:
這里我“iou-thres”分別取“0”,“0.45”,“0.9”,“1”
iou-thres=0:

iou-thres=0.45:

iou-thres=0.9:

iou-thres=1:

4.2.7 “max-det”

這個就是最大檢測數量,默認是最多檢測1000個目標:
我這里把“max-det”分別設置成“0”“1”“5”“1000”大家感受一下
max-det=0:

max-det=1:

max-det=5:

max-det=1000:

4.2.8 “device”

這個參數意思就是指定GPU數量,如果不指定的話,他會自動檢測,這個參數是給GPU多的土豪準備的。
4.2.9 “action='store_true'”說明
這個類型的參數和之前的有很大區(qū)別,大家可以把他理解成一個“開關”,當我們運行程序的時候如果指定了帶有action='store_true'類型的參數,那么就相當于啟動這個參數所對應的功能,反之則不。我會拿下面的舉個例子。

4.2.10 “view-img”

這個參數意思就是檢測的時候是否實時的把檢測結果顯示出來,即我如果在終端中輸入以下指令 :
那么意思就是我在檢測的時候系統(tǒng)要把我檢測的結果實時的顯示出來,假如我文件夾有5張圖片,如果指定了這個參數的話,那么模型每檢測出一張就會顯示出一張,直到所有圖片檢測完成。如果我不指定這個參數,那么模型就不會一張一張的顯示出來。
4.2.11 “save-txt”

這個參數的意思就是是否把檢測結果保存成一個.txt的格式,我們來看一下指定了這個參數的效果:
終端鍵入:
可以看到輸出結果多了一個labels文件夾

打開這個文件夾我們就可以看到兩個.txt文件

這兩個.txt文件里面保存了一些類別信息和邊框的位置信息

4.2.12 “save-conf”

這個參數的意思就是是否以.txt的格式保存目標的置信度
如果單獨指定這個命令是沒有效果的;
必須和--save-txt配合使用,即:

如果指定了這個參數就可以發(fā)現,同樣是保存txt格式的文件,這次多了紅色框里面的置信度值。原來每行只有5個數字,現在有6個了。
4.2.13 “save-crop”

這個參數的意思就是是否把模型檢測的物體裁剪下來,如果開啟了這個參數會在crops文件夾下看到幾個以類別命名的文件夾,里面保存的都是裁剪下來的圖片。

這幾張就是backpack和handbag文件夾下的圖片



4.2.14 “nosave”

開啟這個參數就是不保存預測的結果,但是還會生成exp文件夾,只不過是一個空的exp

我覺得這個參數應該是和“--view-img”配合使用的
4.2.15 “classes”


這里又出現了一個新的參數,這個的意思就是我們可以給變量指定多個賦值,也就是說我們可以把“0”賦值給“classes”,也可以把“0”“2”“4”“6”都賦值給“classes”
接下來說classes參數,這里看一下coco128.yaml的配置文件就明白了,比如說我這里給classes指定“0”,那么意思就是只檢測人這個類別。

例:鍵入如下指令:


4.2.16 “agnostic-nms”

這個是增強版的nms,算是一種trick吧,通過一個例子對比一下:

啟用后:

然而我并沒有感受到區(qū)別,或許是我用的yolov5s.pt的原因吧
4.2.17 “augment”

這個參數也是一種增強的方式
啟用前:

啟用后:

這個還是有很明顯的區(qū)別的
4.2.18 “visualize”

這個參數的意思就是是否把特征圖可視化出來,如果開啟了這和參數可以看到exp文件夾下又多了一些文件,這里.npy格式的文件就是保存的模型文件,可以使用numpy讀寫,.png就是圖片文件啦。

下面來看一下保存下來的特征圖:
stage0:

stage3:

stage6:

stage23:

4.2.19 “update”

如果指定這個參數,則對所有模型進行strip_optimizer操作,去除pt文件中的優(yōu)化器等信息。
4.2.20 “project”

這個就是我們預測結果保存的路徑。

4.2.21 “name”

這個就是預測結果保存的文件夾名字

4.2.22 “exist-ok”

這個參數的意思就是每次預測模型的結果是否保存在原來的文件夾,如果指定了這個參數的話,那么本次預測的結果還是保存在上一次保存的文件夾里;如果不指定就是每次預測結果保存一個新的文件夾下。
4.2.23 “l(fā)ine-thickness”

這個參數就是調節(jié)預測框線條粗細的,因為有的時候目標重疊太多會產生遮擋;
終端鍵入:

4.2.24 “hide-labels”

這個參數就是隱藏標簽的
終端鍵入:
?

4.2.25 “hide-conf”

這個參數就是隱藏標簽的置信度用的
終端鍵入;

4.2.26 “half”

這個參數的意思就是是否使用 FP16 半精度推理,簡單介紹一下低精度技術:
低精度技術 (high speed reduced precision)。在training階段,梯度的更新往往是很微小的,需要相對較高的精度,一般要用到FP32以上。在inference的時候,精度要求沒有那么高,一般F16(半精度)就可以,甚至可以用INT8(8位整型),精度影響不會很大。同時低精度的模型占用空間更小了,有利于部署在嵌入式模型里面。
4.2.27 “dnn”

這個參數的意思就是是否使用 OpenCV DNN 進行 ONNX 推理
DNN即Deep Neural Networks
這個我并沒有用過,我覺得應該和torch.hub比較類似
感興趣的小伙伴可以去opencv文檔看一下
參考文獻
非極大值抑制算法
小彩蛋:??
Pycharm通過點擊“運行”按鈕生成exp文件夾的速度要比在終端里鍵入指令生成exp文件夾的速度快。
有問題歡迎大家指正,如果感覺有幫助的話請點贊支持下??????
關注【學姐帶你玩AI】公眾號
回復“YOLO”
論文PDF+代碼數據集免費領!