Scikit-learn (viết tắt là sklearn) là một thư viện mã nguồn mở trong ngành học máy, rất mạnh mẽ và thông dụng với cộng đồng Python, được thiết kế trên nền NumPy và SciPy. Scikit-learn chứa hầu hết các thuật toán học máy hiện đại nhất, đi kèm với đầy đủ bộ tài liệu. Điểm mạnh của thư viện này là nó được sử dụng phổ biến trong cộng đồng những người lập trình chuyên nghiệp, do đó nó luôn được cập nhật và có một cộng đồng đông đảo người sử dụng hỗ trợ.
3.3 Quá trình phát triển và xây dựng chương trình
3.3.1 Chương trình huấn luyện
Chương trình sử dụng bộ 1173 ảnh khuôn mặt là nam giới và 1134 ảnh khuôn mặt là nữ giới (nguồn internet: https://github.com), dùng làm cơ sở dữ liệu ảnh huấn luyện cho mạng CNN.
Bước 1: Thiết lập thông số cho chương trình huấn luyện: Epochs = 100;
Batch_size = 64;
Bước 2: Tải ảnh thiết lập cơ sở dữ liệu dùng huấn luyện;
Bước 3: Tiền xử lý dữ liệu để cắt khuôn mặt từ ảnh gốc;
Bước 4: Thực hiện các bước trong thuật toán CNN :
Input image Convolutional layer (Conv) + Pooling layer (Pool) Fully connected layer (FC) Build model
Bước 5: In biểu đổ mô phỏng kết quả huấn luyện.
Trong đó:
- Epoch: là số lần “duyệt” qua hết số lượng mẫu trong tập huấn luyện; - Loss/Accuracy: Độ sai/ Độ chính xác;
- Train_loss: Biểu thị độ sai trong quá trình huấn luyện;
- Train_Acc: Biểu thị độ chính xác trong quá trình huấn luyện; - Val_loss (Validation loss): Tập độ sai
- Val_acc (Validation accuracy): Tập độ chính xác xác thực
Sau khi chạy chương trình huấn luyện với Epoch = 100 ta được kết quả như sau:
- Loss: 4.5216e-05 - Accuracy: 1.0000 - Val_loss: 0.000086412 - Val_accuracy: 1.0000
Đây là một kết quả rất tốt với giá trị accuracy đạt ngưỡng 1.0000 và giá trị loss rất nhỏ chỉ 0.000086412.
3.3.2 Chương trình phát hiện giới tính
Kịch bản chạy thử nghiệm:
Số lượng học sinh thử nghiệm là 305 học sinh, Camera được đặt tại hành lang với góc nhìn thẳng với người di chuyển, có độ phân giải 720p, số lượng khung hình là 30fps, tốc độ di chuyển của học sinh là trung bình và chậm, đảm bảo cho camera có thể bắt được đầy đủ khung hình.
Bước 3: - Lặp lại quá trình phát hiện khuôn mặt trong các frame ảnh;
- Cắt hình ảnh khuôn mặt làm dữ liệu so sánh với 2 lớp đã được xây đựng trong quá trình huấn luyện
Bước 4: - Gán nhãn cho các khuôn mặt (Nam hoặc nữ) cùng tỉ lệ phát hiện.
3.3.3 Kết quả sau khi chạy dữ liệu thử nghiệm.
Hình 3.3 Bảng số liệu kết quả thử nghiệm
Khối Số lượng Nhận đúng Nhận sai Số lượng % Nam --> Nữ Nữ -->Nam Số lượng % Khối 10 105 98 93,33% 2 5 7 6,67% Khối 11 102 97 95,10% 1 4 5 4,90% Khối 12 98 97 98,98% 0 1 1 1,02% Tổng 305 292 95,74% 3 10 13 4,26%
Như vậy với bộ dữ liệu chạy thử nghiệm là phát hiện giới tính của 305 học sinh Trường phổ thông dân tộc nội trú tỉnh Quảng Ninh trong điều kiện đủ ánh sáng, kết quả phát hiện đúng giới tính là khá cao, với khối lớp 10 tỉ lệ phát hiện đúng giới tính là 93,33%; khối lớp 11 là 95,10%; khối lớp 12 đạt 98,98%; tỉ lệ chung toàn trường đạt 95,74% là một tỉ lệ tốt. Các trường hợp phát hiện sai thường do góc nhìn nghiêng hoặc dữ liệu chưa đủ và số lượng giới tính nữ bị phát hiện nhầm thành giới tính nam thì nhiều hơn so với giới tính nam phát hiện nhầm thành giới tính nữ.
PHẦN KẾT LUẬN
Sau khi tìm hiểu về công tác quản lý học sinh tại các khu ký túc xá của các Trường phổ thông dân tộc nội trú tỉnh Quảng Ninh cho thấy rằng công tác quản lý học sinh tạị khu ký túc xá của trường là một trong những công tác quản lý phức tạp, phải dành nhiều thời gian, nhân lực và hiệu quả trong công tác này còn thấp, nếu thực hiện việc ứng ụng công nghệ thông tin trong công tác quản lý tại đây sẽ giúp giảm thiểu thời gian và nhân lực, nâng cao chất lượng công tác quản lý.
Bài toán phát hiện giới tính từ hình ảnh mặt người là một bài toán còn có nhiều thách thức, ngoài yếu tố về thuật toán thì đặc biệt là trong điều kiện ảnh mặt bị tác động bởi các yếu tố như ánh sáng, thời gian, hướng cũng sẽ làm sai lệch kết quả nhận diện. Trong luận văn này, tôi cũng đã tìm hiểu, phân tích bài toán phát hiện giới tính thông qua các đặc điểm trên khuôn mặt thông qua 2 kỹ thuật LPQ và CNN, một hệ thống phát hiện mặt tự động đã được đề xuất, xây dựng và đánh giá hiệu năng cơ bản.
Hệ thống đề xuất sử dụng các thuật toán CNN (Convolutional neural network) được huấn luyện từ bộ 1173 ảnh khuôn mặt là giới tính nam và 1134 ảnh khuôn mặt là giới tính nữ, chương trình sẽ sử dụng thuật toán trích rút đặc điểm của 1173 ảnh khuôn mặt giới tính nam và 1134 ảnh khuôn mặt giới tính nữ để khởi tạo mô hình và phân loại mô hình huấn luyện cho máy sau đó lưu vào hệ thống, sau đó chương trình phát hiện giới tính từ hình ảnh khuôn mặt sẽ phát hiện các hình ảnh khuôn mặt được trích xuất từ camera đối chiếu với các đặc điểm được hệ thống trích rút từ tập mô hình đã được huấn luyện sau đó căn cứ vào tỉ lệ đối sánh trong mô hình rút ra kết luận hình ảnh thu nhận là giới tính nam hay giới tính nữ và hiển thị các thông báo phản hồi trên hình ảnh camera.
Qua kết quả cho thấy trong điều kiện đủ ánh sáng, các góc nhìn thẳng, khuôn mặt không bị che khuất kết quả phát hiện đúng đạt tỷ lệ cao (95,74%), đặc biệt hệ thống phát hiện cho kết quả chính xác có tỉ lệ thấp hơn đối với các bạn lớp 10 nhưng tăng độ chính xác đối với các học sinh lớp 11 và 12.
Chương trình thử nghiệm mới đưa ra được phát hiện giới tính trong các điều kiện tiêu chuẩn và còn nhiều hạn chế như chưa kết nối với các thiết bị có thể ghi nhận và cảnh báo cho người quản lý, ở các điều kiện thiếu sáng hoặc bị che khuất thì tỷ lệ phát hiện đúng còn thấp, Vì vậy, theo quan điểm của học viên, đề tài còn có một số hướng phát triển sau:
+ Tăng khả năng phát hiện chính xác trong các điều kiện khác nhau + Kết nối các thiết bị để ghi nhận, cảnh báo cho người quản lý;
+ Thiết kế các biểu mẫu thống kê báo cáo phù hợp với yêu cầu thực tế. Do giới hạn về thời gian nghiên cứu và kiến thức của bản thân, luận văn khó có thể tránh khỏi một số sai sót nhất định. Học viên rất mong nhận được sự đóng góp ý kiến của các thầy cô, các bạn đọc quan tâm để luận văn được hoàn thiện hơn.
Một lần nữa học viên xin được cảm ơn Thầy PGS TS Đỗ Năng Toàn đã tận tình giúp đỡ, hướng dẫn trong thời gian thực hiện đề tài, cảm ơn sự giúp đỡ của gia đình, bạn bè và các đồng nghiệp trong thời gian qua.
Thái Nguyên ngày 16 tháng 9 năm 2020
Người thực hiện
TÀI LIỆU THAM KHẢO
I. Tài liệu tiếng Việt
[1]. Tài Liệu về Xử Lý Ảnh của PGS TS Đỗ Năng Toàn Và TS Phạm Việt Bình của trường Đại Học Thái Nguyên biên soạn.
[2]. Nguyen Huu Tuan. “Towards buiding an automatic gender classification system using LPQ”. The international conference on marine science and technology 2016.
[3]. Phung Thi Thu Trang, Ma Thi Hong Thu. “a lightweight deep learning moder for age and gender indentity problem using the CNN network”
[4]. Thông tư 01/2016/TT-BGDĐT ngày 15/01/2016 của Bộ Giáo dục và Đào tạo ban hành về quy chế tổ chức và hoạt động của trường phổ thông dân tộc nội trú.
II. Tài liệu tiếng Anh
[5] Allen Downey, Think Python, How to Think Like a Computer Scientist, Green Tea Press 9 Washburn Ave Needham MA 02492 2015 [6]. M. Duan, K. Li, C. Yang, and K. Li, “A hybrid deep learning cnn– elm for age and gender classification”, Neurocomputing, Vol. 275, pp. 448–461, 2018.
PHỤ LỤC 1. Chương trình huấn luyện
//import các thư viện
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.utils import to_categorical, plot_model
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import BatchNormalization, Conv2D, MaxPooling2D, Activation, Flatten, Dropout, Dense from tensorflow.keras import backend as K
from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import numpy as np import random import cv2 import os import glob
# Thiết lập thông số ban đầu
epochs = 100 lr = 1e-3
batch_size = 64
img_dims = (96,96,3) data = []
labels = []
# Tải các tệp hình ảnh từ tập dữ liệu
image_files = [f for f in glob.glob (r'C:\Files\gender_dataset_face' + "/**/*", recursive=True)
if not os.path.isdir(f)] random.shuffle(image_files)
# chuyển đổi hình ảnh và gắn nhãn
for img in image_files:
image = cv2.imread(img) image = cv2.resize(image, (img_dims[0],img_dims[1])) image = img_to_array(image) data.append(image) label = img.split(os.path.sep)[-2] # C:\Files\gender_dataset_face\woman\face_1162.jpg if label == "woman": label = 1 else: label = 0
labels.append([label]) # [[1], [0], [0], ...]
# Gắn nhãn vào mảng
data = np.array(data, dtype="float") / 255.0 labels = np.array(labels)
# Chia nhỏ tập dữ liệu để train
(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=0.2,
random_state=42)
trainY = to_categorical(trainY, num_classes=2) # [[1, 0], [0, 1], [0, 1], ...]
testY = to_categorical(testY, num_classes=2)
# Tăng cường độ chính xác aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode="nearest") # Định nghĩa kiểu
def build(width, height, depth, classes): model = Sequential()
inputShape = (height, width, depth) chanDim = -1
if K.image_data_format() == "channels_first": #Returns a string, either 'channels_first' or
'channels_last'
inputShape = (depth, height, width) chanDim = 1
# (Cài đặt thuật toán CNN) chuẩn hóa sau lớp Conv2D với data_format="channels_first", # Gắn trục = 1 trong BatchNormalization. model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape)) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(3,3))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(64, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(128, (3,3), padding="same"))
model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(128, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(1024)) model.add(Activation("relu")) model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(classes)) model.add(Activation("sigmoid")) return model # Xây dựng kiểu
model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2],
classes=2)
# Biên dịch kiểu
opt = Adam(lr=lr, decay=lr/epochs)
model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])
# Train kiểu H = model.fit_generator(aug.flow(trainX, trainY, batch_size=batch_size), validation_data=(testX,testY), steps_per_epoch=len(trainX) // batch_size, epochs=epochs, verbose=1) # Lưu kiểu model.save('gender_detection.model') # Lập đồ thị plt.style.use("ggplot") plt.figure() N = epochs plt.plot(np.arange(0,N),H.history["loss"],label="train_los s") plt.plot(np.arange(0,N),H.history["val_loss"],label="val_l oss")++++++ plt.plot(np.arange(0,N), H.history["acc"], label="train_acc") plt.plot(np.arange(0,N), H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy") plt.xlabel("Epoch #")
# Ghi đồ thị ra đĩa
plt.savefig('plot.png')
2. Chương trình phát hiện giới tính
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model import numpy as np import cv2 import os import cvlib as cv # load kiểu model = load_model('gender_detection.model') # Mở webcam webcam = cv2.VideoCapture(0) classes = ['Nam','Nu'] # Tạo khung while webcam.isOpened(): # Đọc các khung từ webcam
status, frame = webcam.read()
# Áp dụng nhận diện khuôn mặt
face, confidence = cv.detect_face(frame) for idx, f in enumerate(face):
(startX, startY) = f[0], f[1] (endX, endY) = f[2], f[3]
# Vẽ hình chữ nhật trên mặt
cv2.rectangle(frame, (startX,startY), (endX,endY), (0,255,0), 2)
# Cắt vùng khuôn mặt được phát hiện
face_crop = np.copy(frame[startY:endY,startX:endX])
if (face_crop.shape[0])<10 or (face_crop.shape[1]) < 10: continue
# Tiền xử lý cho kiểu
face_crop = cv2.resize(face_crop, (96,96)) face_crop = face_crop.astype("float") / 255.0 face_crop = img_to_array(face_crop)
face_crop = np.expand_dims(face_crop, axis=0)
# Áp dụng tính năng phát hiện giới tính trên khuôn mặt
conf = model.predict(face_crop)[0]
# model.predict return a 2D matrix, ex: [[9.9993384e-01 7.4850512e-05]]
# Nhận nhãn với độ chính xác lớn nhất.
idx = np.argmax(conf) label = classes[idx]
# Hiển thị nhãn và độ chính xác trên khung nhận diện.
cv2.putText(frame, label, (startX, Y), cv2.FONT_HERSHEY_SIMPLEX,
0.7, (0, 255, 0), 2)
# Hiển thị dữ liệu ra
cv2.imshow("gender detection", frame)
# Nhấn phíp (Q) để thoát.
if cv2.waitKey(1) & 0xFF == ord('q'): break
webcam.release()