Lịch sử OpenCV

Một phần của tài liệu Xây dựng chương trình phát hiện và nhận dạng một số biển báo giao thông đường bộ nguy hiểm tại việt nam báo cáo nghiên cứu khoa học sinh viên (Trang 27)

OpenCV ra đời là một sáng kiến nghiên cứu của Intel nhằm mục đích đẩy mạnh các ứng dụng của CPU chuyên sâu. Hướng tới mục tiêu này, Intel đã đưa ra nhiều dự án bao gồm theo vết thời gian thực, và những bức tường hiển thị ảnh 3D. Một trong những tác giả làm việc cho Intel thời gian này đã đến thăm một số trường đại học và nhận thấy rằng một số nhóm trường đại học hàng đầu nhưng MIT Media Lab, đã phát triển rất tốt với một nền tảng thị giác máy tính mở (open computer vision) được truyền tay nhau nội bộ giữa các sinh viên. Thay vì phải xây dựng lại những chức năng cơ bản từ đầu thì một sinh viên mới có thể bắt đầu bằng cách xây dựng tiếp dựa trên những gì đã có sẵn.

Do đó OpenCV được Intel chú ý và đầu tư nghiên cứu phát triển. Những mục tiêu ban đầu của OpenCV là:

 Nâng cao nghiên cứu xử lý thị giác không chỉ là nguồn mở mà còn phải tối ưu hóa mã lệnh (code) cho nền tảng xử lý thị giác cơ bản.

 Phổ biến kiến thức xử lý thị giác bằng cách cung cấp những nền tảng chung để các nhà phát triển có thể xây dựng trên nó, vì vậy mà code sẽ có thể dễ dàng đọc được cũng như trong chuyển nhượng.

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

 Thúc đẩy ứng dụng thương mại dựa trên thị giác máy tính bằng cách làm cho nó linh hoạt, di động (portable), tối ưu hóa hiệu suất của mã lệnh, cung cấp giấy phép miễn phí mà không yêu cầu các ứng dụng thương mại sẽ mở (open) hoặc miễn phí.

Kể từ khi dự án đầu tiên vào năm 1999 (Hình 1.5) thì đến nay thư viện OpenCV là một lĩnh vực tích cực quan trọng của một số tổ chức phát triển cũng như thu hút trên 20.000 thành viên sử dụng trên khắp thế giới , do đó OpenCV được mong đợi có sẽ có nhiều bản cập nhật tốt hơn trong các vấn đề về xử lý thị giác máy tính, robot…[12, Trang 1-3].

Hình 1. 5. Lịch sử phát triển của OpenCV [12, Trang 7]. 1.2.2, Kiến trúc của OpenCV

OpenCV có cấu trúc gồm 5 thành phần chính, 4 thành phần trong số đó được thể hiện như trong hình 1.6. Các thành phần CV chứa thuật toán xử lý ảnh cơ bản và các thuật toán cao cấp trong xử lý thị giác máy tính; ML là thư viện phục vụ trong lĩnh vực máy học bao gồm nhiều phân lớp thống kê và các công cụ phân cụm. HighGUI chứa những thành phần nhập xuất và các hàm cho việc lưu trữ và truy xuất hình ảnh, video, và CXCore chứa nội dung và các cấu trúc dữ liệu cơ bản.

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

Hình 1. 6. Kiến trúc cơ bản của OpenCV [12, Trang 13].

Trên hình 1.6 không mô tả thành phần CvAux, thành phần này chứa các hàm đã ngừng phát triển, hoặc đang thử nghiệm. CvAux bao gồm:

 Stereo vision.

 Theo vết 3D.

 Theo vết mắt và miệng.

 Xác định khung xương của đối tượng trong cảnh.

1.3. Tiểu kết

Chương này trình bày một số phương pháp tiếp cận cơ bản trong việc phát hiện, nhận dạng biển báo giao thông đã được áp dụng trong nhiều đề tài nghiên cứu và nền tảng thư viện OpenCV hỗ trợ trong việc xử lý ảnh. Thông qua đó nhóm đã chọn lựa và xác định những thuật toán, công nghệ phù hợp để xây dựng đề tài.

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt CHƢƠNG 2: GIỚI THIỆU PHƢƠNG PHÁP NHẬN DẠNG

BIỂN BÁO GIAO THÔNG

2.1 Khái quát phƣơng pháp nhận dạng biển báo giao thông đƣợc sử dụng trong đề tài.

2.2 Xác định vùng đặc trƣng chứa biển báo giao thông.

2.3 Giới thiệu phƣơng pháp phân tích thành phần chính (Principle Components Analysis_PCA).

2.4 Nhận dạng biển báo dùng bộ phân lớp Support Vector Machine (SVM). (SVM).

2.5Tiểu kết. Nội dung chính Nội dung chính

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt 2.1. Khái quát phƣơng pháp nhận dạng biển báo giao thông sử dụng trong đề tài.

Từ ảnh RGB đầu vào ta xác định vùng ảnh chứa biển báo giao thông nguy hiểm và tách vùng ảnh này ra khỏi ảnh đầu vào. Sau đó trích riêng biển báo và so sánh với cơ sở dữ liệu mẫu trong bộ phân loại để nhận dạng biển báo giao thông nguy hiểm. (adsbygoogle = window.adsbygoogle || []).push({});

Chi tiết các bước của phương pháp nhận dạng theo quy trình như sau:

Sơ đồ 2. 1. Trình tự các bước trong phương pháp nhận dạng biển báo giao thông nguy

hiểm. Ảnh RGB đầu

vào

Xác định vùng đặc trưng chứa biển giao thông

Tách vùng ảnh này ra để xử lý Cân bằng Histogram vùng ảnhLoại bỏ những thông tin thừa trong ảnh Trích riêng biển báo giao thông

khỏi vùng ảnhChuyển ảnh biển báo về ảnh xám Resize ảnh biển báo về Size 50x50 Dùng PCA để giảm bớt số chiều của ảnh xám Dùng SVM để nhận dạng biển báo Cân bằng Histogram vùng ảnhLoại bỏ những thông tin thừa trong ảnhCân bằng histogram ảnh

Formatted: Caption, Left, Space Before: 0 pt,

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt 2.2. Xác định vùng đặc trƣng chứa biển báo giao thông

2.2.1, Đặc trƣng Haar-like

Đặ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[16] gồm 4 đặc trưng cơ bản để xác định một đối tượng trong ả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. 1. Đặc trưng theo cạnh

Hình 2. 2. Đặc trưng theo đường

Hình 2. 3. Đặc trưng theo xung quanh tâm

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

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ùng trắng.

f(x) = Tổng vùng đen(các mức xám của pixel) – Tổng vùng trắng (các mức xám của pixel) (2.1)

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” (ảnh chia nhỏ) để 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. 5. Cách tính Integral Image của ảnh

(2.2)

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; P2(x2,y2)= A1+A2;

P3(x3,y3)= A1+A3; P4(x4,y4)= A1+A2+A3+A4;

A4 = P4 + P1 – P2 –P3; (2.3)

Formatted: Font: Italic

Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Subscript Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Font: Italic Formatted: Subscript Formatted: Font: Italic Formatted: Subscript Formatted: Font: Italic (adsbygoogle = window.adsbygoogle || []).push({});

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

Hình 2. 6. Cách tính tổng giá trị pixel vùng cần tính. 2.2.2, Thuật toán tăng tốc Adaboost

Thuật toán tăng tốc Adaboost là thuật toán máy học được cải tiến từ thuật toán Boosting. Với ưu điểm khả năng giải quyết bài toán nhanh chóng, cài đặt đơn giản và dễ dàng, không có các tham số để điều chỉnh và không cần tri thức về bộ học yếu do đó thuật toán tăng tốc Adaboost được sử dụng nhiều trong các ứng dụng về nhận dạng.

2.2.2.1, Tiếp cận Boosting

Boosting là kĩ thuật nâng cao độ chính xác cho các thuật toán máy học. Năm 1989, Schaire đã đưa ra các chứng minh đầu tiên về thuật toán boosting. Và một năm sau đó Freund đã phát triển thuật toán boosting một cách hiệu quả hơn rất nhiều, mặc dù vẫn còn nhiều hạn chế trong thực tế và chỉ tối ưu trong một số trường hợp. Các thực nghiệm đầu tiên với thuật toán boosting được thực hiện bởi Drucker, Schapire và Simard trong chương trình nhận dạng ký tự quang học (OCR_Optical Character

Recognition). Mãi đến năm 1995 thuật toán AdaBoost mới chính thức được công bố

bởi Freund và Schapire [17].

Nguyên lý cơ bản của thuật toán Boosting là kết hợp các bộ phân loại yếu (weak classifiers) thành một bộ phân loại mạnh (strong classifier). Trong đó bộ phân loại yếu là các bộ phát hiện đơn giản chỉ cần có độ chính xác trên 50%. Bằng cách này, chúng ta nói bộ phát hiện đã được “boost”.

Xét một bài toán phát hiện 2 lớp (mẫu cần nhận dạng sẽ được phân vào 1 trong 2 lớp) với D là tập huấn luyện gồm có n mẫu. Trước tiên, chúng ta sẽ chọn ngẫu nhiên ra n1 mẫu từ tập D (n1<n) để tạo tập D1. Sau đó, chúng ta sẽ xây dựng “weak classifier” đầu tiên C1 từ tập D1. Tiếp theo, chúng ta xây dựng tập D2 để huấn luyện bộ phân loại C2. D2 sẽ được xây dựng sao cho một nửa số mẫu của nó được phân loại

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

đúng bởi C1 và nửa còn lại bị phân loại sai bởi C1. Bằng cách này, D2 chứa đựng những thông tin bổ sung cho C1. Bây giờ chúng ta sẽ xây huấn luyện C2 từ D2.

Tiếp theo, chúng ta sẽ xây dựng tập D3 từ những mẫu không được phân loại tốt bởi sự kết hợp giữa C1 C2: những mẫu còn lại trong D C1 C2 cho kết quả khác nhau. Như vậy, D3 sẽ gồm những mẫu mà C1 và C2 hoạt động không hiệu quả. Sau cùng, chúng ta sẽ huấn luyện bộ phân loại C3 từ D3.

Bây giờ chúng ta đã có một “strong classifier”: sự kết hợp C1, C2 C3. Khi tiến hành nhận dạng một mẫu X, kết quả sẽ được quyết định bởi sự thỏa thuận của 3 bộ C1, C2 C3: Nếu cả C1 C2 đều phân X vào cùng một lớp thì lớp này chính là kết quả phân loại của X; ngược lại, nếu C1 C2 phân X vào 2 lớp khác nhau, C3 sẽ quyết định X thuộc về lớp nào [ 3, Trang 14-15 ].

Hình 2. 7. Boosting[ 3, Trang 16 ]. 2.2.2.2, AdaBoost

AdaBoost (Adaptive Boost) là một bộ phân loại phi tuyến mạnh cải tiến từ thuật toán Boosting, giúp đẩy nhanh việc tạo ra bộ phân loại mạnh (strong classifier) bằng cách chọn các đặc trưng tốt Haar-Like trong bộ phân loại yếu (weak classifier) và kết

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

hợp chúng lại tuyến tính để hình thành một bộ phân loại mạnh (strong classifier) bằng cách sử dụng các trọng số (Weight) để đánh dấu các mẫu khó nhận dạng.

Cho trước một vài thuật toán học yếu, người ta áp dụng kỹ thuật tăng cường để tạo ra thuật toán học mạnh hơn. Adaboost là thuật toán cho phép ta có thể làm được điều trên. Gồm có 2 giai đoạn chính như sau: [18]

Giai đoạn 1: Tạo ra các giả định yếu (weak hypotheses) từ các thuật toán học yếu.

Giai đoạn 2: Tạo ra các thuật toán học mạnh từ các giả định yếu.

Với một tập dữ liệu huấn luyện, một giả định yếu được khởi tạo như sau:

Đầu vào(Input): Cho một tập dữ liệu huấn luyện, N cặp (xi, yi), xi là các vector đặc trưng Haar, yi là giá trị đầu ra mong muốn luôn luôn mang giá trị bằng +1 hoặc -1

(trong đó +1 là đối tượng (object), -1 không phải là đối tượng( background)), và số

lượng vòng lặp là T.

Đầu ra(Output): Tồn tại một hàm có thể được sử dụng để phân lớp các

đặc trưng của vector x.

Nếu thì x được phân lớp là -1. Nếu thì x được phân lớp là +1. (adsbygoogle = window.adsbygoogle || []).push({});

Khởi tạo(Initialization): Cho trọng số

Lặp(Iterate): tính giả định (hypothesis) , trọng số tốt

(goodness) , và đồng thời cập nhật lại các trọng số theo các bước sau:

Bước 1: Chọn ngẫu nhiên một tập con trong tập dữ liệu huấn luyện. Trong

trường hợp này chính là trọng số .

Bước 2: Tính toán giả định bằng cách sử dụng bộ phân lớp yếu cho

Bước 3: Tính toán sai số của trọng số huấn luyện của .

(2.4)

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

Bước 3.2: Nếu thì đây không phải là một phân lớp yếu. Khi đó nên tăng

thêm số lượng mẫu huấn luyện.

Bước 4: Tính toán trọng số tốt của

(2. 5)

Bước 5: Cập nhật lại trọng số

Với

Và :

Trong đó là thừa số chuẩn hóa sao cho

Kết thúc (Termination):

(2. 6)

Tính chất quan trọng nhất của thuật toán Adaboost là có tốt hơn . Để đánh giả hiệu quả của thuật toán ta định nghịa hàm sai số sau:

Khi đó tổng sai số trên N mẫu là:

(2.7)

2.3. Giới thiệu phƣơng pháp phân tích thành phần chính (Principle Component Analysis_PCA).

2.3.1, Giới thiệu.

Mục đích của phương pháp PCA là loại bỏ đi một số hướng thành phần trong không gian dữ liệu, và chỉ giữ lại các thành phần đặc trưng nhất.

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

PCA giúp làm giảm số chiều của dữ liệu. Hay nói theo cách khác thay vì sử dụng các trục tọa độ của không gian cũ, PCA xây dựng một không gian mới có số chiều ít hơn, nhưng lại có thể biểu diễn dữ liệu tốt tương đương không gian cũ, nghĩa là đảm bảo độ biến thiên (variability) của dữ liệu trên mỗi chiều mới [19]. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 2.8 là một ví dụ kinh điển hình ảnh của một con lạc đà. Cùng một con

nhưng với hai góc nhìn khác nhau thì sẽ có được hai thông tin khác nhau.

Hình 2. 8. Phép chiếu lên các trục tọa độ khác nhau có thể cho cách nhìn khác nhau về

cùng một dữ liệu.

Hoặc một ví dụ khác như hình 2.9 với một tập dữ liệu ban đầu (tập điểm màu xanh) được quan sát trong không gian 3 chiều (trục màu đen), ta dễ dàng nhận thấy 3 trục này không mô tả được dữ liệu một cách tốt nhất. PCA sẽ tìm một hệ trục tọa độ mới ( là trục màu đỏ), với không gian mới dữ liệu được mô tả rõ ràng hơn (hình bên phải màu đỏ). Rõ ràng hình bên phải chỉ cần 2 trục tọa độ nhưng cách thể hiện dữ liệu tốt hơn so với hệ trục ban đầu.

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt 2.3.2, Thuật toán PCA

Thuật toán PCA được trình bày lần lượt theo các bước dưới đây[7]:

Bƣớc 1: Chuyển đổi ảnh

Biểu diễn M ảnh trong không gian 2D thành 1D. Tạo vector có kích thước N (số

hàng của ảnh xám x số cột của ảnh xám) như mô tả sau:

(2.8)

Với: ai là giá trị pixel của ảnh T là chuyển vị của ma trận Si

Kết quả chuyển cho M ảnh đưa vào ma trận như sau:

Mỗi ảnh là một ma trận cột, ghép M ma trận cột ứng với M ảnh thành một ma trận có kích thước NxM

(2. 9)

Chỉ số đầu là thành phần của vector, chỉ số sau là thứ tự của ảnh.

Bƣớc 2: Tính ảnh trung bình

(2.10)

Chi tiết công thức trên:

(2.11)

Bƣớc 3: Trừ mỗi ảnh cho ảnh trung bình

Formatted: Font: Check spelling and grammar Formatted: Font: 12 pt

Formatted: Font: Times New Roman, 12 pt

(2.12)

Xây dựng ma trận từ các vừa tìm được

Đặt: sẽ được ma trận kích thước NxM

Một phần của tài liệu Xây dựng chương trình phát hiện và nhận dạng một số biển báo giao thông đường bộ nguy hiểm tại việt nam báo cáo nghiên cứu khoa học sinh viên (Trang 27)