這里簡單記錄和概述學習目標檢測算法的心得,盡可能的詳細一些,但限於寫博客的一些語法和格式不是很好,所以請閱讀者見諒!
概述:1、什么是目標檢測
2、目標檢測任務描述
2.1、目標檢測算法分類(接下來我會更新常見的目標檢測算法原理)
2.2、目標檢測的常見指標
2.3、目標定位的簡單實現
1、什么是目標檢測
目標檢測定義
識別圖片中有哪些物體以及物體的位置(坐標位置)
什么是物體
即圖像中存在的物體對象,但是能檢測哪些物體會受到人為設定限制。
目標檢測中能檢測出來的物體取決於當前任務(數據集)需要檢測的物體有哪些。假設我們的目標檢測模型定位是檢測動物(牛、羊、豬、狗、貓五種結果),那么模型對任何一張圖片輸出結果不會輸出鴨子、書籍等其它類型結果。
什么是位置
目標檢測的位置信息一般由兩種格式(以圖片左上角為原點(0,0)):
- 極坐標表示:(xmin, ymin, xmax, ymax)
- xmin,ymin:x,y坐標的最小值
- xmin,ymin:x,y坐標的最大值
- 中心點坐標:(x_center, y_center, w, h)
- x_center, y_center:目標檢測框的中心點坐標
- w,h:目標檢測框的寬、高
假設這個圖像是1000x800,所有這些坐標都是構建在像素層面上:
中心點坐標結果如下:
目標檢測的技術發展歷史
- 傳統目標檢測方法(候選區域+手工特征提取+分類器)
- HOG+SVM、DPM
- region proposal+CNN提取分類的目標檢測框架
- (R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN)
- 端到端(End-to-End)的目標檢測框架
- YOLO、SSD
2、目標檢測任務描述
2.1 目標檢測算法分類
-
兩步走的目標檢測:先進行區域推薦,而后進行目標分類
- 代表:R-CNN、SPP-net、Fast R-CNN、Faster R-CNN
-
端到端的目標檢測:采用一個網絡一步到位
- 代表:YOLO、SSD
2.2 目標檢測的任務
2.2.1 分類原理
先來回顧下分類的原理,這是一個常見的CNN組成圖,輸入一張圖片,經過其中卷積、激活、池化相關層,最后加入全連接層達到分類概率的效果
- 分類的損失與優化
在訓練的時候需要計算每個樣本的損失,那么CNN做分類的時候使用softmax函數計算結果,損失為交叉熵損失
- 常見CNN模型
對於目標檢測來說不僅僅是分類這樣簡單的一個圖片輸出一個結果,而且還需要輸出圖片中目標的位置信息,所以從分類到檢測,如下圖標記了過程:
- 分類
- 分類+定位(只有一個對象的時候)
- 目標檢測
2.3 檢測的任務
分類:
- N個類別
- 輸入:圖片
- 輸出:類別標簽
- 評估指標:Accuracy
定位:
- N個類別
- 輸入:圖片
- 輸出:物體的位置坐標
- 主要評估指標:IOU
其中我們得出來的(x,y,w,h)有一個專業的名詞,叫做bounding box(bbox).
2.3.1 兩種Bounding box名稱
在目標檢測當中,對bbox主要由兩種類別。
- Ground-truth bounding box:圖片當中真實標記的框
- Predicted bounding box:預測的時候標記的框
一般在目標檢測當中,我們預測的框有可能很多個,真實框GT也有很多個。
2.4 檢測的評價指標
任務 | description | 輸入 | 輸出 | 評價標准 |
---|---|---|---|---|
Detection and Localization (檢測和定位) |
在輸入圖片中找出存在的物 體類別和位置(可能存在多種物體) |
圖片(image ) | 類別標簽(categories)和 位置(bbox(x,y,w,h)) |
IoU (Intersection over Union) mAP (Mean Average Precision) |
- IoU(交並比)
- 兩個區域的重疊程度overlap:侯選區域和標定區域的IoU值
2.5 目標定位的簡單實現
在分類的時候我們直接輸出各個類別的概率,如果再加上定位的話,我們可以考慮在網絡的最后輸出加上位置信息。
2.5.1 回歸位置
增加一個全連接層,即為FC1、FC2
-
FC1:作為類別的輸出
-
FC2:作為這個物體位置數值的輸出
假設有10個類別,輸出[p1,p2,p3,...,p10],然后輸出這一個對象的四個位置信息[x,y,w,h]。同理知道要網絡輸出什么,如果衡量整個網絡的損失
- 對於分類的概率,還是使用交叉熵損失
- 位置信息具體的數值,可使用MSE均方誤差損失(L2損失)
如下圖所示
2.5.2 位置數值的處理
對於輸出的位置信息是四個比較大的像素大小值,在回歸的時候不適合。目前統一的做法是,每個位置除以圖片本身像素大小。
假設以中心坐標方式,那么x = x/x_image,y/y_image, w/x_image,h/y_image,也就是這幾個點最后都變成了0~1之間的值(歸一化)。