---
title: 'Hand pose recognition with CNN'
disqus: hackmd
---
# Hand pose recognition with CNN
# Table of Contents
[TOC]
# 1.Reading training data
---
## 1.1 enumerate_files function
```python=
def enumerate_files(dirs, path='All_gray_1_32_32', n_poses=3,n_samples=20):
filenames,targets = [], []
for p in dirs: #Set
for n in range(n_poses): #3種pose,label
for j in range(3):
dir_name = path+'/'+p+'/000'+str(n*3+j)+'/'#資料夾每3個換label
for s in range(n_samples): #各個label的資料夾裡有20個samples
d = dir_name+'%04d/'%s
for f in os.listdir(d):#瀏覽資料夾
if f.endswith('jpg'):
filenames += [d+f]
targets.append(n)#label
return filenames, targets
```
* `enumerate_files` 執行function以獲得每張圖的位置和Label。
* `n_poses` 總共包含3種hand poses,也就是說Label為0~2。
* `filenames` 存每張圖的位置,`targets` 存每張圖的Label。
* `p` 紀錄目前執行到哪Set。
* `n` 紀錄Label。
* `n*3+j` 由於在Set資料夾裡每3個資料夾換一個Label。
## 1.2 read_images function
```python=
def read_images(files):
imgs = [] #存每張img
for f in files:
img = cv2.imread(f, cv2.IMREAD_GRAYSCALE) #以灰階方式讀入
img = img / 255 # 正規化
imgs.append(img)
return imgs
```
* `read_images function` 將圖存進imgs並正規化。
## 1.3 read_datasets function
```python=
def read_datasets(datasets):
files, labels = enumerate_files(datasets)
list_of_arrays = read_images(files)
return np.array(list_of_arrays), labels
```
* `read_datasets function` 獲得Labels和轉成nparray的圖。
## 1.4 run the functions
```python=
train_sets = ['Set1', 'Set2', 'Set3']
test_sets = ['Set4', 'Set5']
trn_array, trn_labels = read_datasets(train_sets)
tst_array, tst_labels = read_datasets(test_sets)
```
# 2.Reshape and One-hot encoding
---
## 2.1 Training data
```python=
from keras import utils as np_utils
train_x = []
for i in range(540):#training data有540筆資料
train_x.append(np.reshape(trn_array[i], (32, 32, 1)))#將每張圖轉成3維
train_x = np.array(train_x)
y_train_oneHot = np_utils.to_categorical(trn_labels)#Label做onehot encoding
```
## 2.2 Testing data
```python=
test_x = []
for i in range(360):#testing data有360筆資料
test_x.append(np.reshape(tst_array[i], (32, 32, 1)))
test_x = np.array(test_x)
y_test_oneHot = np_utils.to_categorical(tst_labels)
```
# 3.Constructing network
---
```python=
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(60, (3, 3), activation = 'relu',input_shape = (32,32, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(60, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Dropout(rate = 0.25))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation = 'relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(3, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
```
* CNN :
* Layer 1 :
* filter : 3X3,60個
* activation: relu
* MaxPooling : 2X2
* Layer 2 :
* filter : 3X3,60個
* activation: relu
* MaxPooling : 2X2
* Dropout : 0.25
* Dense :
* Layer 1 :
* dim : 128
* activation: relu
* Dropout : 0.5
* Layer 2 : 6
* dim : 3
* activation: relu
# 4.Fit and Evaluate
## 4.1 Train the model
```python=
history = model.fit(train_x, y_train_oneHot, epochs = 300, batch_size = 100)
```
* Epoch : 300
* Batch : 100
## 4.2 Prediction
```python=
prediction = model.predict_classes(test_x)
```
Output:
```python
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 2, 2, 0, 0, 0, 1, 2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0,
0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1,
2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2], dtype=int64)
```
## 4.3 Evaluate
```python=
evaluate = model.evaluate(test_x, y_test_oneHot)
```
* 以test data做測試。
```python=
print(evaluate[1])
```
* `evaluate[1]`為accuracy。
Output:
```python
0.9416666626930237
```
## 4.4 Plot the loss
### function
```python=
import matplotlib.pyplot as plt
def show_train_history(train_acc):
plt.plot(history.history[train_acc])
plt.title('Train History')
plt.ylabel('loss')
plt.xlabel('Epoch')
plt.show()
show_train_history('loss')
```
* 