Найти в Дзене
Жонглер данными

Numpy для работы с координатами прямоугольников

Продолжаем наш цикл статей про матричное программирование: первая, вторая, третья, четвертая и пятая. Для начала ответим на вопрос: является ли матричное программирование синонимом numpy-программированию? Если вы используете библиотеку numpy, то ответ будет положительным. Матричное программирование является более общим понятием, в которое входит и numpy-программирование. В задачах компьютерного зрения достаточно часто приходится иметь дело с прямоугольниками, стороны которых параллельны осям координат. Такие прямоугольники можно задать всего двумя точками, то есть четырьмя значениями. Существует несколько вариантов как это сделать. Один из них использует левый верхний и правый нижний углы, обычно он обозначается как xyxy (икс-игрек-икс-игрек). Другой, достаточно распространенный, формат определяет центр прямоугольника и его ширину и высоту - xywh. Напишем функцию преобразования из первого во второй: Все приемы, используемые в этой функции, были уже рассмотрены в предыдущих статьях, поэ

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

Пересечение прямоугольников
Пересечение прямоугольников

В задачах компьютерного зрения достаточно часто приходится иметь дело с прямоугольниками, стороны которых параллельны осям координат. Такие прямоугольники можно задать всего двумя точками, то есть четырьмя значениями. Существует несколько вариантов как это сделать. Один из них использует левый верхний и правый нижний углы, обычно он обозначается как xyxy (икс-игрек-икс-игрек). Другой, достаточно распространенный, формат определяет центр прямоугольника и его ширину и высоту - xywh. Напишем функцию преобразования из первого во второй:

Функция преобразования первого варианта во второй
Функция преобразования первого варианта во второй

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

Так же существуют нормализованные формы обоих вариантов, у которых значения лежат в диапазоне от 0 до 1. Тему масштабирования мы рассматривали во второй статье, если возникли вопросы по нормализации (масштабированию), то вам следует обратиться к этому материалу. Но в нашем случае искать максимальные и минимальные значения не нужно. Максимальные значения задаются форматом изображения (кадра) в виде кортежа, например, (32, 32), а минимальное значение должно быть 0. Иногда алгоритмы не содержат проверку на минимальное и максимальное значение, поэтому могут попадаться отрицательные значения или превышающие формат (находящиеся за пределами полотна). Напишем функцию, преобразующую в нормализованный формат с исправлением значений, выходящих за пределы:

Функция нормализованной формы
Функция нормализованной формы

С функцией tile мы с вами познакомились здесь, надеюсь, что и остальное тоже понятно.

Все это были вспомогательные функции, пора уже заняться чем-то по-серьезнее. Начнем с пересечения прямоугольников, а точнее с коэффициента пересечения, так как само пересечение - логическая задача, а коэффициент пересечения - арифметическая. Если первый прямоугольник находится внутри второго, то этот коэффициент должен быть равен 1. Если прямоугольники не пересекаются, то - 0. Если коэффициент меньше 1, то прямоугольники пересекаются частично. Например, коэффициент 0.5 говорит о половинном пересечении первого прямоугольника вторым.

Функция коэффициента пересечения прямоугольников
Функция коэффициента пересечения прямоугольников

Знаете ли вы, чем отличаются функции min и minimum, max и maximum? У первых максимальное значение ищется в одном массиве, а вторые находят экстремумы из двух аргументов. В этой функции находится площадь пересечения, которая делится на площадь первого прямоугольника. Если полученное значение больше 0, то это и будет коэффициентом пересечения, в остальных случаях - 0.

При возврате результата вместо условия использовали возможности функции where, которая позволяет варьировать вывод в зависимости от условия, но возвращает массив, поэтому используется метод массива item.

Напишем функцию, находящую все индексы в массиве прямоугольников, координаты которых близки к определенному прямоугольнику в пределах 5%:

Функция поиска близких прямоугольников
Функция поиска близких прямоугольников

Для поиска близких значений будем использовать функцию isclose, которой передаем массив прямоугольников (где искать), шаблонный прямоугольник (что искать) и размер относительного допуска (на сколько близко). Эта функция возвращает булевый массив, в котором нас интересуют только те строки, у которых все колонки истинны. Для такого отбора используем функцию all, с указанием оси 1 (по колонкам). Ну а с функцией where вы уже знакомы по предыдущей статье.

Я думаю, материала для статьи вполне достаточно, оставшееся рассмотрим в следующий раз.