一.yolo系演算法
目前深度學習相關的目標檢測方法大致可以分為兩派:
1、基於區域提名的(regin proposal)的,比如r-cnn、spp-net、fast r-cnn、faster r-cnn、r-fcn。
2、基於端到端(end to end)的,無需候選區域,如yolo、ssd。
二者發展都很迅速,區域提名準確率較好、端到端的方法速度較快。
1)yolo v1:
核心思想:
將整張作為網路的輸入,直接在輸出層對bounding box的位置和所屬類別進行回歸。將目標定位和目標類別**整合於在單個神經網路模型中。
yolo檢測系統步驟簡單直接,可以看做只有三步:
1.yolo檢測系統先將輸入影象調整到448×448;
2.在影象上執行卷積網路;
3.通過模型的置信度對結果進行閾值。
實現細節:
1.將一幅影象分成 s×s 個網格(grid cell),如果某個object的中心落在某個網格中(通過ground-truth框確定),則這個網格就負責**這個object。
2.每個網格要**b個bounding box,每個box除了要回歸自身的位置之外,還要附帶**乙個confidence值。這個值代表了所**的bounding box中是否含有object和若有object,這個object**得有多準的兩重資訊,3. 每個網格單元針對20種類別**bboxes屬於單個類別的條件概率p r ( c l a s s i ∣ o b j e c t ) pr(class_i | object)pr(classi∣object),屬於同乙個網格的b個bboxes共享乙個條件概率。在測試時,將條件概率分別和單個的bbox的confidence**相乘
4. 在pascal voc中,yolo檢測系統的影象輸入為448×448,s=7,b=2,一共有20個class(c=20),輸出就是7×7×30的乙個tensor。
網路結構:
yolo使用了24個級聯卷積層和最後2個全連線層,交替的1×1卷積層降低了前面層的特徵空間。在imagenet分類任務上使用解析度的一半(224×224輸入影象)對卷積層進行預訓練,然後將解析度加倍進行目標檢測。
yolo網路借鑑了googlenet的思想,但與之不同的是,為了更好的效能,它增加額外的4層卷積層(conv)。yolo一共使用了24個級聯的卷積層和2個全連線層(fc),其中conv層中包含了1×1和3×3兩種kernel,最後乙個fc全連線層後經過reshape之後就是yolo網路的輸出,是長度為s×s×(b×5+c)=7×7×30的tensor,最後經過識別過程得到最終的檢測結果。
每個bounding box要**(x,y,w,h,confidence)五個值,一張共分為s×s個網格,每個網格要**出b個bounding box和乙個網格負責的object的類別資訊,記為c。則輸出為s ∗ s ∗ ( 5 ∗ b + c ) ss(5*b+c)s∗s∗(5∗b+c)的tensor張量,(x,y)表示bounding box相對於網格單元的邊界的offset,歸一化到(0,1)範圍之內,而w,h表示相對於整個的**寬和高,也被歸一化到(0,1)範圍內。c代表的是object在某個bounding box的confidence。
歸一化:
dbl: 如圖1左下角所示,也就是**中的darknetconv2d_bn_leaky,是yolo_v3的基本元件。就是卷積+bn+leaky relu。對於v3來說,bn和leaky relu已經是和卷積層不可分離的部分了(最後一層卷積除外),共同構成了最小元件。
resn:n代表數字,有res1,res2, … ,res8等等,表示這個res_block裡含有多少個res_unit。這是yolo_v3的大元件,yolo_v3開始借鑑了resnet的殘差結構,使用這種結構可以讓網路結構更深(從v2的darknet-19上公升到v3的darknet-53,前者沒有殘差結構)。對於res_block的解釋,可以在圖1的右下角直**到,其基本元件也是dbl。
concat:張量拼接。將darknet中間層和後面的某一層的上取樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。
整個yolo_v3_body包含252層,組成如下:
對於**層面的layers數量一共有252層,包括add層23層(主要用於res_block的構成,每個res_unit需要乙個add層,一共有1+2+8+8+4=23層)。除此之外,bn層和leakyrelu層數量完全一樣(72層),在網路結構中的表現為: 每一層bn後面都會接一層leakyrelu。卷積層一共有75層,其中有72層後面都會接bn+leakyrelu的組合構成基本元件dbl。看結構圖,可以發現上取樣和concat都有2次,和**分析中對應上。每個res_block都會用上乙個零填充,一共有5個res_block。
backbone
整個v3結構裡面,是沒有池化層和全連線層的。前向傳播過程中,張量的尺寸變換是通過改變卷積核的步長來實現的。
yolo_v3也和v2一樣,backbone都會將輸出特徵圖縮小到輸入的1/32。所以,通常都要求輸入是32的倍數。yolo_v3並沒有那麼追求速度,而是在保證實時性(fps>36)的基礎上追求performance。不過前面也說了,你要想更快,還有乙個 tiny-darknet作為backbone可以替代darknet-53,在官方**裡用一行**就可以實現切換backbone。搭用tiny-darknet的yolo,也就是tiny-yolo在輕量和高速兩個特點上,顯然是state of the art級別,tiny-darknet是和squeezenet正面剛的網路,詳情可以看下表
所以,有了yolo v3,就真的用不著yolo v2了,更用不著yolo v1了。這也是yolo官方**
yolo v3輸出了3個不同尺度的feature map,如上圖所示的y1, y2, y3。這也是v3**中提到的為數不多的改進點:predictions across scales。這個借鑑了fpn(feature pyramid networks),採用多尺度來對不同size的目標進行檢測,越精細的grid cell就可以檢測出越精細的物體。
y1,y2和y3的深度都是255,邊長的規律是13:26:52。yolo v3設定的是每個網格單元**3個box,所以每個box需要有(x, y, w, h, confidence)五個基本引數,然後還要有80個類別的概率。所以3*(5 + 80) = 255。這個255就是這麼來的。(還記得yolo v1的輸出張量嗎? 7x7x30,只能識別20類物體,而且每個cell只能**2個box,和v3比起來就像老人機和iphonex一樣)
3. some tricks
bounding box prediction:
b-box**手段是v3**中提到的又乙個亮點
對於v3而言,在prior這裡的處理有明確解釋:選用的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
每個anchor prior(名字叫anchor prior,但並不是用anchor機制)就是兩個數字組成的,乙個代表高度另乙個代表寬度。v3對b-box進行**的時候,採用了logistic regression。v3每次對b-box進行predict時,輸出和v2一樣,然後通過公式1計算出絕對的(x, y, w, h, c)。logistic回歸用於對anchor包圍的部分進行乙個目標性評分(objectness score),即這塊位置是目標的可能性有多大。這一步是在predict之前進行的,可以去掉不必要anchor,可以減少計算量。
loss function:
對掌握yolo來講,loss function不可謂不重要。我們知道,在目標檢測任務裡,有幾個關鍵資訊是需要確定的:
( x , y ) , ( w , h ) , c l a s s , c o n f i d e n c e
根據關鍵資訊的特點可以分為上述四類,損失函式應該由各自特點確定。最後加到一起就可以組成最終的loss_function了,也就是乙個loss_function搞定端到端的訓練。可以從**分析出v3的損失函式,同樣也是對以上四類,不過相比於v1中簡單的總方誤差,還是有一些調整的。除了w, h的損失函式依然採用總方誤差之外,其他部分的損失函式用的是二值交叉熵。
YOLO演算法總結
步驟 1.輸入 608,608,3 2.經過cnn處理,輸出 19,19,5,85 3.展開以上矩陣後為 19,19,425 每個19 19的網格裡有425個數字 425 5 85,每個網格裡有5個achor box,achor box中有85個數字 85 5 80,pc,bx,by,bw,bh,c...
yolo演算法筆記
yolo演算法筆記 目標檢測方法yolo you only look once 看一眼就可識別目標。與r cnn比,有以下特點 faster rcnn 中rpn網路吸取了該特點 速度很快 看到全域性資訊,而非r cnn產生乙個個切割的目標,由此對背景的識別效率很高 可從產生的有代表性的特徵中學習。流...
目標檢測 YOLO演算法
r cnn系列目標檢測方法 r cnn,fast r cnn,faster r cnn 看做目標檢測,都是需要 看兩眼 的。即,第一眼做 region proposals 獲得所有候選目標框,第二眼對所有候選框做 box classifier候選框分類 才能完成目標檢測 事實上 第一眼 是挺費時間的...