ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO ĐỒ ÁN 1
NHẬN DẠNG VẬT THỂ
Sinh viên thực hiện: Lê Thành Luân - 19520702
Lớp: SE121.M21
Giảng viên hướng dẫn: ThS. Mai Trọng Khang - Khoa CNPM
TP.Hồ Chí Minh, Ngày 22 tháng 6 năm 2022
LỜI CẢM ƠN
Lời đầu tiên, nhóm tác giả xin chân thành cảm ơn quý thầy cô khoa Công nghệ Phần
mềm, trường Đại Học Công Nghệ Thông Tin, ĐHQG TP.HCM, đã tận tình hướng dẫn
nhóm trong suốt thời gian qua. Những kiến thức mà thầy cô đã truyền đạt là nền tảng
quan trọng để có thể hồn thành đề tài này.
Nhóm tác giả xin gửi lời cảm ơn đặc biệt sâu sắc và chân thành đến ThS. Mai Trọng
Khang, cảm ơn thầy đã tận tình hướng dẫn và tạo điều kiện tốt nhất để chúng em có thể
hồn thành đề tài này. Những lời động viên, góp ý chân tình của thầy là động lực quý
báu để chúng em vượt qua những khó khăn khi tìm hiểu và thực hiện đề tài. Trong thời
gian hơn 3 tháng thực hiện đề tài, nhóm đã cố gắng vận dụng những kiến thức nền tảng
đã học, kết hợp với học hỏi và tìm hiểu công nghệ mới để ứng dụng xây dựng đề tài mơn
học. Tuy nhiên trong q trình thực hiện, do kiến thức và kinh nghiệm cịn nhiều hạn chế,
khó tránh khỏi những thiếu sót. Chính vì vậy, nhóm tác giả rất mong nhận được sự góp
ý từ q thầy cơ để nhóm hồn thiện thêm những kiến thức mà nhóm đã học tập, làm
hành trang q báu cho nhóm trong cơng việc sau này.
Xin chân thành cảm ơn quý thầy cô!
MỤC LỤC
2
Mục lục
1 Giới thiệu
1.1 Trí tuệ nhân tạo và ứng dụng . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Giới thiệu đề tài và lý do chọn đề tài . . . . . . . . . . . . . . . . . . . . . .
1.3 Mục tiêu đề ra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Các
2.1
2.2
2.3
2.4
2.5
2.6
khái niệm
Nhận dạng vật thể . . . . . . . . . .
Học sâu . . . . . . . . . . . . . . . .
Mạng thần kinh (Neural Network) .
Lớp tích chập (Convolutional Layer)
Lớp gộp (Pooling Layer): . . . . . .
Intersection Over Union (IOU) . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
5
6
.
.
.
.
.
.
6
. 6
. 8
. 9
. 11
. 16
. 17
3 YOLO (You Only Look Once)
3.1 Mạng YOLO là gì? . . . . . .
3.2 Kiến trúc mạng YOLO . . . .
3.3 Anchor box (hộp neo) . . . .
3.4 Non-max suppression . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
18
19
19
20
21
4 Các
4.1
4.2
4.3
4.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
22
22
22
22
22
5 Quá trình thực hiện
5.1 Bắt đầu với bài tốn phân loại biển báo giao thông
5.1.1 Bộ dữ liệu . . . . . . . . . . . . . . . . . . .
5.1.2 Đọc và xử lý dữ liệu đầu vào . . . . . . . .
5.1.3 Mơ hình học sâu sử dụng . . . . . . . . . .
5.1.4 Kết quả . . . . . . . . . . . . . . . . . . . .
5.2 Nghiên cứu về nhận diện vật thể sử dụng YOLOv5
5.2.1 Bộ dữ liệu . . . . . . . . . . . . . . . . . . .
5.2.2 Đọc và xử lý dữ liệu . . . . . . . . . . . . .
5.2.3 Tiến hành huấn luyện . . . . . . . . . . . .
5.2.4 Kết quả . . . . . . . . . . . . . . . . . . . .
5.3 Tạo ra API nhận diện vật thể trên đường phố . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
23
24
25
26
27
27
28
29
30
31
công nghệ sử dụng
TensorFlow . . . . . .
Keras . . . . . . . . .
YOLOv5 . . . . . . . .
Flask . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6 Hướng dẫn cài đặt và sử dụng
34
6.1 Điều kiện yêu cầu: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.2 Các bước thực hiện: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7 Kết
7.1
7.2
7.3
luận
Ưu, nhược điểm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hướng phát triển trong tương lai . . . . . . . . . . . . . . . . . . . . . . . .
Lời kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
36
37
37
3
1
Giới thiệu
1.1
Trí tuệ nhân tạo và ứng dụng
Trong xã hội hiện đại, với sự phát triển nhanh chóng của ngành khoa học và công nghệ
thông tin, việc áp dụng những nền tảng cơng nghệ vào thực tiễn đã khơng cịn là xa lạ.
Đặc biệt là các cuộc cách mạng trong lĩnh vực trí tuệ nhân tạo, học sâu, nhờ đó mà sự vận
dụng trí tuệ nhân tạo vào các sản phẩm phần mềm, tạo ra những ứng dụng thay thế con
người thực chất đã trở thành chuyện hết sức thực tế. Hơn hết, ngành công nghiệp phần
mềm cũng bắt kịp xu hướng đó. Ngày càng có nhiều ứng dụng được áp dụng trí tuệ nhân
tạo, đem đến vơ số lợi ích cho người dùng. Lấy ví dụ, có những ứng dụng sử dụng trí tuệ
nhân tạo đã trở nên gắn liền với cuộc sống của nhiều người như: Google Assistant, Siri
của Apple, ELSA, Replika, Spotify... Thậm chí, việc sử dụng trí tuệ nhân tạo đã mang lại
sự tiện lợi, khiến các ứng dụng này trở nên nổi bật và có thể chiếm lĩnh thị trường. Ngày
nay, việc một ứng dụng có tích hợp trí tuệ nhân tạo sẽ trở thành lợi thế cạnh tranh tuyệt
vời cho các nhà phát triển. Từ đó, có thể thấy được, trí tuệ nhân tạo cùng với ứng dụng
là một sự kết hợp khôn khéo hết sức tuyệt vời của lồi người. Vì thế, việc lập trình viên
được trang bị những kiến thức này là điều cần thiết để có thể chuẩn bị cho những bước
tiến xa hơn của xã hội trong tương lai.
Hình 1: Trong một chiếc điện thoại thơng minh, có hàng chục ứng dụng tích hợp trí tuệ
nhân tạo đang được sử dụng hằng ngày bởi hàng triệu người dùng
Với sự cải thiện hằng ngày có thể thấy qua các cơng trình nghiên cứu liên tục được
cơng bố, trí tuệ nhân tạo đang hứa hẹn một tương lai tươi sáng cho loài người. Các lập
trình viên, những người ln đón đầu xu hướng công nghệ, đã nghĩ ra rất nhiều cách để
sử dụng trí tuệ nhân tạo trong các ứng dụng, có thể kể đến như:
1. Máy học:
Máy học có thể nói là cơng nghệ trí tuệ nhân tạo phổ biến nhất trong công nghệ
thông tin. Máy học là khả năng máy tính và các sản phẩm phần mềm đưa ra các
quyết định có hiểu biết và đưa ra kết luận học hỏi từ kinh nghiệm trong quá khứ
của chúng.
Sở dĩ nó có thể đạt được hiệu quả như vậy là thơng qua 2 kỹ thuật. Đầu tiên, mơ
hình học tập có giám sát được huấn luyện để dự báo các phản ứng trong tương lai
đối với dữ liệu mới bằng cách phân tích các đầu vào và đầu ra. Kỹ thuật thứ hai
là học không giám sát, chỉ hoạt động trên các thông tin đầu vào và phát hiện các
mẫu liên tục (còn gọi là phân cụm). Cho dù chiến lược máy học được chọn là gì, nó
1.1
Trí tuệ nhân tạo và ứng dụng
4
sẽ mở ra những khung cảnh rộng lớn để triển khai chúng trong các ứng dụng được
sử dụng trong các lĩnh vực khác nhau - từ giáo dục và chăm sóc sức khỏe đến bán
hàng và sản xuất.
Một ví dụ về máy học được sử dụng trong ứng dụng là một giải pháp fintech tên
Oval. Ứng dụng này phân tích thói quen chi tiêu của tất cả người dùng để rút ra
chiến lược tiết kiệm cá nhân hóa cho từng khách hàng. Hơn nữa, là một sản phẩm
sử dụng máy học, ứng dụng này ngày càng được cải thiện với mỗi tập dữ liệu mới
mà người dùng cung cấp để đưa ra những khuyến nghị phù hợp và chính xác hơn.
2. Nhận diện giọng nói:
Con người ngày nay khơng chỉ nói chuyện thơng qua điện thoại, mà cịn thực sự
đang nói chuyện với chiếc điện thoại của mình. Việc trang bị trí cho thiết bị CUI
(Conversational User Interface - giao diện người dùng hội thoại) giúp chúng đủ thông
minh để tuân theo mệnh lệnh bằng giọng nói và hiểu giọng nói của con người bằng
cách chuyển đối nó thành định dạng mà máy tính có thể hiểu được. Phương pháp
ứng dụng trí tuệ nhân tạo này đã giúp các trợ lí ảo như Siri hoặc Cortana như đang
"sống"bên trong các thiết bị di động của chúng ta và giúp chúng ta các công việc
vặt hằng ngày như tìm chỗ đậu xe, phát bài nhạc yêu thích, đặt chỗ nhà hàng...
Bên cạnh việc cung cấp những trải nghiệm tiện lợi cho người dùng, ứng dụng nhận
diện giọng nói là thứ khơng thể thiếu cho những người có thị giác kém, cho phép
họ có cơ hội tương tác với chiếc điện thoại thông minh mà không cần nhìn vào màn
hình.
3. Tổng hợp giọng nói:
Cơng nghệ tổng hợp giọng nói cho phép trí tuệ nhân tạo trong thiết bị di động cũng
có thể nói chuyện với chúng ta. Tuy nhiên, trên thực tế, thiết bị di động khơng thực
sự "nói chuyện"với chúng ta mà chỉ phát âm lại các văn bản được nhập vào. Dịch
vụ này được hiển thị trong các tiện ích do Android hỗ trợ bởi tính năng gốc với đặc
điểm giọng nói có thể tùy chỉnh (tốc độ nói và cao độ giọng) và tùy chọn cài đặt
thêm ngơn ngữ, giới tính,...
Tuy nhiên, ứng dụng này có thể được cường đáng kể với các ứng dụng chuyên biệt
hiện hữu khá nhiều trên thị trường cơng nghệ thơng tin hiện tại. Ví dụ: Narrator’s
Voice khơng chỉ đọc văn bản từ nhiều nguồn mà cịn có nhiều lựa chọn giọng nói
để phát âm văn bản và tùy chọn thêm nhiều hiệu ứng âm thanh (tiếng vọng, hợp
xướng,...). Ngồi ra, trí tuệ nhân tạo có thể chạy văn bản chúng ta viết thông qua
bộ tổng hợp và lưu nó dưới dạng tệp MP3, trở thành cơng cụ mạnh mẽ để lồng tiếng
cho các bộ phim, thuyết trình,...
4. Chatbot:
Để tăng cường trải nghiệm cho khách hàng sử dụng ứng dụng di động, đòi hỏi các
doanh nghiệp phải tự động hóa một phần các dịch vụ tương tác với khách hàng.
Đây là lúc chatbot vào cuộc, giúp giảm bớt trọng trách cho các nhân viên đối với
việc phản hồi lại khách hàng yêu cầu những dịch vụ phổ biến như giúp điền vào biểu
mẫu, trả lời các câu hỏi điển hình, giúp đặt hàng,... Loại hình ứng dụng này của trí
tuệ nhân tạo hiện đang trở thành thứ cần thiết phải có đối với các doanh nghiệp
vừa và nhỏ, trong khi tất cả những "gã khổng lồ"trong giới kinh doanh (Apple,
Microsoft, Amazon, IBM,...) đều sử dụng công nghệ chatbot trên quy mơ lớn trên
tồn hệ thống dịch vụ khách hàng của họ. Chatbot không chỉ mang lại trải nghiệm
tốt cho khách hàng khi không phải mệt mỏi chờ đợi phản hồi từ nhà cung cấp, mà
còn giúp các nhà cung cấp dịch vụ có thể cắt giảm bớt nhân lực và vốn dùng trong
việc phản hồi khách hàng.
5. Nhận diện hình ảnh:
Đây cũng chính là chủ đề được nghiên cứu trong đồ án này. Có thể nhận ra và phân
loại đối tượng trong một bức ảnh hoặc video là điều mà tưởng chừng như là không
1.2
Giới thiệu đề tài và lý do chọn đề tài
5
thể đối với máy móc cho đến khoảng thời gian gần đây. Ngày nay, các ứng dụng trí
tuệ nhân tạo thực hiện việc này với độ chính xác cao, thậm chí là cao hơn con người.
Khả năng này của trí tuệ nhân tạo được ứng dụng trong các lĩnh vực khác nhau từ xác định biển số xe vi phạm quy định giao thông đến giám sát chất lượng sản
phẩm trong q trình sản xuất u cầu độ chính xác cao.
Một trong những ứng dụng thuộc loại này là Calorie Mama, giúp người dùng kiểm
soát lượng calo họ tiêu thụ bằng cách phân tích các bức ảnh về bữa ăn. Hơn nữa,
việc người dùng thêm các hình ảnh mới vào cơ sở dữ liệu giúp việc tính tốn hàm
lượng dinh dưỡng của ứng dụng trở nên chính xác hơn theo thời gian.
6. Nhận dạng văn bản:
Đơi khi, chúng ta có thể cần trích xuất các chữ cái hoặc số (hoặc thậm chí một đoạn
văn bản lớn) từ một hình ảnh để nhập và sử dụng cho các mục đích khác nhau. Các
ứng dụng nhận dạng quang học (OCR) sẵn sàng trợ giúp chúng ta đối với tác vụ
này. Một trong những ứng dụng phổ biến nhất trong số đó là Google Keep, giúp ghi
lại văn bản từ ảnh và lưu trữ nó ở định dạng kỹ thuật số để chúng ta khơng phải
nhập bất cứ thứ gì theo cách thủ cơng và có thể xóa hồn tồn hình ảnh, chỉ để lại
các ký tự. Không những thế, ứng dụng này của trí tuệ nhân tạo cịn giúp chúng ta
trích xuất những thơng tin quan trọng trong văn bản, tóm tắt một văn bản lớn,...
7. Sinh trắc học:
Các cơ chế được hỗ trợ bởi trí tuệ nhân tạo khơng chỉ có thể nhận dạng văn bản,
hình ảnh hoặc giọng nói mà cịn cả các thông số sinh học trên cơ thể con người như
hình dạng khn mặt, kích thước cơ thể, dấu vân tay, cử chỉ...
Chủ yếu được sử dụng trong lĩnh vực tiếp thị, cơng nghệ này cũng có thể được tận
dụng trong các ngành cơng nghiệp khác. Ví dụ, các ngân hàng, cơ sở cải tạo và cơ
sở giáo dục có thể được hưởng lợi từ việc sử dụng cơng nghệ này cho các hệ thống
xác thực người dùng.
Ví dụ, Face2Gene là một ứng dụng chuyên biệt dành cho các bác sĩ và giúp họ chẩn
đoán các rối loạn di truyền. Nó được huấn luyện để phân tích khn mặt của bệnh
nhân, đưa ra phản hồi tức thì và cho phép các nhà cung cấp dịch vụ chăm sóc sức
khỏe chia sẻ kết quả trong các diễn đàn kín.
8. Phân tích cảm xúc và tình thái:
Đây là sự cải tiến của các công nghệ nhận dạng đã đề cập ở trên, nhưng tập trung
vào việc xác định cảm xúc của một người. Ngôn ngữ cơ thể, sự biến đổi trong giọng
nói và nét mặt là những dấu hiệu nhận biết đóng vai trị là chìa khóa để nhận biết
cảm xúc của một người. Việc phân tích chúng rất hữu ích để đánh giá thái độ của
người dùng đối với các sản phẩm hoặc quảng cáo cụ thể, đánh giá xếp hạng truyền
hình hoặc thậm chí xác định tội phạm ở sân bay, ngân hàng, sân vận động và các
địa điểm khác. Thị trường ứng dụng hiện đại có rất nhiều sản phẩm như vậy, trong
đó Face Reader của Noldus và Project Oxford của Microsoft là những sản phẩm nổi
bật đáng được nhắc đến.
1.2
Giới thiệu đề tài và lý do chọn đề tài
Với những kết quả nghiên cứu và ứng dụng của trí tuệ nhân tạo đối với việc phát triển
phần mềm, có thể thấy một tương lai đầy hứa hẹn khi mà hầu hết những ứng dụng trên
thế giới đều tích hợp trí tuệ nhân tạo. Là những lập trình viên, nhiệm vụ của chúng em là
phải đón đấu và nắm bắt xu hướng cơng nghệ, để có thể đem những cơng nghệ tiên tiến
đó phục vụ trải nghiệm người dùng. Chính vì vậy mà chúng em đã lựa chọn đề tài "Nhận
dạng vật thể". Đây vốn là một bài tốn thuộc về cơng nghệ nhận diện hình ảnh đã đề cập
ở trên, và cũng là một trong số những bài toán được các nhà nghiên cứu khoa học đầu tư
chất xám để giải quyết nhất trong số những bài tốn trong lĩnh vực trí tuệ nhân tạo. Đã
và đang có vơ số những cơng trình nghiên cứu xoay quanh bài tốn này, giúp cho độ hồn
1.3
Mục tiêu đề ra
6
thiện của những mơ hình giải quyết bài tốn ngày càng tăng. Do giới hạn của mơn học
nên chúng em chỉ nghiên cứu vận dụng những gì mà các nhà nghiên cứu trước đó đã đạt
được để đưa vào ứng dụng chứ không cải tiến hay thực hiện một cơng trình nghiên cứu
hồn tồn mới.
1.3
Mục tiêu đề ra
Như đã đề cập ở trên, với giới hạn thời gian của môn học, cũng như do cơ sở vật chất
khơng thể đáp ứng được (khơng có máy tính cấu hình mạnh) và sự thiếu thốn tài ngun
thơng tin (khơng đủ dữ liệu để huấn luyện mơ hình học sâu), nên nhóm chúng em chỉ có
thể dừng lại ở mức vận dụng thành quả nghiên cứu của những người đi trước, ứng dụng
nó vào việc phát triển sản phẩm phục vụ người dùng. Chính vì vậy, nhóm chúng em đã
đặt ra mục tiêu cho môn học này là nghiên cứu và phát triển một API ứng dụng thành
quả nghiên cứu trong bài toán "Nhận diện vật thể", cụ thể là API nhận dạng các vật thể
trên đường như xe cộ, đèn giao thơng, biển báo,... Tuy nhiên, nếu chỉ có như vậy thì lại
khó mà đáp ứng được tiêu chí của mơn học, thê nên nhóm quyết định thực hiện thêm việc
nghiên cứu và huấn luyện một phần mơ hình học sâu để máy tính phát hiện vật thể bằng
phương pháp học chuyển giao (transfer learning) - sẽ được giải thích ở phần sau.
2
Các khái niệm
Phần này sẽ nói về những khái niệm mà chúng em đã tìm hiểu được trong q trình
nghiên cứu, đồng thời cũng có đề cập đến sẽ được sử dụng để giải thích về mơ hình học
sâu dùng để tạo nên API nhận diện vật thể trên đường phố.
2.1
Nhận dạng vật thể
Nhận dạng vật thể là một kỹ thuật trong thị giác máy tính để xác định các vật thể
trong hình ảnh hoặc video. Nhận dạng vật thể là đầu ra chính của các thuật tốn học sâu
và học máy. Khi con người nhìn vào một bức ảnh hoặc xem một đoạn video, chúng ta có
thể dễ dàng phát hiện ra người, đồ vật, cảnh và các chi tiết trực quan khác. Mục đích của
nhận dạng vật thể là dạy máy tính làm được những gì đã được coi là bản năng của con
người: đạt được đến mức độ hiểu được nội dung của hình ảnh.
2.1
Nhận dạng vật thể
7
Hình 2: Ứng dụng nhận dạng đối tượng để xác định phân loại của đối tượng (ở đây là chó
và mèo).
Nhận dạng vật thể là một cơng nghệ quan trọng, được ứng dụng trong rất nhiều lĩnh
vực. Trong đó có thể kể đến nổi bật nhất chính là xe không người lái. Nhận dạng vật thể
cho phép những chiếc xe không người lái nhận ra biển báo dừng hoặc để phân biệt người
đi bộ với cột đèn. Ngồi ra, nó cũng được ứng dụng để xác định bệnh trong y học, kiểm
tra công nghiệp và thị giác robot (giúp robot nhận diện được các vật thể).
Hình 3: Nhận diện vật thể trên đường phố, được ứng dụng trong xe tự hành.
Bài toán nhận dạng vật thể sản sinh ra những bài toán con khác, cũng là những bài
toán nhận được sự quan tâm sâu sắc của giới nghiên cứu khoa học. Trong số đó có thể kể
đến như:
• Gán thẻ hình ảnh: Là q trình thêm thẻ văn bản vào một hình ảnh dựa trên những
gì có trong hình ảnh đó. Mỗi hình ảnh có thể được gán nhiều hơn một thẻ.
– Đầu vào: Hình ảnh và các thẻ có thể được gán cho hình ảnh.
2.2
Học sâu
8
– Đầu ra: Các thẻ phù hợp để gán cho hình ảnh.
• Phân loại hình ảnh: Dự đốn loại hoặc lớp của đối tượng trong hình ảnh.
– Đầu vào: Một hình ảnh với một đối tượng duy nhất.
– Đầu ra: Nhãn phân loại đối tượng.
• Định vị đối tượng: Định vị sự hiện diện của các đối tượng trong một hình ảnh và
chỉ ra vị trí của chúng bằng một hộp giới hạn.
– Đầu vào: Một hình ảnh có một hoặc nhiều đối tượng.
– Đầu ra: Một hoặc nhiều hộp giới hạn (xác định bởi tọa độ một điểm tâm chính
giữa, chiều rộng và chiều cao).
• Phát hiện đối tượng: Định vị sự hiện diện của các đối tượng bằng hộp giới hạn và
các loại hoặc lớp của các đối tượng được định vị trong một hình ảnh.
– Đầu vào: Một hình ảnh có một hoặc nhiều đối tượng.
– Đầu ra: Một hoặc nhiều hộp giới hạn và nhãn phân loại cho từng hộp giới hạn.
• Phân đoạn đối tượng: Các đối tượng trong hình ảnh được nhận dạng bằng cách đánh
dấu các pixel cụ thể của đối tượng thay vì hộp giới hạn.
– Đầu vào: Một hình ảnh có một hoặc nhiều đối tượng.
– Đầu ra: Mảng các pixel được đánh dấu tương ứng với từng loại đối tượng.
Trong số các bài toán này, bài toán được biết đến nhiều nhất là phát hiện đối tượng. Nó
phổ biến đến mức mà khi một người nhắc đến nhận diện vật thể, ý của họ là đang chỉ đến
việc phát hiện đối tượng bằng các hộp giới hạn.
2.2
Học sâu
Việc sử dụng học sâu vào giải quyết bài toán nhận diện vật thể đang là một trong những
phương pháp phổ biến nhất mà các nhà nghiên cứu khoa học sử dụng. Các mơ hình học
sâu như mạng thần kinh tích chập (Convolutional Neural Network - CNN) được sử dụng
để tự động tìm kiếm các đặc điểm của đối tượng hiện hữu trong hình ảnh nhằm xác định
đối tượng đó. Ví dụ: CNN có thể học cách xác định sự khác biệt giữa mèo và chso bằng
cách phân tích hàng nghìn hình ảnh và tìm hiều các đặc điểm khiến chó và mèo khác
nhau. Học sâu là một tập hợp con của học máy, khác biệt ở một số khía cạnh quan trọng
so với học máy truyền thống, cho phép máy tính giải quyết một loạt các vấn đề phức tạp
không giải quyết được.
Một ví dụ về các vấn đề phức tạp này là bài toán nhận dạng các chữ số viết tay. Để
giải quyết bài tốn này, máy tính cần phải có khả năng đối phó với sự đa dạng trong cách
thức trình bày dữ liệu. Mỗi chữ số từ 0 đến 9 có thể được viết theo vơ số cách: kích thước
và hình dạng chính xác của mỗi chữ số viết tay có thể rất khác nhau tùy thuộc vào người
viết và viết trong hồn cảnh nào. Để đối phó với sự đa dạng này, việc sử dụng các phương
trình tính tốn bình thường có độ phức tạp thấp là bất cả thi, mà đòi hỏi phải sử dụng
những phương trình tính tốn với độ phức tạp cao. Những phương trình này được máy
tính học bằng phương pháp học sâu, mà cụ thể hơn là bằng mạng lưới thần kinh.
2.3
Mạng thần kinh (Neural Network)
9
Hình 4: Ví dụ về 100 cách viết tay chữ số 2 khác nhau được trích từ bộ dữ liệu MNIST
nổi tiếng.
2.3
Mạng thần kinh (Neural Network)
Mạng lưới thần kinh (tên tiếng Anh là neural network) là các mơ hình tính tốn có cấu
trúc được lấy cảm hứng từ cấu trúc mạng lưới thần kinh của con người. Mỗi neural trong
mạng thần kinh là một hàm toán học lấy dữ liệu thông qua các đầu vào, biến đổi dữ liệu
đó thành dạng dễ điều chỉnh hơn và sau đó đưa ra đầu ra để tiếp tục truyền vào đầu vào
ở lớp tiếp theo, hoặc tính tốn để đưa ra đầu ra cuối cùng.
Tất cả các mạng thần kinh đều có một lớp đầu vào, trong đó dữ liệu ban đầu được đưa
vào, và một lớp đầu ra dự đốn cuối cùng. Nhưng khơng chỉ thế, thứ làm nên sức mạnh
của mạng thần kinh chính là các lớp ẩn nằm ở giữa các lớp đầu vào và đầu ra. Các lớp
này được kết nối với nhau bằng cách đầu ra của lớp đứng trước là đầu vào của lớp đứng
sau. Do đó, thuật ngữ học sâu có liên quan đến số lượng lớn các lớp ẩn nằm ở giữa đầu
vào và đầu ra của mạng thần kinh.
2.3
Mạng thần kinh (Neural Network)
10
Hình 5: Cấu trúc một mạng thần kinh đơn giản, với một lớp đầu vào, một lớp đầu ra và
hai lớp ẩn.
Sơ đồ đơn giản hóa ở trên hy vọng sẽ giúp cung cấp một ý tưởng về cấu trúc của một
mạng thần kinh đơn giản. Trong sơ đồ trên, mỗi nốt tròn đại diện cho một neural trong
mạng, với các neural được tổ chức thành các lớp thẳng đứng. Như có thể thấy, mỗi neural
được liên kết với mọi neural ở lớp trước nó, thể hiện rằng mỗi neural tạo ra một giá trị
đầu vào cho mỗi neural ở lớp tiếp theo. Các mũi tên liên kết giữa các neural cũng có ý
nghĩa quan trọng, chúng sẽ mang những giá trị khác nhau thể hiện tầm quan trọng khác
nhau của các liên kết giữa các neural. Những liêu kết có ý nghĩa lớn hơn sẽ khuếch đại giá
trị của neural khi nó được truyền qua các lớp. Đổi lại, sự khuếch đại giá trị này có thể
giúp kích hoạt tế bào neural mà giá trị đang được đưa vào. Có thể hiểu rằng, mỗi kết nối
giữa hai nốt trong mạng thần kinh chính là một hệ số của phương trình tính tốn giá trị
của nốt tiếp theo.
Một neural được kích hoạt khi tổng các giá trị được đưa vào neural này vượt qua ngưỡng
nhất định. Ngưỡng này thường được xác định bởi các hàm kích hoạt ở mỗi lớp. Sự kích
hoạt này có ý nghĩa khác nhau qua từng lớp của mạng thần kinh. Ví dụ đối với mạng
thần kinh được xây dựng để giải quyết bài toán nhận dạng chữ số viết tay, lớp đầu vào là
những pixel hình ảnh chữ viết tay. Lớp ẩn đầu tiên có thể phát hiện những đường thẳng
và đường xiên theo các hướng khác nhau. Lớp ẩn thứ hai có thể phát hiện ra thêm những
đường gấp khúc, nét cong, nét chồng,... Neural được kích hoạt trong lớp đầu ra của mạng
thần kinh trong trường hợp này tương ứng với số lượng nhãn mà bài toán muốn phân loại,
ở đây là 10 nhãn tương ứng theo thứ tự từ 0 đến 9.
Từ đó, ta có thể đúc kết ra được giá trị của một nốt được tính bằng 2 công thức sau:
(l)
(l−1)
zi = Σlj=1 aj
(l)
(l)
(2.3.1)
(l)
(2.3.2)
ai = σ(zi )
Trong đó:
(l)
(l)
∗ wji + bi
• zi : là giá trị của nốt thứ i trong lớp thứ l.
2.4
Lớp tích chập (Convolutional Layer)
11
(l)
• aj : là giá trị của nốt thứ j trong lớp thứ l sau khi áp dụng hàm kích hoạt σ.
(l)
• wji : là giá trị hệ số của liên kết giữa nốt thứ i của lớp trước và nốt thứ j của lớp
hiện tại.
(l)
• bi : là hệ số tự do của phương trình tính tốn nốt thứ i của lớp thứ l trong mạng
thần kinh, thường được liên kết với nốt có giá trị bằng 1 được thêm vào ở lớp đầu
vào và các lớp ẩn. Mục đích là để hạn chế việc kết quả huấn luyện cho ra phương
trình ln đi qua gốc tọa độ.
• σ: là hàm kích hoạt.
Khi chuyển đổi về dạng vector và ma trận, ta có 2 cơng thức trên trở thành:
z (l) = (W (l) )T ∗ a(l) + b(2)
(2.3.3)
a(l) = σ(z (l) )
(2.3.4)
Mơ hình học được các liên kết giữa các nơ-ron rất quan trọng trong việc đưa ra dự đốn
thành cơng trong q trình huấn luyện. Ở mỗi bước trong quá trình huấn luyện, mạng sẽ
sử dụng một hàm toán học để xác định mức độ chính xác của dự đốn mới nhất của nó
so với dự kiến, được gọi là hàm mất mát. Hàm này tạo ra một loạt các giá trị lỗi, thường
được xác định bằng cách tính tốn độ sai lệch giữa dự đốn của mơ hình với giá trị đúng
của đầu ra và tìm cách tối thiểu hóa nó, do đó hệ thống có thể sử dụng để tính tốn cách
mơ hình nên cập nhật giá trị của các trọng số được gắn vào mỗi liên kết, với mục đích
cuối cùng là cải thiện độ chính xác của các dự đốn của mạng. Việc cải thiện độ chính
xác của dự đốn của mạng được thực hiện thơng qua các bước tính tốn đạo hàm để tìm
"điểm rơi"để giá trị hàm mất mát là nhỏ nhất. Mức độ mà các giá trị này sẽ được thay
đổi được tính bởi một hàm tối ưu hóa, chẳng hạn như giảm độ dốc và những thay đổi
đó được đẩy lùi trên tồn mạng vào cuối mỗi chu kỳ huấn luyện trong một bước gọi là
lan truyền ngược. Trải qua nhiều, rất nhiều chu kỳ huấn luyện và với sự trợ giúp của việc
điều chỉnh tham số thủ cơng, mạng sẽ tiếp tục tính tốn để tạo dự đoán tốt hơn và tốt
hơn cho đến khi nó đạt gần với độ chính xác cao nhất.
Mỗi lớp ẩn còn được gọi với cái tên khác là lớp kết nối đủ (Fully Connected Layer)
và những mơ hình mạng học sâu có cấu trúc chỉ gồm lớp đầu vào, lớp đầu ra và lớp ẩn
thường được gọi là mạng thần kinh kết nối đủ (Fully Connected Neural Network - FCN).
Nhược điểm của FCN xuất hiện khi ta sử dụng nó với những bài tốn u cầu xử lý dữ
liệu đầu vào cực kỳ phức tạp, chẳng hạn như hình ảnh kích thước lớn, video, văn bản dài,
giọng nói,... Điều này dẫn đến sự xuất hiện của những cách tạo lớp khác, đi kèm đó là
những cấu trúc mạng thần kinh khác, chuyên biệt để giải quyết những bài toán đó.
2.4
Lớp tích chập (Convolutional Layer)
Đối với bài tốn xử lý ảnh, giả sử chúng ta làm việc với tập dữ liệu huấn luyện gồm
các ảnh màu có kích thước 64*64 với 3 kênh màu R, G và B. Lúc này, để có thể truyền
dữ liệu vào mạng thần kinh thơng qua lớp đầu vào với mỗi nốt đầu vào tương ứng với
một pixel trên ảnh thì lớp đầu vào cần phải có 64*64*3 = 12288 nốt. Giả sử số lượng nốt
trong lớp ẩn thứ nhất là 1000. Số lượng trọng số W giữa lớp đầu vào và lớp ẩn thứ 1 là
12288*1000 = 12288000, số lượng hệ số tự do là 1000. Khi đó, tổng số tham số của mơ
hình là: 12289000. Đấy mới chỉ là số tham số giữa lớp đầu vào và lớp ẩn thứ 1, trong mơ
hình cịn nhiều lớp nữa, và nếu kích thước ảnh tăng, ví dụ 512*512 thì số lượng tham số
sẽ tăng cực kì nhanh. Vậy nên chúng ta cần một giải pháp tốt hơn để giải quyết những
bải toán liên quan đến dữ liệu đầu vào hình ảnh, và đây là lúc lớp tích chập vào cuộc.
2.4
Lớp tích chập (Convolutional Layer)
12
Lớp tích chập được xây dựng dựa trên phép tốn tích chập. Phép tốn tích chập giúp
giảm bớt chiều của một ma trận nhưng vẫn giữ được những điểm đặc trưng nhất định của
ma trận đó. Để lấy ví dụ, có thể nhìn vào hình sau:
Hình 6: Bắt đầu thực hiện phép tốn tích chập.
Trong ví dụ trên, chúng ta sẽ thực hiện phép tốn tích chập giữa một ma trận vng
5*5 với một kernel kích thước 3*3. Một kernel là một ma trận vuông luôn có chiều là số
lẻ. Kernel sẽ đóng vai trị như một "cửa sổ trượt", trượt qua toàn bộ ma trận 5*5. Với
mỗi lần trượt, nó sẽ thực hiện phép tốn nhân từng phần tử của ma trận kernel với khung
hình mà nó nhắm đến trong ma trận 5*5, và ghi lại kết quả vào một ma trận đầu ra. Như
trong hình trên có thể thấy phần tử đầu tiên của ma trận đầu ra được tính như sau:
1∗1+1∗0+1∗1+0∗0+1∗1+1∗0+0∗1+0∗0+1∗1=4
(2.4.1)
Và cứ tiếp tục như vậy, quá trình này được thực hiện cho đến khi kernel trượt qua hết ma
trận 5*5 đó.
Hình 7: Bước thứ 2 trong phép tốn tích chập.
2.4
Lớp tích chập (Convolutional Layer)
13
Hình 8: Hồn thành phép tốn tích chập khi kernel đi hết ma trận 5*5.
Tổng quan cách thực hiện phép tốn tích chập giữa ma trận X có kích thước m*n và
ma trận kernel W với kích thước k*k (k là số lẻ), với ký hiệu Y = X
W . Với mỗi phần tử
xij trong ma trận X lấy ra một ma trận có kích thước bằng kích thước của ma trận kernel
W có phần tử xij làm trung tâm (đây cũng chính là lý do vì sao kích thước của kernel
thường lẻ) gọi là ma trận A. Sau đó tính tổng các phần tử của phép tính element-wise
của ma trận A và ma trận W, rồi viết kết quả vào ma trận Y. Nếu để ý sẽ thấy kích
thước của ma trận kết quả Y nhỏ hơn ma trận X. Thật vậy, kích thước của ma trận Y là
(m − k + 1) ∗ (n − k + 1).
Thế thì sẽ xử lý thế nào với phần tử ở viền ngồi như x11 ? Bình thường khi thực hiện
phép tốn tích chập sẽ bỏ qua các phần tử ở viền ngồi, vì khơng tìm được ma trận A
trong X. Cách giải quyết chính là thêm giá trị 0 ở viền ngoài ma trận X, để có thể thực
hiện nhân tích chập đối với viền của X.
2.4
Lớp tích chập (Convolutional Layer)
14
Hình 9: Ma trận X khi thêm viền 0 bên ngồi.
Lưu ý rằng khi nói padding = p, có nghĩa là thêm p vector 0 vào mỗi phía của ma
trận.
Như ở trên ta thực hiện tuần tự việc nhân tích chập với các phần tử trong ma trận X,
thu được ma trận Y cùng kích thước với ma trận X, lúc đó ta nói rằng phép nhân tích
chập đó có stride = 1.
Hình 10: Phép nhân tích chập được thực hiện khi stride=1, padding=1
Tuy nhiên, nếu stride = s (s>1) thì ta chỉ thực hiện phép nhân tích chập trên các
phần tử có dạng x1+i∗s,1+j∗s . Ví dụ như stride = 2 thì:
2.4
Lớp tích chập (Convolutional Layer)
15
Hình 11: Phép nhân tích chập được thực hiện khi stride=2, padding=1
Hiểu đơn giản là bắt đầu từ vị trí x11 , sau đó nhảy s bước theo chiều dọc và ngang
cho đến khi đi hết ma trận X. Kích thước của ma trận Y trong ví dụ trên khi bước nhảy
stride = 2 là 3*3, đã giảm đi đáng kể so với ma trận X. Vì vậy, stride thường được dùng để
giảm kích thước của ma trận sau phép tính nhân tích chập. Cơng thức tổng quát cho phép
tính nhân tích chập của ma trận X có kích thước m ∗ n với kernel có kích thước k ∗ k (với k
là số lẻ), stride = s, padding = p được ma trận Y có kích thước ( m−k+2p
+1)∗( n−k+2p
+1).
s
s
Lớp tích chập, theo như tên của nó, sẽ thực hiện phép tốn tích chập trên ma trận pixel
của hình ảnh. Tuy nhiên, ảnh màu có đến 3 kênh R, G, B nên khi biểu diễn, ảnh sẽ ở
dưới dạng một tensor 3 chiều. Vì vậy, ta cũng sẽ định nghĩa kernel trong trường hợp này
là một tensor 3 chiều có kích thước k ∗ k ∗ 3.
Hình 12: Minh họa phép nhân tích chập trên ảnh màu với k=3
Ta định nghĩa kernel có cùng độ sâu (depth) với biểu diễn ảnh, rồi sau đó thực hiện
di chuyển khối kernel tương tự như khi thực hiện trên ma trận 2 chiều.
2.5
Lớp gộp (Pooling Layer):
16
Hình 13: Tensor X, W 3 chiều được viết dưới dạng 3 ma trận.
Với mỗi kernel khác nhau ta sẽ học được những đặc trưng khác nhau của ảnh, nên
trong mỗi lớp tích chập ta sẽ dùng nhiều kernel để học được nhiều thuộc tính của ảnh. Vì
mỗi kernel cho ra đầu ra là 1 ma trận nên k kernel sẽ cho ra k ma trận đầu ra. Ta kết hợp
k ma trận đầu ra này lại thành 1 tensor 3 chiều có độ sâu k.
Tổng quát, giả sử đầu vào của một lớp tích chập là tensor kích thước H ∗ W ∗ D, kernel
có kích thước F ∗ F ∗ D (kernel ln có độ sâu bằng độ sâu của đầu vào và F là số lẻ),
stride là S và padding là P. Lớp tích chập áp dụng K kernel. Chúng ta có đầu ra của lớp
tích chập là tensor 3 chiều có kích thước ( H−FS+2P + 1) ∗ ( W −FS+2P + 1) ∗ K.
2.5
Lớp gộp (Pooling Layer):
Pooling layer thường được dùng giữa các convolutional layer, để giảm kích thước dữ
liệu nhưng vẫn giữ được các thuộc tính quan trọng. Kích thước dữ liệu giảm giúp giảm
việc tính tốn trong model. Gọi pooling size kích thước K ∗ K. Đầu vào của pooling layer
có kích thước H ∗ W ∗ D, ta tách ra làm D ma trận kích thước H ∗ W . Với mỗi ma trận,
trên vùng kích thước K ∗ K trên ma trận ta tìm giá trị lớn nhất hoặc giá trị trung bình
của dữ liệu rồi viết vào ma trận kết quả. Quy tắc về stride và padding áp dụng như phép
tính tích chập trên ảnh.
Hình 14: Max pooling layer với size=(3,3), stride=1, padding=0
Nhưng hầu hết khi dùng pooling layer thì sẽ dùng size=(2,2), stride=2, padding=0.
Khi đó chiều dài và chiều rộng của dữ liệu đầu ra giảm đi một nửa, trong khi độ sâu thì
được giữ nguyên. Có 2 loại pooling layer phổ biến là max pooling và average pooling.
2.6
Intersection Over Union (IOU)
17
Hình 15: Ví dụ về pooling layer
2.6
Intersection Over Union (IOU)
Intersection over union (IOU), là một thuật ngữ được sử dụng để mô tả mức độ trùng
lấp của 2 hộp giới hạn. Vùng chồng lấn càng lớn thì IOU càng lớn. IOU chủ yếu được sử
dụng trong các ứng dụng liên quan đến phát hiện đối tượng, khi chúng ta đào tạo một mơ
hình học sâu cho ra kết quả là các hộp giới hạn bao xung quanh đối tượng. Ví dụ trong
hình dưới đây, chúng ta có 2 hộp gới hạn, một màu xanh lục và một màu xanh lam. Hộp
màu xanh lục là hộp chính xác và hộp màu xanh lam là dự đốn từ mơ hình. Mục đích
của mơ hình này là tiếp tục cải thiện dự đốn của nó, cho đến khi hộp màu xanh lanh và
hộp màu xanh lục trùng nhau hoàn toàn, tức là IOU giữa 2 hộp bằng 1.
Hình 16: Khi IOU bằng 1, tức 2 hộp xanh lục và xanh lam trùng nhau, thì mơ hình dự
đốn chính xác nhất.
Vậy làm sao để tính IOU? Giả sử rằng chúng ta có 2 hộp: hộp thứ nhất được biểu diễn
bởi [x1, y1, x2, y2] và hộp thứ hai được biểu diễn bởi [x3, y3, x4, y4], chi tiết như trong
18
hình sau.
Hình 17: Ý nghĩa x1, y1, x2, y2, x3, y3, x4, y4 và vùng giao nhau giữa hai hộp
Hình 18: Biểu diễn hình học cơng thức tính tốn IOU
Từ biểu diễn hình học của cơng thức tính tốn IOU, ta có thể dễ dàng suy ra được
cơng thức tính IOU dựa trên tọa độ các hộp:
IOU =
Ainter
Ainter
=
Aunion
Abox1 + Abox2 − Ainter
Ainter = (min(x2, x4) − max(x1, x3)) ∗ (min(y2, y4) − max(y1, y3))
3
(2.6.1)
(2.6.2)
Abox1 = (x2 − x1) ∗ (y2 − y1)
(2.6.3)
Abox2 = (x4 − x3) ∗ (y4 − y3)
(2.6.4)
YOLO (You Only Look Once)
Đối với các khái niệm đã tìm hiểu, có lẽ người đọc đã được trang bị đủ kiến thức để
bước vào phần kiến thức trọng tâm của báo cáo đồ án này, đó là mạng học sâu YOLO.
3.1
3.1
Mạng YOLO là gì?
19
Mạng YOLO là gì?
YOLO là viết tắt của cụm từ "You Only Look Once", cũng chính là tiêu đề bài báo
nghiên cứu khoa học công bố YOLO. Nó có nghĩa là chúng ta chỉ cần nhìn một lần duy
nhất là có thể phát hiện ra vật thể. Nghe có vẻ rất nhanh phải khơng? Thật vậy, về độ
chính xác thì YOLO có thể khơng phải là thuật tốn tốt nhất nhưng nó là thuật tốn
nhanh nhất trong các lớp mơ hình phát hiện vật thể. Nó có thể đạt được tốc độ gần như
real-time mà độ chính xác không quá giảm so với các model thuộc top đầu.
YOLO là thuật toán phát hiện vật thể nên mục tiêu của mơ hình khơng chỉ là dự đốn
nhãn cho vật thể như các bài tốn phân loại mà nó cịn xác định vị trí của vật thể. Do đó
YOLO có thể phát hiện được nhiều vật thể có nhãn khác nhau trong một bức ảnh thay
vì chỉ phân loại duy nhất một nhãn cho một bức ảnh.
3.2
Kiến trúc mạng YOLO
Kiến trúc YOLO gồm có mạng cơ sở là các các mạng tích chập làm nhiệm vụ trích
xuất đặc trưng. Phần phía sau là những lớp thêm vào để phát hiện vật thể trên feature
map của mạng cơ sở. Mạng cơ sở của YOLO sử dụng chủ yếu là các lớp tích chập và các
fully connected layer. Các kiến trúc YOLO cũng khá đa dạng và có thể tùy biến thành
các phiên bản cho nhiều dạng dữ liệu đầu vào khác nhau.
Hình 19: Sơ đồ kiến trúc mạng YOLO
Trong YOLOv3, các tác giả áp dụng một mạng trích xuất đặc trưng là darknet-53.
Mạng này gồm 53 lớp tích chập được được kết nối liên tục nhau, mỗi lớp được theo sau
bởi một batch normalization và một hàm kích hoạt Leaky Relu. Để giảm kích thước của
đầu ra sau mỗi lớp tích chập, các tác giả giảm chiều giữ liệu bằng các filter với kích thước
là 2. Việc này nhằm giảm thiểu số lượng tham số cho mơ hình, từ đó tăng cường tốc độ
tính tốn.
3.3
Anchor box (hộp neo)
20
Hình 20: Các lớp trong mạng darknet-53
Hình ảnh khi được đưa vào mơ hình sẽ được scale về chung một kích thước phù hợp
với input shape của mơ hình và sau đó được gom lại thành batch để đưa vào huấn luyện.
y T = [p0 , < tx , ty , tw , th >, < p1 , p2 , ..., pc >]
(3.2.1)
Trong đó:
• p0 : Xác suất có vật thể xuất hiện trong bounding box.
• tx , ty , tw , th : Lần lượt là tọa độ (x, y) tâm của bounding box, chiều dài và chiều rộng
của bounding box đó.
• p1 , p2 , ..., pc : Các xác suất vật thể xuất hiện trong bounding box là vật thể tương
ứng với các nhãn đầu ra.
3.3
Anchor box (hộp neo)
Một trong những vấn đề của nhận diện vật thể chính là nhận diện vật thể bị che khuất
bởi vật thể khác. Vì thuật tốn nhận diện vật thể gốc chỉ có thể xác định được một vật
thể nếu như có hai vật thể chồng lên nhau. Anchor box được sinh ra để giải quyết vấn đề
này. Anchor box là một tập hợp các bounding box được xác định trước có chiều cao và
chiều rộng nhất định. Các box này được xác định để nắm bắt kích thước và tỷ lệ của các
lớp đối tượng cụ thể mà chúng ta muốn mơ hình nhận diện và thường được chọn dựa trên
kích thước đối tượng trong tập dữ liệu huấn luyện. Trong quá trình nhận diện, các anchor
box được xác định trước sẽ được thử lần lượt trên hình ảnh. Mạng dự đốn xác suất và
các thuộc tính khác, ví dụ như IOU. Các dự đốn được sử dụng để tinh chỉnh từng anchor
3.4
Non-max suppression
21
box riêng lẻ và loại đi những anchor box chỉ cùng một đối tượng, chỉ giữ lại một box duy
nhất đối với mỗi đối tượng trong ảnh.
Hình 21: Ví dụ về các anchor box.
3.4
Non-max suppression
Thuật toán YOLO dự đoán rất hiệu quả, thậm chí phải nói là "q"hiệu quả khi nó dự
đốn một vật trong ảnh nhiều lần, đưa ra nhiều bounding box chồng nhau. Trong trường
hợp này, YOLO cần đến non-max suppression để giảm bớt số lượng các bounding box đầu
ra.
Hình 22: Từ 3 bounding box ban đầu cùng bao quanh chiếc xe, sau khi sử dụng non-max
suppression đã giảm xuống cịn một bounding box cuối cùng.
Thuật tốn non-max suppression gồm 2 bước như sau:
• Bước 1: Giảm bớt số lượng các bounding box bằng cách loại bỏ tồn bộ những
bounding box có xác suất chứa vật thể nhỏ hơn một ngường nào đó, thường là 0.5.
Tức là p0 < 0.5
• Bước 2: Đối với các bounding box cịn lại, non-max suppression sẽ chọn ra bounding
box có xác suất chứa vật thể lớn nhất. Sau đó, tính tốn chỉ số IOU với các bouding
box còn lại. Nếu chỉ số này lớn hơn ngưỡng threshold thì có nghĩa là 2 bounding
box đang chồng lên nhau. Ta sẽ xóa các bounding box có p0 thấp hơn và giữ lại
bounding box có p0 cao nhất.
22
4
4.1
Các công nghệ sử dụng
TensorFlow
TensorFlow là một thư viện mã nguồn mở và miễn phí dành cho máy học và trí tuệ
nhân tạo. Nó có thể được sử dụng trong nhiều tác vụ liên quan đến AI/ML, nhưng đặc
biệt tập trung vào việc huấn luyện và xây dựng các mạng học sâu. TensorFlow được phát
triển bởi đội ngũ Google Brain để sử dụng trong nội bộ của Google cho việc nghiên cứu
và sản xuất các công cụ của Google. Phiên bản đầu tiên được phát hành rộng rãi vào năm
2015. TensorFlow được xây dựng để có thể được sử dụng với những ngơn ngữ lập trình
phổ biến, tiêu biểu nhất ở đây là C++, Java và Python. Chính vì vậy, TensorFlow trở
thành công cụ cực kỳ phổ biến trong nghiên cứu cũng như phát triển các ứng dụng liên
quan đến học sâu.
4.2
Keras
Keras là một thư viện mã nguồn mở cung cấp giao diện Python cho các mạng học sâu.
Keras hoạt động như một giao diện cho thư viện TensorFlow. Keras là một API được thiết
kế cho con người, không phải máy móc. Nó cung cấp các API nhất quán và đơn giản, giảm
thiểu nỗ lực của người dùng cho những trường hợp sử dụng phổ biến, đồng thời cung cấp
các thơng báo lỗi rõ ràng. Nó cũng có nhiều tài liệu và hướng dẫn cụ thể dành cho các nhà
phát triển. Keras là framework deep learning được sử dụng nhiều nhất trong số 5 đội xếp
thứ hạng đầu trên Kaggle. Bởi vì Keras giúp việc thực hiện các thử nghiệm mới dễ dàng
hơn, nó cho phép các nhà nghiên cứu thử nghiệm nhiều ý tưởng hơn và nhanh hơn. Được
xây dựng trên nền tảng của TensorFlow 2 - một thư viện deep learning khác chuyên về
hiệu năng xử lý, Keras hồn tồn đảm bảo được về hiệu năng khi có thể sử dụng GPU và
TPU cho việc huấn luyện mô hình. Keras hỗ trợ nhiều mạng học sâu được dựng sẵn mà
hay được sử dụng phổ biến để phát triển các cấu trúc mạng học sâu phức tạp hơn như
RNN, CNN. Chính vì những lý do này mà Keras được sử dụng rộng rãi trong môi trường
học tập và nghiên cứu.
4.3
YOLOv5
Kiến thức về YOLO đã được trình bày rất cụ thể ở phần trên, nên ở đây chỉ giới thiệu
sơ lược về YOLOv5. YOLOv5 là một mơ hình phát hiện vật thể thuộc họ mơ hình
YOLO. 3 phiên bản YOLO đầu tiên được phát triển bởi Joseph Redmon. Sau đó, Alexey
Bochkovskiy cho ra mắt YOLOv4 với sự cả thiện cả về tốc độc cũng như độ chính xác.
Và rồi YOLOv5 được công bố gần đây với những so sánh ban đầu cho thấy độ chính xác
tương đương YOLOv4 và có tốc độ thực hiện dự đoán nhanh hơn. Khác với những phiên
bản tiền nhiệm, YOLOv5 được phát triển dựa trên PyTorch thay vì DarkNet. Đây là một
điểm cộng cho YOLOv5 vì PyTorch phổ biến hơn rất nhiều so với DarkNet, điều này đồng
nghĩa với việc sẽ có nhiều tài liệu và hướng dẫn về mơ hình này hơn, đồng thời chúng ta
cũng dễ dàng can thiệp vào cấu trúc mô hình hơn.
4.4
Flask
Flask là một micro web framework được viết bởi Python. Nó được phân loiaj là microframework là vì nó không yêu cầu những công cụ hay thư viện chuyên biệt. Nó khơng
có lớp trừu tượng cơ sở dữ liệu, kiểm định biểu mẫu hay những thành phần khác mà những
thư viện bên thứ ba có sẵn cung cấp những chức năng chung. Tuy nhiên, Flask hỗ trợ các
tiện ích mở rộng có thể thêm những tính năng ứng dụng nếu chúng được triển khai trong
Flask. Các phần mở rộng sẵn có dành cho object-relational mappers, kiểm định biểu mẫu,
xử lý tải lên, các công nghệ xác thực mở khác nhau và một số công cụ khác liên quan đến
framework phổ biến. Những ứng dụng nổi tiếng sử dụng Flask gồm Pinterest và LinkedIn.
Sau đây là một số công cụ hay đi kèm với Flask được sử dụng trong ứng dụng Chatik:
23
• WSGI: Web Server Gateway Interface, hay viết tắt là WSGI, được sử dụng làm
tiêu chuẩn để phát triển ứng dụng web với Python. WSGI là đặc tả của những giao
diện chung giữa máy chủ web và ứng dụng web.
• Werkzeug: Werkzeug là một bộ công cụ WSGI thực hiện các yêu cầu, đối tượng
phản hồi và chức năng tiện ích. Điều này cho phép một khung web được xây dựng
trên đó. Framework Flask sử dụng Werkzeug như một trong những cơ sở của nó.
Khơng giống như Django, Flask rất mang tính Python, tức là nó rất đơn giản, đơn giản
hơn rất nhiều so với Django. Rất dễ dàng để bắt đầu với Flask, bởi vì lộ trình học tập
của Flask khơng nhiều. Dưới đây là ví dụ về một ứng dụng đơn giản được triển khai bằng
Flask.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello() -> str:
return "Hello World"
if __name__ == "__main__":
app.run(debug=False)
Khơng những thế, Flask cịn rất dễ hiểu, như trong chương trình trên, chỉ cần một người
có chút kiến thức cơ bản về Python cũng có thể hiểu được chương trình đang làm gì, từng
thành phần có vai trị gì mà khơng cần đọc tài liệu hướng dẫn. Chính vì tính gọn nhẹ và
đơn giản này của Flask mà nó rất phù hợp với việc triển khai các API có liên quan đến
Machine Learning. Đây cũng là lý do hàng đầu mà các lập trình viên lựa chọn sử dụng
Flask.
5
Quá trình thực hiện
5.1
Bắt đầu với bài tốn phân loại biển báo giao thông
Đối với đề tài là nhận diện vật thể, hướng tiếp cận đầu tiên mà chúng em nghĩ đến là
giải quyết bài toán nhỏ thuộc vào bài toán đó - bài tốn phân loại vật thể. Cụ thể hơn,
chúng em quyết định thử nghiệm với bài toán "Phân loại biển báo giao thơng thơng qua
hình ảnh một bài toán phổ biến trong giới nghiên cứu học máy. Cùng với bài toán "Nhận
dạng chữ số viết tay", hai bài tốn này ln được đưa vào làm ví dụ điển hình mỗi khi
nhắc đến xử lý ảnh.
5.1.1
Bộ dữ liệu
Bộ dữ liệu được chúng em lấy từ bộ dữ liệu biển báo giao thông nổi tiếng - German
Traffic Sign Dataset. Đây cũng là một bộ dữ liệu thường được sử dụng trong nghiên cứu
cũng như giảng dạy tại các trường đại học vì độ đa dạng về nhãn, độ sáng, góc máy, hình
dạng,...
5.1
Bắt đầu với bài toán phân loại biển báo giao thơng
24
Hình 23: Một vài hình ảnh nằm trong bộ dữ liệu German Traffic Sign Dataset
Bộ dữ liệu này gồm khoảng gần 40 nghìn ảnh chia thành 43 thư mục là 43 loại biển báo
khác nhau. Mỗi thư mục sẽ có 1 file CSV chứa thông tin các ảnh trong thư mục. Có vài
thơng tin sau cần lưu ý:
• ROI: là vùng ảnh chứa biến số với các thông tin X1, Y1, X2, Y2
• ClassID: là nhãn của biển số (từ 1 đến 43)
Hình 24: Thơng tin các ảnh được chứa trong file CSV.
5.1.2
Đọc và xử lý dữ liệu đầu vào
Để đọc và xử lý dữ liệu đầu vàng, chúng em dùng thư viện pandas để đọc dữ liệu đầu
vào trong file .csv và đưa dữ liệu về dạng bảng, thuận tiện cho việc xử lý. Quá trình này
được thực hiện bởi 2 hàm getDataFromPandas và loadDataset. Chi tiết cài đặt 2 hàm này
có thể tìm được tìm thấy dưới đây.
Khai báo thư viện sử dụng:
import os
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from google.colab.patches import cv2_imshow
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score
from tensorflow import keras
Hàm getDataFromPandas:
def getDataFromPandas(pandas_data, input_size=(64, 64)):
pixels = []
labels = []
for i in range(pandas_data.shape[0]):
dir = "/content/" + pandas_data["Path"][i]
img = cv.imread(dir)