# 臉部辨識
## 程式碼
import tensorflow as tf
import csv
import numpy as np
import pandas as p
import matplotlib.pyplot as ppt
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Flatten, Dense, Dropout, BatchNormalization, Conv2D, MaxPool2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing import image
from sklearn.model_selection import train_test_split
from tqdm import tqdm
from keras.utils.np_utils import *
from keras import models
from keras.models import load_model
data = pd.read_csv('train_label.csv')
x = []
for i in tqdm(range(data.shape[0])):
path = 'train/trn_img' + data['file_id'][i].astype('str').zfill(5) + '.jpg'
img = image.load_img(path, target_size = (img_width, img_height, 3))
img = image.img_to_array(img)
img = img/255.0
x.append(img)
x = np.array(x)
y = data['label']
y = y.to_np()
y = to_categorical(y,40)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 1, test_size = 0.2)
model = Sequential()
model.add(Conv2D(16, (3,3), activation ='relu', input_shape = x_train[0].shape))
model.add(BatchNormalization())
model.add(MaxPool2D(2,2))
model.add(Dropout(0.3))
model.add(Conv2D(32, (3,3), activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPool2D(2,2))
model.add(Dropout(0.3))
model.add(Conv2D(64, (3,3), activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPool2D(2,2))
model.add(Dropout(0.4))
model.add(Conv2D(128, (3,3), activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPool2D(2,2))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation ='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(128, activation ='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(40, activation ='softmax'))
model.compile(oaptimizer ='rmsprop', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(x_train, y_train, batch_size = batch, epochs = epoch, validation_data = (x_test, y_test))
testdata = pd.read_csv('test.csv')
Test = []
for i in tqdm(range(testdata.shape[0])):
path = 'test/tst_img' + testdata['file_id'][i].astype('str').zfill(5) + '.jpg'
img = image.load_img(path, target_size = (img_width, img_height, 3))
img = image.img_to_array(img)
img = img / 255.0
Test.append(img)
Test = np.array(Test)
pred = model.predict(Test)
prediction = []
for i in range(len(pred)):
top = np.argmax(pred[i])
print("Prediction: {0}".format(top))
prediction.append(top)
file = open('submisson.csv', 'w', newline = '')
writer = csv.writer(file, delimiter = ',')
writer.writerow(['Id', 'Category'])
for i in range(0, len(prediction)):
writer.writerow([i + 1, int(prediction[i])])
print("Successful")
## 心得
第二次的作業是做臉部辨識,辨識通常分成兩種,multi label 和multi class。
multilabel是指每個標籤代表一個不同的分類任務,但是這些任務在某種程度上是相關的,因此將它們一起處理而不是單獨處理是有好處的。簡單來說就是在此訓練任務中存在著兩個以上類別,但每個類別之間並不互斥。
而multiclass顧名思義,則是在此類型的分類任務中,會具有兩個以上類別的分類任務,但每個樣本只能被標記為一個類別。
這次的作業則是multilabel,解決該問題有以下步驟。
第一步是以結構化格式獲取數據
第二步是加載並先行處理數據
第三步是定義模型的架構
第四步是訓練模型
第五步是作出預測
這次的作業比第一次複雜很多,一開始理解multilabel和multiclass的差別就花了一些時間,網路上的例子都是以不同的個體做為範例,像是貓狗兔子等等,但這次作業範例則是各個人臉,但我想如果是用multiclass的話,局限性太高,各個類別互斥,所以最後才以multilabe為出發點。
前幾天因為某些原因,把電腦重灌,好多東西都要重載,忙得雞飛狗跳,想說看了作業截止日期是1/20日,以為時間還來得及,殊不知是以美國時間為主,只能怪我把作業拖太晚。