9 thg 1, 2014

Nhận dạng biển báo giao thông (Traffic Sign Identification)

Nhận dạng biển báo giao thông dựa trên thuật toán Surf

 
 

Chi tiết thuật toán có thể tham khảo tại đây
Chi tiết về thuật toán Surf có thể tham khảo tại đây 
Surf trong Opencv có thể tham khảo tại đây hoặc tại đây

Về cơ bản, việc nhận dạng biển báo giao thông có thể thông qua 2 bước sau:

1. Phát hiện vùng biển báo.

Phát hiện biển báo phải dựa trên các đặc trưng của biển báo, trong phần này ta giới hạn việc phát hiện biển báo đối với các biển báo nguy hiểm. Vì biển báo nguy hiển ở Việt Nam có hình tam giác, bao quanh bằng viền màu đỏ, bên trong là nền màu vàng và nội dung của biển báo. Để phát hiện biển báo, ta làm như sau: (có thể có nhiều cách làm khác)
  • Chuyển đổi không gian màu BGR sang HSV
  • Phát hiện màu đỏ bao quanh vùng biển báo nguy hiểm dựa vào màu sắc (H)
  • Dựa vào đường biên vùng màu đỏ để xác nhận lại vùng biển báo 
  • Kết hợp với màu vàng bên trong để suy ra loại bỏ tìm ra vùng biển báo chính xác
  • Có thể remove vùng viền đỏ sau khi phát hiện được vùng biển báo, và lấy ảnh này là ảnh đưa vào nhận dạng. 
2. Nhận dạng biển báo. 
  • Chuẩn bị một tập dữ liệu chứa các biển báo cần nhận dạng
  • Tính toán keypoint, descriptor của ảnh cần nhận dạng và của tất cả các ảnh trong database
  • match các ảnh cần nhận dạng với các ảnh trong database
  • tìm ảnh có matching lớn nhất, đó là ảnh cần nhận dạng
Thuật toán Surf có thể được dùng để nhận dạng ra những ảnh có góc quay và tỉ lệ khác nhau (ảnh không nhất thiết phải vuông góc với phương nhìn). Tuy nhiên thời gian tính toán khá lâu và khó áp dụng trong thực tế nếu tập dữ liệu cần nhận dạng lớn.
Source code download tại đây.

10 nhận xét:

Cupid nói...

chào bạn cho mình hỏi 1 chút được không, ở đoạn cuối "tìm ảnh matching lớn nhất" mình hiểu cái này là so khớp descriptor của ảnh cần nhận dạng vs descriptor của tất cả các ảnh trong csdl, vậy dùng hàm nào trong opencv để so và làm sao lấy chỉ số của phép so đó vậy.? Và 1 cái nữa là các ảnh trong csdl chỉ cần tìm descriptor 1 lần vậy các descriptor đó lưu vào đâu và lưu dưới dạng gì để dùng cho các lần sau.!? Làm ơn chỉ giúp mình, mình còn gà, đang tìm hiểu cấp tốc để làm đồ án môn học.! Thanks bạn..!

Computer Vision and Application nói...

Descriptor là một ma trận, em lưu các ma trận đã tính toán descriptor (dữ liệu huấn luyện) vào file storage dang YAML (http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html) sau đó load ra mỗi khi cần so sánh.
Em dùng KNN để matching các ảnh, sau đó loại bỏ bớt các match không tốt, tìm số lượng matching lớn nhất sẽ tương ứng với ảnh trong csdl.
Thân

Tiến Dũng Phạm nói...

Anh có thể cho em xin source code phần này đc không ạ

Computer Vision and Application nói...

Source code anh cập nhật rồi nhé.

Hai ta quang nói...

Cho mình hỏi đây là nghiên cứu của cá nhân hay của một nhóm vậy?
Mình thấy đề tài này rất hay sao vẫn chưa thấy ứng dụng được vào thực tế nhỉ?

ThiYen Ngo nói...

B ơi, mình đang rất cần sự giúp đỡ của bạn về bài tập này. Bạn có thể ib lại cho m k? Mail của m là: ngothiyencnt52dh1@gmail.com . cảm ơn bạn!

ThiYen Ngo nói...
Nhận xét này đã bị tác giả xóa.
Tùng Bùi nói...

Anh ơi cho em hỏi Source code này anh chạy trên bản VS nào và bản Opencv nào vậy anh. Em dùng VS 2015 và OpenCV 2.4.11 mà không chạy được. Anh giúp em với.

Phú Hiền Nguyễn nói...

Mình cũng đang làm đồ án giống giống bạn
Do vật mình hình tròn nên mình dùng Hough Circle
Bạn cho mình hỏi là làm sao cắt ảnh đó ra để so sánh với ảnh trong database được vậy bạn

Mình cám ơn

Unknown nói...

cho m hỏi làm sao để chạy đk ạ. m chạy nó báo lỗi . rất mong bn chỉ ạ

Đăng nhận xét