Условие здесь.
Здесь описаны основные ступени решения кейса, а также мои идеи решения каждой из них.
- Анализ задачи: Изучение различных алгоритмов сегментации, таких как:
- Классические подходы: Пороговые модели, цветовая сегментация, K-means clustering.
- Современные подходы: Fully Convolutional Networks (FCN), DeepLab, UNet.
- Выбор и реализация подхода:
- Обоснование выбора UNet.
- Разметка данных.
- Обучение UNet на размеченном датасете (item vs. background).
- Метрики для оценки удаления фона:
- Intersection over Union (IoU) для оценки точности сегментации.
- Визуальная проверка результатов на тестовых изображениях.
- Анализ задачи: Казалось бы не стоит запариваться и нужно лепить подготовленную текстуру. Хотя можно было бы придумать методы генерации интересного фона на основе цветов изображения, или подходящих по смыслу. (сгененрировать сначала описание, на основе него анализировать на каком фоне должен быть объект)
- Реализация:
- После сегментации, замена фона на одноцветную текстуру (выбор из 10 пастельных цветов).
- Добавление функции выбора фона из предложенного набора (из загруженных текстур).
- Добавление возможности генерации фона с градиентом цветов. захотелось, нравится)
- Обеспечение естественного наложения фона без резких границ. (пока не узнал как сделать, но явно нужно и наверное можно)
- Надо выделить признаки из фото, делается энкодерной частью UNET или просто взять предобученную другую сеть (ResNet тот же)
- После эти признаки подать в модель для создания текста. GPT-2 подойдёт если я правильно понимаю.
- По хорошему надо дообучить, хотя бы последние несколько слоёв, но для этого нужна текстовая разметка над картинками...
- Из метрик знаю такие..
- BLEU или ROUGE для оценки качества текста (сравнение с эталонными описаниями).
- Или вручную создать какие-то правила для оценки точности информации.
На мой взгляд самая интересная часть кейса - это именно решение задачи напрямую связанной с CV (первый пункт). Поэтому бо'льшая часть времени была потрачена на эту часть, поэтому бо'льшее внимание будет уделено ей. Решение кейса:
- Пороговые методы:
- Способы сегментации на основе анализа яркости пикселей.
- Не подходят из-за частой схожести цветов объекта и фона
- Сегментация на основе цветовых моделей:
- Использование цветовых моделей для разделения объекта и фона.
- Не подходит по той же причине.
- Кластеризация (Clustering):
- Например, алгоритм K-means могут быть использованы для сегментации на основе пиксельных кластеров.
- Вроде работает лучше, чем простые пороговые методы.
- Проблемы - требует настройки параметров, сложно добиться точных результатов без предварительной обработки изображений.
- Графовые методы (Graph-based segmentation): честно говоря не до конца разобрался.. просто знаю что существуют
- Алгоритмы на основе глубокого обучения:
- Например, Fully Convolutional Networks (FCN), SegNet, DeepLab, и UNet.
- Плюсы: способны обрабатывать сложные сцены, хорошо справляются с артефактами на границах, высокое качество сегментации.
- Минусы: требуют большого объема данных для обучения, относительно сложная модель. Также требуют размеченных данных (((((((
- Так как нейронки часто показывают лучший результат и сейчас являются state-of-the-art то остановился на них.
-
UNet была выбрана как baseline модель, которая в итоге показала отличные результаты, на ней и остановился. Это архитектура, специально разработанная для сегментации изображений и широко применяется в медицине и других областях, требующих высокой точности.
-
Преимущества UNet:
- Симметричная архитектура с пропуском связей: слои кодирования передают информацию напрямую в соответствующие слои декодирования, что позволяет более точно восстанавливать детали границ объекта.
- Устойчивость к малым объемам данных
- Высокая точность
- Гибкость: модель легко дообучать
- Первоначально надо собрать данные.
- По заданию был выдан архив, поэтому взяли фото из него.
- Половина жутко не понравились, но как бы задание есть задание.
- Далее нужно разделить их на train, validation, test.
- В связи с тем что данных немного - test=validation.
- Отобрали 50 почти случайных картинок и отложили их в отдельную папку - test.
- Для обучения нейросетей нужны данные с правильными ответами, то есть в нашем случае - с разметкой.
- Для получения разметки был выбран инструмент CVAT.
- Если в рассказе пропустить несколько дней потраченных на разметку, то вот результат:
- После обработки получились 355 фото на тесте и 50 на валидации. (чуть перетасовал добавив больше сложных примеров тест, а ещё часть потерял...)
- Разметка происходила на два класса - item и backgroung
- Все изображения представлены парой .jpg и .png с одинаковыми названиями, первое - изначальное изображение, второе - маска.
- Вроде это называется формат CamVid 1.0
- Далее предстоит долгий разговор про обучение модели. Файл тут, иногда даже комментарии есть. Он основан на множестве туториалов из интернета, сслыки приведены в конце этого файла.
- По существу:
- Пользуемся torch и segmentation_models_pytorch
- Вначале установили гиперпараметры: эпохи, размер батча итд.
- Далее создали функции визуализации изображений и маски, а также Dataloader. Проверили работоспособность.
- Далее необходимо настроить аугментации, так как их можно сделать много, а датасет как раз маленький. Пользуемся albumentations. (на тест меньше аугментации добавили, только самое адекватное)
- горизонтальная и вертикальная симметрия
- паддинг, обрезка и сдвиги
- шумы
- Далее взяли предзагруженную модель с весами полученные после обучения на ImageNet.
- В качестве метрик взяли IOU и Fscore, оптимизировали Adam-ом по Diceloss-у.
- Графики результатов обучения, а также сравнение полученных масок с groundtrue можно видеть ниже..
- (итоговые модели сохранялись в формате .pt-.pth и оказались достаточно объёмными, в итоге не хотят загружаться на гитхаб, скину по требованию, если что - почта firsov.sa@phystech.su)
- Реализованы 3 подхода:
- Заливка сплошным фоном. Сделал функции и ячейку для выбора пользователем цвета из 10 пастельных.
- Замена на предзагруженный фон (фото текстуры). Также 5 вариантов предоставлены пользователю.
- Заливка фона градиентом. Пока не дописал, но можно сделать чтобы цвета для градиента тоже выбирались. (2 строчки)
- Результаты работы ниже, по сути ничего интеллектуального. Можно придумать что-то с анализом цветов, но вот возьмите на работу - там буду все силы выжимать из себя и все фичи пилить, ради реального проекта не жалко.
- Качество навпрямую зависит от качеств сегментации.
- По плану было научиться выделять признаки с фото, примерно для этого оставить только первые 5 слоёв UNET (энкодер) или взять ResNet и убрать последний слой.
- Это ещё сделал, но дальше работу с GPT-2 не наладил, так что пока только в теории понимаю как это сделать.
- Также уверен что было бы качество текста плохое, ведь нет возможности дообучить, так как отсутствует текстовая разметка. Создавать её совсем нет времени.
- Итоговый проект представлен в этом репозитории файлами:
camvid-dataset.rar
- датасет с разметкой и разделением на train-testmain_file_segmentation.ipynb
- Основной файл с решением задачи сегментации item-background, дообучаем UNETpart_2_change_background.ipynb
- Файл с реализацией замены фона, с использованием дообученной моделиfinal.py
- скрипт для инференса
Большое спасибо за внимание, особенно если дочитали до этого момента. Моё резюме - тут и тут. Способы связи: почта - firsov.sa20@gmail.com и мессенджер - https://t.me/schaft_192
Используемая литература