1. Trang chủ
  2. » Luận Văn - Báo Cáo

Thiết kế mô hình đọc biển số, QR Code và xác định vị trí đỗ xe bằng Tesseract - OCR

114 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thiết Kế Mô Hình Đọc Biển Số, QR Code Và Xác Định Vị Trí Đỗ Xe Bằng Tesseract-OCR
Tác giả Bùi Minh Quang, Trần Trung Thắng
Người hướng dẫn TS. Phạm Văn Khoa
Trường học Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh
Chuyên ngành Công Nghệ Kỹ Thuật Máy Tính
Thể loại Đồ Án Tốt Nghiệp
Năm xuất bản 2022
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 114
Dung lượng 8,11 MB

Nội dung

40 Trang 19 16 CHƯƠNG 1 TỔNG QUAN 1.1 GIỚI THIỆU Hiện nay các bãi giữ xe vẫn sử dụng giấy bút để ghi lại các biển số xe ra vào cả ô-tô lẫn xe máy, vấn đề trên sẽ xảy ra các vấn đề như v

Trang 1

THIẾT KẾ MÔ HÌNH ĐỌC BIỂN SỐ, QR CODE VÀ XÁC ĐỊNH

VỊ TRÍ ĐỖ XE BẰNG TESSERACT-OCR

GVHD: TS PHẠM VĂN KHOA SVTH: BÙI MINH QUANG TRẦN TRUNG THẮNG

S K L 0 0 9 5 0 5

TP HỒ CHÍ MINH – 07/2022

Trang 2

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH

KHOA ĐÀO TẠO CHẤT LƯỢNG CAO

ĐỒ ÁN TỐT NGHIỆP

SVTH: BÙI MINH QUANG

MSSV: 18119110 TRẦN TRUNG THẮNG MSSV: 18119121

GVHD: TS PHẠM VĂN KHOA

NGÀNH CÔNG NGHỆ KỸ THUẬT MÁY TÍNH

THIẾT KẾ MÔ HÌNH ĐỌC BIỂN SỐ, QR CODE VÀ XÁC ĐỊNH VỊ TRÍ ĐỖ XE BẰNG

TESSERACT-OCR

TP HỒ CHÍ MINH – 07/2022

Trang 3

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH

KHOA ĐÀO TẠO CHẤT LƯỢNG CAO

ĐỒ ÁN TỐT NGHIỆP

NGÀNH CÔNG NGHỆ KỸ THUẬT MÁY TÍNH

THIẾT KẾ MÔ HÌNH ĐỌC BIỂN SỐ, QR CODE VÀ XÁC ĐỊNH VỊ TRÍ ĐỖ XE BẰNG

TESSERACT-OCR

SVTH: BÙI MINH QUANG

MSSV: 18119110 TRẦN TRUNG THẮNG MSSV: 18119121

GVHD: TS PHẠM VĂN KHOA

TP HỒ CHÍ MINH – 07/2022

Trang 4

1

Trang 5

2

Trang 6

3

CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM

Độc lập – Tự do – Hạnh Phúc

*******

PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN

Họ và tên Sinh viên: Bùi Minh Quang MSSV: 18119110

Trần Trung Thắng MSSV: 18119121 Ngành: Công Nghệ Kỹ Thuật Máy Tính

Tên đề tài: Thiết kế hệ thống đọc biển số và xác định vị trí xe trong bãi

Họ và tên Giáo viên hướng dẫn: ………

Trang 7

Tp Hồ Chí Minh, ngày 09 tháng 07 năm 2022

Giáo viên phản biện

(Ký & ghi rõ họ tên)

Trang 8

5

LỜI CẢM ƠN

Trong quá trình làm đồ án và báo cáo, nhóm đã gặp một số khó khăn nhất định và được giải quyết kịp thời nhờ sự giúp đỡ của giáo viên hướng dẫn, những người bạn và gia đình đã động viên cũng như tiếp thêm tinh thần cho nhóm để nhóm tiếp tục thực hiện đề tài lần này

Nhóm xin chân thành gửi lời cảm ơn đến TS Phạm Văn Khoa người đã dẫn dắt nhóm trong việc làm đề tài, những người bạn và gia đình đã ở bên động viên nhóm thực hiện đề tài, thầy là người đã luôn động viên tinh thần, chu cấp phần cứng là Raspberry Pi 4 Model B để nhóm có dụng cụ để thực hiện đề tài lần này, cảm ơn thầy đã giành thời gian gặp mặt nhóm thực hiện đề tài mỗi tuần và đưa ra các hướng giải pháp tích cực cho đề tài này và triển khai từ các ý tưởng từ mỗi thành viên trong nhóm

Cảm ơn nhà trường Đại Học Sư Phạm Kỹ Thuật TP.HCM, Khoa Đào Tạo Chất Lượng Cao, Khoa Điện-Điện Tử và các sinh viên khóa K18 và các anh chị của ngành Công Nghệ Kỹ Thuật Máy Tính trong vòng 4 năm học vừa qua đã dìu dắt, hướng dẫn tận tình với các môn học đào sâu vào lý thuyết và thực tiễn để nhóm thực hiện có thể tự tin thực hiện đề tài này

Một lần nữa nhóm thực hiện gửi lời cảm ơn sâu sắc nhất đến những thầy

cô, bạn bè đã đồng hành suốt một chặn đường dài cùng với nhóm

Trân trọng

Bùi Minh Quang

Trang 9

6

LỜI CAM ĐOAN

Nhóm thực hiện đề tài cam đoan không sao chép nội dung và kết quả của các công trình, đề tài khác và các nội dung ở báo cáo là sự tìm hiểu và nghiên cứu của nhóm thực hiện đề tài Các quá trình tìm hiểu và nghiên cứu đều được thực hiện theo sự hướng dẫn tận tình của TS Phạm Văn Khoa Các nội dung tham khảo đã được trích dẫn đầy đủ Nếu phát hiện báo cáo nhóm thực hiện đề tài được sao chép từ một nguồn nào đó thì nhóm sẽ cam đoan chịu hoàn toàn trách nhiệm, các thầy cô và nhà trường Đại Học SPKT TP.HCM không liên quan

Trang 10

7

TÓM TẮT

Hiện nay nhu cầu sử dụng phương tiện giao thông tăng cao của người dân,

dự kiến trong tương lai những phương tiện giao thông sẽ tăng nhanh nhu cầu về

đi lại của người dân Bên cạnh đó các bãi đỗ xe cũng nhanh chóng mọc lên để phục vụ nhu cầu thiết yếu cho người dân, bên cạnh đó cũng đã xảy ra rất nhiều bất cập dành cho những sử dụng dịch vụ của bãi giữ xe như bị trộm mất xe do an ninh của bãi giữ xe không cao, hay một số người vô ý thức phá hoại xe của người khác, quên mất vị trí đậu xe khiến cho chủ nhân của chiếc xe mất thời gian tìm kiếm với một số lượng xe dày đặt, đã có rất nhiều cách giải quyết được đặt ra như tăng nhân lực bảo vệ, tăng số lượng camera giám sát, đánh ký hiệu số và chữ

ở từng bãi để người đậu xe có thể nhớ nhưng trên thực tế hiệu quả mang lại không cao khi xe vẫn có thể bị phá hoại hoặc tệ hơn có thể bị mất cắp, người đậu

xe không nhớ được ký hiệu ở khu vực đó do không có một trí nhớ tốt,

Cuộc cách mạng công nghệ lần thứ tư đã và đang diễn ra, công nghệ thông tin ngày càng phát triển, nhu cầu thay đổi của các doanh nghiệp trong và ngoài nước đã và đang thay đổi từng ngày, tận dụng những công nghệ mang tính kỹ thuật cao áp dụng vào đời sống của con người làm giảm thiểu số lượng nhân công lao động, tiết kiệm được kinh tế và sức người, hơn hết là tăng năng suất do những công nghệ hiện nay có một hiệu suất hoạt động rất cao Đối với những vấn

đề còn tồn đọng lại ở phía trên thì lĩnh vực Computer Vision (Thị giác máy tính)

là một lĩnh vực có thể giải quyết được các bất cập ở phía trên khi phần cứng tại thời điểm hiện tại đã phát triển một cách mạnh mẽ, tốc độ xử lí nhanh, đặc biệt trong 5 năm đổ lại gần đây trí tuệ nhân tạo (AI) hay máy học (Machine Learning)

đã đóng góp một phần không nhỏ trong lĩnh vực Computer Vision, về phía phần mềm thì các ngôn ngữ lập trình như Python đã xuất hiện nhiều thư viện hỗ trợ cho việc xử lý ảnh xuất hiện nhiều hơn và có mã nguồn mở, các thư viện này liên tục cập nhật, tối ưu nên việc tiếp cận vô cùng dễ dàng

Nắm bắt được các vấn đề nêu trên nên nhóm thực hiện quyết định thực hiện đề tài hệ thống nhận dạng biển số, phân loại và xác định vị trí ra vào xe cùng với mô phỏng, đánh giá tốc độ xử lý của ngôn ngữ lập trình Python khi sử dụng thư viện opencv, một thư viện rất mạnh mẽ trong việc xử lý ảnh

Trang 11

8

MỤC LỤC

PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN 3

DANH MỤC HÌNH 11

DANH MỤC BẢNG 15

CHƯƠNG 1 TỔNG QUAN 16

1.1 GIỚITHIỆU 16

1.2 MỤCTIÊUĐỀTÀI 17

1.3 PHẠMVINGHIÊNCỨU 17

1.4 PHƯƠNGPHÁPNGHIÊNCỨU 17

1.5 BỐCỤCQUYỂNBÁOCÁO 18

CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 20

2.1 TỔNGQUANVỀ THƯVIỆNOPENCV 20

2.1.1OpenCV là gì? 20

2.1.2Kiến trúc của OpenCV 20

2.2 XỬLÝẢNHVỚIOPENCV 21

2.2.1Tổng quan 21

2.2.2Đọc hình ảnh từ đầu vào 22

2.2.3Smoothing 23

2.2.4Kernel 25

2.2.5Threshold 26

2.2.6Adaptive Threshold 28

2.2.7Contours 30

2.3 TESSERACT ORC 34

2.3.1Optical Character Recognition 34

Trang 12

9

2.3.2Giới thiệu về Tesseract-orc 34

2.3.3Kiến trúc hệ thống của Tesseract OCR 35

2.3.4Pytesseract 37

2.4 QRCODE 38

2.4.1Khái niệm QR Code 38

2.4.2Các phiên bản và sức chứa dữ liệu QR Code 39

2.4.3Khả năng chịu lỗi QR Code 40

2.4.4Kiến trúc của QR Code 41

2.4.5Mã hóa và giải mã QR Code 44

2.4.6Quy trình giải mã QR Code: 46

2.4.7Các loại QR Codes 48

2.5 CƠSỞDỮLIỆU 48

2.5.1Khái niệm về cơ sở dữ liệu 48

2.5.2Cơ sở dữ liệu quan hệ 49

2.6 CÁCGIAOTHỨCBỔSUNG 51

2.6.1Domain Name System 51

2.6.2Dynamic Domain Name System 52

2.6.3Hypertext Transfer Protocol Secure 53

2.6.4HTTP Method 54

CHƯƠNG 3 THIẾT KẾ MÔ HÌNH 56

3.1 THIẾTKẾMÔHÌNH 56

3.1.1Sơ đồ bãi: 56

3.1.2Sơ đồ khối mô hình: 60

Trang 13

10

3.1.3Lưu đồ và thuật toán quá trình xử lý hình ảnh 64

3.1.4Lưu đồ API 67

3.1.5Lưu đồ quét mã QR: 73

3.2 THIẾTKẾPHẦNCỨNG 74

3.2.1Raspberry Pi: 74

3.2.2ESP32 CAM: 78

3.3 THIẾTKẾPHẦNMỀM 79

3.3.1Thiết kế cơ sở dữ liệu: 79

3.3.2Thiết lập và cấu hình Server: 82

3.3.3API giao tiếp với bãi xe: 83

3.3.4Ứng dụng di động: 85

3.3.5Thiết kế tổng thể: 89

CHƯƠNG 4 KẾT QUẢ 95

4.1 KẾTQUẢ THỰCHIỆNMÔHÌNH 95

4.2 ĐÁNHGIÁ MÔHÌNH 103

CHƯƠNG 5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 105

5.1 KẾTLUẬN 105

5.2 HƯỚNGPHÁTTRIỂN 105

PHỤ LỤC 106 TÀI LIỆU THAM KHẢO 107

Trang 14

11

DANH MỤC HÌNH

Hình 2.1: Kiến trúc cơ bản của OpenCV [1] 21

Hình 2.2: Hàm đọc hình ảnh đầu vào [1] 22

Hình 2.3: Bộ lọc Gaussian mảng 1 chiều [1] 24

Hình 2.4: Hình ảnh đã qua xử lý bộ lọc Gaussian [1] 25

Hình 2.5: Hàm tạo nhân kernel mới [1] 26

Hình 2.6: Hàm threshold [1] 27

Hình 2.7: Làm rõ chính xác từng loại threshold [1] 28

Hình 2.8: Hàm Adaptive Threshold [1] 29

Hình 2.9: So sánh giữa Binary Threshold và Adaptive Binary Threshold [1] 30

Hình 2.10: Ý tưởng thể hiện việc tìm contour [1] 31

Hình 2.11: Hàm findContours trong OpenCV [1] 32

Hình 2.12: Kiến trúc của Tesseract OCR [3] 36

Hình 2.13: Luồng xử lý của OCR [4] 37

Hình 2.14: Tổng quan về QR Code [5] 39

Hình 2.15: Các version theo từng cấu hình module khác nhau của QR Code [5] 39

Hình 2.16: Vị trí của EEC Level của QR Code Version 2 và 3 [5] 41

Hình 2.17: Kiến trúc của QR Code [5] 42

Hình 2.18: Finder Pattern [5] 43

Hình 2.19: Quy trình QR Code mã hóa [5] 44

Trang 15

12

Hình 2.20: Quy trình QR Code mã hóa [5] 47

Hình 2.21: Tổng quan về table trong cơ sở dữ liệu quan hệ [6] 50

Hình 2.22: Mỗi phần trong một domain name 52

Hình 2.23: Luồng hoạt động của giao thức HTTPS [7] 53

Hình 3.1: Khu vực cổng ra vào và quét mã QR 56

Hình 3.2: Khu vực đậu xe 57

Hình 3.3: Khu vực đậu mỗi chiếc xe và vị trí camera (minh họa) 58

Hình 3.4: Sơ đồ tổng thể của bãi 59

Hình 3.5: Sơ đồ khối tổng quan của mô hình 60

Hình 3.6: Luồng xử lý khi xe vào 62

Hình 3.7: Luồng xử lý khi xe đã đậu vào bãi 63

Hình 3.8: Luồng xử lý khi xe ra khỏi bãi 64

Hình 3.9: Quy trình xử lý ảnh để tìm đường viên xung quanh biển số 65

Hình 3.10: Quy trình xử lý ảnh để đưa vào cho Tesseract đọc 66

Hình 3.11: Lưu đồ API ở trạng thái xe vào 68

Hình 3.12: Lưu đồ API ở trạng thái xe đậu 70

Hình 3.13: Lưu đồ API ở trạng thái xe ra 72

Hình 3.14: Lưu đồ quét mã QR với hai trạng thái vào và ra 73

Hình 3.15: Raspberry Pi với camera Logitech C270 74

Hình 3.16: Raspberry Pi với Camera Module Standard 75

Hình 3.17: Vị trí của Camera Module trên Raspberry Pi 75

Hình 3.18: Camera Module Version Standard 76

Hình 3.19: Cách lắp camera vào cổng module trên Raspberry Pi 76

Trang 16

13

Hình 3.20: Config hệ thống để nhận camera 77

Hình 3.21: Enable nút để kích hoạt camera 78

Hình 3.22: ESP32-CAM 79

Hình 3.23: Bảng người dùng 80

Hình 3.24: Bảng phương tiện và trạng thái xe 81

Hình 3.25: Bảng vị trí của camera 82

Hình 3.26: API với các endpoint cho 3 trạng thái 83

Hình 3.27: Request body ở API trạng thái xe vào 83

Hình 3.28: Request body ở API trạng thái xe đậu 84

Hình 3.29: Request Body của API có trạng thái là ra 85

Hình 3.30: Màn hình đăng nhập của ứng dụng di động 86

Hình 3.31: Màn hình đăng kí của của ứng dụng di động 87

Hình 3.32: Màn hình chính sau khi đã đăng nhập 88

Hình 3.33: Giao diện màn hình thông tin người dùng 89

Hình 3.34: Quy trình xe vào của bãi với bên trái là biển số và bên phải là mã QR 90

Hình 3.35: Dữ liệu trả về khi đọc mã QR và biển số 90

Hình 3.36: Hình ảnh khi xe đã tiến vào vị trí đậu 91

Hình 3.37: Camera đọc được biển số và gửi lên hệ thống cùng với địa chỉ MAC của camera đó 91

Hình 3.38: Thông tin vị trí xe và biển số được hiển thị trên ứng dụng di động sau khi xe đã đậu 92

Hình 3.39: Trạng thái xe ra khỏi bãi với bên trái là camera đọc biển số và bên phải là mã QR để tiến hành checkout khỏi bãi 93

Trang 17

14

Hình 3.40: Dữ liệu nhận được sau khi quét mã QR bao gồm cả vị trí đỗ xe

ở trạng thái ra 93

Hình 3.41: Kiểm tra lại trên màn hình thông tin xe sau khi đã checkout, vị trí xe không còn 94

Hình 4.1: Mô hình tổng quan của bãi gửi xe 95

Hình 4.2: Màn hình QR Code của ứng dụng di động khi xe chưa có trong bãi 96

Hình 4.3: Sử dụng VNC Viewer để kiểm tra log hệ thống khi quét mã QR 97

Hình 4.4: Màn hình QR Code của ứng dụng di động khi có trong bãi 98

Hình 4.5: Kiểm tra camera của ESP32 thông qua địa chỉ IP 99

Hình 4.6: Màn hình thông tin xe khi đã đậu vào vị trí nhất định 100

Hình 4.7: Kiểm tra hệ thống bằng VNC Viewer khi quét QR Code cho xe ra bãi 101

Trang 18

15

DANH MỤC BẢNG

Bảng 2.1: Các loại shape và ý nghĩa của chúng 26

Bảng 2.2: Các loại Threshold trong OpenCV 27

Bảng 2.3: Các loại Retrieval mode 32

Bảng 2.4: Các loại Approximation Method 33

Bảng 2.5: Sức chứa dữ liệu của QR Code Version 40 [5] 40

Bảng 2.6: Các phương thức của HTTP 54

Trang 19

bị mất khiến cho việc xác minh đó là phương tiện của chính họ trở nên khó khăn hơn khi thẻ đã không còn, một số nơi đã phát triển hơn khi sử dụng thẻ từ, nhưng suy cho cùng đây cũng là thẻ vật lý khi mà việc mất thẻ hay cầm nhầm thẻ cũng

có thể xảy ra, bên cạnh đó việc người sử dụng phương tiện sẽ quên mất chỗ đậu cũng không còn lạ lẫm gì, việc đó làm người sử dụng phương tiện phải mất thời gian để tìm vị trí đậu cũng là một vấn đề bất cập trong các bãi hiện nay khi diện tích của bãi quá rộng Còn đối với những người bảo vệ, quản lý bãi, việc sử dụng giấy bút để ghi hay có những chỗ phát triển hơn sẽ có hệ thống camera chụp hình biển số lại nhưng vẫn chủ yếu vẫn phụ thuộc vào con người là chủ yếu

Nắm bắt được những vấn đề tồn đọng trên nhóm thực hiện đã hình thành các ý tưởng như sử dụng các phương pháp xử lý ảnh để có thể đọc biển số xe của phương tiện và lưu vào một cơ sở dữ liệu, việc xây dựng một ứng dụng điện thoại di động cũng là điều cần thiết để thay thế cho giấy hoặc thẻ giữ xe vật lý đi, nhóm thực hiện sẽ thay thế việc sử dụng thẻ vật lý bằng việc quét mã QR để thuận tiện hơn trong việc ra vào của bãi, bên cạnh đó ứng dụng di động này cũng

sẽ hiển thị thông tin vị trí đầu và biển số xe cho người dùng khi người dùng đậu vào một vị trí nhất định của bãi

Từ những vấn đề trên nhóm thực hiện áp dụng các lý thuyết đã được học

về hệ thống nhúng, xử lý ảnh để thực hiện đề tài “THIẾT KẾ MÔ HÌNH ĐỌC BIỂN SỐ, QR CODE VÀ XÁC ĐỊNH VỊ TRÍ ĐỖ XE SỬ DỤNG TESSERACT-OCR”

Trang 20

sẽ được nhóm thực hiện thiết kế để phù hợp về vị trí, ánh sáng để camera có thể đọc biển số xe một cách tốt nhất

Từ đó đưa ra đánh giá một cách khả quan, cụ thể nhất khi đã thực thi ý tưởng và đưa ra hướng phát triển cho đề tài

số xe dài đúng theo chuẩn, thời tiết được đảm bảo và có độ sáng đủ nhất định để camera có thể đọc được biển số và theo dõi được vị trí của xe đậu trong bãi Bãi

xe giới hạn ở một tầng duy nhất và mỗi phương tiện khi đậu đều phải được đậu theo thiết kế của đề tài

Vì đề tài được thực hiện hướng mục tiêu chính là thực thi ý tưởng nên sẽ trình bày tập trung vào các chức năng đã được đề cập ở phần mục tiêu đề tài và không vượt quá giới hạn cho phép của đề tài

1.4 PHƯƠNG PHÁP NGHIÊN CỨU

Phương pháp tổng hợp tài liệu, lý thuyết, khảo sát mô hình thực tế:

Tìm hiểu hành vi người dùng thông qua các bài báo phân tích, trải nghiệm thực tế của bản thân Tìm hiểu cách quản lý số lượng xe di chuyển qua các số liệu cụ thể từ các bài báo cáo ở nhiều bãi giữ xe khác nhau Tìm hiểu các mô hình bãi giữ xe, cách đặt camera từ đó rút ra các ưu và nhược điểm của từng vị trí đặt Tìm hiểu thư viện opencv thông qua trang chủ chính thức của thư viện, các diễn đàn, sách hướng dẫn từ đó áp dụng opencv để có thể chạy được trên camera

Trang 21

18

Phương pháp thực nghiệm:

Nhóm thực hiện tiến hành thiết kế mô hình, mô phỏng mạng lưới bãi gửi

xe với các chức năng đọc biển số xe theo chuẩn quốc tế, màu sắc và vị trí của xe, lưu dữ liệu, từ đó đánh giá mô hình, tính chịu tải Mô phỏng tính năng phát hiện chỗ còn trống trong bãi, xe đậu sai làn và xe đậu đúng Sử dụng cơ sở dữ liệu làm nơi để lưu trữ xe từ đó đưa ra các phân tích, đánh giá khả quan nhất

1.5 BỐ CỤC QUYỂN BÁO CÁO

Nội dung chính của đề tài được trình bày với 5 chương:

Chương 1: Tổng quan:

Đây là chương mở đầu, chương này sẽ đưa ra các vấn đề thực tiễn, những thứ còn tồn đọng trong một bãi giữ xe thông thường từ đó đưa ra các cách giải quyết khác nhau, vận dụng những kiến thức đã học để áp dụng vào các bài toán thực tế

Chương 2: Cơ sở lý thuyết:

Chương tiếp theo sẽ trình bày chi tiết các khái niệm cơ bản nhất để người đọc có thể hình dung được, lượng kiến thức được đưa ra trong chương này là nền tảng để nắm rõ được các quy trình, thiết kế trong chương tiếp theo, các cơ sở lý thuyết được trình bày rất cơ bản, tổng quan cho người đọc về xử lý ảnh sử dụng thư viện OpenCV, QR Code và các luồng xử lý khi thực hiện mã hóa và giải mã một QR Code, tiếp đến sẽ là các khái niệm cơ bản về cơ sở dữ liệu, về khái niệm của các giao thức HTTP và HTTPS và thiết kế API theo chuẩn Restful API để giao tiếp đọc và trả dữ liệu từ server về bộ xử lý ở bãi giữ xe

Chương 3: Thiết kế mô hình:

Mô hình là một phần không thể thiếu khi xây dựng một hệ thống dù lớn hay nhỏ, chương này sẽ đưa đến cho người đọc một cái nhìn tổng quan về cách

hệ thống xử lý như thế nào, luồng đi của dữ liệu, luồng đi của API, thiết kế hệ thống, thiết kế server, thiết kế giao tiếp raspberry pi 4 với esp32 cam, sử dụng API để giao tiếp với server

Chương 4: Kết quả:

Trang 22

19

Nhóm thực hiện sẽ đánh giá mô hình thông qua mục tiêu đề tài đã được đề

ra ở chương đầu tiên, các chức năng, phần cứng và phần mềm có hoạt động tốt hay không Đưa ra nhận xét và xác định những vấn đề đã được giải quyết ở chương đầu tiên nêu ra

Chương 5: Kết luận và hướng phát triển:

Từ chương 4 nối tiếp đến chương này nhóm thực hiện sẽ đưa ra kết luận

mô hình có thực hiện hóa được ở ngoài đời thực không, các sai số liệu có ảnh hưởng đến quá trình giữ xe của bãi hay không

Trang 23

số sử dụng ngôn ngữ lập trình Python Các mã nguồn liên quan sẽ được đề cập ở chương 3 phần thiết kế phần mềm

OpenCV được thiết kế để tối ưu hiệu quả tính toán và tập trung mạnh vào phần xử lý thời gian thực (real-time applications) OpenCV được tối ưu với ngôn ngữ C và xử lý được đa lõi (multicore processors)

Một trong những thành công của OpenCV chính là cung cấp những thứ cần thiết và dễ sử dụng để giúp người sử dụng xây dựng một ứng dụng thị giác phức tạp một cách nhanh chóng OpenCV cung cấp gần 500 hàm tổng quát hết cách lĩnh vực thị giác máy tính bao gồm việc giám sát sản phẩm của nhà máy, y

tế, an ninh, giao diện người dùng (user interface), hiệu chỉnh máy ảnh, v.v… Hiện nay thì thị giác máy tính (Computer Vision) và máy học (Machine Learning) sẽ đi đôi với nhau nên OpenCV có đầy đủ các chức năng với các mục đích cơ bản về máy học [1]

2.1.2 Kiến trúc của OpenCV

OpenCV được chia thành 5 phần cấu trúc chính, 4 trong 5 phần chính sẽ được thể hiện qua hình 2.1 bên dưới:

Trang 24

21

Hình 2.1: Kiến trúc cơ bản của OpenCV [1]

Hình 2.1 thể hiện kiến trúc cơ bản của OpenCV Đầu tiên là phần CV

chứa những thứ cơ bản về xử lý ảnh và các thuật toán cao cấp về thị giác máy

tính Thứ hai, MLL là thư viện về máy học (Machine learning library) trong thư

viện này chứa các công cụ phân loại và thống kê Phần tử kế tiếp sẽ là HighGUI,

phần này sẽ chứa những quy trình và hàm sử dụng ngoại vi (I/O – Input/Output)

để chứa và tải các hình ảnh, videos và cuối cùng sẽ là CXCore chứa những cấu

trúc dữ liệu cơ bản và nội dung của nó Hình 2.1 sẽ không bao gồm phần tử

CvAux, phần này chủ yếu liên quan về nhận diện khuôn mặt, các phông nền nên

nhóm thực hiện sẽ không nêu chi tiết quá về phần này [1]

2.2 XỬ LÝ ẢNH VỚI OPENCV

2.2.1 Tổng quan

OpenCV được viết bằng C++ và các phần trình bày tiếp theo sẽ đi sâu vào

từng hàm bên trong để phân tích cũng như hiểu rõ hơn cấu trúc giải thuật của

OpenCV viết bằng C sẽ như thế nào, qua đến chương tiếp theo nhóm sẽ sử dụng

OpenCV nhưng ở ngôn ngữ Python để rút gọn thời gian viết mã lại cũng như các

thư viện của OpenCV ở ngôn ngữ Python đều cung cấp đầy đủ các hàm giống

như OpenCV viết bằng C++, Python OpenCV chứa bên trong là Engine gốc của

OpenCV (tức là viết dưới tầng sâu là ngôn ngữ C++) và các hàm sẽ gọi nhau

Trang 25

22

thông qua API để giao tiếp giữa hai ngôn ngữ cũng như rút ngắn được thời gian viết mã

2.2.2 Đọc hình ảnh từ đầu vào

OpenCV cung cấp cho những tính năng như đọc hình ảnh từ video và camera Những tính năng này là một phần được cài đặt sẵn ở bên trong gói OpenCV Đối với ngôn ngữ C một ví dụ đơn giản được trình bày dưới đây

Hình 2.2: Hàm đọc hình ảnh đầu vào [1]

Khi biên dịch và chạy chương trình, hệ thống sẽ nhận đầu vào là hình ảnh

và hiển thị nó trên màn hình Sau đấy sẽ đợi tác động phím bấm bất kỳ từ bàn phím của người dùng, thì lúc này chương trình sẽ tắt cửa sổ và thoát chương trình Hàm cvLoadImage() là một hàm cấp cao xác định được nội dung sẽ tải lên dựa vào tên của file, nó cũng tự động cấp phát vùng bộ nhớ cho cấu trúc dữ liệu của hình ảnh Lưu ý rằng cvLoadImage() có thể xử lý đọc được nhiều loại định dạng hình ảnh như BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS và TIFF Một con trỏ (pointer) trỏ tới phần vùng chứa của cấu trúc dữ liệu hình ảnh

đó Cấu trúc này được gọi là IplImage, đây sẽ là thứ sẽ gặp thường xuyên trong OpenCV OpenCV sửa dụng hầu hết các cấu trúc này để xử lý tất cả các loại hình ảnh Một hàm cao cấp tiếp theo đó là cvNamedWindow() là mở một cửa sổ ở trên màn và nội dung trong đấy sẽ chứa hình ảnh vừa được đọc Tiếp ở trường hợp sau, cửa sổ sẽ tự điều chỉnh tự cân bằng với độ rộng của màn hình thông qua hàm cvShowImage()

Tiếp đến hàm cvWaitKey(0) yêu cầu chương trình sẽ dừng lại và đợi tác động ngoại vi (ở đây là bàn phím hoặc nhấp chuột) Tham số có thể truyền vào khi gọi hàm có thể là số âm hoặc dương, đối với số dương truyền vào thì chương trình sẽ đợi theo đơn vị ms theo số dương đã truyền vào và sẽ tiếp túc chạy

Trang 26

23

chương trình nếu không có phím nào được tác động, còn đối với số 0 hoặc số âm, chương trình sẽ dừng hẵn đợi khi nào có tác động từ bàn phím thì mới tiếp tục chạy những chức năng sau Sau khi đã đọc được hình ảnh và muốn không hiện nữa thì việc giải phóng bộ nhớ là cần thiết, OpenCV cung cấp cho ta hàm để thực hiện điều đó là hàm cvReleaseImage(&img), sau khi truyền chiếu đến tham số img và gọi hàm thì giá trị con trỏ lúc này là IplImage* sẽ được chuyển thành NULL Việc đóng cửa sổ window giờ chỉ cần gọi hàm cvDestroyWindow() để đóng lại cửa sổ và sẽ hủy cấp phát bộ nhớ mà chương trình đã sử dụng bao gồm

cả cấp phát bộ nhớ cho cấu trúc dữ liệu hình ảnh

2.2.3 Smoothing

Smoothing hay còn gọi là làm mịn, hoặc có thể gọi là blurring (làm mờ) là một kỹ thuật đơn giản và sử dụng thường xuyên trong quá trình xử lý ảnh Có rất nhiều lý do để làm mịn ảnh nhưng thường thì kỹ thuật này sẽ được dùng để loại bỏ nhiễu (noise) hoặc lỗi sọc từ camera ảnh Làm mịn cũng là một phần quan trọng nếu chúng ta muốn cải thiện chất lượng của ảnh theo một cách có nguyên tắc Ở đề tài này sẽ tập trung vào làm mờ ảnh bằng bộ lọc Gaussian

Bộ lọc Gaussian (CV_GAUSSIAN), là một bộ lọc rất hữu dụng nhưng tốc

độ lọc không phải là nhanh nhất Bộ lọc Gaussian sẽ thực hiện bằng cách tích chập mỗi điểm ở ngõ vào của một cấu trúc mảng với nhân kernel của Gaussian

và sau đó tổng hợp lại để tạo thành một mảng đầu ra Cú pháp gọi hàm theo ngôn ngữ Python là cv.GaussianBlur(params1, params2, params3, params4)

Trang 27

24

Hình 2.3: Bộ lọc Gaussian mảng 1 chiều [1]

Hình trên thể hiện bộ lọc Gaussian ở mảng pixel một chiều, phương pháp làm mờ sửa dụng Gaussian, hai tham số đầu vào sẽ là độ rộng và cao của bộ lọc cửa sổ và một tham số tùy chọn thứ ba đó là giá trị sigma (một nữa độ rộng ở giữa giá trị tối đa) của nhân kernel Gaussian Nếu tham số thứ 3 không có thì Gaussian sẽ tự động xác định kích thước của window thông qua công thức:

𝜎𝑥 = (𝑛𝑥

2 − 1) × 0.30 + 0.80,  𝑛𝑥 =  𝑝𝑎𝑟𝑎𝑚1

𝜎𝑦 = (𝑛𝑦

2 − 1) × 0.30 + 0.80,  𝑛𝑦 =  𝑝𝑎𝑟𝑎𝑚2 Nếu muốn nhân Kernel đối xứng, có thể thêm một tham số thứ 4 để làm việc đó, trong trường hợp này thì tham số thứ 3 và tham số thứ 4 sẽ là giá trị của sigma ở trục hoành và trục tung Nếu trong trường hợp tham số 3 và 4 được xác định giá trị nhưng tham số 1 và 2 thì không thì kích thước của cửa sổ sẽ được xác định tự động dựa trên giá trị từ sigma theo công thức ở trên

Triển khai bộ lọc Gausian thông qua OpenCV cũng tối ưu hóa hiệu suất hơn cho nhân kernels, 3 với 3, 5 với 5 và 7 với 7, với một tham số 3 đầu vào mặc định là (0.0) sẽ cho một hiệu suất tốt hơn những nhân kernels thực hiện cách khác Bộ lọc Gaussian hỗ trợ từ chạy từ một đến ba channel hình ảnh cho dù hình

Trang 29

26

Hình 2.5: Hàm tạo nhân kernel mới [1]

Hình trên là một hàm với 6 tham số đầu vào để tạo một nhân kernel mới, khi tạo một nhân kernel mới, hai tham số đầu là cols và rows (cột và hàng) thể hiện kích thước chứa cấu trúc của element đó dựa theo kích thước của hình chữ nhật Tham số tiếp theo, anchor_x và anchor_y là tọa độ (x,y) sẽ bao quanh kernel, tham số thứ 5 là shape, các giá trị shape được định nghĩa mặc định trong OpenCV theo bảng dưới đây

CV_SHAPE_RECT Nhân kernel là hình chữ nhật CV_SHAPE_CROSS Nhân kernel là hình chữ thập CV_SHAPE_ELLIPSE Nhân kernel là hình ellipse

CV_SHAPE_CUSTOM Nhân kernel sẽ được định

nghĩa theo đầu vào của người dùng

Bảng 2.1: Các loại shape và ý nghĩa của chúng

Bảng trên thể hiện các giá trị shape mà người dùng có thể truyền vào, như

đã trình bày ở đầu phần này thì nhóm thực hiện sẽ sử dụng nhân kernel hình chữ nhật để chập thông qua việc sử dụng bộ lọc Gaussian một cách đơn giản nhất

2.2.5 Threshold

Thông thường, việc tạo ra rất nhiều lớp mặt nạ trong quá trình xử lý ảnh

sẽ dẫn đến bước cuối cùng đó là phân loại những pixel được giữ lại hoặc không,

Trang 30

27

ý tưởng của việc này là chuyển hình anhr thành dạng kiểu dữ liệu mảng từ đó áp dụng threshold vào từng giá trị của mảng đó, việc quyết định giá trị của mảng đó được giữ lại hay không sẽ tùy thuộc vào nó năm trên hay dưới ngưỡng của threshold Nói một cách dễ hiểu thì Threshold là một phương pháp đơn giản nhất

để phân đoạn hình ảnh (segmenting images)

Hình 2.6: Hàm threshold [1]

Hình trên miêu tả hàm threshold của thư viện OpenCV khi sẽ nhận vào 4 tham số là src, dist, threshold, max_value, threshold_type Threshold sẽ là một phần quan trọng trong đề tài vì nó giúp chuyển đổi từ một ảnh thông thường sang ảnh nhị phân (ảnh có chứa giá trị 0 và 1) để phù hợp với đầu vào của Tesseract (sẽ được đề cập vào phần 2.3)

Trang 31

Hình 2.7: Làm rõ chính xác từng loại threshold [1]

Hình trên sẽ tương ứng với bảng gần nhất với từng loại threshold, mỗi hình sẽ chứa một đường kẻ ngang cắt đứt là threshold sẽ đặt tại đấy, nếu giá trị nằm ở trên hoặc dưới thì threshold sẽ giúp ta phân loại được giá trị nằm trong mảng đó

2.2.6 Adaptive Threshold

Phương pháp Threshold sẽ có một phiên bản nâng cấp hơn ở OpenCV đó

là Adaptive Threshold (ngưỡng động hay ngưỡng động), ý tưởng ban đầu được

Trang 32

29

cải thiện từ phương pháp Threshold thông thường đó là việc áp dụng một giá trị ngưỡng ở tất cả vị trí trong ảnh là cách làm việc của threshold, đối với adaptive threshold sẽ khác khi mỗi vùng sẽ có mỗi giá trị ngưỡng khác nhau, điều này sẽ giúp đọc tốt với những hình ảnh kém chất lượng và đầu ra khi đọc cũng sẽ khác

so với threshold thông thường

Hình 2.8: Hàm Adaptive Threshold [1]

Khác với threshold thông thường, Adaptive Threshold sẽ nhận vào ba tham số đầu vào nữa là adaptive_method, block_size và param1, Adaptive Threshold sẽ cho phép hai kiểu khác nhau của threshold trong một hàm dựa vào tham số đầu vào là adaptive_method Ở trong cả hai trường hợp thì adaptive threshold 𝑇(𝑥, 𝑦) sẽ được thiết đặt theo pixel-by-pixel (pixel theo pixel) dựa trên tính toán giá trị trung bình của các vùng xung quanh pixel đó theo b-by-b và trừ cho một hằng số (constant), với b là tham số đầu vào block_size và giá trị hằng

số là tham số param1 được truyền vào Nếu adaptive_method được truyền vào là CV_ADAPTIVE_THRESH_MEAN_C nghĩa là tất cả các pixel trong khu vực đều có giá trị như nhau CV_ADAPTIVE_THRESH_GAUSSIAN_C là giá trị được truyền vào thay cho giá trị ở trên thì những pixel trong các khu vực xung quanh (𝑥, 𝑦) sẽ có giá trị theo hàm Gaussian bắt đầu từ điểm chính giữa Cuối cùng, threshold_type sẽ giống như bảng các loại threshold đã trình bày trong phần trước

Phương pháp adaptive threshold này hữu ích trong các trường hợp đầu vào hình ảnh có ánh sáng cường độ phân bố phức tạp trong các ảnh và hiệu số gradient bị lệch so với mặt bằng chung của toàn bộ bức ảnh nên cần phải sử dụng phương pháp này để tối ưu quá trình lọc ảnh

Trang 33

30

Hình 2.9: So sánh giữa Binary Threshold và Adaptive Binary Threshold [1]

Ở hình đầu tiên phía trên trên có thể cho thấy rằng đối với một bức ảnh có cường độ sáng phân bố phức tạp thì việc sử dụng binary threshold để chuyển đổi hình ảnh sẽ khiến cho đầu ra của hình ảnh khi chuyển đổi sẽ không xác định được hết các ô trắng đen trong bàn cờ do sử dụng chung một giá trị threshold trong một bức ảnh, khác với binary threshold thì adaptive bianry threshold sẽ giải quyết được vấn đề cường độ ánh sáng ảnh khi ảnh đã chuyển đổi đầu ra hiện nguyên hình tất cả các ô trắng và đen do sử dụng từng giá trị threshold cho từng

vị trí các vùng khác nhau như đã đề cập ở phần trên

Việc sử dụng adaptive threshold cũng sẽ được đề cập ở chương tiếp theo khi thiết kế phần mềm, do các bức ảnh sẽ được chụp ngoài trời với cường độ ánh sáng phân bố không cố định ở mỗi vị trí nên việc nhóm thực hiện lựa chọn adaptive threshold là có cơ sở khi những đáp ứng của mỗi threshold là không đủ cho việc đọc biển số xe

2.2.7 Contours

Phần tiếp theo là Contours hay còn gọi là viền, để xác định được khung hình của biển số xe thì việc nhóm thực hiện cần xác định đó là viền bao bọc xung quanh của biển số xe, ở những phần trên đã trình bày về phần adaptive threshold,

Trang 34

31

khi sử dụng phương pháp này sẽ chuyển được thành ảnh nhị phân với giá trị 0 và

1, việc tiếp theo cần xác định đó là viền của biển số xe để đưa vào tesseract Hàm cvFindContours() sẽ tính toán viền từ đầu vào là hình ảnh nhị phân, việc sử dụng threshold hay adaptive threshold sẽ đảm nhiệm cho việc xử lý hình ảnh nhị phân này, trong đó cách cạnh được hiểu là ranh giới giữa hai giá trị âm và dương

Hình 2.10: Ý tưởng thể hiện việc tìm contour [1]

Hình trên được thể hiện để dễ hiểu hơn về cách tìm OpenCV thực hiện tìm viền trong một bức ảnh, hình trên cùng sẽ được đánh nhãn từ A đến E ở trong các vùng sáng Hình phía dưới sẽ thể hiện cho các viền đã được xác định thông qua hàm cvFindContours() Những viền đó được đánh nhãn cX và hX, với “c" nghĩa

là “contour” và h nghĩa là “hole”, và “X” là một số bất kỳ Một số viền sẽ được thể hiện dưới dấu gạch nối “-” và một số viền được thể hiện dưới dấu “.”, những vùng thể hiện dưới dấu gạch nối “-” là những vùng ranh giới bên ngoài (nonzero region) hay còn gọi là những vùng không có giá trị là 0 và những viền thể hiện dưới dấu “.” thì ngược lại gọi là những vùng ranh giới bên trong (zero region)

Trang 35

32

Hình 2.11: Hàm findContours trong OpenCV [1]

Sau khi đã tìm hiểu về ý tưởng của contours là gì, hình bên trên sẽ trình bày hàm cvFindContours trong thư viện OpenCV với tham số nhận vào tổng cộng là 6 tham số Tham số đầu tiên là img, là 8-bit single-channel hình ảnh và được biểu diễn dưới dạng nhị phân Khi hàm được chạy thì hình ảnh này sẽ được

sử dụng để tính toán các viền của nó, tham số thứ 2 là mode với giá trị là số nguyên tố, thư viện OpenCV đã định nghĩa sẵn cho chúng ta các biến chưa các giá trị method lần lượt ở bảng dưới đây được gọi là retrieval modes

Retrieval Modes Value

Bảng 2.3: Các loại Retrieval mode

Với từng mode sẽ có công dụng khác nhau và các mode sẽ được trình bày lần lượt theo thứ tự

RETR_EXTERNAL: Đối với mode này thì sẽ chỉ lấy những đường viền bên ngoài cùng, tức đối với khi muốn xác định viền của biển số xe thì mode này gần như là một sự lựa chọn hoàn hảo nhưng xét đến nhiều yếu tố tác động bên ngoài thì mode này vẫn chưa thực sự hữu dụng trong trường hợp này

Trang 36

33

RETR_LIST: Mode này sẽ lấy tất cả các đường viền bao gồm cả đường viền đen của biển số xe, nhóm thực hiện quyết định sử dụng mode này trong chương thiết kế phần mềm tiếp theo vì phù hợp với đề tài đang thực hiện

RETR_CCOMP: Tất cả các đường viền cũng sẽ được lấy trong mode này nhưng sẽ tạo ra phân lớp 2 cấp (two-level hierarchy)

RETR_TREE: Cũng như mode trên là lấy tất cả các đường viền và tái cấu trúc phan cấp cho tất cả các lớp trong một tổ hợp các đường viền, tuy nhiên mode vừa trình bày sẽ không được sử dụng nhiều khi thực hiện thiết kế

Tiếp theo sẽ là các method được truyền vào để sử dụng là tham số cuối cùng của hàm, các method này cũng được định nghĩa sẵn các biến trong thư viện OpenCV theo bảng bên dưới:

Contour Approximation Modes Value

Bảng 2.4: Các loại Approximation Method

Tương tự như mode thì method cũng sẽ có những chức năng riêng khi truyền vào

CV_CHAIN_APPROX_NONE: Chuyển đổi tất cả các điểm từ chain code thành giá trị điểm trong mảng

CV_CHAIN_APPROX_SIMPLE: Method này sẽ nén các phân đoạn ngang, dọc và chéo, chỉ để lại điểm kết thúc của các phân đoạn trên Ví dụ như một hình chữ sẽ được mã hóa bằng 4 điểm Đây là method phù hợp nhất với đề tài đặc biệt là biển số xe hình chữ nhật hoặc hình vuông đều cần nén các phân đoạn ngang và dọc lại để lại các điểm nhất định để định dạng được khung hình

Trang 37

2.3 TESSERACT ORC

2.3.1 Optical Character Recognition

Optical Character Recognition (OCR) hay nhận dạng ký tự quang học Nói cách khác, nền tảng chung của hệ thống OCR là chuyển ảnh hai chiều thành chữ, ảnh hai chiều ở đây có thể là chữ được đánh bằng máy hoặc viết bằng tay, những hình ảnh đó được thể hiện lại thành dạng chữ mà máy có thể đọc được OCR chứa một quy trình tổng thể mà trong đó những chương trình con được thực hiện một cách chính xác nhất có thể Các quá trình phụ đó là: Giai đoạn tiền xử

lý ảnh, bản địa hóa văn bản (tức có thể chuyển văn bản giữa các ngôn ngữ như Anh, Pháp để nhận diện kiểu ký tự), phân đoạn ký tự, nhận dạng ký tự và cuối cùng là xử lý hậu kỳ Tất nhiên trong tùy trường hợp các quá trình phụ đó có thể khác nhau, nhưng những bước trên là các bước cơ bản để có thể tiếp cận được vào quá trình tự động nhận diện ký tự Phần mềm có chứa OCR thường tập trung chính vào nhận dạng và ghi nhận lại tất cả các chữ cái duy nhất sử dụng các các chữ cái có trong ngôn ngữ được chọn

Trong vòng 2 thập kỷ vừa qua, OCR đã được sử dụng rộng rãi để cung cấp chức năng tự động nhận diện văn bản tự động vào các hệ thống máy tính OCR vẫn còn đang tồn tại những thách thức xảy ra trong các môi trường thực tế như là biến dạng chữ, hình phức tạp và chữ viết mờ hoặc nguệch ngoạc

2.3.2 Giới thiệu về Tesseract-orc

Tesseract là một mã nguồn mở của ORC engine được phát triển tại HP vào giữa năm 1984 đến 1994 Xuất hiện lần đầu vào năm 1995 tại sự kiện UNLV Annual Test of OCR Accuracy, và gặt hái được nhiều thành công đáng kể

Tesseract là một dự án được các tiến sĩ tại HP Labs, ở Bristol, để phát triển cho phần mềm và phần cứng bổ sung cho dòng máy quét của chính HP

Trang 38

35

Động lực để phát triển dự án này đó là muốn cải thiện chất lượng của máy in và giấc mơ của họ là muốn được phát triển và thương mại hóa một phiên bản OCR engines

Sau khi tham gia dự án ở HP Lab Bristol Tesseract có kỹ thuật đọc rất chính xác khi dẫn đầu các OCR engines, nhưng đáng tiếc nó đã không trở thành sản phẩm Giai đoạn phát triển tiếp theo lại quay trở về bài toán nén dung lượng cho OCR tại HP Labs Bristol Tập trung nhiều hơn vào việc cải thiện hiệu quả sai

số vì độ chính xác ở mức cơ bản Vào năm 1994 thì dự án đã bị dừng hoạt động hoàn toàn, engine được gửi cho UNLV vào năm 1995 tại sự kiện Annual Test of OCR Accuracy, nơi mà nó đã được công nhận là bộ nhận dạng ký tự quang học tốt nhất trong giai đoạn đấy Vào năm 2005 thì Tesseract được HP triển khai làm

dự án mã nguồn mở Đường dẫn hiện tại của mã nguồn tại

Tesseract hiện tại là một mã nguồn mở nhận diện văn bản (OCR) Engine

Có thể sử dụng trực tiếp hoặc đối với những lập trình viên có thể sử dụng thông qua API để trích xuất văn bản từ hình ảnh Hiện tại được cộng đồng hỗ trợ rất nhiều loại ngôn ngữ khác nhau thông qua cách gọi API Tesseract không phát triển về mặt giao diện người dùng nhưng có cộng đồng hỗ trợ về khía cạnh đó cũng không kém Tesseract hoạt động tương thích đa số các loại ngôn ngữ và frameworks thông qua các thư viện ví dụ như đối với Python ta sẽ có Pytesseract, java sẽ được sử dụng chung với Springboot hay Javascript sẽ có thư viện hỗ trợ

đó là Tesseractjs

2.3.3 Kiến trúc hệ thống của Tesseract OCR

Tesseract là một công cụ sử dụng OCR khá phổ biến và là một trong những công cụ sở hữu một tỉ lệ nhận diện có độ chính xác khá cao Tesseract sở hữu cho mình một pipeline (đường ống) trong kiến trúc của mình, nói đơn giản thì pipeline là một công cụ tổng hợp giúp người lập trình hoặc những người sử dụng sản phẩm có thể tự động hóa quá trình riêng của mình

Trang 39

36

Hình 2.12: Kiến trúc của Tesseract OCR [3]

Kiến trúc của Tesseract được thể hiện ở ảnh trên khi nó phải đi qua từng

bước cụ thể như sau: Đầu tiên là giai đoạn xử lý ảnh khi phải chuyển đổi ảnh

thành dạng nhị phân 0 và 1 sau đấy xác định được thành phần và kết nối lại (phần

này sẽ được lưu trữ trong một đối tượng gọi là blobs - các khối màu), nhận dạng

ký tự và tổng hợp ký tự để tạo thành từ, dòng, đoạn văn và cuối cùng là giải

quyết vấn đề phát hiện chữ hoa nhỏ

Blobs sẽ được chuyển thành các dòng văn bản và các khu vực được

chuyển hóa sẽ được phân tích dựa vào độ cao cố định hoặc tỉ lệ chữ Từ các dòng

văn bản đó sẽ tách ra thành các ký tự dựa vào khoảng cách giữa các chữ với

nhau Độ rộng của ký tự (hay còn gọi là Fixed Pitch được tính từ khi bắt đầu ký

tự và kết thúc ký tự đó) sẽ được gắn khớp vào từng ô đã được định sẵn, ngoài ra

tỷ lệ văn bản (Proportional text được đo bằng khoảng cách bắt đầu từ ký tự sau

đó đến khoảng trắng và dừng lại ngay sát điểm bắt đầu của ký tự tiếp theo) sẽ

được xác định làm các khoảng cách và không gian giữa các ký tự

Nhận dạng và sau đó thực hiện trình xử lý hai lần (two-pass process) Vào

lần đầu tiên sẽ được hệ thống cố gắng để nhận dạng mỗi ký tự trong một lượt

Mỗi ký tự mà thỏa mãn điều kiện sẽ được truyền đầu vào cho một bộ phân loại

thích ứng để làm dữ liệu training Bộ phân loại sẽ phân loại với độ chính xác cao

hơn khi đã có một cơ số dữ liệu nhất định được qua bộ phân loại này

Mặc dù bộ phân loại có thể phân loại tốt khi có bộ dữ liệu đã được đọc từ

trước nhưng ở phía trước vẫn còn những ký tự mà bộ phân loại chưa xác định

được do lúc đó vẫn chưa phân loại được tốt vì không có bộ dữ liệu được đọc từ

trước, chính vì thế lúc này tiến trình xử lý lần 2 sẽ được thực hiện để chạy lại một

Trang 40

37

lần nữa từ đầu đến cuối với những ký tự nào chưa được nhận diện thì trong lần

thứ 2 này sẽ được nhận diện một lần nữa

Giai đoạn cuối là tiến hành xử lý các khoảng cách giữa các ký tự và kiểm

tra xác định chiều cao các văn bản

Mô hình Tesseract hiện nay đã được hiện đại hóa hơn bằng việc code

cleaning và thêm một model mới là LSTM (Long Short Term Memory) Sau khi

có những bộ công cụ training và model được thêm vào thì hiệu suất của Tesseract

đạt ở mức rất tốt Tuy nhiên vẫn là chưa hiệu quả khi áp dụng vào các chữ viết

tay và các font chữ kỳ lạ Suy cho cùng việc tinh chỉnh lại ở các lớp là điều rất

cần thiết cho kiến trúc của Tesseract

2.3.4 Pytesseract

Pytesseract hay Python-tesseract là một công cụ OCR dành cho ngôn ngữ

python, pytesseract sẽ được bọc xung quanh và lõi bên trong là Tesseract-OCR

engine

Hình 2.13: Luồng xử lý của OCR [4]

Như đã được đề cập ở trên thì Pytesseract sẽ là một phần bao bọc xung

quanh với lõi bên trong của nó sẽ là Tesseract-OCR engine, như hình trên thì có

thể thấy được tổng luồng xử lý của Pytesseract là như thế nào Việc của

Pytesseract sẽ là chuẩn bị đầu vào là hình ảnh, tiếp đến là giai đoạn tiền xử lý

(Pre-Processor) giai đoạn này sẽ xử lý hình ảnh để cung cấp đầu vào cho Engine

Tesseract, sau khi Engine nhận được đầu vào và sẽ tiến thành xử lý theo quy

trình đã được đề cập ở phần kiến trúc của Tesseract với tập data đã được huấn

Ngày đăng: 25/02/2024, 14:37

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w