- Nội dung sơ sài- Trình bầy kém, mắc nhiều lỗi chính tả- Nội dung khá sơ sài và hạn chế- Trình bầy còn hạn chế- Mắc tương đối nhiều lỗi chính tả- Bố cục rõ ràng- Nội dung khá đầyđủ chín
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘITRƯỜNG CƠ KHÍ
KHOA CƠ ĐIỆN TỬ
Giảng viên hướng dẫn: TS Dương Văn Lạc
Sinh viên thực hiện: Trần Ngọc Thuận 20195192 Vũ Duy Minh 20195100 Hoàng Xuân Đích 20194946
Hà Nội, 1/2024
Trang 2- Nội dung sơ sài- Trình bầy kém, mắc nhiều lỗi chính tả
- Nội dung khá sơ sài và hạn chế- Trình bầy còn hạn chế
- Mắc tương đối nhiều lỗi chính tả
- Bố cục rõ ràng- Nội dung khá đầyđủ chính xác- Trình bầy tương đối tốt- Mắc ít lỗi chính tả
- Bố cục của bài viết rõ ràng
- Nội dung đầy đủ, chính xác- Trình bầy tốt
- Sản phẩm sơ sài,chức năng chưa đầy đủ- Tính thẩm mỹ còn kém- Sản phẩm hoạt động
- Sản phẩm tương đối sơ sài, chức năng còn hạn chế- Tính thẩm mỹ còn hạn chế- Sản phẩm hoạt động
- Sản phẩm tương đối hoàn thiện, chức năng khá đầy đủ
- Sản phẩm có tínhthẩm mỹ- Sản phẩm hoạt động tốt
- Sản phẩm hoàn thiện, chức năng đầy đủ- Sản phẩm có tính thẩmmỹ
- Sản phẩm hoạt động tin cậy
- Trả lời các câu hỏi còn nhiều hạnchế
- Hiểu, vận dụng các kiếm thức cònnhiều hạn chế
- Trả lời các câu hỏi còn hạn chế- Hiểu, vận dụng các kiếm thức đã học còn hạn chế
- Trả lời tương đối tốt các câu hỏi- Hiểu, vận dụng các kiếm thức đã học tương đối tốt
- Trả lời đúng và đầy đủ tất các các câu hỏi- Hiểu, vận dụng tốt kiếm thức đã học- Có khả năng phân tích,đánh giá, sáng tạo
II ĐIỂM ĐÁNH GIÁ CHÍNH THỨC
STTHọ tênMSSV Điểm quyểnbáo cáo ĐBC
Điểm sảnphẩm ĐSP
(40%)Điểmbảo vệ*
ĐIỂM KẾT QUẢĐKQ=10%Đ +40%Đ +50%ĐBCSPBV
1Trần Ngọc Thuận 201951922Vũ Duy Minh 201951003Hoàng Xuân Đích 20194946
*Lưu ý: ĐBV ≤ min {ĐBC, ĐSP}.
Trang 3PHÂN CÔNG NHIỆM VỤ
Tìm hiểu thời gianthực, viết codechương trình nhậndạng python, chuẩn bị
phần cứng
Tìm hiểu về thuật toánchương trình python vàarduino, chuẩn bị báo
3 Hoàng Xuân Đích 20194946
Viết chương trìnharduino, chuẩn bị báo
cáo
Trang 4Trang 3
LỜI MỞ ĐẦU
Công nghệ thông tin ngày càng phát triển và có vai trò hết sức quan trọng không thểthiếu trong cuộc sống hiện đại Con người ngày càng tạo ra những cỗ máy thông minhcó khả năng tự nhận biết và xử lí được các công việc một cách tự động, phục vụ cho lợiích của con người Trong những năm gần đây, một trong những bài toán nhận đượcnhiều sự quan tâm và tốn nhiều công sức nhất của lĩnh vực công nghệ thông tin, đóchính là bài toán nhận dạng
Tuy mới xuất hiện chưa lâu nhưng nó đã rất được quan tâm vì tính ứng dụng thực tếcủa bài toán cũng như sự phức tạp của nó Bài toán nhận dạng có rất nhiều lĩnh vựcnhư: nhận dạng vật chất (nước, lửa, đất, đá, gỗ, ), nhận dạng chữ viết, nhận dạnggiọng nói, nhận dạng vật thể, nhận dạng khuôn mặt, trong đó phổ biến và được ứngdụng nhiều hơn cả là bài toán nhận dạng vật thể Các ứng dụng liên quan đến nhận dạngvật thể có thể kể như: Nhận dạng phương tiện giao thông, Nghiên cứu về việc nhận dạngvà phân loại các đối tượng trong môi trường công nghiệp, hệ thống tìm kiếm thông tintrên ảnh, video dựa trên nội dung, Cho đến tận bây giờ, các nhà nghiên cứu vẫn chưađạt được sự ưng ý trong việc giải quyết các khó khăn của bài toán và cho kết quả hoàntoàn đúng Tuy nhiên, những gì đã đạt được cũng đủ để chúng ta áp dụng rộng rãi vàđem lại những lợi ích to lớn trong cuộc sống.
Với sự hấp dẫn của bài toán và những thách thức còn đang ở phía trước, với niềmđam mê công nghệ hiện đại và những ứng dụng thực tế tuyệt với của nó, với khát khaokhám phá và chinh phục những tri thức mới mẻ, nhóm em đã chọn đề tài nghiên cứu:“Nhận dạng đối tượng thời gian thực và điều khiển bàn xoay” làm để tài bài tập lớnmôn Xử lý ảnh Em xin cảm ơn các thầy cô bộ môn của Trường Cơ khí-Đại học BáchKhoa Hà Nội đã trang bị đầy đủ những kiến thức chuyên ngành cần thiết, đặc biệt emxin gửi lời cảm ơn đến thầy Dương Văn Lạc, đã tận tình hướng dẫn, trực tiếp đánh giá,nhận xét giúp đỡ em rất nhiều trong quá trình hoàn thiện bài tập lớp môn học.
Chúng em xin chân thành cảm ơn!
Trang 5MỤC LỤC
Trang 6Trang 5
CHƯƠNG 1: KẾT QUẢ1.1 Nội dung bài toán
Đầu vào: Ảnh và thông tin kèm theo của những người tham gia thực nghiệm.
Đầu ra: Nhận diện được khuôn mặt và trả về thông tin của người nhận dạng được.
1.2 Các thành phần cơ bản
Phần cứng:Camera
Máy tính
Trang 7Chúng ta có thể chạy PyCharm trên Windows, Linux hoặc Mac OS.
Trang 8Trang 7Ngoài ra, nó chứa các module và các package giúp các lập trình viên pháttriển phần mềm bằng Python tiết kiệm thời gian và công sức Hơn nữa, nócũng có thể được tùy chỉnh theo yêu cầu của các nhà phát triển.
+Python 3.9.10
Trang 9+ Firebase.
Firebase là một nền tảng do Google cung cấp để hỗ trợ việc phát triểncác ứng dụng web và di động1 Firebase có nhiều chức năng như lưu trữ dữliệu thời gian thực, phân tích ứng dụng, tiếp thị sản phẩm và khắc phục sự cố.Firebase có nhiều dịch vụ khác nhau cho các nhà phát triển ứng dụng Mộttrong số dịch vụ nổi bật là “Realtime Database: lưu trữ và đồng bộ dữ liệungười dùng theo thời gian thực”
+Thư viện Opencv
Project OpenCV được bắt đầu từ Intel năm 1999 bởi Gary Bradsky.OpenCV viết tắt cho Open Source Computer Vision Library OpenCV là thưviện nguồn mở hàng đầu cho Computer Vision và Machine Learning, và hiệncó thêm tính năng tăng tốc GPU cho các hoạt động theo real-time.
OpenCV được phát hành theo giấy phép BSD, do đó nó miễn phí chocả học tập và sử dụng với mục đích thương mại Nó có trên các giao diện C++, C, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android.OpenCV được thiết kế để hỗ trợ hiệu quả về tính toán và chuyên dùng cho cácứng dụng real-time (thời gian thực) Nếu được viết trên C/C++ tối ưu, thưviện này có thể tận dụng được bộ xử lý đa lõi (multi-core processing).
Trang 10Trang 9+Thư viện Face-Recognition
Thư viện Face-Recognition là một thư viện nhận dạng khuôn mặt rấtnổi tiếng và độ chính xác khá tốt xây dựng dựa trên dlib của python và đượcviết bằng C++1 Thư viện này có thể thực hiện các bài toán như:
Face Detection: phát hiện khuôn mặt trong ảnh hoặc video2.Face Embedding: biểu diễn khuôn mặt bằng một vector số2.
Face Recognition: xác định hoặc xác minh người trong ảnh hoặc video23.
Độ chính xác của thư viện này trên tập Labeled Faces in the Wild là 99,38%
1.3 Chương trình nhận diện khuân mặt thời gian thực
Tải dữ liệu lên firebase
Trang 11counter = 1modeType = 1
ifcounter== 0If matches [matchI ndex]matchIndex
counter = 0modeType = 3Tải dữ li u mói c p nh t lên firebase
Nếu khoảngcách giữu 2 lần ghi nh n liêp tiếp
trueNếu cókhuân m t trong camera
trueif counter <=
trueif 10 < counter
Chạy chương trình nhận diện
counter += 1
Trang 12Vẫn còn xảy ra hiện tượng giật lag do sự truyền tải dữ liệu thời gianthực giữa thiết bị và Firebase.
Một số kết quả thực nghiệm như sau:
Trang 131.5 Thảo luận kết quả thực nghiệm
Sau 4 tháng học môn Xử lý ảnh kết hợp với sự tìm tòi, học hỏi, nghiêncứu từ bạn bè, thầy cô giáo và mạng Internet, nhóm đã đạt được mục tiêu đềra:
Sử dụng tốt ngôn ngữ Python, thư viện OpenCV và face_recognition,tìm hiểu và áp dụng thành công cơ sở dữ liệu Firebase, hoàn thiện các thuậttoán đáp ứng yêu cầu đề ra.
Đây là lần đầu nhóm thực hiện mô hình nên còn nhiều thiếu xót, cũngnhư chưa hoàn thiện về giao diện phần mềm và các thiết bị về hệ thống cơkhí.
Trang 14Trang 13
CHƯƠNG 3: KẾT LUẬN3.1 Kết luận
Sau thời gian nghiên cứu dưới sự hướng dẫn của PGS.TS Mạc ThịThoa, hệ thống đã đáp ứng các yêu cầu đề ra Các khối chức năng hoạt độngđúng, đảm bảo cập nhật đầy đủ dữ liệu, hệ thống chạy ổn định trong thời giandài không phát sinh lỗi hoặc xác suất thấp Hệ thống thu được kết quả với độchính xác cao nhưng vẫn chưa xử lý được hiện tượng giật lag Nhu cầu về cácbài toán nhận dạng khuôn mặt đang rất cấp thiết trong cuộc sống, hệ thốngnày tuy còn sơ khai nhưng là bước đầu để xây dựng nên một hệ thống nhậndạng hoàn chỉnh với sự chính xác, tốc độ ưu việt và quy mô cơ sở dữ liệurộng hơn.
3.2 Hướng phát triển đề tài trong tương lai
Xử lý nhiễu với các luồng sáng khác nhau.
Thiết kế hệ thống cơ khí hoàn chỉnh cho toàn bộ hệ thống.
Nhận dạng được khuôn mặt khi đeo khẩu trang hoặc bị che một phầnkhuôn mặt.
Phát triển trợ lý ảo hướng dẫn cũng như đưa ra thông tin trong quá trìnhnhận dạng.
Trang 15CHƯƠNG 4: TÀI LIỆU THAM KHẢO
Trang 16-Trang 15
CHƯƠNG 5: PHỤ LỤC
1.Chương trình tải thông tin lên firebase import firebase_adminfrom firebase_admin import credentials from firebase_admin import db
cred = credentials.Certificate("serviceAccountKey.json") firebase_admin.initialize_app(cred, {
'databaseURL':"https://faceattendacerealtime-49075-default- rtdb.firebaseio.com/"
ref = db.reference('Students')
data = {"20195124":
"name": " Nguyễn Văn Nhất ","major" : " Mechatronics ", "starting_year": 2019,"total_attendance": 6,"Class": "ME1-02",
"last_attendance_time": "2022-12-11 00:54:34"},
Trang 17"name": " Nguyễn Văn Minh ","major" : " Mechatronics ", "starting_year": 2019,"total_attendance": 6,"Class": "ME1-02",
"last_attendance_time": "2022-12-11 00:54:34"},
"name": " Mạc Thị Thoa ", "major" : " Mechatronics Talent ","starting_year": 2019,
"total_attendance": 6,"Class": "ME1",
"last_attendance_time": "2022-12-11 00:54:34"},
for key, value in data.items():ref.child(key).set(value)
Trang 18Trang 17
2.Chương trình tải ảnh lên firebaseimport cv2
import face_recognitionimport os
import pickleimport firebase_admin
from firebase_admin import credentials from firebase_admin import storage
cred = credentials.Certificate("serviceAccountKey.json") firebase_admin.initialize_app(cred,{
'databaseURL':"https://faceattendacerealtime-49075-default- rtdb.firebaseio.com/",
folderPath = 'imagesencode'
pathList = os.listdir(folderPath) #hàm trong thư viện OS hỗ trợ load tất cả các ảnh trong 1 list
print(pathList)imgList = [] studentIds = []for path in pathList:
Trang 19imgList.append(cv2.imread(os.path.join(folderPath,path))) studentIds.append(os.path.splitext(path)[0])
#append : thêm nối đuôi ma trận của các ảnh vào studentIds#print(path)
# os.path.splitext(tên_ảnh) để tach tên ảnh và đuôi định dạng theo dấu '.'
fileName = f'{folderPath}/{path}'bucket = storage.bucket()blob = bucket.blob(fileName) blob.upload_from_filename(fileName)
def findEncodings(imagesList):encodeList = []
for img in imagesList:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)encode = face_recognition.face_encodings(img)[0]encodeList.append(encode)
return encodeList print("Encoding Started ")
encodeListKnown = findEncodings(imgList)
Trang 20Trang 19encodeListKnownWithIds = [encodeListKnown, studentIds]
print("Encoding Complette")
file = open("EncodeFile.p",'wb')
pickle.dump(encodeListKnownWithIds,file) file.close()
print("File Saved")
3.Chương trình nhận dạng khuân mặtimport pickle
import cv2import os
import face_recognitionimport cvzoneimport firebase_admin
from firebase_admin import credentials from firebase_admin import dbfrom firebase_admin import storageimport numpy as np
from datetime import datetimefrom gtts import gTTSimport playsound
from unidecode import unidecode
Trang 21cred = credentials.Certificate("serviceAccountKey.json") firebase_admin.initialize_app(cred,{
'databaseURL':"https://faceattendacerealtime-49075-default- rtdb.firebaseio.com/",
bucket = storage.bucket() cap = cv2.VideoCapture(0)cap.set(3,640)
imgModeList.append(cv2.imread(os.path.join(folderModePath,path)))#print(modelPathList) #['1.png', '2.png', '3.png', '4.png']
# Load the encodeing fiefile = open('EncodeFile.p','rb')
Trang 22Trang 21encodeListKnownWithIds = pickle.load(file)
encodeListKnown, studentIds = encodeListKnownWithIds #print(studentIds)
modeType = 0counter = 0id = 0 imgStudent = []
def voicetext(text):
output = gTTS(text, lang="vi", slow=False)output.save("voice.mp3")
playsound.playsound("voice.mp3", True) os.remove("voice.mp3")
while True:
ret, img = cap.read()
imgS = cv2.resize(img,(0,0),None, 0.25, 0.25) #giam kich thước ảnh để xử lý nhanh hơn
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
faceCurFrame = face_recognition.face_locations(imgS) #lấy từng khuân mặt và vị trí khuân mặt hiện tại
Trang 23encodeCurFrame = face_recognition.face_encodings(imgS, faceCurFrame)
y1, x2, y2, x1 = y1*4, x2*4, y2*4, x1*4bbox = 55 + x1, 162+y1, x2-x1, y2-y1
imgBackground = cvzone.cornerRect(imgBackground, bbox, rt=0)
Trang 24Trang 23id = studentIds[matchIndex]
if counter == 0: # nếu ko có lệnh if này thì counter sẽ luôn nhỏ 10 và2 lệnh đk 10< <=20 và >=20 ko đc thực thi
counter = 1modeType = 1if counter != 0:
if counter == 1:# get the data
studentInfo = db.reference(f'Students/{id}').get()#print(studentInfo)
# get the Image from the storage
blob = bucket.get_blob(f'imagesencode/{id}.jpg')
array = np.frombuffer(blob.download_as_string(), np.uint8) imgStudent = cv2.imdecode(array,cv2.COLOR_BGRA2BGR) #update data of attendance
datetime.strptime(studentInfo['last_attendance_time'], "%Y-%m-%d%H:%M:%S")
secondsElapsed =(datetime.now()-datetimeObject).total_seconds() #print(secondsElapsed)
Trang 25else:counter = 0modeType = 3
imgBackground[44:44 + 633, 808:808 + 414] =imgModeList[modeType]
if modeType != 3: if counter <= 10:
imgBackground[44:44 + 633, 808:808 + 414] =imgModeList[modeType]
cv2.putText(imgBackground, str(studentInfo['total_attendance']),(861,125),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),1)
cv2.putText(imgBackground, str(studentInfo['major']),
(1000, 550), cv2.FONT_HERSHEY_COMPLEX, 0.5,(255, 255, 255), 1)
cv2.putText(imgBackground, str(id),
(1006, 493), cv2.FONT_HERSHEY_COMPLEX, 0.5,(255, 255, 255), 1)
cv2.putText(imgBackground, str(studentInfo['Class']),
(910, 625), cv2.FONT_HERSHEY_COMPLEX, 0.5,(100,100,100), 1)
cv2.putText(imgBackground, str(studentInfo['total_attendance']),
Trang 26Trang 25(1025, 625), cv2.FONT_HERSHEY_COMPLEX, 0.6,(100,100,100), 1)
cv2.putText(imgBackground, str(datetime.now().strftime("%H:%M:%S")),
(1125,625), cv2.FONT_HERSHEY_COMPLEX, 0.4,(100,100,100), 1)
(w,h), _ = cv2.getTextSize(studentInfo['name'],cv2.FONT_HERSHEY_COMPLEX, 1, 1)
#(width, height), baseline :baseline: vị trí của baseline trong vănbản.
# Baseline là đường thẳng ở phía dưới của các chữ cái.offset = (414 - w)//2
(808 + offset, 445), cv2.FONT_HERSHEY_COMPLEX,1, (50, 50, 50), 1)
imgBackground[175:175+216,909:909+216] = imgStudent
if 10 < counter <= 20:modeType = 2
imgBackground[44:44 + 633, 808:808 + 414] =imgModeList[modeType]
if counter>=20:counter = 0modeType = 0 studentInfo = []
Trang 27imgStudent = []
imgBackground[44:44 + 633, 808:808 + 414] =imgModeList[modeType]
counter += 1else:
modeType = 0counter = 0
cv2.imshow("Face Attendance", imgBackground)if cv2.waitKey(1) == ord("s"):
break cv2.release()
cv2.destroyAllWindows()
Trang 28Trang 27
MỤC LỤC
BẢN NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 1
PHÂN CÔNG NHIỆM VỤ 2
3.2 Hướng phát triển đề tài trong tương lai 11
CHƯƠNG 4: TÀI LIỆU THAM KHẢO 12
CHƯƠNG 5: PHỤ LỤC 13