如果直接看yolov3論文的話,會(huì)發(fā)現(xiàn)有好多知識(shí)點(diǎn)沒(méi)見(jiàn)過(guò),所以跟著視頻從頭學(xué)一下。
學(xué)習(xí)up主霹靂吧啦Wz大佬的學(xué)習(xí)方法:
想學(xué)某個(gè)網(wǎng)絡(luò)的代碼時(shí):到網(wǎng)上搜這個(gè)網(wǎng)絡(luò)的講解 → 對(duì)這個(gè)網(wǎng)絡(luò)大概有了印象 → 讀論文原文(
很多細(xì)節(jié)都要依照原論文來(lái)實(shí)現(xiàn),自己看原論文十分重要,發(fā)現(xiàn)更多原來(lái)沒(méi)有發(fā)現(xiàn)的知識(shí)點(diǎn))
→ 讀代碼 (
在github上找大牛實(shí)現(xiàn)了的源代碼,挑選自己喜歡的框架、作者經(jīng)常更新的代碼倉(cāng)庫(kù)、標(biāo)star比較多的,來(lái)克隆代碼 進(jìn)行學(xué)習(xí)
)
克隆第一步:根據(jù)作者的readme將作者代碼跑通;
克隆第二步:分析作者代碼(可以先看:
①網(wǎng)絡(luò)搭建部分,結(jié)合原論文比較好理解;
②數(shù)據(jù)預(yù)處理、損失計(jì)算(損失函數(shù));
看完以上基本上就掌握了網(wǎng)絡(luò)的核心知識(shí)點(diǎn)
)
看代碼時(shí)需要結(jié)合原論文進(jìn)行參考。有時(shí)在讀原論文時(shí),有些地方不太好理解,但如果結(jié)合別人的代碼,也可以更好地理解。
yolo v1
慢于SSD,但是比Faster RCNN快(精度比Faster RCNN低)
一般S取7(每行每列分成7等份)
如果某個(gè)object的中心落在這個(gè)網(wǎng)格,那么這個(gè)網(wǎng)格就負(fù)責(zé)預(yù)測(cè)這個(gè)object。
黃框就負(fù)責(zé)預(yù)測(cè)狗這個(gè)目標(biāo)
- B一般取2,S一般取7。
confidence:在YOLO系列中獨(dú)有的參數(shù)。
數(shù)據(jù)集PASCAL VOC,共20個(gè)類(lèi)別 C=20,
grid cell是7*7大小的 S=7,
Bounding box取B=2,
預(yù)測(cè)的參數(shù)個(gè)數(shù) 7 * 7 * 30:
30 = 2個(gè)框 * 每個(gè)框5個(gè)參數(shù)(4個(gè)位置+1個(gè)confidence) +20類(lèi)
通過(guò)YOLOV1網(wǎng)絡(luò)傳播,最終得到7 * 7,深度為30的矩陣。
對(duì)于沿著深度方向的每一行:
2組bounding box 的參數(shù),該網(wǎng)格預(yù)測(cè)的c個(gè)類(lèi)別分?jǐn)?shù)。 - 每個(gè)bounding box由5個(gè)值組成:x,y(預(yù)測(cè)框中心坐標(biāo),數(shù)值在0 ~ 1之間(相對(duì)于grid cell而言)),w,h(數(shù)值在0 ~ 1之間,也是相對(duì)值,是相對(duì)于整個(gè)圖像而言的),confidence。
相對(duì)值比實(shí)際值,相對(duì)值更方便運(yùn)算(0 ~ 1之間的數(shù)字對(duì)訓(xùn)練有好處,收斂快,且不容易出現(xiàn)極端值)。 - confidence 預(yù)測(cè)bounding box與真實(shí)bounding box之間的交并比。
與Faster RCNN和SSD預(yù)測(cè)的目標(biāo)概率是不一樣的。
網(wǎng)絡(luò)結(jié)構(gòu):
- 7 * 7卷積層,步距為2,通過(guò)一個(gè)maxpooling最大池化下采樣(步距為2)
- 3 * 3卷積層,步距1(沒(méi)有標(biāo)s,那么步距就是默認(rèn)為1),通過(guò)一個(gè)maxpooling最大池化下采樣
- 通過(guò)1 * 1的卷積層、3 * 3的卷積層、1 * 1的卷積層、3 * 3的卷積層、……
- 將1 * 1的卷積層、3 * 3的卷積層重復(fù)四遍,……
- 將……重復(fù)兩遍,再……
- 再通過(guò)兩個(gè)3 * 3的卷積層,得到 7* 7,深度為1024的特征矩陣。
- Conn.Layer ①transpose不一定有,主要根據(jù)tensor通道排列順序決定的。②展平處理。③通過(guò)節(jié)點(diǎn)個(gè)數(shù)為4096的全連接層連接。
→得到一個(gè)4096的向量。 - Conn.Layer ①通過(guò)一個(gè)節(jié)點(diǎn)個(gè)數(shù)為1470(7x7x30)的全連接層②通過(guò)reshape處理,得到7 * 7,深度為30的特征矩陣。
損失函數(shù)
三部分計(jì)算。使用誤差平方和求解。
對(duì)寬和高開(kāi)根號(hào)處理:
綠色:真實(shí)目標(biāo)邊界框。藍(lán)色:預(yù)測(cè)得到的目標(biāo)邊界框。
假設(shè)對(duì)于大目標(biāo)和小目標(biāo),預(yù)測(cè)邊界框相對(duì)真實(shí)邊界框都有偏移(假設(shè)一樣)。
可以發(fā)現(xiàn)對(duì)小目標(biāo)的預(yù)測(cè)結(jié)果很差,而對(duì)大目標(biāo)的預(yù)測(cè)結(jié)果還行。(不同尺度IOU不一樣)所以不能用真實(shí)寬度-預(yù)測(cè)寬度。
(
雖然是xy的偏移,但這種大小box不同的偏移差異卻是wh帶來(lái)的。
)
偏移相同的距離,小目標(biāo)的差值要更大一些才行,這樣會(huì)關(guān)注更多的小目標(biāo)定位損失。
(
正樣本置信度損失的回歸值,論文里好像是IoU?
)
存在問(wèn)題
對(duì)群體性的小目標(biāo)檢測(cè)很差。
因?yàn)樵趛olov1的思想中,對(duì)于每個(gè)cell,只預(yù)測(cè)兩個(gè)bounding box,而且這兩個(gè)bounding box屬于同一類(lèi)別。
主要錯(cuò)誤原因來(lái)自于定位不準(zhǔn)確。直接預(yù)測(cè)坐標(biāo)信息,而不是像FasterRCNN或SSD那樣,預(yù)測(cè)相對(duì)anchor的回歸參數(shù)(但是從yolov2開(kāi)始就改成這樣預(yù)測(cè)相對(duì)anchor的回歸參數(shù)了。)
yolo v2
七種嘗試及其所帶來(lái)的效果
Batch Normalization
Yolo v1沒(méi)有使用BN層,而Yolo v2在每個(gè)卷積層后面都加上了BN層。
添加BN層后,對(duì)訓(xùn)練和收斂都有很大幫助,同時(shí)也減少了一系列的正則化處理。
對(duì)模型起到正則化作用。
可以移除掉dropout操作(減輕過(guò)擬合)。
High Resolution Classifier
采用更高分辨率的分類(lèi)器。
Yolo v1 224x224的輸入,Yolo v2 448x448。
Convolutional With Anchor Boxes
使用基于Anchor的目標(biāo)邊界框預(yù)測(cè)。
Yolo v1預(yù)測(cè)目標(biāo)邊界框:直接預(yù)測(cè)目標(biāo)高度寬度以及中心坐標(biāo)。定位效果差。
Yolo v2采用基于Anchor偏移的預(yù)測(cè)效果相比直接預(yù)測(cè)坐標(biāo),可以簡(jiǎn)化目標(biāo)邊界框預(yù)測(cè)問(wèn)題,也可以使網(wǎng)絡(luò)更加容易去學(xué)習(xí)和收斂。
使用后mAP有微小下降,但是召回率(預(yù)測(cè)正確的樣本在總樣本占的比例)大大提升(模型擁有更多提升空間)。
Dimension Clusters
anchor的聚類(lèi)
使用Faster RCNN和SSD時(shí)作者沒(méi)有明確給出為什么要采用作者給定的那些預(yù)設(shè)Anchor(Faster RCNN)或者defult box(SSD)。SSD中有給公式,但是用處不大。反正都沒(méi)說(shuō)怎么得到那個(gè)尺寸的,只說(shuō)是根據(jù)工程經(jīng)驗(yàn)確定的。
拿到新的網(wǎng)絡(luò)該如何選擇預(yù)設(shè)anchor或者default box?
Yolo v2采用k-means聚類(lèi)方法獲得anchor,稱為prior。(Yolo v3中所有的priors也是通過(guò)聚類(lèi)的方法獲得的)
Direct location prediction
目標(biāo)邊界框預(yù)測(cè)(直接預(yù)測(cè)邊界框中心坐標(biāo))
大部分不穩(wěn)定因素在于預(yù)測(cè)邊界框的中心坐標(biāo)(x,y)。
論文中給出了Faster RCNN邊界框預(yù)測(cè)公式:由于公式?jīng)]有受到限制,所以基于anchor預(yù)測(cè)出的目標(biāo)可能會(huì)出現(xiàn)在圖片的任何一個(gè)地方。
yolo對(duì)圖片劃分了區(qū)域,而Faster RCNN中并沒(méi)有。所以如果用Faster RCNN的預(yù)測(cè)方法會(huì)有很大問(wèn)題。
yolov2對(duì)此改進(jìn):
如果將anchor設(shè)置在grid cell 的左上角,坐標(biāo)(cx,cy)。預(yù)測(cè)的bounding box 的prior的寬度高度為pw、ph。
tx:關(guān)于anchor的偏移量,通過(guò)一個(gè)函數(shù)對(duì)它進(jìn)行限制:
σ:logistic activation → sigmoid函數(shù)(將輸入映射到0~1之間)。
如此一來(lái),預(yù)測(cè)框的中心點(diǎn)只會(huì)出現(xiàn)在grid cell之間。
區(qū)域外的目標(biāo)就不去管了。
由于限制了坐標(biāo)信息,所以網(wǎng)絡(luò)更容易進(jìn)行學(xué)習(xí),也更加穩(wěn)定。
Fine-Grained Features
預(yù)測(cè)特征圖結(jié)合一些更底層的信息。
**底層信息包含更多的圖像細(xì)節(jié),而這些細(xì)節(jié)就是在檢測(cè)小目標(biāo)時(shí)所需要的。**直接用高層的信息檢測(cè)小目標(biāo)的結(jié)果很差。
結(jié)合方式:通過(guò)passthrough layer來(lái)實(shí)現(xiàn)。
大佬太牛了:
passthrough layer如何將兩個(gè)大小不同的特征圖進(jìn)行融合?舉例:
對(duì)4x4的特征矩陣進(jìn)行分割,分割成4個(gè)小方格(相同的位置用相同的顏色標(biāo)注)。將同樣顏色的數(shù)值放在同一個(gè)特征圖中。
1個(gè)4x4的特征圖 → 4個(gè)2x2的特征圖,深度x4。
融合過(guò)程:
1*1卷積核可以用來(lái)縮減通道數(shù)減少參數(shù)量。
通過(guò)1x1的卷積層后,特征圖的深度變?yōu)?4。
26x26x512 → 26x26x64
通過(guò)passthrough layer:26x26x64 → 13(26?2)x13x256(64x4)
將兩個(gè)矩陣(13x13x256、13x13x1024)在深度方向進(jìn)行拼接(在深度上相加) → 13x13x1280。
Multi-Scale Training
多尺度訓(xùn)練
在訓(xùn)練過(guò)程中,替換掉固定的輸入尺寸(每個(gè)網(wǎng)絡(luò)輸入圖像的尺寸都是固定的,要么是416x416,要么是480x480,要么是544
x544)
為了提升yolov2的魯棒性,作者把圖片縮放到不同的尺度來(lái)訓(xùn)練模型。
如何調(diào)整圖像尺寸:每經(jīng)過(guò)10個(gè)batch,就對(duì)輸入尺寸進(jìn)行隨機(jī)選擇。由于yolov2網(wǎng)絡(luò)的縮放因子是32(32:
)所以采用的一系列的輸入網(wǎng)絡(luò)的尺寸都是32的整數(shù)倍。從這些中隨機(jī)選取幾個(gè)尺寸作為輸入尺寸。
(
彈幕:yolov2網(wǎng)絡(luò)是全卷積結(jié)構(gòu),輸入大小不受限,不會(huì)改變網(wǎng)絡(luò)結(jié)構(gòu)
)
Backbone骨干網(wǎng)絡(luò) Darknet-19
Darknet-19:19個(gè)卷積層
表里224,實(shí)際輸入時(shí)采用448x448作為高分辨率分類(lèi)器進(jìn)行訓(xùn)練。此處224x224是與之前別的網(wǎng)絡(luò)進(jìn)行對(duì)比。
(
top1:輸出的所有類(lèi)別準(zhǔn)確率排序后第一名是正確的概率;
top5:輸出的所有類(lèi)別準(zhǔn)確率排序后前五名包含正確類(lèi)別的概率(5個(gè)有1個(gè)就算數(shù));
top1指取最大概率模型預(yù)測(cè)判斷正確才算正確,top5指概率前五只要有判斷正確的就視為正確
)
框架
對(duì)于檢測(cè)網(wǎng)絡(luò),移除了最后一個(gè)卷積層。保留了卷積核大小3x3,個(gè)數(shù)1024的卷積層(下圖藍(lán)色框上面那個(gè))。
對(duì)應(yīng)這個(gè):
在后面添加3個(gè)3x3的卷積層,卷積核個(gè)數(shù)都為1024的卷積層。在后面接上一個(gè)1x1的卷積層,它輸出的個(gè)數(shù)就是所需檢測(cè)的目標(biāo)參數(shù)。
對(duì)應(yīng)VOC數(shù)據(jù)集,預(yù)測(cè)5個(gè)bounding box,每個(gè)bounding box會(huì)有5個(gè)參數(shù)(同yolov1中,偏移信息:xywh,+confidence(預(yù)測(cè)目標(biāo)與真實(shí)目標(biāo)的iou值))。由于采用的是VOC數(shù)據(jù)集,所以要預(yù)測(cè)20個(gè)類(lèi)別對(duì)于每個(gè)bounding box而言的分?jǐn)?shù),所以最后一個(gè)卷積層采用125個(gè)卷積核。
x 5(采用5個(gè)anchor)
5(5個(gè)參數(shù))+20(每個(gè)anchor分別對(duì)應(yīng)20個(gè)類(lèi)別的概率分?jǐn)?shù))=25
5 x 25 = 125
(
之前是直接預(yù)測(cè),這里是基于anchor的偏移預(yù)測(cè)
)
yolo v3
https://blog.csdn.net/qq_37541097/article/details/81214953?ops_request_misc=&request_id=117f5f0e641e4e41a7963ed4a8c1e0a7&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-81214953-null-null.268v1control&utm_term=yolov3&spm=1018.2226.3001.4450
主要是整合了當(dāng)前比較主流的網(wǎng)絡(luò)的優(yōu)點(diǎn)
backbone的修改
FPS 每秒鐘推理多少?gòu)垺?br> Top1:最大概率的就是預(yù)測(cè)目標(biāo)
Top5:預(yù)測(cè)概率前5里面有正確的標(biāo)簽
框:殘差結(jié)構(gòu)。
為什么DarkNet-53比ResNet一些深層網(wǎng)絡(luò)效果更好?
都是通過(guò)堆疊一系列殘差結(jié)構(gòu)來(lái)得到最終網(wǎng)絡(luò)。但是DarkNet-53中沒(méi)有最大池化層,所有的下采樣幾乎都是通過(guò)卷積層實(shí)現(xiàn)。
如:步距為2,通過(guò)之后所有的高和寬都縮減為原來(lái)的一半。
通過(guò)卷積層替換原來(lái)的最大池化下采樣 → 檢測(cè)效果提升。
yolov3在3個(gè)預(yù)測(cè)特征層上進(jìn)行預(yù)測(cè)(使用3種尺度)
yolo中稱預(yù)設(shè)的目標(biāo)邊界框:bounding box prior,與之前講的anchor、SSD的default box性質(zhì)都差不多。
N:預(yù)測(cè)特征層大小,13或者26或者52.
3:每個(gè)特征層上預(yù)測(cè)3個(gè)尺度
每種尺度上預(yù)測(cè)4+1+80個(gè)參數(shù)
80:COCO數(shù)據(jù)集80個(gè)類(lèi)別
4:對(duì)于每個(gè)anchor而言,預(yù)測(cè)4個(gè)偏移參數(shù)
1:yolo中獨(dú)有的confidence score
目標(biāo)邊界框的預(yù)測(cè)
采用與yolov2中一樣的機(jī)制,與ssd與faster rcnn中的不一樣。
ssd與faster rcnn中的:
網(wǎng)絡(luò)預(yù)測(cè)的關(guān)于目標(biāo)中心點(diǎn)的回歸參數(shù)是相對(duì)于anchor而言的。
在yolov3中:關(guān)于目標(biāo)中心點(diǎn)的回歸參數(shù)是相對(duì)于當(dāng)前cell左上角點(diǎn)的。
最后通過(guò)一個(gè)1 * 1的卷積層在最終的預(yù)測(cè)特征層上預(yù)測(cè)所有的相關(guān)信息。
yolov3:3個(gè)預(yù)測(cè)特征層,每個(gè)特征曾采用了3個(gè)不同的模板。
假設(shè)上面這個(gè)圖是針對(duì)某一預(yù)測(cè)特征層而言,1 * 1的卷積層滑動(dòng)到紅框這個(gè)窗口時(shí),針對(duì)每一個(gè)anchor模板都會(huì)預(yù)測(cè)4個(gè)回歸參數(shù)(tx ty tw th)+1個(gè)objectness參數(shù)+對(duì)應(yīng)每個(gè)類(lèi)別的分?jǐn)?shù)score。
虛線框:anchor。pw:anchor寬度。ph:anchor高度。
藍(lán)框:網(wǎng)絡(luò)預(yù)測(cè)的最終位置以及大小。
計(jì)算得到的bx和by范圍都是在grid cell之間的(一個(gè)grid cell邊長(zhǎng)是1),σ函數(shù)將范圍限制在0~1.
正負(fù)樣本匹配
原文中,針對(duì)每一個(gè)ground truth,都會(huì)分配一個(gè)bounding box prior(正樣本)。
→ 一個(gè)圖片中有幾個(gè)gt目標(biāo)就有幾個(gè)正樣本。
分配原則:將與gt重合程度最大的bounding box prior作為正樣本。
當(dāng)bounding box與gt重合超過(guò)了某一個(gè)閾值,但是重合程度不是最大,則直接丟棄這個(gè)預(yù)測(cè)結(jié)果。
如果bounding box prior沒(méi)有被分配給某個(gè)gt(該bounding box prior不是正樣本),則沒(méi)有定位損失,也沒(méi)有類(lèi)別損失,則只有confidence score(objectness)。
按照論文中寫(xiě)的這樣去分配正樣本,則發(fā)現(xiàn)正樣本數(shù)量特別少。對(duì)照U版(ultralytics公司?)YOLOV3網(wǎng)絡(luò)看一下源碼發(fā)現(xiàn):
如果左邊這三個(gè)IOU都大于閾值,是否是把GT同時(shí)分配給三個(gè)anchor?
是的,則在當(dāng)前grid cell中對(duì)應(yīng)的三個(gè)anchor模板都被是做正樣本。正因如此,才可以擴(kuò)充正樣本的數(shù)量。
損失的計(jì)算
yolov3論文中沒(méi)有給出具體公式
-
置信度損失
針對(duì)預(yù)測(cè)得到的confidence score
針對(duì)每個(gè)bounding box所預(yù)測(cè)的objectness使用的是邏輯回歸。一般使用的邏輯回歸就是二值交叉熵?fù)p失(binary cross entropy),yolov3源碼也是使用的這個(gè)。
原文中:oi取0或者1. -
類(lèi)別損失
也是用的二值交叉熵?fù)p失
對(duì)于這個(gè)Binary Cross Entropy公式,每個(gè)人上網(wǎng)查到的可能都不一樣。這里up主通過(guò)實(shí)踐檢驗(yàn)來(lái)檢驗(yàn)公式是否正確。
pytorch官方的:
自己定義的:
運(yùn)行后結(jié)果:
注意:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-496042.html
-
定位損失
gx gy gw gh將gt映射在grid網(wǎng)格中得到的
gx hat:用gx減去對(duì)應(yīng)grid cell左上角的x坐標(biāo)cx后得到
gwhat ghhat:gw gh是真實(shí)的寬度和高度,要反向計(jì)算它們所對(duì)應(yīng)的回歸參數(shù):除以pw ph,兩邊取ln
了解即可,后面的yolov3 spp和yolov4v5采用的定位損失都不是這種(是CIOU loss)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-496042.html
到了這里,關(guān)于人工智能學(xué)習(xí)07--pytorch21--目標(biāo)檢測(cè):YOLO系列理論合集(YOLOv1~v3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!