YoLoV5学习(5)-- Train.py 程序文件与yolov5s模型文件讲解
本篇博客主要是對(duì)于train文件以及yolov5s.yaml文件進(jìn)行講解,yolov5代碼雖然一直有在更新但整體的框架基本相似。
1.Usage
該部分是作者的一個(gè)說明。
第一行表示我們傳入的data數(shù)據(jù)集是coco128數(shù)據(jù)集,權(quán)重模型是yolov5s模型,–img表示圖片大小640,第二行與第一行的主要區(qū)別在于,第一行是在加載yolov5s的權(quán)重基礎(chǔ)上進(jìn)行訓(xùn)練,而第二行是在配置yolov5s網(wǎng)絡(luò)結(jié)構(gòu)后,從零開始搭建一個(gè)模型,然后從頭開始訓(xùn)練。
2.導(dǎo)包、導(dǎo)庫(kù)操作
前面都是一些導(dǎo)包導(dǎo)庫(kù)操作,train文件在如下圖部分出現(xiàn)三個(gè)參數(shù),這三個(gè)參數(shù)主要用于分布式訓(xùn)練,對(duì)于我們初學(xué)者而言,一般都是默認(rèn)參數(shù)。
3.解析參數(shù)
將參數(shù)進(jìn)行傳遞然后解析。主要包含四大部分。
3.1首先是校驗(yàn)函數(shù)
3.2main函數(shù)
首先是代碼的校驗(yàn)工作,緊接著會(huì)根據(jù)是否在命令行傳入Resume來判斷執(zhí)行不同的操作,第三部分會(huì)判斷你是否采用DDP這種訓(xùn)練方法,第四部分開始正式進(jìn)行訓(xùn)練。
首先它會(huì)根據(jù)rank變量來判斷是否執(zhí)行下面的三行代碼,這塊rank的這個(gè)值在開頭也已經(jīng)說過,如果不進(jìn)行分布式訓(xùn)練的話,默認(rèn)是-1,因此它會(huì)去執(zhí)行下面的三行代碼,第一行是負(fù)責(zé)打印文件所用到的參數(shù)信息,這個(gè)參數(shù)包括命令行傳入進(jìn)去的參數(shù)以及默認(rèn)參數(shù),第二行是檢查yolov5的github倉(cāng)庫(kù)是否更新,如果更新的話,會(huì)有一個(gè)提示。第三行用來檢查requirements中要求的安裝包有沒有正確安裝成功,沒有成功的話會(huì)給予一定的提示。
首先它會(huì)判斷你有沒有在命令行中傳入resume這個(gè)參數(shù),resume參數(shù)表示在中斷中恢復(fù),例如我們因電腦斷電等情況下,導(dǎo)致訓(xùn)練尚未完成而停止,那我們就可以利用這個(gè)參數(shù)將我們之前的訓(xùn)練給恢復(fù)過來。因?yàn)槲覀兪褂玫氖莥olov5s.pt這個(gè)訓(xùn)練模型,因此并沒有必要傳入這個(gè)參數(shù),所以它會(huì)執(zhí)行else中的代碼內(nèi)容。
在else代碼中首先它會(huì)去檢查這幾個(gè)文件的路徑,包括數(shù)據(jù)集data,cfg以及權(quán)重、project等,這里我們沒有用到cfg,因此它傳入為空,緊接著判斷cfg與weights是否都為空,如果為空的話,會(huì)進(jìn)行報(bào)錯(cuò)。
接下來會(huì)進(jìn)行是否輸入evolve判斷,決定保存在那個(gè)文件夾下面,那這里我們沒有輸入evolve。接著是保存文件的名稱。
這部分它會(huì)選擇你是使用cpu還是gpu,假如你采用的是分布式訓(xùn)練的話,它就會(huì)額外執(zhí)行下面的一些操作,我們這里一般不會(huì)用到分布式,所以也就沒有執(zhí)行什么東西。
在模型訓(xùn)練這部分,如果輸入evolve會(huì)執(zhí)行else下面這些代碼,因?yàn)槲覀儧]有輸入evolve并且不是分布式訓(xùn)練,因此會(huì)執(zhí)行train函數(shù)。因此,其實(shí)我們只需要關(guān)注一下train函數(shù)就可以啦。evolve呢是作者給出的一種凈化超參數(shù)的方法,一般情況下,我們采用默認(rèn)的參數(shù)配合部分手動(dòng)調(diào)參,就已經(jīng)足夠優(yōu)秀啦。
3.3train函數(shù)
然后是最關(guān)鍵的train函數(shù),首先是一些參數(shù)的傳入,然后定義了訓(xùn)練權(quán)重文件的文件路徑保存,緊接著是一些訓(xùn)練過程中需要使用的超參數(shù),將一些超參數(shù)加載,并打印出來。
隨后進(jìn)行運(yùn)行配置過程的保存操作,會(huì)保存在你訓(xùn)練目錄下的hyp.yaml文件中,并且會(huì)保存你執(zhí)行過程中使用的參數(shù)在opt.yaml文件中。
在日志文件中,基于wandb與tensorboard這兩個(gè)庫(kù)來完成訓(xùn)練過程中的可視化操作。在這個(gè)文件中完成對(duì)于程序訓(xùn)練日志的記錄過程。
Config文件中,首先基于plots的true或者false反饋是否將訓(xùn)練過程及結(jié)果給畫出來,緊接著判斷電腦是否支持cuda,第三行是為了保證我們的訓(xùn)練是否是可復(fù)現(xiàn)的,第四行是與分布式訓(xùn)練相關(guān)的,如果不進(jìn)行分布式訓(xùn)練則不執(zhí)行。第五行會(huì)進(jìn)行數(shù)據(jù)集檢查讀取操作,第六行會(huì)取出數(shù)據(jù)集的訓(xùn)練路徑以及驗(yàn)證路徑,第七行取出你的類名,第八行會(huì)進(jìn)行類的種數(shù)以及類的名稱是否相同的判斷,不相同會(huì)進(jìn)行報(bào)錯(cuò)處理,最后一行會(huì)進(jìn)行是否是coco數(shù)據(jù)集進(jìn)行判斷,如果是的話會(huì)進(jìn)行一些額外的操作,本次不是,回復(fù)false。
然后呢是模型加載部分,首先會(huì)去檢測(cè)傳進(jìn)來的權(quán)重參數(shù)后綴名是否以.pt結(jié)尾,如果本地沒有就回去會(huì)嘗試去yolov5官方倉(cāng)庫(kù)去下載權(quán)重文件,加載權(quán)重文件,緊接著會(huì)根據(jù)你的權(quán)重文件中會(huì)帶著一個(gè)yolov5s.yaml文件,代碼根據(jù)yolov5s.yaml進(jìn)行模型的訓(xùn)練。這塊的主要意思通俗的理解就是我們預(yù)訓(xùn)練模型是yolov5s.pt,我們的新模型是基于我們自己的識(shí)別檢測(cè)需求在yolov5s的基礎(chǔ)上完成的。
Freeze是一個(gè)凍結(jié)過程,跟我們的傳遞參數(shù)有關(guān),默認(rèn)不凍結(jié),在opt中我們傳入10即表示我們凍結(jié)了backbone部分,也就是說我們訓(xùn)練過程中只用了head部分。通過Freeze這部分代碼,你可以手動(dòng)去控制你想凍結(jié)哪些層。
這部分代碼主要是用于檢查輸入圖片的尺寸滿不滿足32的倍數(shù),如果不滿足的話它會(huì)幫你自動(dòng)補(bǔ)成32的倍數(shù)。
Batchsize部分一般不會(huì)去執(zhí)行,除非我們手動(dòng)輸入-1,默認(rèn)是16。
接下來是創(chuàng)建深度學(xué)習(xí)的優(yōu)化器,隨機(jī)衰減策略以及指數(shù)移動(dòng)平均的方法。
#DP mode會(huì)判斷是不是用了多張顯卡,#SyncBatchNorm是跟分布式訓(xùn)練相關(guān)的,然后是加載訓(xùn)練數(shù)據(jù)操作,加載驗(yàn)證集數(shù)據(jù)操作。
緊接著是開始訓(xùn)練工作,在這個(gè)工程中,“compute_loss=ComputeLoss(model)”定義損失函數(shù),等到訓(xùn)練結(jié)束,這個(gè)時(shí)候會(huì)挑選出 best.weight對(duì)驗(yàn)證集進(jìn)行驗(yàn)證測(cè)試,并把這個(gè)結(jié)果給打印出來。
4.YoloV5S.yaml
nc表示yolov5s所能預(yù)測(cè)出來的種類數(shù),這里是80種。anchors就是提前定義好的一些矩形框,利用這些矩形框完成檢測(cè)。三層anchors分別對(duì)應(yīng)不同的特征層級(jí),在每一層anchors上又定義了3個(gè)不同的anchors。depth_multiple深度倍數(shù)表示的含義體現(xiàn)為backbone中number的參數(shù)乘以depth_multiple即為實(shí)際參數(shù),width_multiple表示通道參數(shù),args中的特征通道參數(shù)乘以width_multiple即為實(shí)際參數(shù)。實(shí)際對(duì)比yolov5s、5l、5m、5n、以及5x就可以發(fā)現(xiàn),.yaml文件中只有depth_multiple深度倍數(shù)以及width_multiple通道參數(shù)是不一樣的。因此,這兩個(gè)參數(shù)可以通俗的理解為調(diào)整網(wǎng)絡(luò)規(guī)模。
backbone表示yolov5模型結(jié)構(gòu)中的backbone結(jié)構(gòu),這一行行表示yolov5每一層的結(jié)構(gòu)信息,不同的層結(jié)構(gòu)都定義在common.py文件中,這里的Conv、C3、Concat等,args表示參數(shù),是根據(jù)前面module的形式確定相應(yīng)的參數(shù)。
head表示yolov5的head部分,yolov5中沒有neck,相似結(jié)構(gòu)被作者并在head里。
本次就先到這,學(xué)習(xí)交流,互相進(jìn)步~
總結(jié)
以上是生活随笔為你收集整理的YoLoV5学习(5)-- Train.py 程序文件与yolov5s模型文件讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MT8168中断流程
- 下一篇: 实际 MIDI 文件分析