Tải bản đầy đủ (.pdf) (28 trang)

báo cáo bài tập lớn xử lý ảnh đề tài nhận dạng đối tượng thời gian thực và điều khiển bàn xoay

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.64 MB, 28 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC BÁCH KHOA HÀ NỘITRƯỜNG CƠ KHÍ</b>

<b>KHOA CƠ ĐIỆN TỬ</b>

<b> </b>

<b>Giảng viên hướng dẫn: TS. Dương Văn Lạc</b>

<b> Sinh viên thực hiện: Trần Ngọc Thuận 20195192 Vũ Duy Minh 20195100 Hồng Xn Đích 20194946</b>

Hà Nội, 1/2024

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<small>- Nội dung sơ sài- Trình bầy kém, mắc nhiều lỗi chính tả</small>

<small>- Nội dung khá sơ sài và hạn chế- Trình bầy cịn hạn chế</small>

<small>- Mắc tương đối nhiều lỗi chính tả</small>

<small>- 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ả</small>

<small>- Bố cục của bài viết rõ ràng</small>

<small>- Nội dung đầy đủ, chính xác- Trình bầy tốt</small>

<small>- 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</small>

<small>- 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</small>

<small>- Sản phẩm tương đối hoàn thiện, chức năng khá đầy đủ</small>

<small>- Sản phẩm có tínhthẩm mỹ- Sản phẩm hoạt động tốt</small>

<small>- Sản phẩm hoàn thiện, chức năng đầy đủ- Sản phẩm có tính thẩmmỹ</small>

<small>- Sản phẩm hoạt động tin cậy</small>

<small>- Trả lời các câu hỏi còn nhiều hạnchế</small>

<small>- Hiểu, vận dụng các kiếm thức cònnhiều hạn chế</small>

<small>- 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ế</small>

<small>- 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</small>

<small>- 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</small>

<b><small>II. ĐIỂM ĐÁNH GIÁ CHÍNH THỨC</small></b>

<small>STTHọ tênMSSV</small> <sup>Điểm quyển</sup><small>báo cáo ĐBC</small>

<small>Điểm sảnphẩm ĐSP</small>

<small>(40%)Điểmbảo vệ*</small>

<small>ĐIỂM KẾT QUẢĐKQ=10%Đ +40%Đ +50%ĐBCSPBV</small>

<small>1Trần Ngọc Thuận</small> <sup>20195192</sup><small>2Vũ Duy Minh</small> <sup>20195100</sup><small>3Hồng Xn Đích</small> <sup>20194946</sup>

<small>*Lưu ý: ĐBV ≤ min {ĐBC, ĐSP}.</small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>PHÂN CÔNG NHIỆM VỤ</b>

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 tốnchương trình python vàarduino, chuẩn bị báo

3 Hồng Xn Đích <sub>20194946</sub>

Viết chương trìnharduino, chuẩn bị báo

cáo

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

Trang 3

<b>LỜI MỞ ĐẦU</b>

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 tố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 tốn cũng như sự phức tạp của nó. Bài tố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 tốn và cho kết quả hồntồ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 q trình hồn thiện bài tập lớp môn học.

Chúng em xin chân thành cảm ơn!

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

MỤC LỤC

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Trang 5

<b>CHƯƠNG 1: KẾT QUẢ1.1. Nội dung bài toán</b>

Đầ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.

<b>1.2. Các thành phần cơ bản</b>

Phần cứng:Camera

Máy tính

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

Chúng ta có thể chạy PyCharm trên Windows, Linux hoặc Mac OS.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Trang 7Ngồ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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="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 tố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).

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Trang 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 tốn như:

Face Detection: phát hiện khn 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%

<b>1.3. Chương trình nhận diện khuân mặt thời gian thực</b>

Tải dữ liệu lên firebase

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<small>counter = 1modeType = 1</small>

<small>ifcounter== 0If matches [matchI ndex]matchIndex</small>

<small>counter = 0modeType = 3Tải dữ li u mói c p nh t lên firebase</small>

<small>Nếu khoảngcách giữu 2 lần ghi nh n liêp tiếp</small>

<small>trueNếu cókhuân m t trong camera</small>

<small>trueif counter <=</small>

<small>trueif 10 < counter</small>

Chạy chương trình nhận diện

<small>counter += 1</small>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Vẫ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:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>1.5. Thảo luận kết quả thực nghiệm</b>

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, hồ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 hồn thiện về giao diện phần mềm và các thiết bị về hệ thống cơkhí.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Trang 13

<b>CHƯƠNG 3: KẾT LUẬN3.1. Kết luận</b>

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.

<b>3.2. Hướng phát triển đề tài trong tương lai</b>

Xử lý nhiễu với các luồng sáng khác nhau.

Thiết kế hệ thống cơ khí hồn chỉnh cho tồ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 q trìnhnhận dạng.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>CHƯƠNG 4: TÀI LIỆU THAM KHẢO</b>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

-Trang 15

<b>CHƯƠNG 5: PHỤ LỤC</b>

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"},

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="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)

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Trang 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:

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

imgList.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)

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Trang 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

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

cred = 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')

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Trang 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

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

encodeCurFrame = 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)

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

Trang 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)

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

else: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']),

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

Trang 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 = []

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

imgStudent = []

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()

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

Trang 27

<b>MỤC LỤC</b>

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

</div>

×