Как подойти к задаче детекции объектов при сильном дисбалансе данных
Что проверяют
Отличаете ли вы дисбаланс в детекции от дисбаланса в табличной классификации и не понесёте ли SMOTE в задачу с картинками и рамками. Следом обычно спрашивают, по какой метрике вы поймёте, что редкий класс стал находиться лучше.
Как отвечать
Сразу разведите два дисбаланса. Первый встроен в саму задачу: фона на снимке намного больше, чем объектов, и почти все якоря или кандидаты отрицательные. Второй между классами: одних объектов тысячи, других десятки. Против первого работают:
- focal loss: гасит вклад лёгких отрицательных примеров, придуман для RetinaNet, в torchvision есть
sigmoid_focal_loss; - сэмплинг в двухстадийных детекторах: RPN и ROI-голова берут в батч фиксированную долю положительных примеров;
- hard negative mining: в обучение идут самые трудные отрицательные.
Против дисбаланса классов:
- repeat factor sampling: снимки с редкими классами повторяются в эпохе чаще, метод из работы про LVIS;
- copy-paste: объекты редкого класса вырезаются по маске или рамке и вставляются в другие снимки, вместе с обычными аугментациями и mosaic;
- взвешенная функция потерь: веса классов или class-balanced loss по «эффективному числу примеров»;
- данные: самый сильный рычаг. Прогоните текущую модель по неразмеченному потоку, соберите кадры с кандидатами редкого класса и отдайте их на разметку, это активное обучение на практике.
Оценивать нужно не общий mAP, а AP и recall по каждому классу. В валидации должно быть достаточно редких объектов, иначе метрика по ним шумит, а порог уверенности на инференсе подбирается для каждого класса отдельно. Идеи переносятся между YOLO, Detectron2, MMDetection и torchvision, отличается только конфиг.
Где спотыкаются
Предлагают SMOTE. Он интерполирует векторы признаков табличных данных, к снимку с разметкой рамок его не применить. Аналог для детекции это аугментации и copy-paste.
Дублируют редкие снимки без аугментаций. Модель запоминает конкретные кадры: на обучении AP по редкому классу растёт, на новых данных нет.
Выкидывают из датасета кадры без объектов, чтобы уменьшить дисбаланс. Модель перестаёт видеть чистый фон и находит объекты там, где их нет.