【深度學習】目標檢測之YOLOv3算法

YOLO系列目標檢測算法官方代碼

https://pjreddie.com/darknet/yolo/

YOLOv3

網絡結構

Darknet-53:
共有53個卷積層進行32倍下采樣
在這裏插入圖片描述
Darknet-53爲了加深網絡,也採取的類似ResNet的跳接結構,但和ResNet的殘差塊結構不同:

  • ResNet的下采樣過程,在與上一個卷積組鄰接的殘差塊中實現【深度學習】ResNet系列網絡結構
  • Darknet-53的下采樣過程,是在Residual跳接之前,用一個單獨的卷積層實現的

在這裏插入圖片描述
Darknet-53中所有的Residual都是如上圖所示的結構

YOLOv3保留Darknet-53標準結構Avgpool以上的部分(不包括Avgpool)。在此基礎上和SSD一樣,在三個不同size的Feature Map上接Detection Head。此外,仿照FPN,較深層的Detection Head的Feature Map經過上採樣,和較淺層的Detection Head的Feature Map按channel方向進行拼接

YOLOv3網絡結構如下:
在這裏插入圖片描述

anchor的編解碼

YOLOv3的編解碼和YOLOv2的編解碼方式相同:

先驗

  • 每個Detection Head的最後一個卷積層的輸入Feature Map(也就是使用anchor的Feature Map)的每一個cell的左上角點座標cxc_xcyc_ycxcy=0,1,2,...c_x、c_y=0,1,2,...
  • anchor的width和height,pxp_xphp_h。注意,YOLOv3中的anchor和YOLOv2、SSD中的anchor都不相同。
    SSD中的anchor,width和height是相對於原圖像的size進行歸一化後的值,其值範圍在0011之間;
    YOLOv2中的anchor,width和height是以使用anchor的Feature Map的width和heigth爲基準的絕對的值,其值範圍在00FeaturnMapwidthheightFeaturn Map的width(height)之間;
    YOLOv3中的anchor,width和height是以初始輸入圖像(第一個卷積層的輸入tensor)的witdh和height爲基準的絕對的值,其值範圍在00widthheight初始輸入圖像的width(height)之間。(YOLOv3的anchor的值,除以各自所在的Feature Map的下采樣倍數,就和YOLOv2的anchor的值定義相同了)

YOLOv3通過COCO數據集的ground truth box的大小,聚類得到9個anchor的值。每個Detection Head使用其中的三個。具體值如下:

最淺的Detection Head:

(10,13), (16,30), (33,23),

中間的Detection Head:

(30,61), (62,45), (59,119),

最深的Detection Head:

(116,90), (156,198), (373,326)

輸出
和YOLOv2相同,YOLOv3每個cell生成三個anchor(YOLOv2是五個),每個anchor對應自己的輸出:4(center_x, center_y, width, height) + 1(置信度) + num_classes(和SSD不同,這個num_classes不包括background,SSD就是通過增加一個background起到YOLO中置信度的作用)

center_x:txt_x
center_y:tyt_y
width:twt_w
height:tht_h
置信度:tot_o

編碼方式
bx=Sigmoid(tx)+cxb_x=Sigmoid(t_x) + c_x
by=Sigmoid(ty)+cyb_y=Sigmoid(t_y)+c_y
bw=pxetwb_w=p_xe^{t_w}
bh=phethb_h=p_he^{t_h}
bo=Sigmoid(to)b_o=Sigmoid(t_o)

label
gxg_xgyg_ygwg_wghg_h:原始圖像上的ground truth box的中心點座標、width以及height歸一化後的值(注意計算loss時,gxg_xgyg_y要乘預測所使用的Feature Map的width、height;gwg_wghg_h要乘初始輸入圖像的width、height)

置信度label:計算方式和YOLOv2相同。【深度學習】目標檢測之YOLOv2算法&6D姿態估計之YOLO-6D算法

損失函數

和YOLOv2相同,計算損失函數前,要先確定哪個anchor負責哪個落入cell中的object的預測,確定方法與YOLOv2相同。【深度學習】目標檢測之YOLOv2算法&6D姿態估計之YOLO-6D算法

損失函數計算:

  • 第一項:所有負責預測目標的anchor的座標損失(bxbybwbhb_x、b_y、b_w、b_h​)。label是gxgygwghg_x​、g_y​、g_w​、g_h​(注意計算loss時,gxg_xgyg_y要乘預測所使用的Feature Map的width、height;gwg_wghg_h要乘初始輸入圖像的width、height)。使用均方損失函數。衡量目標定位準確度。前面的係數設置爲1
  • 第二項:不負責預測目標的anchor的座標損失(bxbybwbhb_x、b_y、b_w、b_h​)。label是cell的左上點xx、cell的左上點yy、anchor的widthwidth、anchor的heigthheigth。因爲這樣的label對應的實際輸出是零。使用均方損失函數。前面的係數設置爲1
  • 第三項:負責預測目標的anchor的confidence損失bob_o。label是Pr(object)IOU(b,object)Pr(object)∗IOU(b,object)使用binary cross-entropy loss(不使用Softmax)。衡量可能有目標的準確度。前面的係數設置爲5
  • 第四項:不負責預測目標的anchor的confidece損失bob_o。計算Pr(object)IOU(b,object)Pr(object)∗IOU(b,object)如果計算結果小於0.5,label是零。使用binary cross-entropy loss(不使用Softmax)。前面的係數設置爲1
  • 第五項:負責預測目標的anchor的類別損失使用binary cross-entropy loss(不使用Softmax)(在這裏相當於多個獨立的邏輯分類器,這樣的多標籤方法有助於對訓練數據更好的建模)

binary cross-entropy loss

二分類的交叉熵損失函數:
對於一個樣本:Hy/(p(y))=[y/log(p(y))+(1y/)log(1p(y))]H_{y^/}(p(y)) =-[y^/*log(p(y))+(1-y^/)log(1-p(y))]
其中,y/y^/是label信息,positive是1,negative是0。p(y)p(y)是網絡的輸出,也就是結果是positive的概率

AP(Average Precision)的含義和計算方法

注意,多類別的目標檢測任務中,AP是針對單獨一類目標而言的

  • 正確率(Precision)
    (Precision)=TPTP+FP正確率(Precision) = \dfrac{TP}{TP + FP}
    判斷爲True的樣本中,真實爲True的比例

  • 真陽性率(True Positive Rate,TPR),靈敏度(Sensitivity),召回率(Recall)
    =TPTP+FN真陽性率 = \dfrac{TP}{TP + FN}
    真實爲True的樣本中,判斷爲True的比例

Precision和Recall用到目標檢測領域,就是:
假設有一組圖片,裏面有若干待檢測的目標,Precision就代表模型檢測出來的目標有多大比例是真正的目標物體Recall就代表所有真實的目標有多大比例被模型檢測出來了

以Recall爲橫軸,Precision爲縱軸繪製的曲線,就是PR曲線

AP(Average Precision),就是對PR曲線的縱軸(Precision)的值取平均。所謂11point-AP,就是將R軸平分11個點,對應的P軸的值取平均。

mAP(mean Average Precision)的含義和計算方法

mAP是所有類別的AP值的均值

結語

如果您有修改意見或問題,歡迎留言或者通過郵箱和我聯繫。
手打很辛苦,如果我的文章對您有幫助,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章