論文網站:http://arxiv.org/abs/1404.3606html
論文下載地址:PCANet: A Simple Deep Learning Baseline for Image Classification?git
論文的matlab代碼(第一個就是):Matlab Codes for Downloadgithub
本文的C++ 和 Scala 代碼:https://github.com/Ldpe2G/PCANet網絡
該文提出了一個簡單的深度學習網絡,用於圖像分類,用於訓練的圖像的特徵的提取包含如下步驟:
函數
一、cascaded principal component analusis 級聯主成分分析;
學習
二、binary hashing 二進制哈希;測試
三、block-wise histogram 分塊直方圖網站
PCA(主成分分析)被用於學習多級濾波器(multistage filter banks),spa
而後用binary hashing 和 block histograms分別作索引和合並。.net
最後得出每一張訓練圖片的特徵,每張圖片的特徵化爲 1 x n 維向量,而後用這些特徵向量來訓練
支持向量機,而後用於圖像分類。
首先假設咱們的訓練圖片的爲N張,,每張圖片大小爲 m x n。
首先對每一幅訓練圖像作一個處理,就是按像素來作一個分塊,分塊大小爲 k1 x k2。
上圖解釋什麼事按像素分塊,假設圖像是灰度圖大小爲 5 x 5,分塊大小爲 2 x 2。
而後獲得的分片矩陣大小是 4 x 16,按照上述計算公式能夠獲得。
而後若是圖像是RGB 圖像,則首先將三個通道分開,每一個通道都作上 訴的分片,獲得的分塊矩陣,
作一個豎直方向上的合併獲得RGB圖像的分塊矩陣,則若是RGB圖像大小爲 5 x 5,分塊大小2x2,
則獲得的分塊矩陣大小爲 12 x 16。
須要注意的是按照論文的說法,分塊的矩陣的列數爲m*n,因此5x5矩陣的分塊矩陣應該有25列,
可是從代碼的實現上看,是按照上圖的公式來計算的。
假設第 i 張圖片,,分塊後獲得的矩陣爲 ,而後對每一列減去列平均,獲得。
接着對N張訓練圖片都作這樣一個處理,獲得
c爲分快矩陣的列數。
而後接着求解的特徵向量,取前個最大的特徵值對應的特徵向量。
做爲下一階段的濾波器。數學表達爲:
而後第一階段的主成分分析就完成了。由於我將matlab代碼移植到了opencv,因此對原來的代碼
比較熟悉,這是結合代碼來發分析的,代碼實現和論文的描述有些不一樣。
過程基本上和第一階段同樣。不一樣的是第一階段輸入的N幅圖像要和第一階段獲得的濾波器
分別作卷積,獲得 L1 x N 張第二階段的訓練圖片。
。
在卷積以前首先作一個0邊界填充,使得卷積以後的圖片和大小相同。
一樣對每一張圖片作分塊處理,而後把由N張圖片和L1 個濾波器卷積獲得的圖片的
分塊結果合在一塊兒,首先獲得:
這是N張圖片和其中一個濾波器卷積的分塊結果。
而後將全部的濾波器輸出合在一塊兒:
但實際上在代碼的實現上,同一張圖片 對應的全部濾波器的卷積是放在一塊兒的,
其實就是順序的不一樣,對結果的計算沒有影響。
而後求解的特徵向量,取前個最大的特徵值對應的特徵向量。
做爲濾波器。
而後就來到特徵訓練的最後一步了。
而後對每一幅第二階段主成分分析的輸入圖片作如下計算:
每張圖片和L2個濾波器分別進行卷積。H(.)函數表示將一個矩陣轉換爲一個相同大小的
只包含0和1的矩陣,就是原來元素大於0,則新的矩陣對應的位置爲1,不然爲0.
而後乘以一個權值再加起來。權值由小到大依次對應的濾波器的也是由小到大。
而後對矩陣,將其分紅B塊,獲得的分塊矩陣大小爲 k1k2 x B,
而後統計分塊矩陣的直方圖矩陣,直方圖的範圍是,
直方圖矩陣大小爲 2^L2 x B。
而後將直方圖矩陣向量化爲行向量獲得,
最後將全部的的連接起來
獲得表明每張訓練圖的特徵向量。
上圖解釋直方圖統計:
而後訓練的步驟就完成了。
接着開始支持向量機的訓練和測試。
svm的核函數用的是線性核函數,論文的matlab用的是Liblinear,
由國立臺灣大學的Chih-Jen Lin博士開發的,主要是應對large-scale的data classification。
而後opencv的svm的類型我選擇了CvSVM::C_SVC,參數C設爲1。
這是我將論文的matlab代碼移植到opencv的測試結果,
用了120張圖片做測試,精確度爲65.5%,比論文中用一樣的數據集caltech101,
獲得的精度68%要差一點。
對SVM有興趣的讀者能夠參考這位博主的文章: