Learn More →
臉部圖片分類器是透過CNN(卷積神經網絡)作為模型時做出來的模型,以下內容包含幾個檔案:
第一個 Face.py含有完整的程式碼,包含著怎麼輸入Data,怎麼建立模型,和怎麼將結果寫入csv檔案。Loadmodel.py 的部分,包含著從Face.py產生的預訓練模型的導入,不透過訓練就將結果依照預訓練模型產生。而GUI模型,就以視覺化的方式,並且結合Loadmodel.py產生預測結果。
本次測試的題目是臉部的分類問題,在這次資料中包含了兩個圖片的資料夾,分別為train 和 test,另外再加上兩個train 和 test的csv檔案。提供我們在輸入測試資料進入程式時,更加方便。
以下為圖片訓練集和測試集截圖:
Learn More →
以下也提供測試用csv和訓練用csv,特別提到的是csv中的第一欄是用來存圖片的名稱,第二欄是用來存label的值。
Learn More →
import tensorflow as tf
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
import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
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
img_width = 192
img_height = 168
batch = 64
epoch = 50
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)
print(X.shape)
print(X)
y = data['label']
y = y.to_numpy()
y=to_categorical(y,40)
print(y.shape)
print(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 1, test_size = 0.15)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
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'))
print(model.summary())
model.compile(optimizer='rmsprop', loss = 'categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=batch, epochs=epoch, validation_data=(X_test, y_test))
# Test
loss, accuracy = model.evaluate(X_test, y_test, batch_size=128)
print('Test:')
print('Loss: %s\nAccuracy: %s' % (loss, accuracy))
model.save('./CNN_Model.h5')
model = load_model('./CNN_Model.h5')
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 {1}:{0}".format(top,(i+1)))
prediction.append(top)
def createCsvFile(prediction):
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 create summisson.csv")
createCsvFile(prediction)
import tensorflow as tf
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
import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
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')
model = load_model('./CNN_Model.h5')
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=(192, 168, 3))
img = image.img_to_array(img)
img = img/255.0
Test.append(img)
Test = np.array(Test)
pred = model.predict(Test)
for i in range(len(pred)):
top = np.argmax(pred[i])
print("Prediction {1}:{0}".format(top,(i+1)))
def createCsvFile(prediction):
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 create summisson.csv")
createCsvFile(prediction)
import tkinter as tk
import tensorflow as tf
import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tkinter as tk
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
from tkinter import ttk
from tkinter import simpledialog as sd
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
def do_askpath():
global Path
Path = filedialog.askopenfilename()
print("Path : {}".format(Path))
img = Image.open(Path)
img = img.resize((250, 250), Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
panel = Label(window, image=img)
panel.image = img
panel.pack()
label= tk.Label(window,text = Path).pack()
def classifier():
model = load_model('./CNN_ModelwithAaron.h5')
img = image.load_img(Path, target_size=(192, 168, 3))
img = image.img_to_array(img)
img = img/255.0
Test = []
Test.append(img)
Test = np.array(Test)
pred = model.predict(Test)
for i in range(len(pred)):
top = np.argmax(pred[i])
if(top==40):
print("Prediction :{0}".format("410721303"))
Text = "Prediction:"+str("410721303")
else:
print("Prediction :{0}".format(top))
Text = "Prediction:"+str(top)
label= tk.Label(window,text = Text).pack()
window=tk.Tk()
window.title('Face Classify GUI Program')
window.geometry('500x500')
window.resizable(0,0)
window.configure(background='white')
ttk.Button(window, text="Image Path", command=do_askpath).pack()
ttk.Button(window, text="Predict", command=classifier).pack()
window.mainloop()
Face.pt和loadmodel.py結果如下:
GUI.py結果如下:
我認為這次的作業挺有挑戰性的,無論是一開始對於題目的理解上,還是在實作過程當中,許多新東西都要重新認識。這次我用的模型CNN也是參考網路上的教學,稍作修改出來的產物,參考了許多的資料,最終才一步步成形。在一開始要處理數據時就讓我非常頭疼,一直無法順利將正確的格式匯出,導致我的模型也建立錯誤。多虧了同儕的提醒,才發現要將label欄位的資料,轉換成numpy格式,最後才成功。後來模型順利建立完成之後,又發現辨識率極低,甚至辨識率還有為零的出現,奇特的是模型的正確率卻很高。後來經過很久的檢查,確認訓練次數,模型正確率、loss值等等,發現到我是在最後將預測出來的值,當作index又再度回去data裡面找資料,才發生錯誤,更正後辨識率大大提升。
再來開始實做視覺化程式又是一大挑戰,我這次用的方式是用tkinter建立視窗,透過谷哥大神稍微參透一下語法,就將內容一步一步填上,最後湊出簡單的成果。其中功能包含利用 ”ImagePath”這個按鈕,可以瀏覽電腦中的檔案所在,接著選擇完測試圖片之後,就可以按下”Prediction”按鍵,等待計算完成之後,就可以順利取得預測資料。基本功能都有,但是我認為有時間的話可以再添加”滾輪”功能,或是重新整理頁面的功能,讓我們載入多張照片的過程中,可以看到的範圍較大,也可以提升容錯率。
另外,在加入自己的資料並預測出學號這部分,我沒有另外擷取本人的照片,我就用Obama的照片做自己的資料去做預測,這個添加測資是透過擴增我原本39類的類別,再加上一類,命名為40類這個label,那我再將40這個預測值轉換成我的學號。我沒有將Obama的照片進行裁減,或是變成黑白的照片,我認為程式中reshape的部分就可以將它進行重新設定,達成程式要求,結果也順利的進行。
整題而言,我認為這次的程式,對於我的幫助蠻大的,雖然可能對於其中的原理,不是那麼了解,也因為時間的緊迫,完成度沒有那麼的完美,不然時間在充裕一些,我認為可以完成到更棒的品質。這次也因為GPU的設定沒有完成,所以預測結果的計算稍慢,慢到我認為有點不合格,大概為5秒的時間,如果加上GPU我認為可以達到更棒的效果。總之,這次的作業,收益良多!
最後分析一下在kaggle上的檔案,我認為辨識率分數最高僅有75分的原因為,有些圖片是全黑,或是完全無法辨識的,所以分數無法提高至90分,甚至以上,以上圖片也可以看到前幾次的提交紀錄,非常不理想,後來才慢慢提高,透過修改參數等等動作。
Kaggle:
https://www.kaggle.com/c/intro-to-ml-assignment-2
介紹影片:
https://reurl.cc/XkOQAj
FaceRecognitionUsingPCA&LDA Github Link 實作作方法與步驟: 依據資料的影像格式,讀取pgm影像檔。 每張人臉影像均為92x112=10304的灰階影像,將其轉為10304x1的向量,即成為一個樣本。 資料共含有400張影像(40人,每人10張),訓練時只用200張(每人隨機取5張)。 利用PCA計算此200張影像的轉換矩陣,設法將維度從10304降至10, 20, 30, 40, 50維 以較低維度的樣本訓練出SVM分類器來進行辨識。 比較不同維度的辨識率,並統計出混淆矩陣 以降維後的樣本,利用FLD(LDA)找出另一轉換矩陣,轉為有較佳的類別分離度之新樣本。
Jan 15, 2022實作樸素貝氏分類器用以分辨鴨子像素位置 Github Link 敘述說明 利用分類器將無人機於空中拍攝鴨子圖片(full_duck.jpeg)中的像速做為訓練data 分辨出那些是屬於鴨子的像素,哪些是背景的像素 並新建一個圖片將背景像素用黑色表示,鴨子部分則用白色表示。 運算公式
Jan 1, 2022OpenCV Installation 從 Ubuntu Repository 安裝 OpenCV sudo apt update sudo apt install libopencv-dev python3-opencv 上面的命令將安裝運行OpenCV所需的所有軟件包。 通過導入cv2模塊並印OpenCV版本來驗證安裝版本:
Mar 31, 2021數位身分證發行之資安風險 Information Security of public digital Identify Card 資安議題: 面對全球數位化浪潮,台灣規劃推動數位身分證(New eID),對於在數位化過程中所伴隨資安風險,政府也進行相關資安風險管控規範。 根據 Acuity market intelligence 全球市場趨勢調查及分析顧問機構調查,在 2017 年世界上已有 82%,約 128 個國家發行晶片卡的國民身分證明文件,到 2021年將有 89%,約 138 個國家採用eID,eID 明顯已是世界潮流。 台灣自 2015 年起再次啟動全面換發數位身分證的計畫,這是政府在 1998 年及 2005 年後,第三次正式啟動與數位身分的計畫。唐鳳表示,現在使用的身分證六代卡有兩大問題,防偽造保固只到2016年,因此辦很多重要手續就要雙證件,防偽功能越來越薄弱;第二,背面有很多別人的個資,還有戶籍地址,有時候辦住宿登記或是給大樓警衛看,馬上知道你住哪裡,個資洩漏比較多,換七代卡主要為解決防偽、個資洩漏問題。 本次製作數位身分證的政策自 2015 年發起至今歷經了多次修正。目前最新的計畫,是政府預計將現有的身分證結合自然人憑證,製作成新式數位晶片身分證,並預計於 2021年 1 月於澎湖縣、新竹市、新北市板橋區及永和區試辦, 2021 年 7 月開始全面換發。 台灣政府當前的規劃,在過去這一兩年內,引發了外界的高度質疑。主要疑慮如下: 新式數位身分證未全面評估資訊安全風險:新式數位身分證可能大幅擴充數位身分的應用範圍,但政府在考量資訊安全的風險時,卻只專注於晶片本身的生產風險,低估了其他與服務相關的系統與軟體風險,更不見其將可能儲存人民數位身分資料的單位的資安能量納入風險考量。 新式數位身分證增加個人遭受監控的風險:個人進行數位身份驗證,可能會在政府或企業端留下大量數位足跡。這些數位足跡可用於系統性地追蹤、分析個人行為。此外,T-Road 提高不同政府部門間資料交換的可能,或數位身分證所存放的高解析度照片(300dpi & 600dpi),亦引發程度不一的國家監控疑慮。針對上述風險,外界過去早有建議應同時設置反監控機制供人民使用,但政府並未採納。
Mar 31, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up