---
# System prepended metadata

title: 'Assignment 2: Face Recognition'

---

# Assignment 2: Face Recognition
---
# 題目說明:
This assignment requires you to design your own face recognizer using any technique taught in the classes. You can use the python packages such as sklearn, TensorFlow, OpenCV, NumPy, ..., and so on. However, you are not allowed to copy the source code of the recognizer from any other person.
使用課程中教授所教導的任何技術來設計自己的面部識別器。可以使用python軟件包，例如sklearn，TensorFlow，OpenCV，NumPy，...等。但是不得從任何其他人復制識別器的源代碼。

---
# 實作:
實作步驟:
1.於Colab 下載 OpenCV

![](https://i.imgur.com/T47dTmU.png)

開始訓練:
2. import 所需函式庫等
3. upload train_label.csv
4. 將train_label.csv中file_id & label取出，各存成一list
5. 使用opcncv imread函式，並以迴圈的方式，使其對應id，將train_img載入;並創建一x_train list 將載入的img依序放入list當中
6. 開始訓練model，Opencv提供了三種辨識用的演算法，分別是:
* Eigenfaces-是指用於機器視覺領域中的人臉識別問題的一組特徵向量。通過PCA(principal components analysis)方法獲得特徵臉。
* Fisherfaces-是基於提高識別效率，對人臉圖像的特徵向量進行降維和尋求更有利於分類的向量。由主成分分析(PCA Principal Components Analysis)以及線性判別分析(LDA Linear Discriminant Analysis)相結合的演算法。
* Local Binary Pattern Histogram ( LBPH )-基於LBP(Local Binary Patterns),是一種用来描述圖像局部紋理特徵的算法，反映内容為每個像素與周圍像素的關係。


其函式為:cv2.face.xxxxxFaceRecognizer_create()

7.將需要訓練的數值(label & train_img)載入model開始訓練


![](https://i.imgur.com/PhlBFQe.png)

![](https://i.imgur.com/W78Cqir.png)

訓練完成後，便可開始預測:
8. upload test.csv
9. 將test.csv中file_id & label取出，各存成一list
10. 使用opcncv imread函式，並以迴圈的方式，使其對應id，將test_img載入
11. 載入後再將img放入model.predict當中，讓model預測其label，最後再將label存於一空list:y_label；循環直至最後一的img
12. 使用data frame輸出submission_2.csv

![](https://i.imgur.com/4hNkcr9.png)

![](https://i.imgur.com/5ZNKM4S.png)

---
# 結果:
這次使用Opencv提供的三種辨識用的演算法，分別是:
1. Eigenfaces，
2. Fisherfaces
3. Local Binary Pattern Histogram ( LBPH )

上傳submission_2後得到的score，分別為:
1. 0.70681
2. 0.74708
3. 0.74074

---
# 開發過程中解決的問題:

圖片當中的綠色註解，都是當下遇到問題的心路歷程，完整了記錄了我遇上的問題，過程中的吶喊，和完成後的愉悅。


---

# 學到的知識:

opencv:訓練model，預測label，三種分類演算法，利用迴圈將img一張張導入list
numpy:如何使用.append將array儲存成list


---
# Code-使用Google Colab:
```
pip install opencv-python 
pip install opencv-contrib-python
```
```
import cv2 
from google.colab import files 
import pandas as pd
import numpy as np
from google.colab import drive 
drive.mount('/content/gdrive') 

upload = files.upload() 
data_train = pd.read_csv("train_label.csv") 

def load_data(csv_file): 
  data_train = pd.read_csv(csv_file)
  label = data_train['label'].to_numpy()
  data_train = pd.read_csv(csv_file,dtype=str)
  id = data_train['file_id'].to_numpy()
  return id,label

x_train = [] 
train_id,y_train = [],[] 
train_id,y_train = load_data('train_label.csv')

for filename in train_id:
  img_train = cv2.imread('gdrive/My Drive/其他/face recognition/train/trn_img'+ filename[:5] + '.jpg', cv2.IMREAD_GRAYSCALE)  
  x_train.append(np.array(img_train,np.uint8)) 


model = cv2.face.FisherFaceRecognizer_create() # 準確率0.74708
# model = cv2.face.EigenFaceRecognizer_create() # 準確率0.70681
# model = cv2.face.LBPHFaceRecognizer_create()   # 準確率0.74074
model.train(x_train,y_train) 
```
```
upload = files.upload() 
data_test = pd.read_csv("test.csv")
test_id,y_test = load_data('test.csv') 
y_test = [] 

for filename in test_id:
  filename = filename.zfill(5) 
  img_test = cv2.imread('gdrive/My Drive/其他/face recognition/test/tst_img'+ filename + '.jpg', cv2.IMREAD_GRAYSCALE) 
  label,conf = model.predict(img_test)
  y_test.append(label)  

data = pd.DataFrame({'Id':test_id ,'Category':y_test}) 
data.to_csv("submissiom_2test.csv",index=False) 
```
---

410721236 資工三 鍾承恩