# 臉部辨識 ## 程式碼 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日,以為時間還來得及,殊不知是以美國時間為主,只能怪我把作業拖太晚。