AdaBoost là một bộ phân loại mạnh phi tuyến phức dựa trên hướng tiếp cận boosting được Freund và Schapire đưa ra vào năm 1995. Adaboost cũng hoạt động trên nguyên tắc kết hợp tuyến tính các “weak classifiers” để hình thành một “strong classifier”.
Là một cải tiến của tiếp cận boosting, AdaBoost sử dụng thêm khái niệm trọngsố (weight) để đánh dấu các mẫu khó nhận dạng. Trong quá trình huấn luyện, cứ mỗi “weak classifier” được xây dựng, thuật toán sẽ tiến hành cập nhật lại trọng số để chuẩn bị cho việc xây dựng “weak classifier” kế tiếp: tăng trọng số của các mẫu bị nhận dạng sai và giảm trọng số của các mẫu được nhận dạng đúng bởi “weak classifier” vừa xây dựng. Bằng cách này “weak classifer” sau có thể tập trung vào các mẫu mà các “weak classifiers” trước nó làm chưa tốt. Sau cùng, các “weak classifers” sẽ được kết hợp tùytheo mức độ tốt của chúng để tạo nên “strong classifier”.
Viola và Jones dùng AdaBoost kết hợp các bộ phân loại yếu sử dụng các đặc trưng Haar-like theo mô hình phân tầng (cascade) như sau:
Trong đó, hk là các bộ phân loại yếu, được biểu diễn như sau: 1 nếu pkfk(x) < pkOk (2.5)
ℎk(x) = 0 nếu gược lại
x: cửa sổ con cần xét Ok: ngưỡng (O = teta)
fk: giá trị của đặc trưng Haar-like
pk: hệ số quyết định chiều của phương trình
AdaBoost sẽ kết hợp các bộ phân loại yếu thành bộ phân loại mạnh như sau: H(x) = sign(a1h1(x) +a2h2(x) + ... + anhn(x)) (a = alpha)
Với: at >= 0 là hệ số chuẩn hoá cho các bộ phân loại yếu
Hình 2.9. Kết hợp các bộ phân loại yếu thành bộ phân loại mạnh 2.1.6Đặc trưng Haar-like [16]
Đặc trưng Haar-like được sử dụng trong việc nhận dạng đối tượng trong ảnh số được phát biểu bởi Viola và Jones gồm 4 đặc trưng cơ bản để xác định một đối tượngtrong ảnh. Mỗi đặc trưng Haar-like là sự kết hợp gồm 2 hoặc 3 khối chữ nhật mang giátrị “đen” hoặc “trắng”. Những khối chữ nhật này thể hiện sự liên hệ tương quan giữa các bộ phận trong ảnh mà bản thân từng giá trị pixel không thể diễn đạt được.
Hình 2.10. Đặc trưng theo cạnh
Hình 2.11. Đặc trưng theo đường
Hình 2.12. Đặc trưng theo xung quanh tâm
Hình 2.13. Đặc trưng theo đường chéo
Dựa theo các đặc trưng trên, giá trị của đặc trưng Haar-like được xây dựng bởi độ chênh lệch giữa tổng các pixel của các vùng đen so với tổng các pixel của các vùngtrắng.
Dưới đây là công thức tính giá trị đặc trưng Haar-like: f(x) = ∑vùng đen(pixel) − ∑vùng trắng( pixel) (2.6)
Như vậy để tính giá trị đặc trưng Haar-like cần phải thực hiện tính toán tổng các vùng pixel trên ảnh. Điều này làm cho chi phí bài toán lớn không thể đáp ứng các tính năng yêu cầu thời gian thực. Do vậy Viola và Jones đã đề xuất ra khái niệm
“Integral Image” để giảm thiểu chi phí cho bài toán tính giá trị của đặc trưng Haar- like để bài toán có thể xử lý với thời gian thực. Tính “Integral Image” bằng cách sử dụng mảng 2 chiều với kích thước bằng kích thước của ảnh cần tính giá trị đặc trưng Haar-like. Ảnh chia nhỏ ở vị trí (x, y) được tính bằng tổng các giá trị pixel của vùng từ vị trí (0,0) đến vị trí (x-1, y-1). Việc tính toán đơn giản là thực hiện phép cộng số nguyên nên tốc độ thực hiện được tối ưu hóa.
Hình 2.14. Cách tính Integral Image của ảnh
P(x,y) = ∑x′≤x,y′≤y i(x′, y′) (2.7)
Kết quả có được sau khi tính Integral Image, việc tính tổng giá trị pixel trong vùng cần tính thực hiện như sau:
Gọi vùng cần tính tổng các giá trị pixel là vùng “A4”.
P1(x1, y1) = A1 (2.8) P2(x2, y2) = A1 + A2 (2.9) P3(x3, y3) = A1 + A3 (2.10) P4(x4, y4) = A1 + A2 + A3 + A4 (2.11) Ta được: A4 = P4 + P1 − P2 – P3 (2.12) Hình 2.15. Cách tính tổng giá trị pixel vùng cần tính
Hình 2.16. Hệ thống phát hiện khuôn mặt
Từ ảnh gốc ban đầu, hệ thống sẽ chia ảnh thành nhiều tỉ lệ rất nhỏ để tính các đặc trưng qua các hàm đặc trưng cơ bản Haar-like. Sau khi tính toán được các hàm đặc trưng, ta nhận được một số lượng rất lớn các đặc trưng. Thì để lựa chọn và xác định có thể là khuôn mặt, ta dùng giải thuật Adaboost để lựa chọn và kết hợp các vùng trọng số yếu thành trọng số mạnh. Cuối cùng, các vùng đã được lựa chọn sẽ được đưa vào bộ phân loại “Cascade of classifier” để loại bỏ các vùng không phải khuôn mặt và xác định vùng nào là khuôn mặt. Và đưa ra kết quả cuối cùng.
2.2 TÌM HIỂU VỀ NGÔN NGỮ PYTHON, THƯ VIỆN OPENCV 2.2.1 Ngôn ngữ python [13]
Python là ngôn ngữ lập trình được sử dụng rất phổ biến ngày nay để phát triển nhiều loại ứng dụng phần mềm khác nhau như các chương trình chạy trên desktop, server, lập trình các ứng dụng web... Ngoài ra Python cũng là ngôn ngữ ưa thích trong ngành khoa học về dữ liệu (data science) cũng như là ngôn ngữ phổ biến để xây dựng các chương trình trí tuệ nhân tạo trong đó bao gồm machine learning. Được tạo ra bởi Guido Van Rossum, thiết kế bắt đầu vào cuối những năm 1980 và được phát hành lần đầu tiên vào tháng 2 năm 1991.
Python là ngôn ngữ dễ học: ngôn ngữ Python có cú pháp đơn giản, rõ ràng sử dụng một số lượng không nhiều các từ khoá, hạn chế các kí hiệu, cấu trúc, cú pháp. Do đó Python được đánh giá là một ngôn ngữ lập trình thân thiện với người mới học. Python là một ngôn ngữ phân biệt kiểu chữ HOA, chữ thường.
Python là ngôn ngữ dễ hiểu: mã lệnh (source code hay đơn giản là code) viết bằng ngôn ngữ Python dễ đọc và dễ hiểu. Ngay cả trường hợp bạn chưa biết gì về Python bạn cũng có thể suy đoán được ý nghĩa của từng dòng lệnh trong source code.
Python có khả năng tương thích cao (highly portable): Chương trình phần mềm viết bằng ngôn ngữ Python có thể được chạy trên nhiều nền tảng hệ điều hành khác nhau bao gồm Windows, Mac OSX và Linux.
Khả năng mở rộng và có thể nhúng: giả sử một ứng dụng đòi hỏi sự phức tạp rất lớn, chúng ta có thể dễ dàng kết hợp các phần code bằng C, C++ và những ngôn ngữ khác (có thể gọi được từ C) vào code Python. Điều này sẽ cung cấp cho các ứng dụng những tính năng tốt hơn cũng như khả năng scripting mà những ngôn ngữ lập trình khác khó có thể làm được.
Ngôn ngữ thông dịch cấp cao: không giống như C/C++, với Python chúng ta không phải lo lắng những nhiệm vụ khó khăn như quản lý bộ nhớ, dọn dẹp những dữ liệu vô nghĩa... Khi chạy code Python, nó sẽ tự động chuyển đổi code sang ngôn ngữ máy tính có thể hiểu. Một ứng dụng viết bằng ngôn ngữ Python có thể bao gồm một hoặc nhiều tập tin khác nhau. Các tập tin chứa mã lệnh Python sẽ có phần mở rộng là .py (ví dụ hello.py, test.py...). Mã lệnh Python được viết tuân theo các quy tắc được quy định sẵn. Ứng dụng python sẽ được biên dịch bằng phần mềm có tên là Python Interpreter.
Bảng 2.1. Các kiểu mã thường dùng
Mã kiểu C Type Python Type Kích thước tối thiểu tính theo byte
Mã kiểu C Type Python Type Kích thước tối thiểu tính theo byte 'B' unsigned char int 1 'u' Py_UNICO DE Unicode character 2
'h' signed short int 2
'H' unsigned
short int 2
'i' signed int int 2
'I' unsigned int int 2
'l' signed long int 4
'L' unsigned long int 4
'f' float float 4
'd' double float 8
Ứng dụng của Python
Python được ứng dụng trong nhiều lĩnh vực khác nhau:
Xây dựng các tiện ích nhỏ để tự động hóa các công việc nào đó như: tự động tìmkiếm, phân loại tập tin theo tiêu chí riêng, tự động cập nhật các tập tin văn bản theoyêu cầu nào đó…
Xây dựng ứng dụng web: Python cung cấp nhiều framework để ta có thể lựa chọn để phát triển ứng dụng web tùy theo mô hình của ứng dụng như: Django, Pyramid,Flask,…
Lập trình các tính toán khoa học, số liệu nhờ các công cụ và lớp thư viện được xâydựng sẵn như: SciPy, IPython,…
Lập trình ứng dụng desktop (wxWidgets), lập trình màn hình tương tác (Kivy),…Bên cạnh đó, Python còn là ngôn ngữ lập trình được lựa chọn để giảng dạy vềlập trình các khóa học nhập môn lập trình ở các trường Đại học lớn trên thế giới.
2.2.2 Thư viện OpenCV [10]
OpenCV (Open Computer Vision) là một thư viện mã nguồn mở chuyên dùng để xử lý các vấn đề liên quan đến thị giác máy tính. OpenCV được thiết kế một cách tối ưu, sử dụng tối đa sức mạnh của các dòng chip đa lõi… để thực hiện các phép tính toán trong thời gian thực, nghĩa là tốc độ đáp ứng của nó có thể đủ nhanh cho các ứng dụng thông thường. OpenCV là thư viện được thiết kế để chạy trên nhiều nền tảng khác nhau, nghĩa là nó có thể chạy trên hệ điều hành Window, Linux, Mac, iOS...
Thư viện OpenCV có thể được chia thành 2 phần (module) chính. Phần căn bản (basic) là mã nguồn được nhóm phát triển xây dựng và kiểm định toàn diện, gồm các thuật toán đã được thế giới công nhận và đánh giá dựa trên cơ sở lý thuyết chắc chắn. Phần mở rộng (contribution) được nhiều tổ chức khoa học khác nhau trên thế giới đóng góp, gồm nhiều thuật toán cập nhật được xây dựng dựa trên các công trình nghiên cứu, bài báo mới đăng trong thời gian gần đây. Do vậy các thuật toán trong phần mở rộng có độ ổn định và tối ưu không cao. Từ phiên bản 3.0, phần mở rộng được tách riêng không còn được gộp chung với thư viện mặc định. OpenCV là thư viện mã nguồn mở được đóng gói thành tập tin nén. Tùy vào phiên bản dành cho các hệ điều hành khác nhau mà tập tin nén này có định dạng tương ứng. Thư viện OpenCV cung cấp cho người dùng các cấu trúc dữ liệu, đối tượng và hàm bằng cách khai báo nguyên mẫu (prototype) của chúng trong các tập tin thư viện C/C++ (*.h, *.hpp…) và định nghĩa chi tiết trong các tập tin mã nguồn (*.c, *.cpp). Với mức độ sử dụng OpenCV, ta chỉ cần giải nén các tập tin đã được biên dịch sẵn rồi thực hiện các thao tác cài đặt đường dẫn cho thích hợp để hệ điều hành tìm đến đúng vị trí của các tập tin thư viện. Ở mức độ cao hơn, nếu muốn hiệu chỉnh
sửa đổi thuật toán hay sử dụng phần mở rộng của OpenCV ta cần phải biên dịch mã nguồn trực tiếp trên máy trước khi cài đặt.
Thư viện mã nguồn mở OpenCV gồm các thành phần nhỏ sau đây: Các thành phần chính:
core. Các hàm cơ bản
imgproc. Xử lý ảnh
imgcodecs. Đọc và ghi tập tin ảnh
videoio. Đọc và ghi đa phương tiện
highgui. Giao diện người dùng bậc cao
video. Phân tích video
calib3d. Hiệu chuẩn thiết bị ghi hình và tái cấu trúc 3D
features2d. Bộ khung các đặc trưng 2D
objdetect. Nhận dạng đối tượng
ml. Học máy
flann. Gom nhóm và tìm kiếm trong nhiều chiều
photo. Các thuật toán chụp ảnh
stitching. Vá ảnh
cudaarithm. Các toán tử trên ma trận
cudabgsegm. Phân đoạn nền ảnh
cudacodec. Mã hóa/giải mã video
cudafeatures2d. Phát hiện và mô tả đặc trưng
cudafilters. Lọc ảnh
cudaimgproc. Xử lý ảnh với CUDA
cudalegacy. Hỗ trợ Legacy
cudaobjdetect. Phát hiện đối tượng
cudaoptflow. Dòng quang học
cudastereo. Thư viện âm thanh
cudawarping. Bẻ cong ảnh
shape. Khác biệt hình học và so sánh
superres. Siêu phân giải
videostab. Ổn định video
viz. Hiển thị 3D
Các thành phần mở rộng:
aruco. Phát hiện ArUco Marker
bgsegm. Các phương pháp phân đoạn đối tượng mới
bioinspired. Các mô hình thị giác sinh học và các công cụ phái sinh
ccalib. Tùy chọn hiệu chuẩn mẫu cho tái cấu trúc 3D
cvv. GUI cho thao tác bắt lỗi trực quan của các chương trình thị giác máy tính
datasets. Thư viện hỗ trợ làm việc với các bộ dữ liệu khác nhau
dnn. Bộ thư viện mạng neural học sâu
dpm. Các mô hình biến dạng từng phần
face. Nhận dạng mặt người
fuzzy. Xử lý ảnh dựa vào lý thuyết mờ
hdf. Nhập xuất dữ liệu cho định dạng HDF (Hierarchical Data Format)
line_descriptor. Mô tả nhị phân cho các đường thẳng trích chọn từ một ảnh
matlab. Liên kết với MATLAB
optflow. Các thuật toán dòng quan học
plot. Hàm vẽ cho dữ liệu ma trận
reg. Đăng kí ảnh
rgbd. Xử lý chiều sâu trong hệ màu RGB
saliency. API xử lý vùng lồi trên ảnh
sfm. Cấu trúc từ chuyển động
stereo. Các thuật toán tín hiệu nổi tương tự
structured_light. API cho tính cấu trúc của ánh sáng
text. Phát hiện và nhận dạng chữ trong cảnh tự nhiên
tracking. Các phương pháp theo vết
xfeatures2d. Tính năng đặc trưng 2D mở rộng
ximgproc. Xử lý ảnh mở rộng
xobjdetect. Phát hiện đối tượng mở rộng
xphoto. Các phương pháp xử lý hình ảnh nâng cao
OpenCV bao gồm một số module khác nhau, mỗi module có các chức năng riêng biệt và bổ sung cho nhau. Chẳng hạn như, "Core" cung cấp cho người dùng cấu trúc dữ liệu cơ sở và các tính năng, trong khi thành phần "Imgproc" có tính năng xử lý hình ảnh, bao gồm lọc ảnh (cả tuyến tính và phi tuyến tính), cũng như các tuỳ chọn chỉnh sửa ảnh khác (thay đổi kích thước, biến dạng...) và chuyển đổi không gian màu. Bên cạnh những tính năng có thể khai thác từ Photoshop thì bộ chỉnh sửa ảnh đến từ OpenCV cũng khá thú vị, hơn nữa chức năng của nó cũng có phần đơn giản hơn Photoshop cho nên bạn dễ dàng xử lý hơn.
Ở module "Video", OpenCV cung cấp cho bạn một số thuật toán mạnh nhằm ước tính chuyển động, theo dõi đối tượng và thực hiện phương pháp tách cảnh nền. Module "Calib3d" bao gồm nhiều thuật toán hình học multiple-view, cung cấp một số tính năng chẳng hạn như hiệu chỉnh camera hoặc xây dựng lại đồ hoạ 3D.
Module "Features2d" bao gồm bộ mô tả và bộ tương hợp mô tả cũng như công cụ phát hiện tính năng. Với thư viện "Objdetect", người dùng có thể tìm các đối tượng khác nhau từ các lớp xác định trước (ví dụ xe hơi, khuôn mặt, ánh mắt...).
OpenCV còn bao gồm "Highgui", một module được thiết kế để quay video, mã hoá giải mã hình ảnh và video. Module "GPU" bao gồm các thuật toán nhằm tăng tốc GPU. Ngoài ra, chương trình còn bao gồm thư viện trợ giúp, cụ thể là FLANN hay Google test wrapper.
Chương 3. TÍNH TOÁN VÀ THIẾT KẾ
3.1 GIỚI THIỆU HỆ THỐNG
Với những yêu cầu của đề tài, nhóm đã hình thành sơ đồ kết nối của hệ thống. Hệ thống gồm các thiết bị như: kit Raspberry Pi 3, module I2C, LCD, máy tính, nguồn.
Hình 3.1. Sơ đồ kết nối hệ thống.
Kit Raspberry: là khối xử lý trung tâm, có chức năng xử lý tín hiệu nhận được từ máy tính. Sau đó xuất tín hiệu, kết quả ra màn hình và LCD.
Máy tính: Có chức năng để lập trình, điều khiển kit Rasberry.
LCD: Có chức năng hiển thị kết quả.
Module I2C: Có chức năng giao tiếp giữa kit Raspberry và LCD nhằm tiết kiệm chân cho kit và dễ dàng kết nối với LCD.
3.2 TỔNG QUAN VỀ HỆ THỐNG3.2.1 Giới thiệu về kit Raspberry Pi 3 [5] 3.2.1 Giới thiệu về kit Raspberry Pi 3 [5]
Raspberry Pi được phát triển đầu tiên vào năm 2012. Raspberry Pi ban đầu là như một thẻ card được cắm trên bo mạch máy tính được phát triển bởi các nhà phát triển ở Anh. Sau đó Raspberry Pi đã được phát triển thành một bo mạch đơn có chức năng như một máy tính mini dùng để giảng dạy ở các trường trung học. Được phát triển bởi Raspberry Pi Foundation – là tổ chức phi lợi nhuận với tiêu chí xây dựng hệ thống mà nhiều người có thể sử dụng được trong những công việc tùy biến khác nhau. Raspberry Pi sản xuất bởi 3 OEM: Sony,Qsida, Egoman. Và được phân phối chính bởiElement14, RS Components và Egoman.
Mặc dù chậm hơn so với các dòng laptop, máy tính hiện đại nhưng Raspberry Pi vẫn được xem là máy tính Linux hoàn chỉnh và có thể cung cấp tất cả các khả năng mà người dùng mong đợi, với mức tiêu thụ năng lượng thấp.