Для решения этой задачи сначала было предложен следующий ход решения - квантизировать цвета картинок на цвета, указанные в качестве классов. Данный подход оказался не жизнеспособным, так как алгоритм находящий близость цветов так, как ее воспринимает человек, обрабатывает картинки слишком долго. Поэтому был предложен другой подход.
Для начала хотелось бы использовать всю информацию, которая содержится в датасете (то есть тип товаров тоже), в связи с чем было принято решение использовать zero-shot классификацию. Для нее была выбрана популярная опен-сорс модель openai/clip-vit-base-patch32 с Hugging Face. Она была обучена с использованием контрастивного обучения и ошибки ITC Loss
Для проверки перфоманса была также обучена модель YOLO11 для задачи классификации с предварительной квантизацией цветов изображений на 33 кластера (число было примерно подобрано, чтобы экономить время и не терять основной цвет товара). На валидационном датасете (таком же как и для модели zero-shot) данная модель показала recall равный порядка 50%. Модель zero-shot показала recall на валидации порядка 63%
Были построены две Confusion-матрицы
По ним можно видеть, что YOLO может справляться получше с хорошо представленными в датасете классами, и плохо с классами представленными слабо (хотя она очень хорошо оптимизирована). То есть преимуществом данной модели по сравнению с классической сверточной нейронной сетью можно назвать то, что ей надо мало данных для обучения, чтобы показывать неплохие обобщающие способности
Проанализировав predict_proba в submission.csv можно вероятно также сказать, что модель zero_shot предсказывает не только класс цвета товара, но и распределение других цветов в товаре по их общему объему. Это возможно благодаря тому, что модель учится на косинусном расстоянии
Можно видеть, что классы "бирюзовый" ( всего 6 на тесте), "золотой" (всего 30 на тесте), "серебристый" (всего 47 на тесте), "оранжевый" (всего 63 на тесте), "бордовый" (всего 95 на тесте) - определяются гораздо лучше, чем в YOLO
Получив это изображение, модель дала такие результаты:
'белый': 0.588928759098053 'жёлтый': 0.19760459661483765 'бежевый': 0.05979130044579506 'разноцветный': 0.050514768809080124 'золотой': 0.04106578975915909 'серый': 0.020818989723920822
В примере работы модели мы видим фото, на котором показана пара обуви с доминирующим белым цветом подошв. Однако, это не мешает модели определить жёлтый цвет, который видно меньшем количестве
Модель была протестировано на GPU RTX 4080 Super на время обработки одного изображения и показала результат равный 15 мс
Для улучшения результатов текущей модели, можно было бы доработать датасет и добавить в него товары плохо представленные на данный момент (бирюзовые, золотые и тд.), также во время обучения можно было бы собирать товары так, чтобы в каждом батче были представители всех классов одновременно, чего не было сделано в текущей реализации