html大作業(yè)源代碼(html5期末作業(yè)源代碼)
向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????
本篇我們會(huì)介紹 yolo.py,這是YOLO的特定模塊,和網(wǎng)絡(luò)構(gòu)建有關(guān)。在 YOLOv5源碼中,模型的建立是依靠 yolo.py 中的函數(shù)和對(duì)象完成的,這個(gè)文件主要由三個(gè)部分:parse_model函數(shù)、Detect類(lèi)和Model類(lèi)組成。
yolo.py文件位置在./models/yolo.py
文章代碼逐行手打注釋?zhuān)總€(gè)模塊都有對(duì)應(yīng)講解,一文幫你梳理整個(gè)代碼邏輯!
一、 導(dǎo)包和基本配置 1.1 導(dǎo)入安裝好的python庫(kù)
首先,導(dǎo)入一下常用的python庫(kù):
argparse: 它是一個(gè)用于命令項(xiàng)選項(xiàng)與參數(shù)解析的模塊,通過(guò)在程序中定義好我們需要的參數(shù),argparse 將會(huì)從 sys.argv 中解析出這些參數(shù),并自動(dòng)生成幫助和使用信息
sys:它是與python解釋器交互的一個(gè)接口,該模塊提供對(duì)解釋器使用或維護(hù)的一些變量的訪問(wèn)和獲取,它提供了許多函數(shù)和變量來(lái)處理 Python 運(yùn)行時(shí)環(huán)境的不同部分
展開(kāi)全文
copy: Python 中賦值語(yǔ)句不復(fù)制對(duì)象,而是在目標(biāo)和對(duì)象之間創(chuàng)建綁定關(guān)系。copy模塊提供了通用的淺層復(fù)制和深層復(fù)制操作
pathlib: 這個(gè)庫(kù)提供了一種面向?qū)ο蟮姆绞絹?lái)與文件系統(tǒng)交互,可以讓代碼更簡(jiǎn)潔、更易讀
1.2 獲取當(dāng)前文件的絕對(duì)路徑
這段代碼會(huì)獲取 當(dāng)前文件的絕對(duì)路徑,并使用Path庫(kù)將其轉(zhuǎn)換為Path對(duì)象。
這一部分的主要作用有兩個(gè):
將當(dāng)前項(xiàng)目添加到系統(tǒng)路徑上,以使得項(xiàng)目中的模塊可以調(diào)用。
將當(dāng)前項(xiàng)目的相對(duì)路徑保存在ROOT中,便于尋找項(xiàng)目中的文件。
這些都是用戶(hù)自定義的庫(kù),由于上一步已經(jīng)把路徑加載上了,所以現(xiàn)在可以導(dǎo)入,這個(gè)順序不可以調(diào)換。具體來(lái)說(shuō),代碼從如下幾個(gè)文件中導(dǎo)入了部分函數(shù)和類(lèi):
models.common: 這個(gè)是yolov5的網(wǎng)絡(luò)結(jié)構(gòu)
models.experimental: 實(shí)驗(yàn)性質(zhì)的代碼,包括MixConv2d、跨層權(quán)重Sum等
utils.autoanchor: 定義了自動(dòng)生成錨框的方法
utils.general: 定義了一些常用的工具函數(shù),比如檢查文件是否存在、檢查圖像大小是否符合要求、打印命令行參數(shù)等等
utils.plots: 定義了Annotator類(lèi),可以在圖像上繪制矩形框和標(biāo)注信息
utils.torch_utils: 定義了一些與PyTorch有關(guān)的工具函數(shù),比如選擇設(shè)備、同步時(shí)間等
通過(guò)導(dǎo)入這些模塊,可以更方便地進(jìn)行目標(biāo)檢測(cè)的相關(guān)任務(wù),并且減少了代碼的復(fù)雜度和冗余。
二、parse_model函數(shù)
parse_model函數(shù)用在DetectionModel模塊中,主要作用是解析模型yaml的模塊,通過(guò)讀取yaml文件中的配置,并且到common.py中找到相對(duì)于的模塊,然后組成一個(gè)完整的模型解析模型文件(字典形式),并搭建網(wǎng)絡(luò)結(jié)構(gòu)。簡(jiǎn)單來(lái)說(shuō),就是把yaml文件中的網(wǎng)絡(luò)結(jié)構(gòu)實(shí)例化成對(duì)應(yīng)的模型。后續(xù)如果需要?jiǎng)幽P涂蚣艿脑?,需要?duì)這個(gè)函數(shù)做相應(yīng)的改動(dòng)。
2.1 獲取對(duì)應(yīng)參數(shù)
這段代碼主要是獲取配置dict里面的參數(shù),并打印最開(kāi)始展示的網(wǎng)絡(luò)結(jié)構(gòu)表的表頭。
我們先解釋幾個(gè)參數(shù),d和ch,na和no:
d: yaml 配置文件(字典形式),yolov5s.yaml中的6個(gè)元素 + ch
ch: 記錄模型每一層的輸出channel,初始ch=[3],后面會(huì)刪除
na: 判斷anchor的數(shù)量
no: 根據(jù)anchor數(shù)量推斷的輸出維度
這里有一行代碼我們上篇YOLOv5源碼逐行超詳細(xì)注釋與解讀(5)——配置文件yolov5s.yaml就見(jiàn)過(guò)了:
這里就是讀取了 yaml 文件的相關(guān)參數(shù)(參數(shù)含義忘了的話再看看上篇哦)
2.2 搭建網(wǎng)絡(luò)前準(zhǔn)備
這段代碼主要是遍歷backbone和head的每一層,獲取搭建網(wǎng)絡(luò)前的一系列信息。
我們還是先解釋參數(shù),layers、save和c2:
layers: 保存每一層的層結(jié)構(gòu)
save: 記錄下所有層結(jié)構(gòu)中from不是-1的層結(jié)構(gòu)序號(hào)
c2: 保存當(dāng)前層的輸出channel
然后開(kāi)始迭代循環(huán)backbone與head的配置。for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']):中有幾個(gè)參數(shù)
f:from,當(dāng)前層輸入來(lái)自哪些層
n:number,當(dāng)前層次數(shù) 初定
m:module,當(dāng)前層類(lèi)別
args:當(dāng)前層類(lèi)參數(shù) 初定
接著還用到一個(gè)函數(shù)eval,主要作用是將字符串當(dāng)成有效的表達(dá)式來(lái)求值,并且返回執(zhí)行的結(jié)果。在這里簡(jiǎn)單來(lái)說(shuō),就是實(shí)現(xiàn)list、dict、tuple與str之間的轉(zhuǎn)化。
2.3 更新當(dāng)前層的參數(shù),計(jì)算c2
這段代碼主要是更新當(dāng)前層的args,計(jì)算c2(當(dāng)前層的輸出channel)
首先網(wǎng)絡(luò)將C3中的BottleNeck數(shù)量乘以模型縮放倍數(shù)n*gd控制模塊的深度縮放,舉個(gè)栗子,對(duì)于yolo5s來(lái)講,gd為0.33,那么就是n*0.33,也就是把默認(rèn)的深度縮放為原來(lái)的1/3。
然后將m實(shí)例化成同名模塊,別看列舉了那么多模塊,目前只用到Conv,SPP,F(xiàn)ocus,C3,nn.Upsample。對(duì)于以上的這幾種類(lèi)型的模塊,ch是一個(gè)用來(lái)保存之前所有的模塊輸出的channle,ch[-1]代表著上一個(gè)模塊的輸出通道。args[0]是默認(rèn)的輸出通道。
這樣以來(lái),c1=ch[f]就代表輸入通道c1為f指向的層的輸出通道,c2=args[0]就代表輸出通道c2為yaml的args中的第一個(gè)變量。注意,如果輸出通道不等于255即Detect層的輸出通道, 則將通道數(shù)乘上width_multiple,并調(diào)整為8的倍數(shù)。通過(guò)函數(shù)make_divisible來(lái)實(shí)現(xiàn)
make_divisible代碼如下:
2.4 使用當(dāng)前層的參數(shù)搭建當(dāng)前層
這段代碼主要是使用當(dāng)前層的參數(shù)搭建當(dāng)前層。
經(jīng)過(guò)以上處理,args里面保存的前兩個(gè)參數(shù)就是module的輸入通道數(shù)、輸出通道數(shù)。只有BottleneckCSP和C3這兩種module會(huì)根據(jù)深度參數(shù)n調(diào)整該模塊的重復(fù)迭加次數(shù)
然后進(jìn)行的是其他幾種類(lèi)型的Module判斷:
如果是BN層,只需要返回上一層的輸出channel,通道數(shù)保持不變。
如果是Concat層,則將f中所有的輸出累加得到這層的輸出channel,f是所有需要拼接層的index,輸出通道c2是所有層的和。
如果是Detect層,則對(duì)應(yīng)檢測(cè)頭部分,這塊下一小節(jié)細(xì)講。
Contract和Expand目前未在模型中使用。
2.5 打印和保存layers
這段代碼主要是打印當(dāng)前層結(jié)構(gòu)的一些基本信息并保存。
把構(gòu)建的模塊保存到layers里,把該層的輸出通道數(shù)寫(xiě)入ch列表里。待全部循環(huán)結(jié)束后再構(gòu)建成模型。
返回值:
return nn.Sequential(*layers): 網(wǎng)絡(luò)的每一層的層結(jié)構(gòu)
return sorted(save): 把所有層結(jié)構(gòu)中from不是-1的值記下 并排序 [4, 6, 10, 14, 17, 20, 23]
至此模型就全部構(gòu)建完畢了。
下面詳細(xì)介紹一下各個(gè)模塊。
?? 三、Detect模塊
Detect 模塊是 YOLO 網(wǎng)絡(luò)模型的最后一層 (對(duì)應(yīng) yaml 文件最后一行),通過(guò) yaml 文件進(jìn)行聲明,格式為:
3.1 獲取預(yù)測(cè)得到的參數(shù)
這段代碼主要是獲取預(yù)測(cè)得到的各種信息。
detection layer 相當(dāng)于yolov3中的YOLOLayer層,我們解釋一下包含的參數(shù):
nc: 分類(lèi)數(shù)量
no: 每個(gè)anchor的輸出數(shù),為(x,y,w,h,conf) + nc = 5 + nc 的總數(shù)
nl: 預(yù)測(cè)層數(shù),此次為3
na: anchors的數(shù)量,此次為3
grid: 格子坐標(biāo)系,左上角為(1,1),右下角為(input.w/stride,input.h/stride)
3.2 向前傳播
這段代碼主要是對(duì)三個(gè)feature map分別進(jìn)行處理:(n, 255, 80, 80),(n, 255, 40, 40),(n, 255, 20, 20)
首先進(jìn)行for循環(huán),每次i的循環(huán),產(chǎn)生一個(gè)z。維度重排列:(n, 255, _, _) - (n, 3, nc+5, ny, nx) - (n, 3, ny, nx, nc+5),三層分別預(yù)測(cè)了80*80、40*40、20*20次。
接著 構(gòu)造網(wǎng)格,因?yàn)橥评矸祷氐牟皇菤w一化后的網(wǎng)格偏移量,需要再加上網(wǎng)格的位置,得到最終的推理坐標(biāo),再送入nms。所以這里構(gòu)建網(wǎng)格就是為了紀(jì)律每個(gè)grid的網(wǎng)格坐標(biāo) 方面后面使
最后按損失函數(shù)的回歸方式來(lái)轉(zhuǎn)換坐標(biāo),利用sigmoid激活函數(shù)計(jì)算定位參數(shù),cat(dim=-1)為直接拼接。注意:訓(xùn)練階段直接返回x ,而預(yù)測(cè)階段返回3個(gè)特征圖拼接的結(jié)果
3.3 相對(duì)坐標(biāo)轉(zhuǎn)換到grid絕對(duì)坐標(biāo)系
這段代碼主要是將相對(duì)坐標(biāo)轉(zhuǎn)換到grid絕對(duì)坐標(biāo)系。
首先構(gòu)造網(wǎng)格標(biāo)尺坐標(biāo)
indexing='ij' : 表示的是i是同一行,j表示同一列
indexing='xy' : 表示的是x是同一列,y表示同一行
grid復(fù)制成3倍,因?yàn)槭?個(gè)框。anchor_grid是每個(gè)anchor寬高。anchor_grid = (self.anchors[i].clone * self.stride[i])。注意這里為啥要乘呢?因?yàn)樵谕饷嬉呀?jīng)把a(bǔ)nchors給除了對(duì)應(yīng)的下采樣率,這里再乘回來(lái)。
原文地址
機(jī)器學(xué)習(xí)算法AI大數(shù)據(jù)技術(shù)
搜索公眾號(hào)添加: datanlp
閱讀過(guò)本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬(wàn)表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)
《基于深度學(xué)習(xí)的自然語(yǔ)言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門(mén):基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
《深度學(xué)習(xí):基于Keras的Python實(shí)踐》PDF和代碼
特征提取與圖像處理(第二版).pdf
python就業(yè)班學(xué)習(xí)視頻,從入門(mén)到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語(yǔ)言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書(shū)代碼
《深度學(xué)習(xí)之pytorch》pdf+附書(shū)源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門(mén)《pytorch-handbook》
【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車(chē)行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開(kāi)源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
yolo3 檢測(cè)出圖像中的不規(guī)則漢字
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過(guò)不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類(lèi)、‘票據(jù)’分類(lèi)兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類(lèi)
特征工程(一)
特征工程(二) :文本數(shù)據(jù)的展開(kāi)、過(guò)濾和分塊
特征工程(三):特征縮放,從詞袋到 TF-IDF
特征工程(四): 類(lèi)別特征
特征工程(五): PCA 降維
特征工程(六): 非線性特征提取和模型堆疊
特征工程(七):圖像特征提取和深度學(xué)習(xí)
如何利用全新的決策樹(shù)集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
螞蟻金服2018秋招-算法工程師(共四面)通過(guò)
全球AI挑戰(zhàn)-場(chǎng)景分類(lèi)的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
搜索公眾號(hào)添加: datayx
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。