前言
YOLO是目前比較流行的物體檢測算法,有著體積小,檢測準(zhǔn)確度高的強(qiáng)大優(yōu)點(diǎn)。這里對YOLO的核心思想知識點(diǎn),使用可視化的方法做一總結(jié)。
物體檢測基礎(chǔ)
YOLO是用于識別圖像中的物體的網(wǎng)絡(luò)。這類網(wǎng)絡(luò)解決的問題通常是找到圖片中是否存在某種物體(如是否有狗或人),以及找到物體在圖片中的位置并標(biāo)記出來(如使用紅色方框標(biāo)記物體)。
比如,對于一個檢測圖片中人和狗的網(wǎng)絡(luò)來說,在神經(jīng)網(wǎng)絡(luò)的輸出端,需要表達(dá)兩類信息:
-
某物體是否存在于圖片中。通常會使用數(shù)字
0
、1
來分別表示目標(biāo)物體不存在
、目標(biāo)物體存在
。 -
如果目標(biāo)物體存在,目標(biāo)物體在圖片中的位置。YOLO使用
物體的中心坐標(biāo)
和物體的長、寬
來表示。
YOLO —— 對圖像碎片進(jìn)行物體檢測
YOLO作為一個圖像物體檢測算法,輸出一個向量來表示圖像中目標(biāo)物體的信息
P
c
P_c
Pc?:圖像中是否不存在任何目標(biāo)物體,1
代表存在,0
代表完全不存在
B
x
B_x
Bx?:目標(biāo)物體幾何中心的橫坐標(biāo)
B
y
B_y
By?:目標(biāo)物體幾何中心的縱坐標(biāo)
B
w
B_w
Bw?:目標(biāo)物體的寬度
B
h
B_h
Bh?:目標(biāo)物體的高度
C
1
C_1
C1?:是否存在類別1的物體(狗)
C
2
C_2
C2?:是否存在類別2的物體(人)
檢測單個物體
比如,將下面的圖片傳入訓(xùn)練好的YOLO網(wǎng)絡(luò),就會得到這樣的一個向量。根據(jù)這個向量標(biāo)出對應(yīng)的物體中心和方形輪廓,就會得我們想要的結(jié)果。
當(dāng)圖片中沒有任何目標(biāo)物體時,
P
c
P_c
Pc? 的值為0
,向量中的其他值就不必理會。
同時檢測多個物體
但是如果圖中同時有多個目標(biāo)物體,一個向量不夠用怎么辦?
直覺性的答案是將原本的
7
?
1
7*1
7?1 的向量擴(kuò)大,使之同時包含
n
n
n 個物體的信息,也就是變成
7
n
?
1
7n*1
7n?1 (形如下圖)的格式。
[
P
c
1
B
x
1
B
y
1
B
w
1
B
h
1
C
11
C
21
.
.
.
.
.
.
.
.
.
P
c
n
B
x
n
B
y
n
B
w
n
B
h
n
C
1
n
C
2
n
]
\left[ \begin{matrix} P_{c1} \\ B_{x1} \\ B_{y1} \\ B_{w1} \\ B_{h1} \\ C_{11} \\ C_{21} \\ ... \\ ... \\ ... \\ P_{cn} \\ B_{xn} \\ B_{yn} \\ B_{wn} \\ B_{hn} \\ C_{1n} \\ C_{2n} \\ \end{matrix} \right]
?
??Pc1?Bx1?By1?Bw1?Bh1?C11?C21?.........Pcn?Bxn?Byn?Bwn?Bhn?C1n?C2n???
??
P
c
k
P_{ck}
Pck?:圖像中是否存在第k個目標(biāo)物體,1
代表存在,0
代表完全不存在
B
x
k
B_{xk}
Bxk?:第k個目標(biāo)物體幾何中心的橫坐標(biāo)
B
y
k
B_{yk}
Byk?:第k個目標(biāo)物體幾何中心的縱坐標(biāo)
B
w
k
B_{wk}
Bwk?:第k個目標(biāo)物體的寬度
B
h
k
B_{hk}
Bhk?:第k個目標(biāo)物體的高度
C
1
k
C_{1k}
C1k?:第k個目標(biāo)物體是否屬于類別1(狗)
C
2
k
C_{2k}
C2k?:第k個目標(biāo)物體是否屬于類別2(人)
但由于神經(jīng)網(wǎng)絡(luò)的輸出結(jié)構(gòu)是固定的,無法靈活的根據(jù)情況來自由變動,那么一種簡單的解決方法就是讓用于表示輸出的向量足夠大(比如每次檢測 10000 10000 10000 個物體,神經(jīng)網(wǎng)絡(luò)每次輸出一個 70000 ? 1 70000*1 70000?1 的向量)。但是這個方法,對于常見的只有數(shù)個目標(biāo)物體的情況時就會有很大的浪費(fèi),而對于個別的出現(xiàn)非常多物體的情況來說又會不夠用,適用性非常差。
YOLO所使用的思想的一大杰出之處就是優(yōu)雅的解決了這個問題。
它將圖片分割為數(shù)個小的碎片(比如 4 ? 4 4*4 4?4),然后對于每個碎片進(jìn)行單一物體檢測。這樣一來,只要切割圖像得到的單個碎片足夠小,就能夠保證每個圖像碎片中的目標(biāo)物體數(shù)量足夠少(比如只有1~2個)。
這樣一來,對于每個圖像碎片,我們可以讓神經(jīng)網(wǎng)絡(luò)只嘗試找到固定數(shù)量個目標(biāo)物體即可,神經(jīng)網(wǎng)絡(luò)的輸出格式就可以固定下來(比如我們設(shè)為 16 16 16 個碎片,每個碎片 2 2 2 個目標(biāo)物體,那么神經(jīng)網(wǎng)絡(luò)的輸出就是一個 14 ? 16 14*16 14?16 的矩陣)。
下圖就是一個例子。(不過值得注意的是,為了便于表示,對目標(biāo)物體的中心坐標(biāo)、寬度、高度做了歸一化處理,可能與YOLO算法的實(shí)際情況不符。其次,對于每個碎片中目標(biāo)物體的中心坐標(biāo),究竟是碎片內(nèi)的局部目標(biāo)物體的中心坐標(biāo),還是目標(biāo)物體在沒打碎圖像前的全局中心坐標(biāo),參考資料沒講解清楚,這里存疑。筆者按照局部目標(biāo)物體的中心坐標(biāo)的方法進(jìn)行處理。)
多邊界框的處理 —— IOU方法
通過使用上述方法,將目標(biāo)圖片切割成小碎片,然后逐一進(jìn)行檢測,得到的檢測結(jié)果就是這樣一個 7 ? 16 7*16 7?16 的矩陣(這里假設(shè)切割圖片為 4 ? 4 4*4 4?4 個碎片,每個碎片中只尋找一個物體)。再對輸出的結(jié)果進(jìn)行處理,就可以得到目標(biāo)物體的邊界框(下圖中用黃色和紅色的方框來表示),以及這些邊界框的精確度(下圖中用每個方框邊角的黑色數(shù)字來表示)。
但是目標(biāo)檢測問題中,經(jīng)常會遇見的問題是出現(xiàn)多個邊界框,都畫出來的話顯然會造成混亂:這么多個邊界框?qū)?yīng)的究竟是幾個目標(biāo)物體?對于某個目標(biāo)物體來說,哪個邊界框?qū)儆谒繉?yīng)某一目標(biāo)物體的多個邊界框中,哪個最精確?
該如何選擇邊界框呢?
一種直覺性的方法是保留準(zhǔn)確度最大的邊界框。但是這個方法的問題是,只會保留 1 1 1 個邊界框用于標(biāo)出圖像中狗的位置、 1 1 1 個邊界框用于標(biāo)出圖像中人的位置。但如果圖像中有多個同類目標(biāo)物體,就會丟失信息了,導(dǎo)致無法接受的偏差。我們需要更好的方法。
這一問題的常用解法是利用IOU
(交并比)判斷兩個邊界框是否屬于同一物體。計(jì)算方法是,對于任意兩個邊框,用二者重疊部分(交集)的面積,除以二者合并起來(并集)的面積,得到一個比值。圖像化公式見下圖
通常我們會設(shè)定一個閾值,當(dāng)IOU超過這個閾值,就判斷兩個邊框?qū)儆谕粋€物體。這樣一來,就能首先確定每個目標(biāo)物體對應(yīng)那些邊界框,隨后再借助每個邊界框所對應(yīng)的精確度,找出屬于每個目標(biāo)物體的最精確的邊界框。(利用這種方法而非粗暴的找全局最大值,從而提高物體檢測精確度的方法,被稱為Non maximum suppression
,非極大值抑制)文章來源:http://www.zghlxwxcb.cn/news/detail-456016.html
參考鏈接
https://www.youtube.com/watch?v=ag3DLKsl2vk
https://www.cnblogs.com/happyamyhope/p/9629358.html
https://zhuanlan.zhihu.com/p/37489043文章來源地址http://www.zghlxwxcb.cn/news/detail-456016.html
到了這里,關(guān)于【YOLO】物體識別算法的核心思想的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!