YOLO系列學習筆記

2022-05-07 10:36:28 字數 2911 閱讀 1421

此文參考:

(1) 給乙個大小為448x448的輸入影象,首先將影象劃分成7 * 7的網格。

(2) 對於每個網格,每個網格**2個bouding box(每個box包含5個**量)以及20個類別概率,總共輸出7×7×(2*5+20)=1470個tensor

(3) 根據上一步可以**出7 * 7 * 2 = 98個目標視窗,然後根據閾值去除可能性比較低的目標視窗,再由nms去除冗餘視窗即可。

yolov1使用了end-to-end的回歸方法,沒有region proposal步驟,直接回歸便完成了位置和類別的判定。種種原因使得yolov1在目標定位上不那麼精準,直接導致yolo的檢測精度並不是很高。

yolov2

1、相比於yolo引入了anchor box,作者在網路中果斷去掉了全連線層。首先,作者去掉了後面的乙個池化層以確保輸出的卷積特徵圖有更高的解析度。然後,通過縮減網路,讓輸入解析度為416 * 416,這一步的目的是為了讓後面產生的卷積特徵圖寬高都為奇數,這樣就可以產生乙個center cell。作者觀察到,大物體通常佔據了影象的中間位置, 就可以只用中心的乙個cell來**這些物體的位置,否則就要用中間的4個cell來進行**,這個技巧可稍稍提公升效率。最後,yolov2使用了卷積層降取樣(factor為32),使得輸入卷積網路的416 * 416最終得到13 * 13的卷積特徵圖(416/32=13)。

加入了anchor boxes後,可以預料到的結果是召回率上公升,準確率下降。我們來計算一下,假設每個cell**9個建議框,那麼總共會**13 * 13 * 9 = 1521個boxes,而之前的網路僅僅**7 * 7 * 2 = 98個boxes。具體資料為:沒有anchor boxes,模型recall為81%,map為69.5%;加入anchor boxes,模型recall為88%,map為69.2%。這樣看來,準確率只有小幅度的下降,而召回率則提公升了7%,說明可以通過進一步的工作來加強準確率,的確有改進空間。

2、作者在使用anchor的時候遇到了兩個問題,第乙個是anchor boxes的寬高維度往往是精選的先驗框(hand-picked priors),雖說在訓練過程中網路也會學習調整boxes的寬高維度,最終得到準確的bounding boxes。但是,如果一開始就選擇了更好的、更有代表性的先驗boxes維度,那麼網路就更容易學到準確的**位置。

和以前的精選boxes維度不同,作者使用了k-means聚類方法類訓練bounding boxes,可以自動找到更好的boxes寬高維度。傳統的k-means聚類方法使用的是歐氏距離函式,也就意味著較大的boxes會比較小的boxes產生更多的error,聚類結果可能會偏離。為此,作者採用的評判標準是iou(交並集),這樣的話,error就和box的尺度無關了,最終的距離函式為:

作者通過改進的k-means對訓練集中的boxes進行了聚類,判別標準是平均iou得分,聚類結果如下圖:

可以看到,平衡複雜度和iou之後,最終得到k值為5,意味著作者選擇了5種大小的box維度來進行定位**,這與手動精選的box維度不同。結果中扁長的框較少,而瘦高的框更多(這符合行人的特徵),這種結論如不通過聚類實驗恐怕是發現不了的。

當然,作者也做了實驗來對比兩種策略的優劣,如下圖,使用聚類方法,僅僅5種boxes的召回率就和faster r-cnn的9種相當。說明k-means方法的引入使得生成的boxes更具有代表性,為後面的檢測任務提供了便利。

v3沒有池化層和全連線層。特徵圖尺寸變換是通過改變卷積核的步長來實現的,比如stride=(2, 2),這就等於將影象邊長縮小了一半。v3會將輸出特徵圖縮小到輸入的1/32。所以,通常都要求輸入是32的倍數。

v2中對於前向過程中張量尺寸變換,都是通過最大池化來進行,一共有5次。而v3是通過卷積核增大步長來進行,也是5次

yolo v3輸出了3個不同尺度的feature map,如上圖所示的y1, y2, y3。採用多尺度來對不同size的目標進行檢測。

對於coco類別而言,有80個種類,所以每個box應該對每個種類都輸出乙個概率。這一點和yolo不一樣,yolo是每個單元**2個box,每個box需要有(x, y, w, h, confidence)五個基本引數,但是並不是對每一類都輸出乙個概率,yolo v3設定的是每個網格單元**3個box,所以每個box需要有(x, y, w, h, confidence)五個基本引數,然後還要有80個類別的概率。所以3*(5 + 80) = 255。這個255就是這麼來的。(yolo v1是 (2x5+20),20為20個類)

yolo v2採用直接**相對位置,用聚類的方法得到5個anchor box prior,v3不一樣,v3是選用的b-box priors 的k=9,對於tiny-yolo的話,k=6。priors都是在資料集上聚類得來的,有確定的數值,如下:

10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
yolo_v3只會對1個prior進行操作,也就是那個最佳prior。而logistic回歸就是用來從9個anchor priors中找到得分最高的那乙個

vue系列學習筆記

1.v if 在vue.js中,我們使用v if指令實現同樣的功能 利用v if控制該元素有還是沒有 template v if 因為v if是乙個指令,需要將它新增到乙個元素上,但如果想切換多個元素,可以把乙個元素當作包裝元素,並在上面使用v if,最終的渲染結果不會包含它 例如2.v show ...

C語言系列學習筆記

本系列部落格文章,系我本人學習總結c語言過程之中的讀書筆記,其主要內容來自於以下若干教材 linux c程式設計實戰 linux高效能伺服器程式設計 c專家程式設計 c語言入門經典 第5版 資料結構 c語言版 等。對上述教材裡的部分 錯誤進行了修正 上述教材中部分 有錯誤,無法編譯通過 並且所有 例...

Oracle函式系列學習筆記

判斷函式 nvl decode case when 字串函式 eg substr case when to char and substr t2.project cd,2,2 case when to char sysdate,mm 01 then to char sysdate,yy else t...