CS231N Assignment5 圖像分類練習html
Beginpython
本文主要介紹CS231N系列課程的第五項做業,利用圖像的其餘特徵取完成一個圖像訓練。算法
這裏採用的使Hog特徵和HSV特徵做爲圖像的特徵,而後利用咱們前面學習的幾種方法作訓練。網絡
另外因爲這裏沒有調用CS231N課程的庫(我懶....沒有去弄),就用了咱們圖像課上的OPENCVdom
的庫去獲取特徵。函數
課程主頁:網易雲課堂CS231N系列課程學習
語言:Python3.6測試
系統:Windows10ui
________________________________________________spa
注意:加入你沒有安裝OPENCV的話,參考個人以下帖子去安裝便可,包括拓展包也有說明~~~
_________________________________________________
好了,其實這個做業簡單,已經沒有什麼東西了~~~
emmm,算法在前幾章節已經寫過了
一、讀取圖像數據
讀取圖像數據和以前代碼一致~~~
#step1 數據裁剪 #數據量太大,咱們從新整理數據,提取一部分訓練數據、測試數據、驗證數據 num_training = 49000#訓練集數量 num_validation = 1000#驗證集數量 num_test = 1000#測試集數量 num_dev = 500 Data = load_CIFAR10() CIFAR10_Data = './' X_train,Y_train,X_test,Y_test = Data.load_CIFAR10(CIFAR10_Data)#load the data #從訓練集中截取一部分數據做爲驗證集 mask = range(num_training,num_training + num_validation) X_val = X_train[mask] Y_val = Y_train[mask] #訓練集前一部分數據保存爲訓練集 mask = range(num_training) X_train = X_train[mask] Y_train = Y_train[mask] #訓練集數量太大,咱們實驗只要一部分做爲開發集 mask = np.random.choice(num_training,num_dev,replace = False) X_dev = X_train[mask] Y_dev = Y_train[mask] #測試集也太大,變小 mask = range(num_test) X_test = X_test[mask] Y_test = Y_test[mask] print(X_train[0].shape) a = np.array(X_train[5]).astype('uint8') print(a.shape)
二、數據預處理
數據預處理就是訓練前對數據進行必定處理,咱們要提取圖像的特徵,通常HOG特徵咱們
須要它變爲灰度圖像,由於HOG要的是它的梯度,無需三個通道顏色值。因此咱們先灰度化
須要使用OPENCV的cvtColor函數,色彩通道的轉換,第一個參數傳入圖像數據,第二個參
傳入轉換形式BGR2GRAY是BGR格式轉爲灰度格式。
gray_train[i]=cv.cvtColor(X_train[i].astype('uint8'),cv.COLOR_BGR2GRAY)
咱們僅對訓練集和驗證集作了轉換,以下:
################################ #獲取灰度圖像 gray_train = np.zeros((X_train.shape[0],X_train.shape[1],X_train.shape[2])) gray_val = np.zeros((X_val.shape[0],X_val.shape[1],X_val.shape[2])) for i in range(X_train.shape[0]): gray_train[i]=cv.cvtColor(X_train[i].astype('uint8'),cv.COLOR_BGR2GRAY) print(gray_train.shape) for i in range(X_val.shape[0]): gray_val[i]=cv.cvtColor(X_val[i].astype('uint8'),cv.COLOR_BGR2GRAY)
接下來須要獲取它的HOG特徵,此時咱們用了CV的HOG類,先聲明一個類~~
hog = cv.HOGDescriptor((32,32), (8,8), (4,4), (4,4), 9, 1)
類中前四個參數是size,後兩個是int對於hog的具體介紹,在本文就不介紹了,
後續我專門寫個圖像的帖子介紹。我簡述一下,第一個是窗口大小,第二個是塊
的大小,第三個是塊每次移動的位移量,第四個是胞的大小,第五個參數是每一個
包內統計的梯度方向的類數。首先,包是在塊裏面的8*8的塊能夠容納4個包,會
計算4個包的梯度數據,每一個包會統計9個方向的數據,這樣就4*9=36個,而後
塊每次移動(4,4)這樣就在一個窗口裏會出現7*7個塊,故一共81*36=1764個。
~~~~~~~~~~~emmmm這麼理解先
你能夠參考下這我的解釋的在看看
http://blog.sina.com.cn/s/blog_48e673350102vcv8.html
這樣呢,咱們聲明瞭一個類,而且聲明一個矩陣,向量維度是1764存儲HOG特徵。
################################### #獲取HOG特徵 hog = cv.HOGDescriptor((32,32), (8,8), (4,4), (4,4), 9, 1) hist_train = np.zeros((gray_train.shape[0],1764)) hist_val = np.zeros((gray_val.shape[0],1764))
而後,接下來要計算hog特徵了,此時用到類的computer函數,傳入三個參數,圖像,
圖像的大小,窗口的單位移動量。也就是說窗口還要再圖像裏面移動,能夠知道hog
特徵又增大了,這裏因爲咱們圖像比較小咱們就不移動窗口了。
for i in range(gray_train.shape[0]): histt = hog.compute(gray_train[i].astype('uint8'),(32,32),(0,0)) hist_train[i] = histt.reshape((-1,)) for i in range(gray_val.shape[0]): histt = hog.compute(gray_val[i].astype('uint8'),(32,32),(0,0)) hist_val[i] = histt.reshape((-10,))
emmmm這就求完了,接下來用SVM訓練一下~~~~~
訓練以前我也參考這答案對特徵處理了一下,相似於歸一化,讓數據更接近。
先將數據乘1000,小數我感受不太好看
hist_train = 1000 * hist_train hist_val = 1000 * hist_val
而後減去平均值,每一列
hist_train_mean = np.mean(hist_train,axis=0,keepdims=True) hist_val_mean = np.mean(hist_val,axis=0,keepdims=True) hist_train -= hist_train_mean hist_val -= hist_val_mean
再除以標準差
std_feat = np.std(hist_train,axis=0,keepdims=True) print(std_feat) hist_train /= std_feat hist_val /= std_feat
好,差很少了
咱們開始訓練
#step4 訓練數據 SVM2 = SVM() SVM2.train(hist_train,Y_train,learning_rate=2.5e-7,reg=4e5,num_iters=1000,verbose = True) Y1 = SVM2.predict(hist_val) Y2 = SVM2.predict(hist_train) print('The Train Data result is %f'%np.mean(Y2 == Y_train)) print('The Val Data result is %f'%np.mean(Y1 == Y_val))
結果以下:
啊,應該還要補充一個神經網絡訓練~~~~~~~~~