Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: SIFT 5040

ngocdaothanh.myopenid.com 172
Updated about 1 month ago

Có ảnh mẫu và ảnh thường. Làm sao để nhận dạng được những con rùa trong ảnh thường? Đây là vấn đề rất căn bản trong xử lí ảnh. Giải được vấn đề này, mở rộng ra ta có thể làm được rất nhiều thứ: nhận dạng chữ viết, nhận dạng khuôn mặt, nhận dạng biển số xe, đăng nhập bằng hình ảnh thay cho mật khẩu, theo dõi quĩ đạo của vật thể v.v.

Có nhiều cách để giải quyết vấn đề trên. Bài viết này giới thiệu SIFT, giải thuật siêu mạnh áp dụng được cho hầu hết các tình huống.

Giới thiệu

Xin đọc Wikipedia. SIFT là phát minh đã được đăng kí bản quyền của David Lowe, muốn dùng cho mục đích thương mại thì phải xin phép.

Ý tưởng:

  • Từ ảnh tìm ra các điểm ảnh đặc biệt, gọi là feature point hay keypoint. Đầu vào và đầu ra của phép biến đổi SIFT: ảnh -> SIFT -> các keypoint
  • Để có thể phân biệt keypoint này với keypoint khác cần tìm ra tham số gì đó, gọi là descriptor. 2 keypoint khác nhau thì phải descriptor khác nhau. Thường thì descriptor là chuỗi số gồm 128 số (vector 128 chiều).
  • Sau khi áp dụng biến đổi SIFT, ứng với mỗi keypoint, thu được (1) toạ độ keypoint (2) scale và orientation của keypoint (3) descriptor. Các mũi tên trong hình dưới vẽ nhờ vào scale và orientation.

Đặc điểm:

  • Keypoint phụ thuộc rất ít vào cường độ sáng, nhiễu, che khuất (một phần ảnh bị che), góc xoay (ảnh bị xoay trong mặt phẳng 2D), thay đổi của tư thế (pose thay đổi trong không gian 3D).
  • Nhanh, tốc độ xử lí gần như thời gian thực (realtime).

Như vậy việc khớp ảnh mẫu với ảnh thường chính là việc khớp các keypoint trong 2 ảnh với nhau:

  • Áp dụng SIFT cho từng tấm.
  • So sánh descriptor của keypoint trong ảnh này với descriptor của keypoint trong ảnh kia. Nếu 2 keypoint có descriptor gần giống nhau thì coi như 2 điểm trên 2 tấm ảnh cùng thuộc về một vật (hoặc vật giống nhau).
  • Dựa vào thương của scale và hiệu của orientation của 2 keypoint, có thể biết thêm vật trong hình này to hơn vật trong hình kia bao nhiêu, vật trong hình này xoay bao nhiêu độ so với vật trong hình kia bao nhiêu.

Thư viện

OK. Nếu bạn là kĩ thuật viên hoặc kĩ sư phần mềm chứ không phải cử nhân khoa học máy tính thì cũng chẳng cần biết chi tiết giải thuật, chỉ cần hiểu ý tưởng và đặc điểm trình bày ở trên, rồi kiếm thư viện có sẵn mà dùng phải không{#emotions_dlg.tongue_out}?

Trang web của MIT có liệt kê vài thư viện cho một số ngôn ngữ: MATLAB, C/C++, C#, Java.

Đề bài tập áp dụng

Xem đề bài năm nay của cuộc thi giải thuật về nhận dạng ảnh của tổ chức PRMU. Vấn đề là tìm ra vị trí trong ảnh thật có chứa ảnh mẫu. Có 3 độ khó:

  1. Ảnh mẫu bị phóng to/thu nhỏ
  2. Ảnh mẫu bị phóng to/thu nhỏ và xoay
  3. Ảnh mẫu bị phóng to/thu nhỏ, xoay và khuất một phần

Giải bài tập bằng SIFT

Vì cuộc thi trên chú trọng về giải thuật, mà SIFT nói chung đã phổ biến, nên nếu dùng SIFT thì không được ban giám khảo đánh giá cao. Tuy vậy, ta thử giải bằng SIFT xem sao:

  1. Áp dụng SIFT cho 2 ảnh.
  2. Dùng khoảng cách Euclid giữa các descriptor để tìm keypoint khớp nhau (gần giống nhau, nghĩa là khoảng cách bé hơn giá trị THRESHOLD nào đó) trong 2 ảnh. Đây là bài toán tìm "hàng xóm" (ví dụ biết tọa độ của N điểm trong mặt phẳng 2D, hãy tìm 2 điểm gần nhau nhất), có nhiều cách tốt hơn nhưng phức tạp hơn nhiều.
  3. Ở vị trí của keypoint nào khớp, thì dựa vào scale và orientation để dán mask của ảnh mẫu vào ảnh thật vào vị trí đó, để đánh dấu khu vực quanh vị trí khớp đã được kiểm tra (search). Keypoint nào nằm trong khu vực này sẽ bị xoá khỏi danh sách keypoint của ảnh thật, để tránh bị lấy ra xử lí tiếp.
  4. Lặp lại bước 3 đến khi nào không còn keypoint khớp nhau. Ở mỗi lần lặp ở bước 3 ta đều thu được vị trí, chính là lời giải cần tìm.

Ngoài ra, đọc kĩ đề bài ta thấy ảnh mẫu chỉ bị phóng to thu nhỏ và xoay chứ không bị thay đổi màu sắc hay độ sáng. Do đó để tăng độ chính xác của SIFT, trước bước 1 có thể dùng thêm color filter như sau:

  1. Liệt kê tất cả các màu có trong ảnh mẫu (nghĩa là tính color histogram). Có thể dùng không gian màu RGB hoặc HSV.
  2. Xoá (bôi đen) tất cả các điểm ảnh trong ảnh thật nếu màu của chúng quá khác (khi phóng to thu nhỏ và xoay, màu của điểm ảnh có thể thay đổi chút ít tuỳ vào phương pháp phóng to thu nhỏ và xoay) màu trong ảnh mẫu.

Ở trên là giải thuật. Việc dùng thư viện để viết thành chương trình cụ thể xin dành cho độc giả.

Tham khảo

Comments

chuma.myopenid.com
over 3 years ago

Uhm, mình không hiểu lắm. Bài toán ở đây là chỉ có 1 ảnh mẫu mà phải nhận dạng ra object trong ảnh thường ah??

Viêc dùng thư viện để viết chương trình xử lý chắc chẳng có gì để nói. Vấn đề là làm sao để viết ra cái thư viện :D

ngocdaothanh.myopenid.com 172
over 3 years ago

Yep, chỉ 1 ảnh mẫu, vậy mới hóc búa, tuy nhiên nếu dùng SIFT thì giải ngon.

Nếu không dùng SIFT, bạn có ý tưởng gì để giải từng độ khó 1, 2, 3 không (có thể dùng cách khác nhau cho từng độ khó)? Trang web của đề bài có cho lời giải mẫu và nhiều ảnh để test đấy.

thanhvv.myopenid.com
over 3 years ago

Chào bạn,

tôi là một "lính mới" trong lĩnh vực xử lý và tìm kiếm ảnh nhưng hiện phải làm một đề tài "tìm kiếm ảnh tương tự online". Trong đề tài này tôi dự định sử dụng công cụ tìm kiếm của Google chẳng hạn, gõ từ khóa ví dụ "cigarette box" tôi sẽ thu được các hình ảnh liên quan đến thuốc lá trong đó có những hình liên quan đến bao thuốc lá nhưng cũng có những hình chỉ liên quan đến những sản phẩm của thuốc lá như điếu thuốc. Bây giờ tôi dự định đưa ra một hình mẫu là hình một bao thuốc lá để tiếp tục tìm và lọc ra từ kết quả thu được của Google những hình có dạng tương tự như bao thuốc lá. Tôi đọc thấy giải thuật SIFT có thể làm được điều này nhưng vì là lính mới nên mặc dù đọc nhiều tài liệu nhưng tôi vẫn chưa hiểu hết về việc trích xuất và sử dụng các features để tạo ra các keypoints và so sánh các keypoints như thế  nào để biết 2 hình tương tự nhau...

Mình cũng đã download một số sỏuce code về tham khảo nhưng tiếc là không có document đính kèm nên cũng không hiểu được chức năng của các hàm. Vì mình không còn nhiều thời gian nên nếu bạn có ý kiến hay tài liệu gì phù hợp với một "new bie" như mình xin chỉ giúp. Mình rất cám ơn.

ngocdaothanh.myopenid.com 172
over 3 years ago

Để xong việc bạn chỉ cần hiểu nguyên lí của SIFT rồi tìm cách dùng được thư viện có sẵn là được rồi. Thư viện thường kèm theo vài ví dụ. Nghịch ngợm chừng 1 ngày là biết cách dùng thôi.

Có cách khác dễ hơn là dùng thư viện OpenCV. Trong ví dụ của OpenCV và trên mạng có sẵn nhiều ví dụ và tutorial về nhận dạng khuôn mặt, nhận dạng gạt tàn thuốc lá v.v. Bạn lấy về rồi cắt dán tham số thì chắc nhận ra được ngay bao thuốc thôi.

me.yahoo.com/a/gBI8WCE8jsq449MYpQhJBBmQBTbEo9Y5zSM6
12 months ago

Chao anh,

cho em hoi em muon dat threshold thi gia tri cua no khoang bao nhieu, nguong cao nguong thap cua threshold thong thuong la bao nhieu.

Cam on anh.

ngocdaothanh.myopenid.com 172
12 months ago

Threshold thường tùy tính chất cụ thể của ảnh. Ví dụ threshold cho con rùa tròn tròn chiếm gần hết tấm ảnh như ở trên thì chắc hẳn khác threshold cho con rắn chẳng hạn. Để chọn threshold thích hợp, cần thí nghiệm rồi rút ra giá trị thích hợp.

phuong-lien.myopenid.com
11 months ago

Mình đang làm đồ án nhận dạng ảnh. Thật may là tìm thấy bài viết của bạn. Bạn có thể cho mình biết thuật toán chi tiết ko. Cảm ơn bạn rất nhiều.{#emotions_dlg.laughing}

ngocdaothanh.myopenid.com 172
11 months ago

Trong bài có một số link. Lần theo link sẽ ra các luận văn bằng tiếng Anh trình bày chi tiết thuật toán. Tôi không có thời gian diễn giải lại bằng tiếng Việt, bạn chịu khó vậy.

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content