[Концепция глубокого обучения] · Анализ немаксимального подавления

искусственный интеллект Python

Немаксимальное подавление

 

содержание

1. Что такое немаксимальное подавление

2. Зачем использовать не максимальное подавление

3. Как использовать не максимальное подавление

4. Ссылки


1. Что такое немаксимальное подавление

Немаксимальное подавление, называемое алгоритмом NMS, английский язык для немаксимального подавления. Идея состоит в том, чтобы искать локальные максимумы и подавлять максимумы. Конкретная реализация алгоритма NMS в разных приложениях не одинакова, но идея одна и та же. Немаксимальное подавление широко используется в задачах компьютерного зрения, таких как обнаружение краев, обнаружение лиц, обнаружение объектов (DPM, YOLO, SSD, Faster R-CNN) и т. д.

2. Зачем использовать не максимальное подавление

Возьмем в качестве примера обнаружение цели: в процессе обнаружения цели будет сгенерировано большое количество кадров-кандидатов в позиции одной и той же цели, и эти кадры-кандидаты могут перекрываться друг с другом. -Максимальное подавление, чтобы найти лучшую цель Ограничивающие рамки, устраняя избыточные ограничивающие рамки. Демонстрация показана ниже:

Object Detection

Левое изображение является результатом полей-кандидатов для обнаружения лиц. Каждая ограничивающая рамка имеет показатель достоверности. Если не используется максимальное подавление, появится несколько полей-кандидатов. Изображение справа — это результат после использования не максимального подавления, который соответствует ожидаемому результату нашего распознавания лиц.

3. Как использовать не максимальное подавление

помещение:Список целевых ограничивающих рамок и соответствующих им списков оценок достоверности, а также установлен порог, который используется для удаления ограничивающих рамок с большими перекрытиями.
IoU:intersection-over-union, то есть пересечение двух ограничивающих прямоугольников, разделенных их объединением.

Процесс немаксимального подавления выглядит следующим образом:

  • Сортировать по показателю достоверности
  • Выберите ограничительную рамку с наиболее надежным соотношением для добавления в окончательный список выходных данных, удалите ее из списка ограничительной рамки.
  • Вычислить площадь всех ограничивающих прямоугольников
  • Рассчитайте IoU ограничивающей рамки с наивысшей достоверностью и других рамок-кандидатов.
  • Удалите ограничивающие рамки с IoU, превышающим пороговое значение.
  • Повторяйте описанный выше процесс, пока список ограничивающих рамок не станет пустым.

Код Python выглядит следующим образом:

#!/usr/bin/env python
# _*_ coding: utf-8 _*_


import cv2
import numpy as np


"""
    Non-max Suppression Algorithm

    @param list  Object candidate bounding boxes
    @param list  Confidence score of bounding boxes
    @param float IoU threshold

    @return Rest boxes after nms operation
"""
def nms(bounding_boxes, confidence_score, threshold):
    # If no bounding boxes, return empty list
    if len(bounding_boxes) == 0:
        return [], []

    # Bounding boxes
    boxes = np.array(bounding_boxes)

    # coordinates of bounding boxes
    start_x = boxes[:, 0]
    start_y = boxes[:, 1]
    end_x = boxes[:, 2]
    end_y = boxes[:, 3]

    # Confidence scores of bounding boxes
    score = np.array(confidence_score)

    # Picked bounding boxes
    picked_boxes = []
    picked_score = []

    # Compute areas of bounding boxes
    areas = (end_x - start_x + 1) * (end_y - start_y + 1)

    # Sort by confidence score of bounding boxes
    order = np.argsort(score)

    # Iterate bounding boxes
    while order.size > 0:
        # The index of largest confidence score
        index = order[-1]

        # Pick the bounding box with largest confidence score
        picked_boxes.append(bounding_boxes[index])
        picked_score.append(confidence_score[index])

        # Compute ordinates of intersection-over-union(IOU)
        x1 = np.maximum(start_x[index], start_x[order[:-1]])
        x2 = np.minimum(end_x[index], end_x[order[:-1]])
        y1 = np.maximum(start_y[index], start_y[order[:-1]])
        y2 = np.minimum(end_y[index], end_y[order[:-1]])

        # Compute areas of intersection-over-union
        w = np.maximum(0.0, x2 - x1 + 1)
        h = np.maximum(0.0, y2 - y1 + 1)
        intersection = w * h

        # Compute the ratio between intersection and union
        ratio = intersection / (areas[index] + areas[order[:-1]] - intersection)

        left = np.where(ratio < threshold)
        order = order[left]

    return picked_boxes, picked_score


# Image name
image_name = 'nms.jpg'

# Bounding boxes
bounding_boxes = [(187, 82, 337, 317), (150, 67, 305, 282), (246, 121, 368, 304)]
confidence_score = [0.9, 0.75, 0.8]

# Read image
image = cv2.imread(image_name)

# Copy image as original
org = image.copy()

# Draw parameters
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
thickness = 2

# IoU threshold
threshold = 0.4

# Draw bounding boxes and confidence score
for (start_x, start_y, end_x, end_y), confidence in zip(bounding_boxes, confidence_score):
    (w, h), baseline = cv2.getTextSize(str(confidence), font, font_scale, thickness)
    cv2.rectangle(org, (start_x, start_y - (2 * baseline + 5)), (start_x + w, start_y), (0, 255, 255), -1)
    cv2.rectangle(org, (start_x, start_y), (end_x, end_y), (0, 255, 255), 2)
    cv2.putText(org, str(confidence), (start_x, start_y), font, font_scale, (0, 0, 0), thickness)

# Run non-max suppression algorithm
picked_boxes, picked_score = nms(bounding_boxes, confidence_score, threshold)

# Draw bounding boxes and confidence score after non-maximum supression
for (start_x, start_y, end_x, end_y), confidence in zip(picked_boxes, picked_score):
    (w, h), baseline = cv2.getTextSize(str(confidence), font, font_scale, thickness)
    cv2.rectangle(image, (start_x, start_y - (2 * baseline + 5)), (start_x + w, start_y), (0, 255, 255), -1)
    cv2.rectangle(image, (start_x, start_y), (end_x, end_y), (0, 255, 255), 2)
    cv2.putText(image, str(confidence), (start_x, start_y), font, font_scale, (0, 0, 0), thickness)

# Show image
cv2.imshow('Original', org)
cv2.imshow('NMS', image)
cv2.waitKey(0)

Адрес загрузки исходного кода:GitHub.com/snail-t-fete/…
Не забудьте дать звезду. Исходное изображение демо находится вREADME.mdвнутри.

Результаты экспериментов:

  • Порог 0,6

threshold = 0.6

  • Порог 0,5

threshold = 0.5

  • Порог 0,4

threshold = 0.4

4. Ссылки

  1. woohoo.py изображение search.com/2014/11/17/…
  2. На данный момент.Brown.quota/~PFF/papers…
  3. blog.CSDN.net/Книжный фанат/искусство…
  4. Блог woohoo.cn на.com/Закрытая карта 0626…
  5. Уууу.Боль 4479.net/a 6_10/…
  6. blog.CSDN.net/QQ_14845119…