YOLOv3算法原理,源碼精講以及YOLOv4要點(更新階段)

YOLOv3算法原理,源碼精講以及YOLOv4要點

1、YOLOv3算法原理
2、YOLOv3源碼精講-講透Anchor機制
3、YOLOv3源碼精講-要點深入理解
4、YOLOv4要點
目標檢測:不僅要給出檢測出來的內容,還要給出內容的位置。
在開始之前,首先理解一下:
Bounding Box:
在這裏插入圖片描述
從左到右分別爲:

  • 1、軸對齊的Bounding Box(簡寫爲AABB),該框有兩種表示方式(x1,y1,x2,y2)—左上右下點的座標或者(x,y,h,w)—中心點的座標和高寬值,即用四維的向量來表示;
  • 2、軸對齊並帶有旋轉角的Bounding Box,該框在上面四維的基礎上,再加上一個旋轉角度,即五維的一個向量來表示,一般用於文本檢測;
  • 3、圓形的Bounding Box,這種表示方式一般用的比較少。

Bounding Box的表示有絕對座標和尺度歸一化後坐標這兩種形式。

  • 絕對值座標是絕對位置,比如(50,100,100,200);
  • 尺度歸一化後的座標,就是把(500,100,100,200)這種絕對座標佔整個圖的位置比例,座標歸一化到0-1之間。在yolo種,默認的是尺度歸一化的表示。

Bounding Box分爲3類:

  • Ground True(GT):事先給定的標籤框,數據標定的;
  • Prediction:預測的框;
  • Anchor:一種機制框,用來輔助預測的。

訓練的數據集:

  • VOC數據集;
  • COCO數據集;
  • 自定義數據集
    其中VOC數據集標定的格式:xml文件
    文件內容如下:
    在這裏插入圖片描述
    其中文件中的畫紅線的就是對應的Grounding True框的位置。注意VOC的數據值沒有進行歸一化。
    但是yolo使用的是歸一化的數據,不用擔心,有轉化的工具,後面會說。

IoU/Jaccard index
一個重要的概念:IoU或者Jaccard index
IoU是交集和並集的比值,通過下面的圖,就可以很清楚的理解,這裏不在贅述。
在這裏插入圖片描述

正式進入YOLOv3部分:

下面這個圖是yolov3的一個預測過程:
在這裏插入圖片描述
1、先對要預測的圖片進行大小的調整,因爲yolov3一旦模型確定之後,對輸入的圖片大小有固定的要求,所以輸入的待檢測圖片的大小也要固定;
那麼如何resize呢?
比如我們輸入訓練好的模型中的圖片大小爲416416,但是我們待檢測的圖片大小是208104。這時,我們是把待檢測圖片的最長邊208放大到416,其實是放大了416/208=2倍,那麼104也要同比放大2倍,變成208,那208不足408怎麼辦?答案是用固定的值進行填補!
例如,補完之後的圖片變爲:
在這裏插入圖片描述
代碼:

#Resize image
def letterbox_image(img,inp_dim):
    """resize image with unchanged aspect ratio using padding"""
    img_w,img_h=img.shape[1],img.shape[0]
    w,h=inp_dim
    new_w=int(img_w*min(w/img_w,h/img_h))
    new_h=int(img_h*min(w/img_w,h/img_h))
    resized_image=cv2.resize(img,(new_w,new_h),interpolation=cv2.INTER_CUBIC)
    #放大縮小需要事先選取那種插值方式。interpolation是插值方式:INTER_CUBIC是4x4像素鄰域的雙三次插值,INTER_LINEAR是雙線性插值(默認設置)
    canvas=np.full((inp_dim[1],inp_dim[0],3),128,dtype='uint8')
    #使用128填充(inp_dim[1],inp_dim[0],3)維度大小的空間
    canvas[(h-new_h)//2:(h-new_h)//2+new_h,(w-new_w)//2:(w-new_w)//2+new_w,:]=resized_image
    #把圖片放入使用128填充的空間中
    return canvas

例如原圖:
在這裏插入圖片描述
resize之後:
在這裏插入圖片描述
2、把調整完大小之後的圖片放入到訓練好的模型之中進行預測;
預測的結果獲得的框,有可能如下所示:(注意:圖不一樣,這裏僅僅看框)
在這裏插入圖片描述
3、再使用NMS(非極大值抑制)對預測的結果進行篩選,即刪除不必要的框,得到的結果就是最終預測的結果。
例如:左圖經過NMS,得到右圖。
在這裏插入圖片描述
下面看一下,在預測過程中的輸出數據的含義是什麼:
在這裏插入圖片描述
Pc:框中有物體的概率即置信度,不管是什麼物體;
bx,by,bh,bw:框住物體的框的位置和寬高;
c:是被檢測物體的類別,如果只有80類,那麼c就是一個80維的向量。這個80個數分別是:是第一類物體的概率,是第二類物體的概率,是第三類物體的概率…
具體如下:
在這裏插入圖片描述
我們把該框含有物體的概率Pc乘以該框含有每一類物體的概率組成c向量,得到的結果就是該框中含有每一類物體的真實概率。在得到的結果中,哪一類的概率最大,該框含有的物體就是哪一類。(當然這麼說不準確,後面還有閘值,以及非極大值抑制來進行再次篩選,目前暫且這麼理解)

再次深入看一下:
在這裏插入圖片描述
圖片通過卷積層得到的結果如上圖的右圖所示,其中19*19的格子,每個格子都代表了5個
在這裏插入圖片描述
爲什麼是5個,這和後面講的anchor有關。

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