CS231N Assignment5 圖像分類練習

CS231N Assignment5 圖像分類練習html

 

Beginpython


本文主要介紹CS231N系列課程的第五項做業,利用圖像的其餘特徵取完成一個圖像訓練。算法

這裏採用的使Hog特徵和HSV特徵做爲圖像的特徵,而後利用咱們前面學習的幾種方法作訓練。網絡

另外因爲這裏沒有調用CS231N課程的庫(我懶....沒有去弄),就用了咱們圖像課上的OPENCVdom

的庫去獲取特徵。函數

課程主頁:網易雲課堂CS231N系列課程學習

語言:Python3.6測試

系統:Windows10ui

________________________________________________spa

注意:加入你沒有安裝OPENCV的話,參考個人以下帖子去安裝便可,包括拓展包也有說明~~~

OPENCV3+PYTHON3

 

_________________________________________________

 

好了,其實這個做業簡單,已經沒有什麼東西了~~~

 

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))

 

  

結果以下:

 

啊,應該還要補充一個神經網絡訓練~~~~~~~~~

相關文章
相關標籤/搜索