Thuật toán dựa trên đặc trưng về màu sắc, hình dạng của từng loại biển báo để phân đoạn màu sử dụng thuật toán HSV Achrom, phân đoạn hình học với phương pháp Affine Moment Invariant sau
CHƯƠNG 1: GIỚI THIỆU
Giới thiệu tổng quan
Vấn đề về an toàn giao thông luôn là một chủ đề nóng được cộng đồng và nhà nước quan tâm Mỗi ngày số người chết vì tai nạn giao thông không ngừng tăng lên, nguyên nhân chủ yếu là do ý thức người tham gia giao thông, ngoài ra còn phải kể tới cơ sở hạ tầng giao thông Tuy nhiên cũng không thể đổ lỗi hoàn toàn cho người tham gia giao thông, một phần các tài xế lưu thông trên đường luôn phải xử lí rất nhiều tình huống liên tục do đó sự thiếu sót là không tránh khỏi, một phần không nhỏ đó là ý thức tham gia giao thông Để giảm bớt thiếu sót trong xử lý tình huống của tài xế cũng như giảm bớt tai nạn giao thông, việc giúp tài xế phát hiện và nhận diện biển báo giao thông có thể giảm bớt phần nào tai nạn giao thông Phát hiện và nhận diện biển báo giao thông là một phần chính của hệ thống hỗ trợ lái xe DAS (Driver Assistant Systems) Nó có thể cung cấp thông tin như đưa ra các cảnh báo cho tài xế, hoặc hỗ trợ cho việc lái xe tự động Trong phạm vi luận văn này em sẽ từng bước xây dựng ra hệ thống này dựa trên bộ thư viện xử lý ảnh OpenCV, chạy trên Kit nhúng FriendlyARM Tiny4412.
Mục tiêu đề tài
- Phát triển giải thuật phát hiện và nhận dạng biển báo giao thông tại Việt Nam
- Mô phỏng giải thuật trên PC - Xây dựng hệ thống phát hiện và nhận diện biển báo giao thông ở Việt Nam, sử dụng kit FriendlyArm Tiny 4412 - Xây dựng cơ sở dữ liệu hình ảnh và video về biển báo giao thông Việt Nam.
Một số thách thức và giới hạn đề tài
Biển báo giao thông đường bộ 2015 hay còn gọi là hệ thống báo hiệu đường bộ là hệ thống các biển báo được đặt ven đường giao thông, biển báo giao thông cung cấp các thông tin cụ thể đến người tham gia giao thông Được chia thành 6 nhóm sau: biển báo cấm, biển báo nguy hiểm, biển hiệu lệnh, biển chỉ dẫn, biển phụ, vạch
- 2 - kẻ đường Trong mỗi nhóm biển báo có số lượng biển báo rất đa dạng nhiều hình dạng màu sắc khác nhau
Do sự phức tạp của biển báo và môi trường xung quanh chúng, việc phát hiện và nhận diện biển báo sẽ gặp nhiều khó khăn như:
- Màu sắc biển báo bị phai mờ theo thời gian do sự tiếp xúc với ánh mặt trời và phản ứng của lớp sơn với không khí
Hình 1.1 Biển báo bị phai mờ
- Tầm nhìn hạn chế do điều kiện thời tiết như sương mù, mưa, mây hoặc tuyết rơi
Hình 1.2 Biển báo bị sương mù bao phủ
- Độ sáng thay đổi theo thời gian trong ngày, bị che khuất bởi các vật thể khác
Hình 1.3 Biển báo bị che khuất
- Đặc biệt thông tin màu sắc rất nhạy cảm với các điều kiện ánh sáng như bóng tối, đám mây, mặt trời, có thể bị ảnh hưởng sự chiếu sáng do góc nhìn
Hình 1.4 Biển báo thiếu sáng
- Nhiễu do các vật thể cùng màu sắc như các biển quảng cáo, băng rôn
Hình 1.5 Biển báo trùng màu nền (quảng cáo )
- Biển báo bị hư hỏng, mất góc
- Có quá nhiều biển báo hiện diện cùng lúc
Hình 1.6 Quá nhiều biển báo cùng lúc
- Thông thường hình ảnh được lấy từ camera trên xe do đó sẽ không tránh khỏi bị mờ do chuyển động, rung
- Sự hiện diện của các chướng ngại như cây cối, nhà cửa, xe cộ và người đi bộ
- Hiện nay biển báo giao thông ở Việt Nam do nhiều công ty thi công và không có quy chuẩn nhất định
- Thiếu một cơ sở dữ liệu tiêu chuẩn để đánh giá các phương pháp phân loại hiện có
Phạm vi nghiên cứu của đề tài dành cho 3 loại biển báo chính với số lượng như sau:
20 Biển báo cấm: Biển báo cấm để biểu thị các điều cấm Người sử dụng đường phải chấp hành những điều cấm mà biển đã báo Nhóm biển báo cấm gồm có 39 kiểu được đánh số thứ tự từ biển số 101 đến biển số 139 Đặc trƣng: thường hình tròn, viền đỏ, nền trắng, trừ một số biển đặc biệt như biển
102- cấm đi ngược chiều, biển cấm dừng, đậu xe có nền xanh viền đỏ như biển 130, 131a, 131b, 131c
Bảng 1.1 Danh sách biển cấm được thử nghiệm
STT Ký hiệu và tên biển Hình ảnh
1 101 – Đường cấm 2 102 – Cấm đi ngược chiều 3 103a – Cấm ô tô
4 103b – Cấm ô tô rẽ phải 5 103c – Cấm ô tô rẽ trái
6 106a – Cấm ô tô tải (có trọng tải từ 1.5 tấn trở lên) 7 123a – Cấm rẽ trái 8 123b – Cấm rẽ phải 9 124a – Cấm quay xe 10 125 – Cấm vượt 11 127a – Tốc độ tối đa cho phép 40km/h
- 6 - 12 127b – Tốc độ tối đa cho phép 60km/h
13 127c – Tốc độ tối đa cho phép 80km/h 14 127d – Tốc độ tối đa cho phép 50km/h 15 127e – Tốc độ tối đa cho phép 30km/h 16 128 – Cấm sử dụng còi
17 130 – Cấm dừng và đỗ xe
18 131a – Cấm đỗ xe 19 131b – Cấm đỗ xe ngày lẻ 20 131c – Cấm đỗ xe ngày chẵn
22 Biển báo nguy hiểm: cảnh báo các nguy hiểm thường gặp, được đánh số từ 201 đến 245 Đặc trƣng: Có hình tam giác nền vàng, viền đỏ
Bảng 1.2 Danh sách biển báo nguy hiểm được thử nghiệm
STT Ký hiệu và tên biển Hình ảnh
1 201a – Chỗ ngoặc nguy hiểm 2 201b – Chỗ ngoặc nguy hiểm 3 202a – Nhiều chỗ ngoặc nguy hiểm liên tiếp 4 202b – Nhiều chỗ ngoặc nguy hiểm liên tiếp 5 203b – Đường bị hẹp bên trái
- 7 - 6 203c – Đường bị hẹp bên phải 7 205e – Đường giao nhau 8 205a – Đường giao nhau 9 205b – Đường giao nhau 10 205c – Đường giao nhau
11 208 – Giao nhau với đường ưu tiên 12 210 – Giao nhau với đường sắt có rào chắn 13 224 – Đường người đi bộ cắt ngang
14 225 – Trẻ em 15 223 – Nguy hiểm khác 16 227 – Công trường 17 239 – Đường cáp điện phía trên 18 245a – Đi chậm
19 246 – Chú ý chướng ngại vật 20 204 – Đường 2 chiều
21 202 – Chỗ ngoặc nguy hiểm liên tiếp
22 209 – Giao nhau có tín hiệu đèn
10 Biển hiệu lệnh: chỉ dẫn hiệu lệnh, được đanh số từ 301 đến 309 Đặc trƣng: Hình tròn, nền xanh và không viền
Bảng 1.3 Danh sách các biển báo hiệu lệnh được thử nghiệm
STT Ký hiệu và tên biển Hình ảnh
1 301a – Hướng đi phải theo 2 301b – Hướng đi phải theo 3 301c – Hướng đi phải theo 4 301d – Chỉ được rẽ phải 5 301e – Chỉ được rẽ trái 6 301i – Chỉ được rẽ phải hoặc rẽ trái 7 302a – Hướng phải đi vòng chướng ngại vật 8 302b – Hướng phải đi vòng chướng ngại vật 9 303 – Nơi giao nhau chạy theo vòng xuyến 10 306 – Tốc độ tối thiểu cho phép
- Đề tài được thực hiện trên kit nhúng Friendly Arm Tiny 4412 - Camera thực hiện có độ phân giải 640x480
- Xử lý thời gian thực ở tốc độ < 20 frames/s
CHƯƠNG 2: TÌNH HÌNH NGHIÊN CỨU
Cơ bản về giải thuật nhận dạng biển báo giao thông
Quá trình nhận diện biển báo giao thông có thể chia ra làm 2 giai đoạn chính: phát hiện và nhận diện Trong đó giai đoạn phát hiện đóng vai trò quyết định về sau, chỉ có phát hiện chính xác đối tượng nào là biển báo thì mới có thể đưa vào nhận diện được
Chính vì vậy đây là giai đoạn cực kỳ quan trọng cần phải nghiên cứu kỹ lưỡng Dựa trên các phân tích về đặc trưng biển báo cho thấy màu sắc và hình dạng biển báo là hai thông tin quan trọng giúp phát hiện và phân loại biển báo do đó ta sẽ xem xét các bài báo sử dụng các kỹ thuật phát hiện và nhận dạng dựa trên: thông tin màu sắc, thông tin hình dạng, dựa trên các thuật toán máy học (machine learning).
Các công trình nghiên cứu liên quan
Một bài báo của Ghica năm 1995 [1] sử dụng ngưỡng để phân đoạn màu, đây là kỹ thuật cơ bản nhất tính toán sự sai khác giữa các pixel trong ảnh so với giá trị tham khảo trên không gian RGB
Fang [2] tính toán giá trị Hue của không gian màu HSI trên mỗi pixel, so sánh sự tương đồng của Hue với giá trị Hue tham khảo Đối tượng được phát hiện nếu sự tương đồng là lớn, kết quả sau đó đem đi phân tích xác định màu sắc của đối tượng so với màu biển báo chuẩn để nhận diện
Hoferlin, K Zimmermann [3], đây là một bài báo phát hiện biển báo dựa trên hình dạng đối tượng
Hình 2.1 Hệ thống nhận diện biển báo của Hoferlin, K Zimmer
Hình 2.1 là cấu trúc hệ thống nhận diện biển báo giao thông của Hoferlin, K Zimmer, sử dụng các ứng dụng của SIFT và dựa trên hình dạng biển báo để phát hiện đối tượng là biển báo Hơn nữa nhóm tác giả bổ sung một kỹ thuật gọi là mật độ cong tương ứng
(contracting curve density – CCD) để tinh chỉnh vùng ứng cử được phát hiện là biển báo, tăng hiệu suất cho quá trình phân loại kế tiếp Cuối cùng nhận diện dựa trên SIFT và SURF sử dụng mạng nơ rơn
Yin S, Ouyang P, et al [4] sử dụng phương pháp biến đổi Hough điển hình để phát hiện vùng ảnh có khả năng là biển báo giao thông sau đó họ dùng RIBP (Rotation Invariant Binary Pattern) dựa trên không gian affine và Gaussian để rút ngắn thời gian phát hiện biển báo hiệu quả trên những biển báo bị xoay, chói sáng, hoặc không đúng tỉ lệ Cuối cùng họ sử dụng mạng ANN (Artificial Neutral Network) dựa trên tính năng giảm kích thước và phân loại để giảm thời gian nhận diện
Hình 2.2 Giải thuật nhận diện biển báo của Yin, et Đây là mô hình nhận diện biển báo giao thông họ đề xuất, phương pháp đặc trưng của biến đồi Hough (được cung cấp bởi thư viện OpenCV) để xác định vị trí các vùng ứng cử cho biển báo giao thông Sau đó áp dụng kỹ thuật không gian Affine và Gaussian để củng cố lại các vùng ứng cử Kỹ thuật tọa độ cực trị (extreme localization) thừa hưởng từ thuật toán SIFT, cung cấp các hướng và tọa độ cực trị Tháp Gaussian sẽ tạo ra các khối ảnh nhị phân và xoay chuỗi nhị phân đến vị trị tối thiểu để tạo ra ảnh RIBP Sau đó thông qua bộ lọc hình tròn, dựa trên các tọa độ cực trị và hướng tạo ra biểu đồ nhị phân các vùng tròn (Circular Binary Pattern based Histogram) Dựa trên các biểu đồ liên tiếp này sẽ tạo thành những véc tơ đặc trưng Cuối cùng là một véc tơ 64 chiều được đại diện bởi các dữ liệu cố định (fixed-point data) Những dữ liệu cố định này dựa trên các véc tơ đặc trưng góp phần cải thiện tốc độ tính toán Các véc tơ đặc trưng được tạo ra ở một vùng ứng cử sẽ được nhóm lại sử dụng ANN dựa trên phương pháp
- 12 - K-means, sau đó phân loại ANN sẽ giảm kích thước phân loại cải thiện đáng kể tốc độ xử lý
Hasan Fleyeh [5], ông phát triển hệ thống nhận diện báo giao thông kết hợp của hai thông tin màu sắc và hình dạng biển báo trải qua ba quá trình chính: phân đoạn màu, phân loại và nhận diện Trong giai đoạn phân đoạn màu, tác giả phát triển bốn thuật toán bao gồm: Shadow and highlight invariant (SHI), lấy ngưỡng động, chỉnh sửa thuật toán de la Escalera‟s và thuật toán phân đoạn màu dùng Fuzzy
Tất cả các thuật toán được tác giả phát triển và thử nghiệm rất kỹ lưỡng, trong đó thuật toán SHI được đánh giá là có hiệu năng cao nhất Nó có thể chống lại được các điều kiện khó khăn của thời tiết, ánh sáng (chói sáng, bóng râm), và thời điểm trong ngày (được chứng minh là không phụ thuộc vào cường độ ánh sáng)
Abhishek Bedi 2011 [6], cũng dựa trên thông tin màu sắc hình dạng cho việc phát hiện biển báo, tác giả phát triển hệ thống nhận diện biển báo hạn chế tốc độ ẩn trong bóng tối hoặc trời nhiều mây ánh sáng không đủ
Tình hình nghiên cứu trong nước, Để phát hiện và nhận diện chính xác biển báo giao thông là một thử thách lớn cho việc phát triển các hệ thống hỗ trợ tài xế khi phải giải quyết khá nhiều vấn đề về mặt hình ảnh như vật chuyển động, trong điều kiện thời tiết khác nhau, bóng tối hoặc che khuất thường gặp khi xe di chuyển
Bùi Minh Thành [7] phân chia công việc thành ba giai đoạn: phân đoạn màu, phát hiện biển báo, phân loại biển báo Kết quả thực nghiệm trên các tuyến đường ở Ireland và vương quốc Anh khá tốt với 99,2 % độ chính xác phân loại biển báo Mô hình đề xuất của tác giả
Hình 2.3 Hệ thống nhận diện biển báo của Bùi Minh Thành, et
Cũng áp dụng phương pháp này nhiều luận văn được thực hiện cho biển báo giao thông ở Việt Nam như Trịnh Quốc Tài – 2012 [8], Nguyễn Việt Tiến – 2013 [9], Lê Quốc
Hình 2.4 Các giai đoạn nhận diện biển báo
- 14 - Các tác giả chia công việc nhận diện biển báo giao thông qua hai bước chính: phát hiện và nhận diện Trong giai đoạn phát hiện (Detection Phase), hình ảnh được qua tiền xử lí, nâng cao, phân đoạn màu sắc, hình dạng Đầu ra là một hình tiềm năng có thể là biển báo Giúp tăng hiệu quả và tốc độ phát hiện vì chỉ giữ lại những vùng tiềm năng thỏa mãn yêu cầu Trong giai đoạn nhận diện (Recognition Phase): Mỗi vùng tiềm năng được kiểm tra các đặc trưng để quyết định nó có phải hay không Hình dạng của đối tượng đóng vai trò quan trọng, nó quyết định xem đối tượng nên học lớp nào hình tròn hay tam giác
2.2.2 Các công trình nghiên cứu sử dụng thuật toán máy học
Máy học là một ngành khoa học nghiên cứu các thuật toán cho phép máy tính có thể học được các khái niệm (concept) Có hai phương pháp máy học chính:
- Phương pháp quy nạp: Máy học phân biệt các khái niệm dựa trên dữ liệu đã thu thập được trước đó Phương pháp này cho phép tận dụng được nguồn dữ liệu rất nhiều và sẵn có
- Phương pháp suy diễn: Máy học phân biệt các khái niệm dựa vào các luật Cho phép tận dụng được các kiến thức chuyên ngành để hổ trợ máy tính
Một nghiên cứu đáng chú ý sử dụng máy học là ứng dụng phát hiện đối tượng của Paul
Phân tích tổng quan lý thuyết
Nhiều công nghệ được sử dụng để nhận diện biển báo giao thông đã được trình bày ở trên, một số chúng có thể kết hợp lại để tối ưu và đem lại hiệu năng cao như kết hợp màu sắc và hình dạng để phát hiện chính xác hơn
- 17 - Thông qua các nghiên cứu, bài toán phát hiện và nhận diện biển báo cơ bản bao gồm các bước:
2.3.1 Tiền xử lý Đây là bước khá quan trọng giúp cho quá trình phát hiện nhanh và chính xác hơn Ảnh đầu vào thu thập từ camera qua tiền xử lý để nâng cao chất lượng ảnh, giảm nhiễu, và chuyển đổi không gian màu sang HSV
Từ phân tích tổng quan và đặc trưng biển báo giao thông, rõ ràng màu sắc là chìa khóa cung cấp thông tin cho tài xế, do đó nó là nguồn thông tin quan trọng đối với hệ thống phát hiện nhận diện biển báo giao thông của chúng ta
Màu sắc thu được bởi camera rất đa dạng, thường ở không gian RGB, ở không gian này khó có thể nhận dàng màu sắc mong muốn một cách chính xác, nên thường được chuyển sang không gian thích hợp cho thị giác máy tính hơn, trong đó không gian HSV được coi là liên quan chặt chẽ so với nhận thức màu sắc của con người
HSV là không gian màu được dùng nhiều trong việc chỉnh sửa ảnh, phân tích ảnh và một phần của lĩnh vực thị giác máy tính Hệ không gian này dựa vào 3 thông số sau để mô tả màu sắc:
Hình 2.7 Bài toán phát hiện và nhận diện biển báo
- 18 - S = Saturation: độ đậm đặc, sự bảo hòa
V = value: giá trị cường độ sáng
Không gian màu này thường được biểu diễn dưới dạng hình trụ hoặc hình nón
Hình 2.8 Không gian màu HSV
Hình 2.9 Biểu diễn màu sắc Hue
Theo như cách biểu diễn không gian màu theo hình trụ như trên, đi từ giá trị độ sáng (V) được biểu diễn bằng cách đi từ dưới đáy hình trụ lên và nằm trong khoảng từ 0 -1 Ở đáy hình trụ V có giá trị là 0, là tối nhất và trên đỉnh hình trụ là độ sáng lớn nhất (V
= 1) Đi từ tâm hình trụ ra mặt trụ là giá trị bão hòa của màu sắc (S) S có giá trị từ 0-1
0 ứng với tâm hình trụ là chỗ mà màu sắc là nhạt nhất S = 1 ở ngoài mặt trụ, là nơi mà giá trị màu sắc là đậm đặc nhất
Cách chuyển đổi không gian màu RGB sang HSV là:
Chia các giá trị R, G, B cho 255 để chuyển đổi từ [0-255] sang [0-1]
G' = G/255 B' = B/255 Cmax = max (R', G', B') Cmin = min (R', G', B') Δ = Cmax - Cmin
Công thức chuyển đổi HSV – RGB:
Chuyển đổi từ YCbCr sang RGB:
Phần quan trọng đầu tiên của phát hiện biển báo là phải xác định được đối tượng nào là biển báo Để phát hiện đối tượng, đầu tiên chúng ta sẽ tìm hiểu một số giải thuật phân đoạn màu
Một số thuật toán phân đoạn màu: a) Thuật toán phân đoạn màu ngƣỡng động (The Dynamic Threshold Algorithm) Được phát triển bởi Hasan Fleyeh [5], phương pháp này dựa trên giá trị trung bình của độ sáng (luminance), ảnh sẽ được biến đổi từ không gian RGB sang không gian IHSL, các giá trị Hue, Saturation, Luminance được tính toán trong khoảng [0,255] dựa vào trị trung bình Nmean của thành phần L, với
(2.7) Trong đó n,m là kích thước của ảnh , L(i,j) là giá trị lumiance của pixel vị trí (i,j)
Giá trị màu tham khảo và giá trị màu của pixel xử lý được thể hiện bởi hai vector sau:
Hình 2.10 Khoảng cách Euclid của hai véc tơ
H1, H2 là Hue của màu tham khảo và màu xử lý, tương ứng S1,S2 là Saturation
Khoảng cách Euclid giữa 2 véc tơ được tính:
(2.8) Do giá trị Hue và Saturation bị ảnh hưởng bởi ánh sáng theo thời gian (thời điểm chụp ảnh), giá trị ngưỡng động được tính: Ý tưởng chính là phát triển một thuật toán ngưỡng động dựa vào độ sáng của ảnh, khi độ sáng cao thì ngưỡng nhỏ và ngược lại Thuật toán kiểm tra tất cả các pixel để tìm kiếm pixel nghi ngờ là đối tượng bằng cách tính toán khoảng cách Euclid d, nếu d nhó hơn hoặc bằng ngưỡng Đầu ra là ảnh nhị phân chứa những pixel có màu tương đương với giá trị màu tham khảo
Bảng giá trị thông thường của Hue và Saturation:
Bảng 2.1 Bảng giá trị thông thường của Hue và Saturation b) Thuật toán chỉnh sửa của de la Escalera Được phát triển bởi Hasan Fleyeh [5], một sự chỉnh sửa của thuật toán được đề xuất bởi de la Escalera, ảnh được chuyển đôi từ không gian RGB sang IHLS, thành phần Hue và Saturation được chuẩn hóa trong khoảng [0,255]
Các thành phần H, S được tính như sau:
Hmin, Hmax tương ứng của Red, Green, Blue được định nghĩa:
Hình 2.13 H_out theo Blue c) Thuật toán Shadow and Highlight Invariant Được phát triển bởi Hasan Fleyeh [5], thuật toán này dựa trên sự bất biến của thành phần Hue dưới hiện tượng đổ bóng và phản xạ ánh sáng của biển báo Do đó, thuật toán này được thực hiện bằng cách chuyển đổi các hình ảnh RGB sang không gian màu HSV Hue, Saturation được chuẩn hóa trong khoảng [0,255] Ý tưởng của phương pháp này là lấy ngưỡng trên diện rộng, tăng khả năng lấy đúng vùng ảnh Các bước thực hiện:
Chuyển đổi ảnh RGB sang không gian màu HSV
Chuẩn hóa mức xám của mỗi pixel của thành phần H từ [0,360] sang [0,255]
Chuẩn hóa mức xám của mỗi pixel của thành phần S từ [0,1] sang [0,255]
Chuẩn hóa mức xám của mỗi pixel của thành phần V từ [0,1] sang [0,255]
Đối với những pixel của ảnh H thực hiện giải thuật sau o Nếu (H_value > 240 và H_value =0 và H_value
= 60: thì ảnh con này được xem như là seed image
Dựa vào seed image này và ảnh H sẽ tìm ra khu vực thích hợp là biển báo
Hình 2.14 Lưu đồ giải thuật Shadow High Light Invariant
- 26 - Nhận xét: Bằng thực nghiệm Fleyeh [5] cho thấy thuật toán Shadow and Highlight
Invariant có hiệu năng tốt nhất so với các thuật toán còn lại với các lý do sau:
- Phân đoạn màu đạt hiệu năng cao 97.6%
- Khả năng phân đoạn trong nhiều điều kiện thời tiết, biển báo, và tình trạng ảnh vào
- Tốc độ cao nhất - Có khả năng nâng cao tốc độ nhận diện do loại trừ được nhiễu và chính xác
Tuy vậy, thuật toán Shadow and Highlight invariant phân đoạn màu diện rộng, và sử dụng ngưỡng khá rộng nên vùng nhận diện sẽ không tốt đối với các ảnh phức tạp chứa nhiều vùng màu trùng với biển báo
Do đó, một phương pháp phân đoạn màu cải tiến so với phương pháp Shadow and Highlight Invariant được đề xuất bởi Bedi [6] gọi là HSV Achom d) Thuật toán HSV Achrom Đây là phương pháp cải thiện hơn được phát triển bởi Abhishek Bedi [6], giúp nhận diện vùng tối tốt hơn
Hình 2.15 HSV Achrom - HSV color space
Dựa vào không gian màu HSV, ta nhận thấy vùng màu đỏ từ 0-30 độ và 300-360 độ, với True Red ứng với 0 độ Người ta đưa ra biểu đồ cho màu đỏ dưới đây:
Hình 2.16 Chromatic Zone của màu đỏ
Vmax thay đổi từ 255-243 Để xác định một pixel nằm dưới hay trên đường chéo, sử dụng phương trình đường thẳng qua hai điểm:
(V2-V1) *S + (S1-S2) *V + V1*S2 – V2*S1 = 0 (2.11) Do đó, một điểm ảnh (S, V) thuộc đường thẳng sẽ thỏa mãn phương trình trên
Các biển báo giao thông chủ yếu có dạng hình tròn, tam giác và chữ nhật Sau khi có ảnh phân đoạn màu, áp dụng tìm đường bao và xác định hình dạng biển báo
CHƯƠNG 3: NỘI DUNG
Giải thuật đề nghị
Sơ đồ giải thuật phát hiện và nhận diện biển báo giao thông:
3.1.1 Ảnh đầu vào Ảnh đầu vào được chụp/quay trực tiếp bằng camera có độ phân giải 640x480
3.1.2 Tiền xử lý Bước 1: Lấy phần ảnh cần xử lý
Hệ thống giao thông Việt Nam đi lại theo lề phải, nên các biển báo giao thông sẽ được bố trí bên phía tay phải, ngang tầm nhìn lái xe Vì vậy, để giảm bớt công việc xử lý, loại bỏ thông tin dư thừa chúng ta sẽ lấy vùng chữ nhật góc trên bên phải như hình dưới
- Tạo mặt nạ có kích thước mong muốn - Thiết lập vùng giá trị mặt nạ với ảnh gốc - Copy vùng ảnh mặt nạ qua ảnh mới Ảnh vào
Hình 3.1 Sơ đồ tổng quan hệ thống nhận dạng
- 41 - - Reset giá trị mặt nạ đối với ảnh gốc
Hình 3.3 Minh họa vùng ảnh cần xử lý
Hình 3.2 Ví dụ tạo vùng mặt nạ
Bước 2: Giảm nhiễu: sau khi cắt được vùng ảnh cần xử lý ta làm trơn ảnh (Blur) bằng bộ lọc Gaussian 5x5 hoặc 7x7 Bộ lọc Gaussian là bộ lọc tần số cao, chỉ giữ lại thành phần lần số thấp
OpenCV cung cấp thư viện để thực hiện công việc này thông qua hàm void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
src – input image; the image can have any number of channels, which are processed independently, but the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F
dst – output image of the same size and type as src
ksize – Gaussian kernel size ksize.width and ksize.height can differ but they both must be positive and odd Or, they can be zero‟s and then they are computed from sigma*
Hình 3.4 Ảnh trước khi áp dụng bộ lọc Gaussian
Hình 3.5 Ảnh sau khi áp dụng bộ lọc Gaussian
Giai đoạn phát hiện biển báo được thể hiện chi tiết như sơ đồ khối bên dưới
Hình 3.6 Sơ đồ khối phát hiện biển báo
Trong giai đoạn phát hiện biển báo, bước quan trọng đầu tiên là phân đoạn màu, tương ứng với đặc trưng biển báo ta có biển báo chỉ dẫn nền xanh ứng với phân đoạn màu
- 44 - xanh, biển cấm và nguy hiểm có đặc trưng viền đỏ ứng với phân đoạn màu đỏ Sau khi có ảnh phân đoạn màu ta tiến hành một số công đoạn để phát hiện đối tượng là biển báo, đem đi phân loại hình học, trích xuất đặc trưng và cho qua giai đoạn nhận dạng
Dựa trên những phân tích về thuật toán phân đoạn màu ở chương 3, ta sử dụng thuật toán phân đoạn HSV Achrom Quá trình phân đoạn màu được chia làm hai bước: phân đoạn màu xanh và phân đoạn màu đỏ Phân đoạn màu xanh sử dụng cho biển báo hiệu lệnh Phân đoạn màu đỏ sử dụng để phát hiện biển báo có viền đỏ và biển báo ngược chiều
1) Chuyển ảnh màu từ không gian RGB sang không giang HSV 2) Thực hiện kiểm tra giá trị H, S, V của từng pixel trong ảnh màu a) Phân đoạn màu đỏ
Trước tiên ta sẽ kiểm tra giá trị H xem có nằm trong vùng ứng với màu đỏ không Nếu không nằm trong vùng trên thì pixel đó tương ứng với pixel màu đen trong ảnh binary
Nếu H nằm trong vùng màu đỏ thì ta sẽ sử dụng tiếp giá trị S và V để xét xem pixel có nằm trong vùng Chromatic zone hay không (minh họa trong hình sau)
Hình 3.7 Ngưỡng giá trị S và V đối với màu đỏ trong Chromatic Zone
- 45 - Nếu SVmin thì ta sẽ tiếp tục xét xem S>Smax hay không, nếu có thì hiển nhiên giá trị màu của pixel này nằm trong vùng chromatic zone Như vậy, pixel này tương ứng với pixel màu trắng trong ảnh binary Nếu ngược lại (nghĩa là Smin pixel màu đen, ngược lại là pixel màu trắng trong ảnh binary
Lưu đồ chi tiết mô tả các bước trên được cho trong hình sau:
Hình 3.8 Lưu đồ giải thuật phân đoạn màu b) Phân đoạn màu xanh
Tương tự như phân đoạn màu đỏ, chỉ khác ở giá trị ngưỡng màu lựa chọn như bảng sau:
Bảng 3.1 Giá trị các ngưỡng trong phân đoạn màu
3.1.3.2 Phát hiện biển Ảnh sau khi phân đoạn màu là ảnh trắng đen: màu trắng là các đối tượng thỏa với màu tham khảo (đỏ, xanh), màu đen là những màu không đúng với màu tham khảo của biến báo Các bước phát hiện biển có thể tóm tắt theo sơ đồ khối dưới đây:
Hình 3.9 Phát hiện biển báo ngược chiều
- 48 - a) Lấy những đối tƣợng có diện tích thích hợp: Để phát hiện ta trích xuất các đối tượng màu trắng trong ảnh sau phân đoạn, lấy phần bên trong của đối tượng để thiểu số lượng đối tượng nhiễu (loại đối tượng quá to hoặc quá nhỏ) Việc chọn ngưỡng diện tích quyết định quan trọng đến:
- Số lượng đối tượng nhiễu - Khoảng cách xa nhất và gần nhất để có thể phát hiện biển báo Thông thường nếu giảm thiểu đối tượng nhiễu thì khoảng cách có thể phát hiện biển báo sẽ bị thu hẹp Bước này phải trải qua thực nghiệm nhiều lần để có thể chọn ra ngưỡng diện tích tối ưu để cân đối giữa số lượng nhiễu và khoảng cách phát hiện
Các thực hiện: Ở bước này đơn giản ta sẽ sử dụng hàm của Opencv (cvFindContours và cvContourArea) lấy ra từng đối tượng (contour) có trong ảnh binary và kiểm tra diện tích từng đối tượng có nằm trong vùng cho phép hay không
Nếu không nằm trong vùng cho phép thì ta sẽ xóa đối tượng này đi bằng cách dùng hàm cvDrawContours Hàm này sẽ chỉ vẽ lại những contour thỏa mãn diện tích, loại bỏ những contour có diện tích quá bé hoặc quá lớn b) Lấy phần bên trong của đối tƣợng hoặc toàn bộ đối tƣợng:
Việc lấy phần bên trong hay lấy toàn bộ đối tượng ảnh hưởng trực tiếp đến việc nhận dạng hình học của đối tượng (tam giác, tròn, chữ nhật)
Các trường hợp ảnh hưởng đến việc lựa chọn lấy phần bên trong hay toàn bộ đối tƣợng:
Thiết kế hệ thống nhúng phát hiện và nhận dạng biển báo
Kit phát triển hệ thống nhúng có rất nhiều loại như Raspberry Pi, Beagle Board,
FriendlyArm Mỗi sản phẩm có tốc độ và khả năng hỗ trợ khác nhau, Raspberry và Beagle Board hướng tới xây dựng thành một máy tính cá nhân nhỏ gọn hỗ trợ đầy đủ các kết nối và tiêu tốn năng lượng thấp tuy nhiên tốc độ vi xử lý không cao bằng FriendlyArm Tiny 4412, do đó ta sẽ sử dụng kit nhúng Tiny 4412
Bảng 3.3 Bảng so sánh các kit phát triển nhúng Đặc tính Friendly ARM mini2440
Beagle board Raspberry Pi Friendly ARM
1.5GHz Quad Core ARM Cotex-A9 Bộ nhớ 64MB SDRAM,
512MB DDRAM 512MB RAM 1GB DDR3
RAM & 4GB eMMC Flash Màn hình
3.5” LCD với cảm ứng điện trở
Gắn riêng Gắn riêng 7” LCD với cảm ứng điện dung Giao tiếp USB, audio,
USB, audio, RS232, SD card, Ethernet, S-video
HDMI, USB, RS232, ethernet, S-video
HDMI, USB, RS232, audio, SD card, ethernet
Tiny4412 là kít phát triển dùng vi xử lý Samsung Exynos4412 ARM Cortex-A9 Cấu hình chi tiết của kit:
CPU: 1.5 GHz Samsung Exynos4412 ARM Cortex-A9 (Quad-Core)
Hỗ trợ hệ điều hành: Linux, Android, Ubuntu
Hình 3.24 Kít nhúng FriendlyARM Tiny 4412
Cấu tạo và các cổng giao tiếp của kit:
Ext Memory: SD-Card socket
Serial Ports: DB9 connector (RS232), RS485, total: 4x serial port connectors)
USB: USB-A Host 1.1, miniUSB Slave/OTG 2.0
Audio Output: 3.5 mm stereo jack, connector for a speaker (Class D Amp)
Audio Input: 3.5mm jack + Condenser microphone
RTC: Real Time Clock with battery
Camera: 20 pin (2.0 mm) Camera interface
LCD: 40 pin FFC and 45 pin FFC connector
User Inputs: 8x buttons and 1x A/D pot
3.2.2 Cài đặt thƣ viện, hệ điều hành trên kit Tiny4412
Trước tiên để cài đặt được nhân Linux cho Kit ta phải ghi bootloader vào SD card
Mọi tài nguyên về tool SD-Flasher, linux kernel, image, giao diện qtopia cần thiết đều được nhà sản xuất ghi kèm trong hai DVD bán kèm theo dev kit, hoặc chúng ta có thể cập nhật được tài nguyên mới nhất thông qua trang web của nhà sản xuất dưới đây http://www.friendlyarm.net/downloads
Burning Superboot lên SD Card: Thẻ nhớ SD card thường sử dụng là loại SanDisk
- 69 - Bước 1: Trên Windows, gắn SD card vào PC, sử dụng tool SD-Flasher.exe (có trong DVD thư mục DiskA\tools\) Chạy với quyền “Administrator”
Hình 3.26 Chạy SD-Flasher.exe
Hình 3.27 SD-Flasher chọn Mini4412/Tiny4412
Click Scan để chương trình tìm thẻ nhớ được gắn vào PC
Với thẻ SD mới chạy lần đầu, ta cần phải ReLayout để format lại SD card: nhấn ReLayout! Sau khi ReLayout, ta nhấn Scan lại thì trong khung SD Drive(s) trường Available sẽ chuyển từ No-> Yes
Bước 2: Khung “Image File to Fuse”, nhấn vào nút browse (…) để lựa chọn file boot
“Superboot4412.bin” trong thư mục (DiskB\images trên DVD)
Bước 3: Nhấn “Fuse” Supperboot sẽ được ghi lên SD card
Chép linux kernel lên thẻ boot SD Card:
Bước 1: Tạo thư mục “images” trên thẻ nhớ
Bước 2: Chép file “Superboot4412.bin” vào thư mục “images”
Bước 3: Tạo thư mục chứa linux kernel (zImage), ramdiks-u.img, rootfs_qtopia_qt4.img Tất cả các file này có thể tìm thấy ở DiskB\images
Hình 3.30 Chép các file boot image lên SD card
Bước 4: Chép file FriendlyARM.ini vào thư mục “images” và chỉnh sửa như sau:
Action = Install: là để cài đặt nhân Linux lên dev kit Hoặc ta có thể chỉnh sửa chỉ chạy chứ không cài đặt bằng cách Action = Run
#This line cannot be removed by FriendlyARM(www.arm9.net)
CheckOneButton=No Action = Install OS = Linux
LCD-Mode = No CheckCRC32=No StatusType = Beeper | LED
#Android-CommandLine = console=ttySAC0,115200n8 androidboot.console=ttySAC0 ctp=2 skipcali=y vmalloc84m ethmac:6F:65:34:51:7E androidboot.selinux=permissive
#Android-RamDisk =Android/ramdisk-u.img
#Android-RootFs-InstallImage = Android/system.img
#Android-UserData-4G = Android/userdata-4g.img
#Android-UserData-8G = Android/userdata-8g.img
#Android-UserData-16G = Android/userdata-16g.img
#Android-UserData = Android/userdata.img
Linux-BootLoader = Superboot4412.bin Linux-Kernel = Linux130715/zImage Linux-CommandLine = root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc ctp=2 skipcali=y ethmac:6F:65:34:51:7E
Linux-RamDisk = Linux130715/ramdisk-u.img Linux-RootFs-InstallImage = Linux130715/rootfs_qtopia_qt4.img
Bước 5: Remove SD card từ PC, cắm vào dev kit và chuyển switch S2 trên dev kit sang chế độ boot từ SD Card, bật nguồn devkit
Quá trình cài đặt sẽ tự động cài đặt đến khi hoàn tất
Trên đây là hướng dẫn sử dụng file zImage được build sẵn từ nhà sản xuất, đôi khi file zImage cũng có lỗi do đó ta có thể build lại theo hướng dẫn sau:
Thực hiện trên hệ điều hành Ubuntu:
Bước 1: Cài đặt trình biên dịch chéo “arm-linux-gcc”
Copy file “arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz” vào \tmp có trong \Disk- A\Linux\arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz
Giải nén vào thư mục /
#tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz –C /
Trình biên dịch chéo sẽ được cài đặt vào “/opt/FriendlyARM/toolschain/4.5.1”
Bước 2: Thêm đường dẫn của cross compiler vào biến môi trường
Chèn vào cuối file dòng lệnh sau:
“export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin”
Save và đóng file lại Logout và login lại máy tính để biến môi trường được cập nhật
Hoặc có thể chạy lệnh
Kiểm tra xem trình biên dịch chéo đã được cập nhật vào biến môi trường hay chưa, ta gõ lệnh:
Bước 2: Biên dịch Linux source code
Tạo thư mục /opt/FriendlyARM/tiny4412/linux, chạy lệnh sau
#mkdir –p /opt/FriendlyARM/tiny4412/linux
Chép file “linux-3.5-20150121.tgz” vào thư mục linux trên, giải nén
#cd /opt/FriendlyARM/tiny4412/linux
#tar xvzf /tmp/linux/linux-3.5-20131010.tar.gz
Sau khi giải nén linux source sẽ nằm trong folder “linux-3.5”
Chuyển vào thư mục “linux-3.5” để biên dịch như sau:
#cp tiny4412_linux_defconfig config
Quá trình build xong, file zImage sẽ được tạo ở thư mục “arch/arm/boot”
Bước 3: Cài đặt Root file system:
Copy file rootfs_qtopia_qt4-20131010.tgz vào thư mục linux, giải nén
#cd /opt/FriendlyARM/tiny4412/linux
#tar xvzf /tmp/linux/rootfs_qtopia_qt4-20131010.tgz
Sau khi giải nén, một thư mục “rootfs_qtopia_qt4” sẽ được tạo ra Để tạo file “rootfs_qtopia_qt4.img” thực hiện lệnh sau:
# make_ext4fs -s -l 314572800 -a root -L linux rootfs_qtopia_qt4.img rootfs_qtopia_qt4
Lệnh trên để nén toàn bộ thự mục “rootfs_qtopia_qt4” thành file
3.2.2.2 Cài đặt thƣ viện Tslib
Tslib là thư viện để giao tiếp sử dụng màn hình cảm ứng, cung cấp các stack, chức năng để giao tiếp với touchscreen trong hệ thống linux
Bước 1: Cài đặt git-core để tải source tslib
#apt-get install git-core
#git clone http://github.com/kergoth/tslib.git
Bước 2: Trong thư mục /tmp sẽ có thư mục „tslib‟ vừa được tải về Cài đặt
Một số trường hợp do thiếu thư viện autoconf có thể gặp lỗi “Error: autoconf not found”, ta nên cài đầy đủ các thư viện sau:
#apt-get install autoconf autogen intltool
#apt-get install build-essential libtool
Bước 3: cấu hình, cài đặt
#./configure host=arm-angstrom-linux-gnueabi prefix=/usr/local/tslib enable-static enable-shared
host: là kit phát triển nhúng Arm Cài đặt xong thư viện tslib sẽ được cài đặt vào –prefix là /usr/local/tslib, bao gồm các folder như sau: bin, etc, include, lib
3.2.2.3 Cài đặt Qt Creator và Qt Everywhere Cài đặt các gói thƣ viện cần thiết:
#apt-get install build-essential
#apt-get install pkg-config
#apt-get install libpng12-0 libpng12-dev libpng++-dev libpng3
#apt-get install libpnglite-dev
#apt-get install zlib1g-dbg zlib1g zlib1g-dev
#apt-get install libjasper-dev libjasper-runtime libjasper1
#apt-get install pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools
#apt-get install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs
#apt-get install ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev
#apt-get install libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev
#apt-get install libxine1-ffmpeg libxine-dev libxine1-bin
#apt-get install libunicap2 libunicap2-dev
#apt-get install libdc1394-22-dev libdc1394-22 libdc1394-utils
#apt-get install libv4l-0 libv4l-dev
#apt-get install python-numpy
#apt-get install libgtk2.0-dev
Nếu như trên Window ta sử dụng Visual Studio, thì trên Linux ta sử dung Qt
Creator Qt Creator được phát triển rất mạnh và không hề thua kém Visual Studio Việc cài đặt khá dễ dàng Ta dùng Ubuntu Software Center, đánh vào khung tìm kiếm “Qt creator” sau đó nhấn nút install
Hình 3.31 Cài đặt Qt Creator từ Ubuntu Software Center
Sau khi cài đặt thành công Mở Qt Creator sẽ thấy giao diện như bên dưới:
Hình 3.32 Giao diện của Qt Creator
Bước 1 Chép gói cài đặt qt-everywhere-opensource-src-4.7.2.tar.gz có sẵn trong
DVD kèm theo board vào thư mục /home/giang/ trên máy tính
Bước 2 Giải nén file cài đặt
Mở cửa sổ lệnh, di chuyển đến thư mục chứa file cài đặt trên và tiến hành giải nén
#gunzip qt-everywhere-opensource-src-4.7.2.tar.gz
#tar xf qt-everywhere-opensource-src-4.7.2.tar
Kết quả giải nén ra một thư mục cùng tên file tar
Bước 3 Cấu hình và biên dịch gói cài đặt
Di chuyển vào thư mục đã giải nén của gói cài đặt:
# cd qt-everywhere-opensource-src-4.7.2
Thêm biến môi trường đến đường dẫn trình biên dịch Qt (Mở file ~/.bashrc, thêm biến môi trường $HOME/qt-everywhere-opensource-src-4.7.2)
Thêm vào cuối file dòng:
PATH=$PATH:$HOME/qt-everywhere-opensource-src-4.7.2
- 78 - Lưu và đóng file lại
Sửa file cấu hình biên dịch qmake.conf chứa tại :home/giang/qt-everywhere- opensource-src-4.7.2/mkspecs/qws/linux-arm-g++/qmake.conf như sau
# qmake configuration for building with arm-linux-g++
# include( / /common/g++.conf) include( / /common/linux.conf) include( / /common/qws.conf)
# modifications to g++.conf QMAKE_CC = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-gcc QMAKE_CXX = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- g++
QMAKE_LINK = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- g++
QMAKE_LINK_SHLIB= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux- gnueabi-g++
# modifications to linux.conf QMAKE_AR = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux- gnueabi-objcopy
QMAKE_STRIP = /opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux- gnueabi-strip
QMAKE_INCDIR += /opt/tslib/include QMAKE_LIBDIR += /opt/tslib/lib load(qt_config)
Chú ý: Trong file cấu hình trên sử dụng đường dẫn tuyệt đối để gọi các trình biên dịch chéo được đặt ở /opt/FriendlyARM/toolschain/4.5.1/bin Sau đó, tiến hành cấu hình thư viện Qt Everywhere 4.7.2 trước khi cài đặt (thư mục cài đặt ra là /opt/qte)
#cd qt-everywhere-opensource-src-4.7.2
#./configure prefix=/opt/qte -embedded arm -xplatform qws/linux-arm-g++ - qt-mouse-tslib -little-endian -no-qt3support -fast -no-largefile -qt-sql- sqlite -nomake tools -nomake demos -nomake examples -no-webkit -no- multimedia -no-javascript-jit
- 79 - Quá trình cấu hình diễn ra một thời gian, chờ đến khi thông báo thành công
Bổ sung thư viện arm_neon.h, tải thư viện định nghĩa các kiểu dữ liệu trên trang http://www.opensource.apple.com/source/gcc/gcc-5664/gcc/config/arm/arm_neon.h Copy vào thư mục qt-everywhere-opensource-src-4.8.5/src/gui/image
Cũng trong thư mục này, include thư viện vào file qimage_neon.cpp sau dòng #ifdef QT_HAVE_NEON như sau:
Trong thư mục qt-everywhere-opensource-src-4.7.2 /src/gui
Mở file Makefile tìm cờ CFLAG và CXXFLAGS thêm vào
#–mfloat-abi=softfp –mfpu=neon
Trong thư mục qt-everywhere-opensource-src-4.7.2 /src/corelib
Mở file makefile tìm cờ CFLAG và cờ CXXFLAG thêm vào “–marm”
Sau đó vào qt-everywhere-opensource-src-4.7.2 /src/corelib xóa các file pch
Làm tương tự cho qt-everywhere-opensource-src-4.7.2 /src/gui
Tiến hành dịch thư viện:
#make Đối với máy tính nhiều lõi có thể sử dụng #make –jx, với x là số nhân CPU để tiết kiệm thời gian build Đợi quá trình make thành công, gõ lệnh cài đặt:
#make install Đợi quá trình cài đặt thành công, kiểm tra kết quả cài đặt tại /opt/qte như đã cấu hình ở trên
Tích hợp QT Everywhere vào QT Creator:
Thư viện QT Everywhere cài trên máy tính Linux cho phép biên dịch ứng dụng Qt để chạy trên Kit Tiny4412 Để tích hợp trình biên dịch qte cho QT Creator ta vào menu Tool>Option> Build & Run Đầu tiên thêm Tool Chains: là arm cross compiler trong thư mục Nhấn nút Add> GCC
- 80 - Compiler path: /opt/FriendlyARM/toolchain/4.5.1/bin/arm-linux-g++
Hình 3.33 Thêm Tool chains vào QT Creator
Sang thẻ Qt Versions: Add đường dẫn qmake trong /opt/qte/bin/qmake
Hình 3.34 Thêm qmake của Qt Everywhere vào Qt Creator Để build một ứng dụng Qt cho kit, ta chọn Build configuration là qte4.7.2 vừa mới thêm vào ở trên
Hình 3.35 Build configuration cho kit ARM
3.2.3 Các bước biên dịch cài đặt OpenCV
Bước 1: Trên máy tính ta sử dung Cmake Gui để generate cấu hình trước khi biên dịch Cài đặt Cmake Gui
#apt-get install cmake-qt-gui
Bước 2: Tải và giải nén thư viện Opencv2.4.3
Trên Desktop ta tạo một thư mục “cmake_cfg_files_pc” để chứa các file cấu hình do cmake tạo ra
Hình 3.36 Cmake Opencv Desktop Use default compiler
Where is the source code: ta chỉ đường dẫn tới thư mục chứa source Opencv2.4.3 đã giải nén ở trên
Where to build the binaries: chỉ đường dẫn tới “cmake_cfg_files_pc”
Hình 3.37 Cmake Opencv Desktop Configure
CMAKE_INSTALL_PREFIX: nên để mặc định là /usr/local
Bỏ chọn WITH_OPENEXR và WITH_TIFF Sau đó nhấn Configure lại, cuối cùng nhấn Generate
Hình 3.38 Cmake Opencv Desktop Generate Đóng Cmake lại
Vào thư mục “cmake_cfg_files_pc” kiểm tra xem thiết lập đã đúng chưa, chạy lệnh:
#cd cmake_cfg_files_pc
Trong thư mục này mở file CmakeCache.txt ta thêm option –lpthread –lrt cho CMAKE_EXE_LINKER_FLAG:STRING=‟‟
CMAKE_EXE_LINKER_FLAG:STRING=-lpthread -lrt
Bước cài đặt sẽ copy tất cả các binary, thư viện vào thư mục đã chỉ trong PREFIX là /usr/local
Bước 6: Export đường dẫn thư viện Opencv vào biến môi trường
$export LD_LIBRARY_PATH=/usr/local/lib
Hoặc mở file bashrc thêm vào cuối file dòng
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH Đóng file bashrc lại
3.2.3.2 OpenCV cho Kit (ARM): Để biên dịch thư viện Opencv cho kit ta sử dụng trình biên dịch chéo (cross compiler) đã cài đặt ở trên
Bước 1: Tạo thư mục để cài đặt thư viện cho kit Ví dụ /opt/opencv234_kit
Và thư mục chưa file configure của cmake trên desktop “cmake_cfg_file_kit”
Chạy Cmake: Chọn cross-compiling như hình
Hình 3.39 Cmake Opencv ARM tùy chọn cross compiler
Hình 3.40 Cmake Opencv ARM đường dẫn tới cross compiler
Where is the source code: ta chỉ đường dẫn tới thư mục chứa source Opencv2.4.3 đã giải nén ở trên
Where to build the binaries: chỉ đường dẫn tới “cmake_cfg_files_kit”
Hình 3.41 Cmake Opencv kit configure
CMAKE_INSTALL_PREFIX trỏ tới nơi cần cài đặt là /opt/opencv243_kit Bỏ chọn WITH_OPENEXR và WITH_TIFF Sau đó nhấn Configure lại, cuối cùng nhấn Generate
Hình 3.42 Cmake Opencv kit generating Đóng Cmake lại
Vào thư mục “cmake_cfg_files_kit” mở file CmakeCache.txt tìm dòng CMAKE_EXE_LINKER_FLAG:STRING=‟‟
CMAKE_EXE_LINKER_FLAG:STRING=-lpthread -lrt
Bước cài đặt sẽ copy tất cả các binary, thư viện vào thư mục đã chỉ trong PREFIX là /opt/opencv243_kit
3.2.4 Porting ứng dụng lên kit nhúng Để có thể copy dữ liệu giữa máy tính và Kit dễ dàng ta sử dụng gFTP, cài đặt như sau:
Kit và máy tính giao tiếp thông qua cổng Ethernet, với địa chỉ và user mặc định của kit như sau:
IP: 192.168.1.230 Username: root Password: fa
Copy thư viện opencv243_kit lên thư mục tương ứng trên kit /opt/opencv243_kit
Hình 3.43 Copy thư viện opencv lên kit
- 90 - Copy thư viện qte lên thư mục tương ứng trên kit /opt/qte:
Hình 3.44 Copy thư viện qte lên kit
Biên dịch ứng dụng cho kit:
- Chọn Build configuration là qte4.7.2 - Sửa đường dẫn thư viện tới opencv243_kit - Nhấn Build
Hình 3.45 Chỉnh sửa đường dẫn thư viện build cho kit
Copy ứng dụng xuống kit:
Hình 3.46 Copy ứng dụng xuống kit
Chạy ứng dụng trên kit:
- Chỉnh sửa rcS File rcS là file cấu hình ứng dụng để tự khởi chạy mỗi lần khởi động hệ thống
Ta chỉnh sửa file /etc/init.d/rcS để khởi tạo script ứng dụng như sau:
Trước hết ta telnet tới kit, với user: root, password: fa
Hình 3.47 Chỉnh sửa file rcS
Trong đó, /home/camera2/appscript là ứng dụng của ta
File này thiết lập môi trường, và khởi chạy ứng dụng
Hình 3.48 Chỉnh sửa file appscript
Trong đó, fix chính là tên ứng dụng
- Khởi động lại board để load ứng dụng
CHƯƠNG 4: THỬ NGHIỆM ĐÁNH GIÁ
Phương pháp thử nghiệm
- Thu thập 100 ảnh tĩnh cho mỗi biển báo (62 biển x 100 = 6200 ảnh)
- Thu thập 200 phút video biển báo thực tế tham gia giao thông Đánh giá độ chính xác giải thuật bằng cách sử dụng tập dữ liệu gồm hơn 6200 ảnh độ phân giải 640x480 trong nhiều điều kiện môi trường khác nhau:
- Ảnh chụp bằng máy ảnh kỹ thuật số hoặc điện thoại, trong nhiều ngày, nhiều khung thời gian, với vị trí biển báo khác nhau, và do nhiều người cùng thực hiện tổng hợp lại
- Trong khi chụp ảnh di chuyển lấy nhiều góc độ khác nhau của biển báo: có 2 loại là ảnh chụp trực diện hoặc nghiêng (với góc nghiêng > độ so với phương dọc thẳng đứng, hoặc phương ngang)
- Ảnh chụp lúc di chuyển bằng xe máy, hoặc rung tay: sẽ cho hình ảnh bị nhòe, blur
- Ảnh chụp ngược sáng: chói sáng, thiếu sáng
- Ảnh chụp các biển báo cũ: sơn phai màu Đánh giá giải thuật trên máy tính:
- 95 - Biển báo bị chói nắng:
Hình 4.1 Nhận diện biển báo bị chói nắng
Biển báo có sơn bị phai mờ, bong tróc:
Hình 4.2 Nhận diện biển báo có màu sơn mờ, bong tróc
- 96 - Biển báo khi trời tối và sơn phai màu
Hình 4.3 Nhận diện biển báo lúc trời tối, sơn phai màu
Biển báo có viền trùng với màu nền:
Hình 4.4 Nhận diện biển báo có viền trùng màu nền
- 97 - Biển báo màu sắc không đồng đều do bóng râm
Hình 4.5 Nhận diện biển báo ánh sáng không đồng đều, bóng râm
Biển báo bị nhòe, mờ do độ phân giải kém, ảnh hưởng di chuyển
Hình 4.6 Nhận diện biển báo mờ, blur do di chuyển
Hình 4.7 Nhận diện biển báo bị blur 1
Hình 4.8 Nhận diện biển báo bị blur 2
Hình 4.9 Nhận diện biển báo bị blur 3
Biển báo bị cong, móp méo
Hình 4.10 Nhận diện biển báo bị cong, méo
- 100 - Kết quả giải thuật trên máy tính được cho trong bảng sau:
Bảng 4.1 Kết quả thử nghiệm
STT SỐ BIỂN BÁO Tổng Phát hiện
6 106a - Cấm ôtô tải (có trọng tải từ 1.5 tấn trở lên) 100 99 99% 99 100%
11 127a - Tốc độ tối đa cho phép 40km/h 100 98 98% 98 100%
12 127 b- Tốc độ tối đa cho phép 60Km/h 100 95 95% 93 98%
- 101 - 13 127c - Tốc độ tối đa cho phép 80Km/h 100 100 100% 100 100%
14 127d - Tốc độ tối đa cho phép 50km/h 100 100 100% 100 100%
15 127e - Tốc độ tối đa cho phép 30km/h 84 61 73% 60 98%
17 130 – Cấm dừng xe và đỗ xe 100 95 95% 90 95%
19 131b – Cấm đỗ xe ngày lẻ 58 57 98% 57 100%
20 131c – Cấm đỗ xe ngày chẵn 100 96 96% 90 94%
3 202a - Nhiều chỗ ngoặt nguy hiểm liên tiếp 100 85 85% 74 87%
4 202b - Nhiều chỗ ngoặt nguy hiểm liên tiếp 100 91 91% 90 99%
12 208 – Giao nhau với đường ưu tiên 100 88 88% 79 90%
13 210 – Giao nhau với đường sắt có rào chắn 100 86 86% 85 99%
15 224 - Đường người đi bộ cắt ngang 100 99 99% 94 95%
18 239 - Đường cáp điện ở phía trên 100 94 94% 94 100%
21 202 – Nhiều chỗ ngoặc nguy hiểm liên tiếp
- 103 - 22 209 – Giao nhau có tín hiệu đèn
6 301i - Chỉ được rẽ phải hoặc rẽ trái 12 12 100% 12 100%
7 302a - Hướng phải đi vòng chướng ngại vật 13 13 100% 13 100%
8 302b - Hướng phải đi vòng chướng ngại vật 18 18 100% 18 100%
9 303 – Nơi giao nhau chạy theo vòng xuyến 11 11 100% 11 100%
10 306 - Tốc độ tối thiểu cho phép 15 15 100% 15 100%
- 104 - Đánh giá giải thuật trên kit thí nghiệm:
Hệ thống được gắn trên xe hơi như hình bên dưới
Hình 4.11 Thử nghiệm giải thuật trên kit
Phương pháp thử nghiệm trên môi trường thực tế:
- Phần mềm được cài đặt sẵn trên kit, với kết nối với camera thông qua cổng USB
- Hệ thống được lắp đặt trên xe hơi như hình trên (Hình 4.11)
Một số hình ảnh về kết quả thử nghiệm được trích xuất từ video thực nghiệm (trong thư mục video trên DVD luận văn)
Hình 4.12 Nhận diện biển báo giao thông trên kit 1
Hình 4.13 Nhận diện biển báo giao thông trên kit 2
Phương pháp đánh giá trong môi trường thí nghiệm:
- Giúp tiết kiệm chi phí và có thể kiểm tra được tất cả các biển báo được đề cập một cách dễ dàng
+ Hình ảnh biển báo được in ra giấy và di chuyển trước camera
+ Camera quay lại các hình ảnh biển báo được hiển thị trên màn hình vi tính
Về mặt thuật toán xử lý phát hiện và nhận diện không có gì khác biệt so với xử lý trên máy tính, chỉ khác biệt duy nhất ở tốc độ xử lý do khác phần cứng (khác tốc độ CPU, dung lượng bộ nhớ)
Phần mềm trên kit được thiết kế để capture video trực tiếp theo thời gian thực Sau đây là một số hình ảnh thể hiện thời gian nhận diện biển báo theo thời gian thực:
Hình 4.14 Thời gian phát hiện và nhận diện biển báo 127a
Thời gian phát hiện: 46ms, thời gian nhận diện: 22ms
Hình 4.15 Thời gian phát hiện và nhận diện biển báo 123a
Hình 4.16 Thời gian phát hiện và nhận diện biển báo 201a
Hình 4.17 Thời gian phát hiện và nhận diện biển báo 227
Hình 4.18 Thời gian phát hiện và nhận diện biển báo 208
Theo kết quả thí nghiệm thời gian phát hiện trung bình là 47ms, thời gian nhận diện biển báo trung bình là 22ms trên kit do đó hoàn toàn đáp ứng được ứng dụng thời gian thực.
Đánh giá
- Dựa trên kết quả thử nghiệm bảng trên cho thấy giai đoạn nhận diện biển báo rất tốt, với độ chính xác 95%
- Phần phát hiện vì sử dụng thuật toán phân đoạn màu dựa trên thông tin màu sắc, vì giới hạn của phương pháp phân đoạn màu dựa trên ngưỡng cố định, trong khi dữ liệu đầu vào vô cùng đa dạng về sắc thái nên rất khó có thể phát hiện hoàn toàn ảnh đầu vào.
Kết luận
- Xây dựng được ứng dụng nhận diện biển báo giao thông trên máy tính cũng như trên Kit Tiny 4412, cơ bản đáp ứng được thời gian thực
- Phát hiện với độ chính xác 92% và nhận diện chính xác 95%
- Thực hiện trong các môi trường khác nhau: trời sáng, ban ngày nắng chói, buổi chiều thiếu sáng, biển báo phai mờ, cong vẹo…
- Xây dựng tập ảnh huấn luyện có 62 loại và hơn 6200 mẫu, chia làm 3 loại chính: biển cấm, biển báo nguy hiểm, biển báo hiệu lệnh
Cài đặt hệ điều hành, biên dịch thư viện và porting ứng dụng lên Kit Tiny 4412
- Hạn chế về tốc độ, mặc dù đã áp dụng kỹ thuật lập trình đa luồng nhưng tốc độ xử lý vẫn còn thấp, chỉ đạt được 15-20 frames/s.