Computer vision

Опыт участия в Data Science соревновании на платформе Kaggle в области компьютерного зрения (object detection)

Время прочтения: 3 мин.

Нашей задачей было распознавание платёжной системы на изображениях банковских карт (Object detection). Метрикой качества в нашей задаче было расстояние Левенштейна – критерий, измеряющий по модулю разность между двумя последовательностями символов. Более подробно про метрику можно почитать здесь.

Датасет

Выборка представляла собой 2000 тренировочных изображений с размеченными платежными системами и 1000 тестовых изображений. В нашем датасете присутствовало 6 различных платёжных систем: MasterCard (MA), Visa (VI), Union Pay (UY), МИР (PC), American Express (EX), Maestro (ST).

Решение

Для решения данной задачи я использовал фреймворк глубокого обучения Pytorch, а также библиотеки Albumentations, Skimage и ImgAug.

В качестве модели я взял предобученную Faster RCNN на основе ResNet50 и немного дообучил её под нашу задачу. Принцип работы и характеристики модели можно посмотреть тут и тут.

Первым делом я посмотрел на распределение лейблов в нашей выборке:

Как видно из графика, распределение довольно неравномерное. В нашей выборке мало изображений, на которых присутствуют следующие лейблы: Union Pay (UY), МИР (PC), American Express (EX), Maestro (ST). Поэтому я попробовал немного изменить баланс наших классов. Для этого, используя библиотеки ImgAug и Skimage, я добавил в нашу выборку новые изображения с редкими лейблами, полученные из исходных с помощью поворотов на определенные углы (от -120 до 120 градусов с шагом в 30 градусов), на некоторые из них также добавил размытие.

В итоге я получил такое распределение:

Так как изображения в нашем датасете разного размера, я привёл их к максимальному размеру, который принимает наша модель (1333 на 1333 пикселя).

Также я добавил следующие аугментации для всех изображений с помощью библиотеки Albumentations:

В качестве оптимизатора я использовал AdamW с WarmUp и LrSceduler.

Гиперпараметры я подбирал по валидации. Порог уверенности (Treshold) выбрал после обучения с помощью валидационной выборки, для этого я перебрал значения от 0.5 до 1.0 с шагом 0.02. На картинке ниже представлен график зависимости расстояния Левенштейна на валидации от значения порога:

Ниже приведу пример работы данной модели на тестовой выборке:

Исходный код предоставляю по ссылке. Спасибо за внимание!

Советуем почитать