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有關。