Skip to content

Schaft-s/Case_CV

Repository files navigation

Кейс по компьютерному зрению - отбор на смену в Сириус.

Условие здесь.

Анализ поставленной задачи.

Здесь описаны основные ступени решения кейса, а также мои идеи решения каждой из них.

1. Удаление фона

  • Анализ задачи: Изучение различных алгоритмов сегментации, таких как:
    • Классические подходы: Пороговые модели, цветовая сегментация, K-means clustering.
    • Современные подходы: Fully Convolutional Networks (FCN), DeepLab, UNet.
  • Выбор и реализация подхода:
    • Обоснование выбора UNet.
    • Разметка данных.
    • Обучение UNet на размеченном датасете (item vs. background).
  • Метрики для оценки удаления фона:
    • Intersection over Union (IoU) для оценки точности сегментации.
    • Визуальная проверка результатов на тестовых изображениях.

2. Замена фона

  • Анализ задачи: Казалось бы не стоит запариваться и нужно лепить подготовленную текстуру. Хотя можно было бы придумать методы генерации интересного фона на основе цветов изображения, или подходящих по смыслу. (сгененрировать сначала описание, на основе него анализировать на каком фоне должен быть объект)
  • Реализация:
    • После сегментации, замена фона на одноцветную текстуру (выбор из 10 пастельных цветов).
    • Добавление функции выбора фона из предложенного набора (из загруженных текстур).
    • Добавление возможности генерации фона с градиентом цветов. захотелось, нравится)
    • Обеспечение естественного наложения фона без резких границ. (пока не узнал как сделать, но явно нужно и наверное можно)

3. Генерация описания товара

  • Надо выделить признаки из фото, делается энкодерной частью UNET или просто взять предобученную другую сеть (ResNet тот же)
  • После эти признаки подать в модель для создания текста. GPT-2 подойдёт если я правильно понимаю.
  • По хорошему надо дообучить, хотя бы последние несколько слоёв, но для этого нужна текстовая разметка над картинками...
  • Из метрик знаю такие..
    • BLEU или ROUGE для оценки качества текста (сравнение с эталонными описаниями).
    • Или вручную создать какие-то правила для оценки точности информации.

На мой взгляд самая интересная часть кейса - это именно решение задачи напрямую связанной с CV (первый пункт). Поэтому бо'льшая часть времени была потрачена на эту часть, поэтому бо'льшее внимание будет уделено ей. Решение кейса:

1. Анализ и обоснования выбора способа решения для задачи сегментации фона

1.1.1 Методы для сегментации изображений:

  1. Пороговые методы:
    • Способы сегментации на основе анализа яркости пикселей.
    • Не подходят из-за частой схожести цветов объекта и фона
  2. Сегментация на основе цветовых моделей:
    • Использование цветовых моделей для разделения объекта и фона.
    • Не подходит по той же причине.
  3. Кластеризация (Clustering):
    • Например, алгоритм K-means могут быть использованы для сегментации на основе пиксельных кластеров.
    • Вроде работает лучше, чем простые пороговые методы.
    • Проблемы - требует настройки параметров, сложно добиться точных результатов без предварительной обработки изображений.
  4. Графовые методы (Graph-based segmentation): честно говоря не до конца разобрался.. просто знаю что существуют
  5. Алгоритмы на основе глубокого обучения:
    • Например, Fully Convolutional Networks (FCN), SegNet, DeepLab, и UNet.
    • Плюсы: способны обрабатывать сложные сцены, хорошо справляются с артефактами на границах, высокое качество сегментации.
    • Минусы: требуют большого объема данных для обучения, относительно сложная модель. Также требуют размеченных данных (((((((
    • Так как нейронки часто показывают лучший результат и сейчас являются state-of-the-art то остановился на них.

1.1.2. Обоснование выбора UNet:

  • UNet была выбрана как baseline модель, которая в итоге показала отличные результаты, на ней и остановился. Это архитектура, специально разработанная для сегментации изображений и широко применяется в медицине и других областях, требующих высокой точности. image

  • Преимущества UNet:

    • Симметричная архитектура с пропуском связей: слои кодирования передают информацию напрямую в соответствующие слои декодирования, что позволяет более точно восстанавливать детали границ объекта.
    • Устойчивость к малым объемам данных
    • Высокая точность
    • Гибкость: модель легко дообучать

1.2. Реализация сегментации фона. Часть 1. Разметка....

Подготовка датасета

  • Первоначально надо собрать данные.
    • По заданию был выдан архив, поэтому взяли фото из него.
    • Половина жутко не понравились, но как бы задание есть задание.
  • Далее нужно разделить их на train, validation, test.
    • В связи с тем что данных немного - test=validation.
    • Отобрали 50 почти случайных картинок и отложили их в отдельную папку - test.

Разметка в CVAT

  • Для обучения нейросетей нужны данные с правильными ответами, то есть в нашем случае - с разметкой.
  • Для получения разметки был выбран инструмент CVAT.
  • Если в рассказе пропустить несколько дней потраченных на разметку, то вот результат:
    • После обработки получились 355 фото на тесте и 50 на валидации. (чуть перетасовал добавив больше сложных примеров тест, а ещё часть потерял...)
    • Разметка происходила на два класса - item и backgroung
    • Все изображения представлены парой .jpg и .png с одинаковыми названиями, первое - изначальное изображение, второе - маска.
    • Вроде это называется формат CamVid 1.0 image

1.3. Реализация сегментации фона. Часть 2. Предобработка, обучение и результаты

  • Далее предстоит долгий разговор про обучение модели. Файл тут, иногда даже комментарии есть. Он основан на множестве туториалов из интернета, сслыки приведены в конце этого файла.
  • По существу:
    • Пользуемся torch и segmentation_models_pytorch
    • Вначале установили гиперпараметры: эпохи, размер батча итд.
    • Далее создали функции визуализации изображений и маски, а также Dataloader. Проверили работоспособность.
    • Далее необходимо настроить аугментации, так как их можно сделать много, а датасет как раз маленький. Пользуемся albumentations. (на тест меньше аугментации добавили, только самое адекватное)
      • горизонтальная и вертикальная симметрия
      • паддинг, обрезка и сдвиги
      • шумы
    • Далее взяли предзагруженную модель с весами полученные после обучения на ImageNet.
    • В качестве метрик взяли IOU и Fscore, оптимизировали Adam-ом по Diceloss-у.
  • Графики результатов обучения, а также сравнение полученных масок с groundtrue можно видеть ниже..
  • (итоговые модели сохранялись в формате .pt-.pth и оказались достаточно объёмными, в итоге не хотят загружаться на гитхаб, скину по требованию, если что - почта firsov.sa@phystech.su)

Анализ результатов

  • В целом объяснимы такие графики за счёт малости датасета и ужаса данных и разметки. В валидационные были выбраны и хорошие и плохие фото, но видимо плохих чуть меньше. (я пытался чутка переложить данные, но картина меняется не сильно, нельзя оставить только плохие на валидации)

  • Итоговые метрики: dice_loss - 0.02511, fscore - 0.9752, iou_score - 0.9555

  • Понятно, что неидеально и можно добить до лучшего качества, для этого в первую очередь не хватает датасета, на мой взгляд. Так что можно переходить к следующей части.

2. Замена фона

  • Реализованы 3 подхода:
    • Заливка сплошным фоном. Сделал функции и ячейку для выбора пользователем цвета из 10 пастельных.
    • Замена на предзагруженный фон (фото текстуры). Также 5 вариантов предоставлены пользователю.
    • Заливка фона градиентом. Пока не дописал, но можно сделать чтобы цвета для градиента тоже выбирались. (2 строчки)
  • Результаты работы ниже, по сути ничего интеллектуального. Можно придумать что-то с анализом цветов, но вот возьмите на работу - там буду все силы выжимать из себя и все фичи пилить, ради реального проекта не жалко.
  • Качество навпрямую зависит от качеств сегментации.

3. Генерация описания

  • По плану было научиться выделять признаки с фото, примерно для этого оставить только первые 5 слоёв UNET (энкодер) или взять ResNet и убрать последний слой.
  • Это ещё сделал, но дальше работу с GPT-2 не наладил, так что пока только в теории понимаю как это сделать.
  • Также уверен что было бы качество текста плохое, ведь нет возможности дообучить, так как отсутствует текстовая разметка. Создавать её совсем нет времени.

Итого

  • Итоговый проект представлен в этом репозитории файлами:
    • camvid-dataset.rar - датасет с разметкой и разделением на train-test
    • main_file_segmentation.ipynb - Основной файл с решением задачи сегментации item-background, дообучаем UNET
    • part_2_change_background.ipynb - Файл с реализацией замены фона, с использованием дообученной модели
    • final.py - скрипт для инференса

Большое спасибо за внимание, особенно если дочитали до этого момента. Моё резюме - тут и тут. Способы связи: почта - firsov.sa20@gmail.com и мессенджер - https://t.me/schaft_192


Используемая литература

  • Сегментация на UNET статья
  • Курс по CV на практике. Видеозаписи помогающие разобраться с запуском базовых моделей. тут
  • Туториал по настройке UNET тут
  • CVAT
  • Туториал по разметке в CVAT.
  • Курс лекций Воронцова и advanced курс от Нейчева.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published