XYXY и XYWH: как не потерять пиксель при переводе рамок

Один инструмент разметки экспортирует рамку как левый верхний угол, ширину и высоту. Детектор ждёт две пары координат углов. После конвертации рамки на картинке выглядят почти правильно, но площадь и IoU немного отличаются. На маленьких объектах ошибка в один пиксель может существенно изменить оценку качества. Прежде чем искать проблему в модели, договоритесь о значении правой и нижней границы.

Явно назовите формат

В xywh запись означает (x, y, width, height). В xyxy — (x1, y1, x2, y2). Для полуоткрытой рамки правая и нижняя границы не входят в область: ширина равна x2 - x1, высота — y2 - y1. Такой формат используют функции работы с рамками в torchvision. Если в старой разметке координата последнего пикселя включается, формулу нужно изменить и явно зафиксировать это в импорте.

box_xywh = (2, 3, 4, 5)
x, y, width, height = box_xywh
box_xyxy = (x, y, x + width, y + height)
area = (box_xyxy[2] - box_xyxy[0]) * (box_xyxy[3] - box_xyxy[1])
print("xywh:", box_xywh)
print("xyxy:", box_xyxy)
print("площадь:", area)
assert box_xyxy == (2, 3, 6, 8)
assert area == 20

Рамка (2, 3, 4, 5) в формате xywh становится (2, 3, 6, 8) в xyxy; площадь равна 20. Частая ошибка — вычесть единицу из правого угла, получив ширину 3 вместо 4, или прибавить единицу к площади без понимания конвенции. Код проверяет обратимые числовые условия без изображения.

Проверка на нескольких крайних случаях

Создайте тесты для рамки шириной один пиксель, рамки у правого края и рамки, касающейся нижней границы изображения. При ширине W полуоткрытый x2 может быть равен W: это допустимо, хотя последняя колонка пикселей имеет индекс W−1. Отрицательная ширина, x2 <= x1 или выход за границы должны быть явными ошибками данных либо проходить заранее согласованное обрезание.

После числового теста нарисуйте несколько рамок поверх исходных картинок. Убедитесь, что класс и геометрия принадлежат одному объекту. Нормализованные координаты YOLO требуют ещё масштабирования на ширину и высоту; не смешивайте его с переводом xywh/xyxy. Разбор letterbox касается следующего этапа, где рамка переносится между исходным и подготовленным изображениями.

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

В курсе «Computer Vision Engineer: от детекции и Doc-AI до продакшна» вы работаете с разметкой детекции, обучаете модели и оцениваете их через IoU/mAP. Проверенная конвенция координат нужна, чтобы ошибка формата не превращалась в ложный вывод о качестве детектора. Посмотрите программу курса.

Продолжить на практике

  • Computer Vision Engineer: от детекции и Doc-AI до продакшна ↗

    Практический курс по Computer Vision. Соберёте продакшн-сервис: датасет → обучение (YOLO/RT-DETR, SAM), трекинг, OCR/Doc-AI, веб-приложение (UI+API) и мониторинг. Экспорт в ONNX/TensorRT/OpenVINO, батчинг/квантование под CPU/GPU. Плюс профессиональные блоки: mAP/IoU/Dice и калибровка доверия, QA разметки и аугментации, p95/стоимость, дрейф данных и алерты, guardrails (NMS/правила), A/B-тесты, Triton/gRPC/FastAPI.