YOLO目標檢測演算法的深入理解

2021-10-03 10:47:12 字數 2772 閱讀 9551

yolo(you only look once)是一種目標檢測演算法,目標檢測演算法分為兩大任務:目標分類和定位,yolo創造性的將候選區和物件識別這兩個階段合二為一,看一眼(不用看兩眼)就能知道有哪些物件以及它們的位置。實際上,yolo並沒有真正去掉候選區,而是採用了預定義的候選區,通過篩選找到中某個存在物件的區域,然後識別出該區域中具體是哪個物件。因此其僅僅使用乙個cnn(卷積神經網路)直接**不同目標的類別與位置。

yolo作用:物件識別和定位。例如:輸入一張,要求輸出其中所包含的物件,以及每個物件的位置(包含該物件的矩形框)。如圖1 yolo檢測過程所示。

yolo演算法很好的解決了這個問題,它不再是視窗滑動了,而是直接將原始分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖,基於上面的分析,可以認為特徵圖的每個元素也是對應原始的乙個小方塊,然後用每個元素來可以**那些中心點在該小方格內的目標,這就是yolo演算法的樸素思想。下面將詳細介紹yolo演算法的設計理念。

整體來看,yolo由於沒有候選區,所以結構相對簡單,就是單純的卷積、池化。yolo演算法採用乙個單獨的cnn模型實現end-to-end的目標檢測,整個系統如圖2所示:首先將輸入resize到416x416,然後送入cnn網路,最後處理網路**結果得到檢測的目標。由於沒有候選區,所以結構相對簡單,就是單純的卷積、池化。相比r-cnn演算法,其是乙個統一的框架,其速度更快,而且yolo的訓練過程也是end-to-end的。

具體來說,yolo的cnn網路將輸入的分割成 s×s 網格,然後每個單元格負責去檢測那些中心點落在該格仔內的目標,如圖3所示,可以看到狗這個目標的中心落在左下角乙個單元格內,那麼該單元格負責**這個狗。

每個單元格會** b 個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的準確度。前者記為 p_r (object),當該邊界框是背景時(即不包含目標),此時 p_r (object)=0。而當該邊界框包含目標時, p_r (object)=1 。邊界框的準確度可以用**框與實際框(ground truth)的iou(intersection over union),交並比)來表徵,記為 iou_pred^truth。因此置信度可以定義為 p_r (object)×iou_pred^truth 。因此yolo的置信度是兩個因子的乘積,邊界框是否含有目標的概率以及**框的準確度。邊界框的大小與位置可以用4個值來表徵: (x,y,w,h) ,其中(x,y) 是邊界框的中心座標,而 w 和 h 是邊界框的寬與高。還有一點要注意,中心座標的**值 是相對於每個單元格左上角座標點的偏移值,並且單位是相對於單元格大小的,單元格的座標定義如圖3所示。而邊界框的 w和h**值是相對於整個的寬與高的比例,這樣理論上4個元素的大小應該在 [0,1] 範圍。這樣,每個邊界框的**值實際上包含5個元素: (x,y,w,h,c) ,其中前4個表徵邊界框的大小與位置,而最後乙個值是置信度。

還有分類問題,對於每乙個單元格其還要給出**出 c 個類別概率值,其表徵的是由該單元格負責**的邊界框其目標屬於各個類別的概率。但是這些概率值其實是在各個邊界框置信度下的條件概率,即p_r (〖class〗_i |object) 。值得注意的是,不管乙個單元格**多少個邊界框,其只**一組類別概率值,這是yolo演算法的乙個缺點,同時,我們可以計算出各個邊界框類別置信度(class-specific confidence scores):

p r(

clas

s∣ob

ject

)∗pr

(obj

ect)

∗iou

pred

trut

h=pr

(cla

ssi)

∗iou

pred

trut

hp_r(class|object) * p_r(object) *iou_^ = p_r(class_i)*iou_^

pr​(cl

ass∣

obje

ct)∗

pr​(

obje

ct)∗

ioup

redt

ruth

​=pr

​(cl

assi

​)∗i

oupr

edtr

uth​

最終每個單元格需要** (b∗

5+c)

(b*5+c)

(b∗5+c

)值。如果將輸入劃分為 s∗s

s*ss∗

s個 網格,那麼最終**值為 s∗s

×(b∗

5+c)

s*s× (b*5+c)

s∗s×(b

∗5+c

)大小的張量。整個模型的**值結構如下圖所示。對於pascal voc資料,其共有20個類別,如果使用s=7,b=2,那麼最終的**結果就是7×7×30大小的張量。

最後yolo利用非極大值抑制演算法(non maximum suppression, nms)對**的結果進行篩選輸出與目標重合度最高的在影象中的分類及其類別置信度和邊框位置。

目標檢測演算法之YOLO系列

1.演算法解讀 2.原始碼解析 nms演算法包含在 interpret output 這個函式中 v2通過對標籤聚類得到一系列anchor box prior box 相比v1,bounding box的數量大幅增加。v2 的bounding box以這些anchor box為基準,在一定程度上減少...

YOLO檢測演算法小結

1.如何訓練yolo 1.準備資料 1.1按照voc的資料格式存放好資料,然後使用darknet上的py指令碼voc label.py生成相應的train,val,test相關的路徑txt以及yolo需要讀取的labels檔案 1.2 指定訓練相關資料,字尾名是.data,其主要存放了類別數,類別名...

目標檢測 YOLO演算法

r cnn系列目標檢測方法 r cnn,fast r cnn,faster r cnn 看做目標檢測,都是需要 看兩眼 的。即,第一眼做 region proposals 獲得所有候選目標框,第二眼對所有候選框做 box classifier候選框分類 才能完成目標檢測 事實上 第一眼 是挺費時間的...