NMS (non maximum suppression) được sử dụng rộng rãi trong các thuật toán trích xuất tính năng truyền thống và phát hiện mục tiêu học sâu. Nguyên tắc của NMS là thu được giải pháp tối ưu bằng cách sàng lọc giá trị cực đại cục bộ. Trong trích xuất cạnh 2D, sau khi trích xuất đường viền cạnh, một số điểm có tốc độ thay đổi hướng gradient nhỏ sẽ được sàng lọc để tránh nhiễu. Nó cũng đóng vai trò quan trọng trong việc phát hiện điểm chính 3D, lọc ra các giá trị cực trị không cục bộ trong các đặc điểm. Về mặt phát hiện mục tiêu, cho dù là thuật toán chuỗi SSD một giai đoạn, thuật toán chuỗi YOLO hay thuật toán chuỗi RCNN hai giai đoạn, thì việc triệt tiêu không tối đa là một thành phần thiết yếu, có thể lọc ra các hộp đầu ra có điểm số nhỏ hơn. Tương tự như vậy, nó cũng được sử dụng trong mô hình phát hiện mục tiêu dựa trên đám mây điểm ba chiều.
Trong các thuật toán phát hiện đối tượng dựa trên mỏ neo hiện có, một số lượng lớn các hộp chữ nhật ứng viên được tạo ra, nhiều hộp trong số đó trỏ đến cùng một đối tượng, do đó có một số lượng lớn các hộp chữ nhật ứng viên trùng lặp. Mục đích của thuật toán loại bỏ không tối đa là loại bỏ các hộp trùng lặp và tìm vị trí phát hiện đối tượng tốt nhất.
IoU (Giao điểm trên hợp): Công thức đánh giá độ chính xác định vị. Nó tương đương với kết quả của phép chia giao của hai diện tích cho hợp của hai diện tích đó. Kết quả của các giá trị IoU khác nhau được hiển thị. Nhìn chung, Điểm > 0,5 có thể được coi là kết quả tốt.
Tính toán IOU:
Cách tính IoU (Giao điểm trên hợp).
Chọn giá trị lớn nhất của tọa độ ngang và dọc của góc trên bên trái của hai hộp chữ nhật, x21, y21; chọn giá trị nhỏ nhất của tọa độ ngang và dọc của góc dưới bên phải của hai hộp chữ nhật, x12, y12,
- Tính diện tích giao nhau:
\[{Diện tích(A \cap B)} = |x12 - x21| * |y12 - y21| \]
\[{Diện tích(A \cup B)} = |x11 - x12| * |y11 - y12| + |x21 - x22| * |y21 - y22| - {Diện tích(A \cap B)} \]
\[IoU = \frac {Diện tích(A \cap B)} {Diện tích(A \cup B)} \]
Luồng thuật toán như sau:
- Sắp xếp điểm của tất cả các ô và chọn điểm cao nhất và ô tương ứng
- Chúng tôi duyệt qua các ô còn lại và nếu diện tích chồng lấn (IOU) với ô có điểm cao nhất hiện tại lớn hơn một ngưỡng nhất định (giá trị thường được sử dụng là khoảng 0,5), chúng tôi sẽ xóa ô đó. (Tại sao phải xóa nó? Bởi vì nó vượt quá ngưỡng đã đặt và người ta cho rằng các đối tượng trong hai hộp thuộc cùng một danh mục, chẳng hạn như danh mục chó. Chúng ta chỉ cần giữ lại sơ đồ hộp khả năng của một danh mục.)
- Chọn câu trả lời có điểm cao nhất từ hộp chưa được xử lý và lặp lại quy trình trên.
Mã như sau:
#!/usr/bin/env python3 # -*- mã hóa: utf-8 -*- """ Hàm NMS (Loại bỏ không tối đa, Loại bỏ các phần tử không quá lớn) mã giả: 1. chọn phần tử có điểm cao nhất a_1 trong tập hợp B, thêm a_1 vào tập hợp giữ C 2. tính toán IOU giữa phần tử được chọn (như a_1) và các phần tử khác trong tập hợp B 3. chỉ giữ lại các số trong tập hợp B có giá trị IOU nhỏ hơn ngưỡng (có thể được đặt thành >=0,5), xóa các số tương tự như a_1 (IOU càng cao thì giao điểm giữa a_1 và nó sẽ càng nhiều) 4. chọn giá trị điểm cao nhất a_2 còn lại trong tập hợp B và thêm a_2 vào tập hợp C 5. lặp lại 2-4 cho đến khi không còn gì trong tập hợp B, trong khi tập hợp C là giá trị NMS set """ import numpy as np # chi tiết[:, 0] # [100. 250. 220. 230. 220.] y1 = chi tiết[:, 0] # [100. 250. 220. 230. 220.] y2 = chi tiết[:, 0] # [100. 250. 220. 230. 220.] y3 = chi tiết[:, 0] # [100. 250. 220. 230. 220.] y4 = chi tiết[:, 0] # [100. 250. 220. 230. 220.] y5 = chi tiết[:, 0] # [100. 250. 220. 230. 220.] () Điểm số ", chỉ mục) Hộp ED theo điểm số chỉ mục = điểm.ArgSort () [::-1] # [2 4 3 1 0] trong khi index.size> 0: in ("Chỉ mục được sắp xếp của các hộp theo điểm số", chỉ mục) # Các hộp được sắp xếp theo chỉ mục. # Tính tọa độ của giao điểm của hộp với điểm số cao nhất và các hộp khác tương ứng x11 = np.maximum (x1 [i], x1 [index [1:]]) # [220. 240. 250. 220.] x22 = np.minimum (x2 [i], x2 [index [1:]] maximum(0, y22 - y11 + 1) # chiều cao của phần chồng chéo phần chồng chéo = w * h # Tính diện tích giao điểm w = np.maximum(0, x22 - x11 + 1) # trọng số của phần chồng chéo h = np.maximum(0, y22 - y11 + 1) # chiều cao của phần chồng chéo phần chồng chéo = w * h # Tính giá trị IOU có liên quan (diện tích giao nhau / diện tích hợp, biểu thị mức độ chồng chéo đường viền, càng lớn thì càng giống nhau, càng cần xóa nhiều) # Diện tích chồng chéo / (diện tích 1 + diện tích 2 - diện tích chồng chéo) ious = chồng chéo / (diện tích[i] + diện tích[chỉ số[1:]] - chồng chéo) # Chỉ giữ lại số chỉ mục có iou nhỏ hơn ngưỡng và lặp lại bước trước đó idx = np.where(ious <= thresh)[0] # # 1. Tạo một bảng vẽ mới. # 2. Tạo một bảng vẽ mới. # 3. Tạo một bảng vẽ mới. # 4. Tạo một bảng vẽ mới. # 5. Tạo một bảng vẽ mới. # 6. Tạo một bảng vẽ mới. # 7. Tạo một bảng vẽ mới. # 8. Tạo một bảng vẽ mới. # 9. Tạo một bảng vẽ mới. # 10. Tạo một bảng vẽ mới. # 11. Tạo một bảng vẽ mới. # 12. Tạo một bảng vẽ mới. # 13. Tạo một bảng vẽ mới. # 14. Tạo một bảng vẽ mới. fig = plt.figure(figsize=(12, 6)) # Giải thích tham số, hai tham số đầu tiên 1,2 chỉ ra việc tạo một hộp có một hàng và hai cột. Tham số thứ ba chỉ ra hộp hiện tại. ax1 = fig.add_subplot(1, 2, 1) ax2 = fig.add_subplot(1, 2, 2) plot_bbox(ax1, boxes, 'k', title_name="before nms") # before nms keep = py_cpu_nms(boxes,thresh=0.7) plot_bbox(ax2, boxes[keep], 'r', title_name="after nms") # after nms plt.show()
Tài liệu tham khảo: https://blog.csdn.net/weixin_42237113/article/details/105743296 https://blog.csdn.net/lz867422770/article/details/100019587 .
Cuối cùng, bài viết này về giải thích chi tiết về thuật toán non-maximum suppression (NMS) ở đây. Nếu bạn muốn biết thêm về giải thích chi tiết về thuật toán non-maximum suppression (NMS), vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!