安裝python直譯器,Welcome to Python
測試執行影片播放影片程式,相關套件:
pip3 install opencv-python
程式碼:
# Import the necessary modules and libraries
import cv2
#讀取辨識用影片檔
cap = cv2.VideoCapture("twofaces.mp4")
while True:
ret, img = cap.read()
if ret == False: break
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key==27: break
cap.release()
cv2.destroyAllWindows()
計算影片中各畫面的特徵值,收集處理資料,畫出資料分佈圖
相關套件:
pip3 install numpy
pip3 install matplotlib
程式碼:
# Import the necessary modules and libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#讀取辨識用影片檔
cap = cv2.VideoCapture("twofaces.mp4")
#Data collection
num = 0
data = list()
while True:
ret, img = cap.read()
if ret == False: break
data.append([num, np.std(img), np.mean(img)])
num = num+1
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key==27: break
cap.release()
cv2.destroyAllWindows()
#Drawing
data = np.array(data)
fig1 = plt.figure()
ax = plt.subplot(projection='3d')
ax.scatter(data[:, 0], data[:, 1], data[:, 2])
plt.show()
利用PCA轉換顯示方式。相關套件:
pip3 install scikit-learn
Homework 1: 根據資料分佈的轉換結果解釋:
轉換過程(解釋PCA)
各維度的關係(解釋eigen vectors)
結論(解釋轉換結果)
作業以一至兩頁呈現,標示姓名及學號,轉成PDF繳交
程式碼:
# Import the necessary modules and libraries
...
#Data collection
...
#Data scaling
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
scaled_data = scaler.transform(data)
#PCA processing
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(scaled_data)
x_pca = pca.transform(scaled_data)
#Drawing
fig1=plt.figure()
ax = plt.subplot(projection='3d')
ax.scatter(x_pca[:, 0], x_pca[:, 1], x_pca[:, 2])
plt.show()
利用Decision Tree建立分佈模型
Homework 2: 解釋不同max_depth所近似的模型,在supervised learning的應用,以及Overfitting的情況。
作業以一至兩頁呈現,標示姓名及學號,轉成PDF繳交。
程式碼:
# Import the necessary modules and libraries
...
#Data collection
...
#Decision tree regression
from sklearn.tree import DecisionTreeRegressor
data = np.array(data)
regr = DecisionTreeRegressor(max_depth=2)
regr.fit(data[:, 0].reshape(-1, 1), data[:,1])
#Predict
y_p = regr.predict(data[:, 0].reshape(-1, 1))
#Drawing
fig1 = plt.figure()
plt.scatter(data[:, 0], data[:, 1])
plt.plot(data[:, 0], y_p, c="darkorange")
plt.show()
利用Haar-like特徵所訓練出的模型偵測人臉。
其他偵測模型:haarcascades
程式碼:
# Import the necessary modules and libraries
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
#讀取辨識用影片檔
cap = cv2.VideoCapture("twofaces.mp4")
while True:
ret, img = cap.read()
if ret == False: break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5, 4 )
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key==27: break
cap.release()
cv2.destroyAllWindows()
利用k-means分群人臉照片。
Homework 3: 調整k值n_clusters,實作分群影片中的人臉圖片,說明不同k值的分群結果。
程式碼:
# Import the necessary modules and libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import shutil
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
#讀取辨識用影片檔
cap = cv2.VideoCapture("twofaces.mp4")
if os.path.isdir("data"):
shutil.rmtree("data")
os.mkdir("data")
else: os.mkdir("data")
#Data collection
num = 0
data = list()
while True:
ret, img = cap.read()
if ret == False: break;
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5, 4 )
for (x, y, w, h) in faces:
image = img[y: y+h, x: x+w]
cv2.imwrite('data/%d.png'%num, image)
data.append([np.std(image), np.mean(image)])
num = num+1
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv2.imshow('img', img)
key = cv2.waitKey(1)
if key==27: break
cap.release()
cv2.destroyAllWindows()
#Data scaling
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
scaled_data = scaler.transform(data)
#Applying k-means to predict
from sklearn.cluster import KMeans
X = np.array(scaled_data)
y_p = KMeans(n_clusters=2).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_p)
plt.show()
#Rename image file name
for i in range(num):
os.rename('data/%d.png'%i, 'data/'+str(y_p[i])+('_%d.png'%i))
資料搜集:輸入影片産生人臉偵測照片序列檔案,存放在data目錄中的兩個目錄,一個為辨識目標,一個為驗證資料。
建立模型:利用卷積神經網路神經網路(CNN)訓練程式,訓練人臉辨識模型,産生訓練結果模型檔。
成果應用:執行臉部辨識程式,標示影像中的人臉。
相關套件:
pip3 install pandas
pip3 install tensorflow
建立模型
# Import the necessary modules and libraries
import os
import numpy as np
import cv2
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense, Flatten, Dropout, Activation, Conv2D, MaxPooling2D
#設定照片處理大小
IMAGE_SIZE = 64
OUTPUTS_SIZE = 10
#設定辨識目標存放目錄名稱
path_name = "./data/"
#準備訓練資料
label = 0
images = []
labels = []
for dir_item in os.listdir(path_name):
full_path = os.path.join(path_name, dir_item)
if os.path.isdir(full_path):
print(label, full_path)
for file_item in os.listdir(full_path):
file_path = os.path.join(full_path, file_item)
if file_path.endswith('.png'):
image = cv2.imread(file_path)
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
image = cv2.resize(image, dsize=(IMAGE_SIZE, IMAGE_SIZE))
image = image/255.0
images.append(image)
output = np.zeros(OUTPUTS_SIZE)
output[label] = 1
labels.append(output)
label += 1
images = np.array(images).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)
labels = np.array(labels)
# Training
X_train, X_test, Y_train, Y_test = train_test_split(images, labels, test_size=.2)
model = Sequential()
# Adds a densely-connected layer to the model:
model.add(Input(shape=X_train.shape[1:]))
model.add(Conv2D(64,(3,3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
# Add a softmax layer with output units:
model.add(Dense(OUTPUTS_SIZE, activation='sigmoid'))
model.compile(optimizer="adam", loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, Y_train, epochs=100, batch_size=32, validation_data=(X_test, Y_test))
# evaluate the model
model.summary()
test_loss, test_acc = model.evaluate(X_test, Y_test)
print(f'Test accuracy: {test_acc}')
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:json_file.write(model_json)
model.save_weights("a.weights.h5")
模型應用
# Import the necessary modules and libraries
import os
import numpy as np
import cv2
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential, model_from_json
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
#設定照片處理大小
IMAGE_SIZE = 64
NAMES = ["apple", "banana", "cherry", "durian"]
# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
model.load_weights("a.weights.h5")
#準備測試資料
cap = cv2.VideoCapture("twofaces.mp4")
while True:
ret, img = cap.read()
if ret == False: break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5, 4 )
if len(faces)>0:
images = []
for (x, y, w, h) in faces:
image = gray[y: y+h, x: x+w]
image = cv2.resize(image, dsize=(IMAGE_SIZE, IMAGE_SIZE))
image = image/255.0
images.append(image)
images = np.array(images).reshape(-1, IMAGE_SIZE, IMAGE_SIZE, 1)
predictions = model.predict(images)
i = 0
for (x, y, w, h) in faces:
label = np.where(predictions[i] == max(predictions[i]))[0][0]
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)
cv2.putText(img, NAMES[label], (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 1)
i += 1
cv2.imshow('img', img)
k = cv2.waitKey(1)
if k == 27: break
cap.release()
cv2.destroyAllWindows()
利用CNN類神經模型,實作分類影片中的不同偵測物件,辨識影片中三個以上的偵測結果。
Homework 4: 結果說明,問題討論
(1) 一定有分類結果,對於應用上有什麼問題,該如何解決?
(2) 利用模型決策結果只有編號,該如何解決辨識後的標示名稱?