更新時間:2022-12-07 來源:黑馬程序員 瀏覽量:
Yolo算法采用一個單獨的CNN模型實現(xiàn)end-to-end的目標檢測,核心思想就是利用整張圖作為網(wǎng)絡的輸入,直接在輸出層回歸 bounding box(邊界框) 的位置及其所屬的類別,整個系統(tǒng)如下圖所示:
首先將輸入圖片resize到448x448,然后送入CNN網(wǎng)絡,最后處理網(wǎng)絡預測結果得到檢測的目標。相比R-CNN算法,其是一個統(tǒng)一的框架,其速度更快。
在介紹Yolo算法之前,我們回憶下RCNN模型,RCNN模型提出了候選區(qū)(Region Proposals)的方法,先從圖片中搜索出一些可能存在對象的候選區(qū)(Selective Search),大概2000個左右,然后對每個候選區(qū)進行對象識別,但處理速度較慢。
Yolo意思是You Only Look Once,它并沒有真正的去掉候選區(qū)域,而是創(chuàng)造性的將候選區(qū)和目標分類合二為一,看一眼圖片就能知道有哪些對象以及它們的位置。
Yolo模型采用預定義預測區(qū)域的方法來完成目標檢測,具體而言是將原始圖像劃分為 7x7=49 個網(wǎng)格(grid),每個網(wǎng)格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49x2=98 個bounding box。我們將其理解為98個預測區(qū),很粗略的覆蓋了圖片的整個區(qū)域,就在這98個預測區(qū)中進行目標檢測。
只要得到這98個區(qū)域的目標分類和回歸結果,再進行NMS就可以得到最終的目標檢測結果。那具體要怎樣實現(xiàn)呢?
YOLO的結構非常簡單,就是單純的卷積、池化最后加了兩層全連接,從網(wǎng)絡結構上看,與前面介紹的CNN分類網(wǎng)絡沒有本質的區(qū)別,最大的差異是輸出層用線性函數(shù)做激活函數(shù),因為需要預測bounding box的位置(數(shù)值型),而不僅僅是對象的概率。所以粗略來說,YOLO的整個結構就是輸入圖片經(jīng)過神經(jīng)網(wǎng)絡的變換得到一個輸出的張量,如下圖所示:
網(wǎng)絡結構比較簡單,重點是我們要理解網(wǎng)絡輸入與輸出之間的關系。
網(wǎng)絡輸入
網(wǎng)絡的輸入是原始圖像,唯一的要求是縮放到448x448的大小。主要是因為Yolo的網(wǎng)絡中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以Yolo的輸入圖像的大小固定為448x448。
網(wǎng)絡輸出
網(wǎng)絡的輸出就是一個7x7x30 的張量(tensor)。那這個輸出結果我們要怎么理解那?
1.7X7網(wǎng)格
根據(jù)YOLO的設計,輸入圖像被劃分為 7x7 的網(wǎng)格(grid),輸出張量中的 7x7 就對應著輸入圖像的 7x7 網(wǎng)格?;蛘呶覀儼?7x7x30 的張量看作 7x7=49個30維的向量,也就是輸入圖像中的每個網(wǎng)格對應輸出一個30維的向量。如下圖所示,比如輸入圖像左上角的網(wǎng)格對應到輸出張量中左上角的向量。
2.30維向量
30維的向量包含:2個bbox的位置和置信度以及該網(wǎng)格屬于20個類別的概率。
2個bounding box的位置 每個bounding box需要4個數(shù)值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數(shù)值來表示其位置。
2個bounding box的置信度 bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU,用公式表示就是:
Pr(Object)是bounding box內存在對象的概率
20個對象分類的概率
Yolo支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網(wǎng)格位置存在任一種對象的概率。