----------【2018.09.07 更新】---
如果你看到了這篇文章,並且從 github 下載了代碼想走一遍整個流程。我強烈建議你把《SVM 物體分類和定位檢測》這一系列的 6 篇文章都仔細看一遍。內容不多,但會對你理解算法和代碼有很大的幫助。
----------【2018.01.22 更新】---- 降維算法 -----
看了一篇文章介紹 t-SNE 降維算法的,文章中給出的數據效果比 PCA 好點,大家可以嘗試看看。
--------【2017.12.22 更新】---- 流程說明 ------
總結一下我用著最好的方法流程吧。
-
先 HoG 提取特徵 features。
-
PCA 對 features 降維,然後用 PSO 優化參數 C 和 gamma。降維的目的是加快 PSO 運行速度,否則太慢,但分類效果降低。
-
用第一步拿到的 features 和第二步拿到的參數訓練一個初始 SVM 模型。
-
Hard Negative Mining 優化 SVM 模型。
-
進行 滑窗 detection,最後 NMS 邊框回歸。
目前 2700 正樣本,2700 負樣本。測試集 1200 負樣本,700 正樣本。
** 最新代碼 Github 地址:** https://github.com/HansRen1024/SVM-classification-localization
最近在研究傳統方法的物體分類,使用的方法是 Hog + SVM,不過分類正確率不是很高。我寫一寫心得體會。
首先聲明我不會具體將原理。因為網上信息太多了,大家自己先看看大致了解了再看這篇文章。
一、HoG 特徵數計算#
先說一下兩個參數:
-
pixels of a cell
-
cells of a block
HoG 是對圖片進行滑框提取特徵的,block 就是這個框。block 裡有 cell,在 cell 中進行特徵提取。將 bolck 中所有 cell
的特徵整合在一起,就是這個 block 的特徵。再將所有 block 的特徵整合一起就是整張圖片的特徵了。
HoG 在 cell 中提取特徵的時候可以理解成是按角度來的,一般分 9 組,一組有 40 度,9 組一共 360 度。每一組就代表一個特徵值。那麼我們就可以計算整張圖的特徵數了。
對於一張 300 × 600 的圖片,我定義每個 cell 裡像素是 15 × 15, 每個 block 裡有 2 × 2 個 cell, 圖片一共有 10 × 20
個 block
一個 cell: 9 個特徵
一個 block: 4 × 9 = 36 個特徵
圖片一共有: 10 × 20 × 36 = 3600 個特徵
二、說明#
如果不對圖片進行處理而直接丟如 HoG 的話,背景等因素會對最後提取的特徵造成很大的不好影響。所以我提供的提取特徵值的代碼中包含兩部分,一部分是根據 xml 文件中 bbox 信息切割出物體進行特徵提取。另一部分是直接對整圖進行特徵提取。因為最後的特徵值數量和輸入圖片大小有關,所以要對切割後的圖片和整圖統一 resize 到固定大小。更多細節看代碼中註釋。
路徑說明:
./train/positive # 存放需要切圖的帶分類物體的訓練集
./test/positive # 存放帶分類物體的測試集
./train/positive_rest # 存放不需要切圖的帶分類物體的訓練集
./train/negative # 存放不帶分類物體的訓練集
./test/negative # 存放不帶分類物體的測試集
後記#
我是從 ILSVRC 拿的圖片,訓練集 8000 多張,正樣本和負樣本一種一半。測試集 2000 多張圖片,正負樣本各一半。後續我又做了 PCA,對正確率沒什麼影響,會增加模型的魯棒性。下一篇我文章我放出加上 PCA 的代碼。做 PCA 主要是後來我選擇 PSO 求解最優化 SVM 參數 C 和 gamma 需要把特徵降維,否則計算量太大。