6
Có lẽ tất cả giải thuật được coi là trên mức căn bản ở bậc học từ đại học trở xuống đều chỉ liên quan đến (cấu trúc) dữ liệu chính xác tuyệt đối, không chứa nhiễu. Nguyên nhân có lẽ nhiễu liên quan đến xác suất thống kê, mà môn này cuối bậc phổ thông học sinh mới được học, sau phổ thông thì được học sâu hơn, nhưng đây hẳn là môn sinh viên ngán nhất . Bài viết này cố gắng giới thiệu một cách dễ hiểu RANSAC - giải thuật có tính ứng dụng cao mà không khó hiểu lắm - mà không cần dùng đến kiến thức của môn học rất đáng sợ kia . Nhiễu là gì? Dạo này người ta hay nhắc đến tham nhũng. Ta dùng tiền làm ví dụ cho dễ hiểu . Giả sử Việt Nam có 19 người nghèo và 1 tỉ phú. Mỗi người nghèo có thu nhập 5 đồng, tỉ phú có thu nhập 1 tỉ. Nếu tính theo kiểu trung bình cộng, thì thu nhập trung bình của dân Việt Nam vào khoảng 50 triệu. Nếu tính theo kiểu trung vị , thì ra 5 đồng. Rõ ràng cách tính thứ 2 cho phép giảm nhiễu, và nhiễu ở đây chính là tay tỉ phú (có con gái không nhỉ? ). Phương pháp trung vị thật ra chỉ hạn chế chứ vẫn bao gồm cả nhiễu. Nếu loại bỏ luôn được nhiễu thì quá hay. RANSAC cho phép làm điều này. Mô hình là gì?

Ran Sac

Embed Size (px)

Citation preview

Page 1: Ran Sac

Có lẽ tất cả giải thuật được coi là trên mức căn bản ở bậc học từ đại học trở xuống đều chỉ liên quan đến (cấu trúc) dữ liệu chính xác tuyệt đối, không chứa nhiễu. Nguyên nhân có lẽ nhiễu liên quan đến xác suất thống kê, mà môn này cuối bậc phổ thông học sinh mới được học, sau phổ thông thì được học sâu hơn, nhưng đây hẳn là môn sinh viên ngán nhất .

Bài viết này cố gắng giới thiệu một cách dễ hiểu RANSAC - giải thuật có tính ứng dụng cao mà không khó hiểu lắm - mà không cần dùng đến kiến thức của môn học rất đáng sợ kia .

Nhiễu là gì?

Dạo này người ta hay nhắc đến tham nhũng. Ta dùng tiền làm ví dụ cho dễ hiểu .

Giả sử Việt Nam có 19 người nghèo và 1 tỉ phú. Mỗi người nghèo có thu nhập 5 đồng, tỉ phú có thu nhập 1 tỉ. Nếu tính theo kiểu trung bình cộng, thì thu nhập trung bình của dân Việt Nam vào khoảng 50 triệu. Nếu tính theo kiểu trung vị, thì ra 5 đồng. Rõ ràng cách tính thứ 2 cho phép giảm nhiễu, và nhiễu ở đây chính là tay tỉ phú (có con gái không nhỉ? ).

Phương pháp trung vị thật ra chỉ hạn chế chứ vẫn bao gồm cả nhiễu. Nếu loại bỏ luôn được nhiễu thì quá hay. RANSAC cho phép làm điều này.

Mô hình là gì?

Về mặt toán học, mô hình là hình thức biểu diễn một cách tổng quát quan hệ giữa các thuộc tính của cùng một phần tử, thường bằng đẳng thức. Ví dụ để biểu diễn tập hợp các điểm (x, y) nằm trên đường tròn tâm (a, b) bán kính r, ta dùng mô hình (x - a)^2 + (y - b)^2 = r^2. Mô hình trên được tham số hoá bởi vector (a, b, r). Tuỳ cách hiểu mà có thể có mô hình khác nhau, ví dụ chỉ cần thay đổi hệ qui chiếu là ta có vector (a, b, r) mới.

Về mặt máy tính, số lượng phần tử của tập hợp là hữu hạn. Việc tìm ra mô hình tổng quát dựa vào thuộc tính của các phần tử của tập hợp hữu hạn là nội suy, vì ta suy từ những cái cụ thể ra cái tổng quát, từ trong ra. Sau khi suy ra mô hình, không nhất thiết tất cả các phần tử đều phải khớp ngược trở lại vào mô hình. Ví dụ mô hình suy ra từ 19 người nghèo và tỉ phú là: Thu nhập = 5 [đồng], nhưng tỉ phú không khớp vào mô hình này.

Page 2: Ran Sac

Về mặt xác suất thống kê, khi kiểm tra phần tử có khớp vào mô hình hay không, ta không dùng dấu =, mà dùng dấu gần bằng, nghĩa là có xét đến nhiễu. Phần tử không khớp gọi là phần tử gây nhiễu, tiếng Anh là outlier (cẩn thận viết nhầm thành outliner).

RANSAC là gì?

Bài toán

Để cụ thể dễ hiểu, phần giải thích tiếp theo sử dụng bài toán sau, từ bài toán này, bạn đọc hãy tự nội suy ra bài toán tổng quát:

Cho toạ độ của N điểm trên mặt phẳng. Giả sử có một số điểm nằm trên đường thẳng, còn các điểm khác là nhiễu (nghĩa là

biết chắc có 2 tập hợp con, hay còn gọi là cluster).

Hãy tìm phương trình đường thẳng, và cho biết những điểm nào nằm trên đường thẳng, những điểm nào là nhiễu.

Người ta phân biệt 2 loại cách giải: theo xác suất thống kê cổ điển (classical statistics) và theo xác suất thống kê chống nhiễu (robust statistics). Đặc điểm của các phương pháp theo xác suất thống kê cổ điển là luôn gồm luôn cả nhiễu, nên đáp số bị ảnh hưởng bởi nhiễu.

Giải bằng phương pháp bình phương tối thiểu

Cách giải thuộc loại xác suất thống kê cổ điển nổi bật nhất có lẽ là phương pháp bình phương tối thiểu. Nó cho phép tìm ra một đường khớp nhất cho tất cả các điểm, với tổng các khoảng cách (sai số) từ từng điểm đến đường thẳng là nhỏ nhất. Tuy nhiên nếu dữ liệu chứa quá nhiều outlier (ví dụ một nửa số điểm), thì tất cả cách giải thuộc loại xác suất thống kê cổ điển đều cho kết quả sai bét.

Page 3: Ran Sac

Giải bằng RANSAC

Bí quyết của các cách giải thuộc loại xác xuất thống kê chống nhiễu là làm sao loại bỏ outlier, để không sử dụng outlier khi tính toán mô hình. Nói dễ hiểu, là làm sao tiêu diệt được các phần tử phản động không đi lề bên phải, không cho chúng bắt rễ-xâu chuỗi, cho nhân dân à quên cho chúng ra rìa .

RANSAC là viết tắt của RANdom SAmple Consensus (cẩn thận viết nhầm thành concensus). Giải thuật như sau:

Đầu vào: data - tập hợp các điểm k - số lần lặp t - ngưỡng (threshold) sai số để xác định điểm nào đó có khớp mô hình không

Đầu ra: best_model - mô hình tốt nhất best_consensus_set - tập hợp các điểm khớp với best_model

best_model = nilbest_consensus_set = nilbest_num_points = 0

loop k lần consensus_set = tập hợp 2 điểm ngẫu nhiên thuộc data model = mô hình đường thẳng suy ra từ 2 điểm trên

với mỗi điểm point thuộc data nhưng không thuộc consensus_set distance = khoảng cách từ point đến đường thẳng if distance < t (point khớp model với sai số nhỏ hơn t) thêm point vào consensus_set num_points = số lượng phần tử trong consensus_set if num_points > best_num_points best_model = model best_consensus_set = consensus_set best_num_points = num_points

return best_model, best_consensus_set

Page 4: Ran Sac

Trong giải thuật, ta chọn ra 2 điểm ngẫu nhiên, vì 2 là số lượng điểm tối thiểu để có thể tính toán mô hình đường thẳng. Với bài toán tổng quát, ta cần chọn ra số phần tử tối thiểu để có thể tính toán mô hình.

Chương trình ví dụ

Dựa vào giải thuật trên, ta thử viết chương trình xem sao.

Trước hết để chuẩn bị cần ôn lại kiến thức toán cấp 2:

Phương trình đường thẳng Khoảng cách từ điểm đến đường thằng

Tiếp đó, từ tấm ảnh trên trích ra toạ độ các điểm. Nếu có sức khoẻ, có thể mở ảnh trên bằng chương trình xem ảnh cho phép xem toạ độ chuột (PaintBrush trên Windows chẳng hạn), rồi dò từng điểm. Nếu lười, có thể viết chương trình dò giá trị màu của từng pixel để tính ra. Đây vẫn là bước chuẩn bị .

Bây giờ đến bước viết chương trình. Chỉ cần dựa vào giải thuật và bước chuẩn bị là viết được ngay.

Cuối cùng sau khi có kết quả, cần trực quan hoá kết quả thành tập tin ảnh để xác nhận bằng mắt.

Đây là chương trình viết bằng Ruby:

Mô hình đường thẳng: ax + by = 1, có hạn chế là không thể chứa điểm có toạ độ (0, 0).

Dùng thư viện RMagick để đọc ảnh đầu vào và xuất kết quả ra ảnh.