學(xué)習(xí)筆記-YOLOV5目標(biāo)檢測(cè)初步了解記錄
吐槽:無(wú)奈,好好的?markdown文本一到b站,啥排版都沒了,只能手動(dòng)再調(diào)整。也不知道以后會(huì)不會(huì)支持md格式。似乎有人開發(fā)了轉(zhuǎn)換插件,也不知好不好用。到底還是對(duì)口的網(wǎng)站更對(duì)口些。
大體上對(duì)yolov5模型有了初步了解。模型是類似于應(yīng)用程序的模板,程序員拿過來(lái)改一改就能弄出自己需求功能應(yīng)用。上手只需要修改需要的幾個(gè)參數(shù)或位置,即可拿來(lái)跑出自己的模型權(quán)重,來(lái)用于后期的部署。以下是使用yolov5前基本的了解與熟悉過程的記錄,非教程。
tips:不管是前期配置pytorch環(huán)境,還是之后git yolo本體或pt文件,都最好備著個(gè)代理,不然真是會(huì)被網(wǎng)速折磨的夠嗆。
官方例程運(yùn)行:
detect.py使用yolov5s.pt權(quán)重:
使用了了官方的yolov5s.pt權(quán)重,可以識(shí)別80類物品:
'person','bicycle','car','motorcycle', 'airplane','bus','train', 'truck','boat', 'traffic light'……
運(yùn)行起來(lái),看著還不錯(cuò),蠻有意思的。不過整體置信率都不高。


yolov5m.pt權(quán)重:
換成了更大的yolov5m.pt,卡頓了不少,置信率整體上高了一些。連把書識(shí)別成laptop都更自信了。


實(shí)時(shí)識(shí)別效果:

train.py使用yolov5s.pt訓(xùn)練

數(shù)據(jù)集為coco128,雖然只有128張圖,但也只淺淺地跑了5輪。畢竟我的小筆記本只是1660ti,還是不要為難它了。得到了best.pt。
使用best.pt效果

乍一看其實(shí)也還可以,就是為我們的實(shí)驗(yàn)室新添了個(gè)TV。
好了,玩了好一陣,確實(shí)很有趣,不過接下來(lái)要開始干正事了。

項(xiàng)目結(jié)構(gòu):基本完成
要學(xué)習(xí)一個(gè)項(xiàng)目,項(xiàng)目結(jié)構(gòu)是必須先了解的。一個(gè)不錯(cuò)的詳解學(xué)習(xí)文章:
https://blog.csdn.net/weixin_43334693/article/details/129356033
通過此博客,基本了解yolov5項(xiàng)目結(jié)構(gòu),知道大體上文件及文件夾作用,知道首先需要注意哪幾個(gè)文件及文件夾。下圖顯示了我們初學(xué)者主要需要關(guān)注的文件或文件夾:

tips:聽到某個(gè)人說數(shù)據(jù)集本體最好放在根目錄下,不要放在data文件夾下。
文件結(jié)構(gòu)基本清楚了,繼續(xù)下一步吧。讀源碼,也是根據(jù)此人的博客。

源碼閱讀:
由于源碼中存在注釋,在記錄中只標(biāo)記代碼段功能,不再額外引用代碼。有一說一,看代碼確實(shí)是個(gè)令人頭禿的活計(jì)。
detect.py:基本完成
https://blog.csdn.net/weixin_43334693/article/details/129349094
基本配置:
首先導(dǎo)入包,不必多提
獲取文件路徑,將當(dāng)前.py文件所在項(xiàng)目文件夾添加到python環(huán)境中,使得其可以調(diào)用同一個(gè)文件夾下的其他模塊。
加載自定義模塊中的類,由于有第2步,所以這一步可以導(dǎo)入。
執(zhí)行main函數(shù):
在命令行中中進(jìn)入對(duì)用根目錄,輸入:>python detect.py --source 0,即可運(yùn)行detect.py去采集攝像頭視頻幀進(jìn)行識(shí)別并輸出結(jié)果。
detect.py最后,
if __name__ == "__main__":
opt = parse_opt() # 接收命令行傳來(lái)的參數(shù)到opt中
main(opt) # 用opt參數(shù)去執(zhí)行主函數(shù)
if行只有命令行調(diào)用時(shí)執(zhí)行,與作為模塊調(diào)用執(zhí)行相比,多了個(gè)接受命令行參數(shù)的步驟。
設(shè)置opt參數(shù):
這段代碼是一個(gè) Python 腳本中的一個(gè)函數(shù),用于解析命令行參數(shù)并返回這些參數(shù)的值。
--data:yolov5官方模板指向data/coco128.yaml文件。此yaml文件包括coco128數(shù)據(jù)集路徑;該路徑下的train、val以及test集的劃分路徑。還有coco128數(shù)據(jù)集的標(biāo)簽總數(shù)類別。還有數(shù)據(jù)集下載url 。有人說可以不用管。
--weights: ?訓(xùn)練的權(quán)重路徑,可以使用自己訓(xùn)練的權(quán)重,也可以使用官網(wǎng)提供的權(quán)重。默認(rèn)官網(wǎng)的權(quán)重yolov5s.pt(yolov5n.pt/yolov5s.pt/yolov5m.pt/yolov5l.pt/yolov5x.pt/區(qū)別在于網(wǎng)絡(luò)的寬度和深度以此增加)
--source: ?測(cè)試數(shù)據(jù),可以是圖片/視頻路徑,也可以是'0'(電腦自帶攝像頭),也可以是rtsp等視頻流, 默認(rèn)data/images
--imgsz: ?預(yù)測(cè)時(shí)網(wǎng)絡(luò)輸入圖片的尺寸,默認(rèn)值為 [640]
--conf-thres: ?置信度閾值,默認(rèn)為 0.50
……
執(zhí)行run函數(shù):
載入?yún)?shù)。
初始化配置。這段代碼主要用于處理輸入來(lái)源。定義了一些布爾值區(qū)分輸入是圖片、視頻、網(wǎng)絡(luò)流還是攝像頭。
保存結(jié)果。這段代碼主要是用于創(chuàng)建保存輸出結(jié)果的目錄。創(chuàng)建一個(gè)新的文件夾exp(在runs文件夾下)來(lái)保存運(yùn)行的結(jié)果。
加載模型。這段代碼主要是用于選擇設(shè)備、初始化模型和檢查圖像大小。
加載數(shù)據(jù)。這段代碼是根據(jù)輸入的 source 參數(shù)來(lái)判斷是否是通過 webcam 攝像頭捕捉視頻流。
推理部分
熱身部分,對(duì)每張圖片/視頻進(jìn)行前向推理,NMS除去多余的框(這段代碼是執(zhí)行非最大值抑制(NMS)的步驟,用于篩選預(yù)測(cè)結(jié)果,預(yù)測(cè)過程(這段代碼使用了一個(gè)循環(huán)來(lái)遍歷檢測(cè)結(jié)果列表中的每個(gè)物體,并對(duì)每個(gè)物體進(jìn)行處理),打印目標(biāo)檢測(cè)結(jié)果,在窗口中實(shí)時(shí)查看檢測(cè)結(jié)果,設(shè)置保存結(jié)果在終端里打印出運(yùn)行的結(jié)果
train.py:存疑/未完成
https://blog.csdn.net/weixin_43334693/article/details/129460666
導(dǎo)包和基本配置,分布式訓(xùn)練初始化(如果具有多GPU)。大體同detect.py。
執(zhí)行main()函數(shù):
檢查分布式訓(xùn)練環(huán)境。
判斷是否斷點(diǎn)續(xù)訓(xùn)。
判斷是否分布式訓(xùn)練。
判斷是否進(jìn)化訓(xùn)練。設(shè)置opt參數(shù)。
執(zhí)行train()函數(shù):
加載參數(shù)和初始化配置信息。
加載網(wǎng)絡(luò)模型。
加載數(shù)據(jù)集。
訓(xùn)練過程。
打印消息釋放緩存。執(zhí)行run()函數(shù)。類似于命令行支持函數(shù),可以使得別的模塊導(dǎo)入train.py后,通過run調(diào)用執(zhí)行訓(xùn)練過程。
有一說一,train.py的閱讀過程極其艱難與痛苦,大部分的原因還是長(zhǎng)期積累缺失導(dǎo)致的各類專有名詞與python基礎(chǔ)代碼實(shí)現(xiàn)的不認(rèn)識(shí)/不熟練,以至于能不能說讀完了讀完源碼都得打個(gè)大大的問號(hào)。不過,基本的功能對(duì)應(yīng)的代碼位置確定了,至于別的更細(xì)的,說到底是個(gè)水磨工夫,慢慢來(lái)吧。

總結(jié):
到目前為止,yolov5的初步使用所需的應(yīng)該具備了,準(zhǔn)備開始嘗試訓(xùn)練自己的小玩意吧。