# Hand Posture Recognition with CNN
---
# 目錄
[TOC]
# 問題描述
訓練卷積神經網路用以辨識三種不同的手勢
---
# 解法
流程為:
讀取照片&處理照片⇨ 建立CNN模型 ⇨ 訓練神經網路 ⇨
根據Loss&Accuracy作圖
---
### 讀取照片&處理照片
```python=
def enumerate_files(dirs, path="D://All_gray_1_32_32", n_poses=3, n_samples=20):
filenames, targets = [], []
for p in dirs:
for n in range(n_poses):
for j in range(3):
dir_name = path + '//' + p + '//000' + str(n*3+j) + '//'
for s in range(n_samples):
d = dir_name + '%04d'%s + '//'
for f in os.listdir(d):
if f.endswith('jpg'):
filenames += [d+f]
targets.append(n)
return filenames, targets
def read_images(files):
imgs = []
for f in files:
img = cv2.imread(f, cv2.IMREAD_GRAYSCALE)
imgs.append(img)
#print(img)
return imgs
def read_datasets(datasets):
files, labels = enumerate_files(datasets)
list_of_arrays = read_images(files)
return np.array(list_of_arrays), labels
train_sets = ['Set1', 'Set2', 'Set3']
test_sets = ['Set4', 'Set5']
train_images, train_labels = read_datasets(train_sets)
test_images, test_labels = read_datasets(test_sets)
train_images = train_images.reshape((540 ,32 ,32 ,1))
train_images = train_images.astype('float32')/255
test_images = test_images.reshape((360 ,32 ,32 ,1))
test_images = test_images.astype('float32')/255
#print(train_images)
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
```
透過read_datasets()呼叫enumerate_files()讀取位於各資料夾的照片位置跟label並回傳
read_images()則使用cv2進行讀取照片
其餘則是對照片進行初步的處理。
### 建立CNN模型
```python=
model = models.Sequential()
model.add(layers.Conv2D(10,(5,5),activation='relu',input_shape=(32,32,1)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(20,(5,5),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(rate=0.25))
model.add(layers.Flatten())
model.add(layers.Dense(100,activation='relu'))
model.add(layers.Dense(3,activation='softmax'))
print(model.summary())
```
使用兩層卷積層、一層池化層和一層dropout
### 訓練神經網路
```python=
model.compile(optimizer = 'rmsprop', loss = 'categorical_crossentropy', metrics=["accuracy"])
epoch=20
i = model.fit(train_images, train_labels, validation_data=(test_images, test_labels),
batch_size=32, epochs=epoch, verbose=2)
```
為了方便後續作圖使用到epochs,先另行定義一個變數epoch並給定其值為20


### 根據Loss&Accuracy作圖
```python=
import matplotlib.pyplot as plt
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, epoch), i.history["loss"], label="train_loss")
plt.plot(np.arange(0, epoch), i.history["val_loss"], label="val_loss")
plt.title("Training Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.legend()
plt.figure()
plt.plot(np.arange(0, epoch), i.history["accuracy"], label="accuracy")
plt.plot(np.arange(0, epoch), i.history["val_accuracy"], label="val_accuracy")
plt.title("Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Accuracy")
plt.legend()
plt.show()
```

