Мысли и теория

WBF: Оптимизация обнаружения объектов - Объединение и фильтрация предсказанных блоков

Слияние взвешенных ящиков стало новым SOTA для оптимизации моделей обнаружения объектов.

Обнаружение объектов - одна из самых распространенных и интересных задач компьютерного зрения. Последние модели SOTA, такие как YOLOv5 и EfficientDet, впечатляют. Эта статья будет о новом новом методе SOTA, называемом слияние взвешенных ящиков, которое оптимизирует проблему обнаружения огромных объектов. Это продвинутая техника обнаружения объектов, и я обнаружил ее во время текущего конкурса VinBigData Kaggle.

Если вы знакомы с тем, как работает обнаружение объектов, вы, вероятно, знаете, что всегда существует магистральная CNN, извлекающая признаки. И есть еще один этап, на котором либо генерируются предложения регионов (возможные ограничивающие рамки), либо фильтруются уже предложенные. Основная проблема здесь в том, что это совсем непростая задача, на самом деле это довольно сложно. Вот почему модели обнаружения объектов в конечном итоге либо генерируют много ограничивающих прямоугольников, либо их недостаточно, что приводит к низкой средней средней точности. Для решения этой проблемы было предложено несколько алгоритмов, которые я считаю собирается пройти в первую очередь.

Если вас не интересует теоретическое объяснение, вы можете просто перейти к руководству по кодированию в конце, где я покажу, как применить эту технику к очень сложному набору данных для конкурса, над которым я работал (VinBigData ).

Чтобы дать вам немного контекста, соревнование направлено на обнаружение заболеваний легких с помощью рентгеновских лучей. Однако ваша модель должна уметь различать 14 различных заболеваний, и для каждой болезни предсказать, где находится эта болезнь. Это становится еще более трудным, поскольку для каждого изображения может быть более одного заболевания (и, следовательно, вам нужно предсказать несколько разных ограничивающих рамок).

Первая проблема заключается в том, что болезни маркируются несколькими разными радиологами, и для одной и той же аномалии может быть несколько разных ограничивающих рамок. Поэтому мы должны фильтровать их (или в данном случае «объединять» их), чтобы не запутать нашу модель.

Вторая проблема заключается в том, что в некоторых плотных областях болезни содержится несколько меток, а это означает, что в небольшой ограничивающей рамке может быть несколько меток болезней. Это немного усложняет нашу жизнь, если мы используем что-то вроде NMS, поскольку мы фильтруем базы ящиков на IoU (что довольно часто здесь происходит). Таким образом, такой метод, как NMS, скорее всего, удалит полезные ящики.

Обратите внимание, что все эти методы можно использовать двумя способами. Либо для предварительной обработки ваших данных, чтобы отфильтровать неточно помеченные ограничивающие прямоугольники (это то, что я буду делать здесь), либо чтобы отфильтровать ограничивающие прямоугольники, предсказанные моделью, которую вы обучили для повышения точности (или и то, и другое).

Я буду обсуждать каждую технику, включая визуализацию ограничивающих рамок до и после использования техники.

  1. Не максимальное подавление (NMS)

Если вы знакомы с обнаружением объектов, вы, вероятно, слышали о NMS. Учитывая, что каждый прогноз модели обнаружения объекта состоит из координат ограничивающего прямоугольника, метки класса и показателя достоверности, NMS работает следующим образом:

  • Поля фильтруются в 1 блок, если их Intersection Over Union IoU выше, чем указанный пороговый гиперпараметр удержания. IoU - это, по сути, количество перекрытий между двумя полями.

Основная проблема здесь в том, что если объекты расположены рядом, один из них будет удален (поскольку IoU будет довольно высоким).

2. Soft-NMS

Второй метод пытается решить основную проблему NMS, используя более «мягкий» подход. Вместо того, чтобы полностью удалять блоки с более высоким IoU, чем пороговое значение, он снижает их доверительные оценки в соответствии со значением IoU.

3. Weighted Boxes Fusion (WBF)

Алгоритм WBF работает иначе, чем NMS. Он немного длинный и включает в себя множество математических уравнений, но я сделаю все возможное, чтобы дать вам простой обзор, не утомляя вас деталями.

Во-первых, он сортирует все ограничивающие прямоугольники в порядке убывания оценок достоверности. Затем он генерирует другой список возможных «слияний» (комбинаций) блоков и пытается проверить, соответствует ли какое-либо из этих слияний исходным ограничивающим прямоугольникам. Он делает это, проверяя, превышает ли IoU указанный порог (гиперпараметр).

Затем он использует формулу для корректировки координат и оценок достоверности всех ящиков в списке слитых ящиков. Новая оценка достоверности - это просто средняя оценка достоверности всех блоков, из которых она была объединена. Новые координаты объединяются аналогичным образом (усреднение), за исключением того, что координаты взвешиваются (это означает, что не каждый блок имеет одинаковый вклад в полученный объединенный блок). Значение веса определяется оценкой достоверности, что имеет смысл, поскольку низкая оценка достоверности, вероятно, указывает на неверный прогноз.

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

Также стоит упомянуть, что существует четвертый метод под названием Non-Maximum Weighted Fusion, который работает аналогичным образом, но не так эффективен, как WBF. Это связано с тем, что он не изменяет оценки достоверности ящиков и использует значение IoU для взвешивания ящиков, а не более точный показатель, которым является оценка достоверности. Однако их производительность довольно близка:

Кодирование

Хорошо, с теоретической частью, приступим к кодированию! Один из лучших способов оценить, действительно ли эта статья хороша или нет, - это посмотреть, выпустили ли они качественный код, и в данном случае они это сделали. Вы можете проверить это здесь, на Github.

Они предоставляют простую в использовании библиотеку. Вот пример

boxes, scores, labels = weighted_boxes_fusion(boxes_list, scores_list, labels_list, weights=weights, iou_thr=iou_thr, skip_box_thr=skip_box_thr)

Вы можете заменить «weighted_boxes_fusion» на «nms» или «soft_nms» или «non_maxmimum_weighted», если хотите попробовать другие методы, и он будет работать нормально.

Первоначальная причина, по которой я столкнулся с этой библиотекой / техникой, заключается в том, что в конкурсе Kaggle VinBigData есть 2 основных проблемы с набором данных, которые приводят к недостаточной производительности моделей обнаружения объектов.

Исходный фрейм данных, предоставленный конкурсом, уже включает в себя ограничивающие рамки, метки для каждого изображения. Таким образом, они будут частью входных данных функции WBF выше.

Поскольку мы будем использовать его здесь для предварительной обработки, мы можем просто установить «веса» и «оценки» на 1, чтобы каждый блок обрабатывался одинаково (поскольку у нас еще нет прогнозов). Вот и все! Библиотека действительно проста, это всего лишь одна строка кода, вы передаете список ограничивающих рамок и оценок, и вы снова получаете более аккуратный список.

Последние мысли

Вскоре я опубликую немало статей об уроках, которые я извлек из этого конкурса, в основном о передовых методах обнаружения объектов, так что следуйте за мной, если вам интересно.