Название статьи

Кто мы

Привет, Habr! Я Дима Савелко, лид из команды нейро-сети.рф, мы специализируемся на разработке сервисов на основе AI для решения бизнес-задач реального сектора экономики. Для этого активно применяем GenAI(ЛЛМки, Диффузионные модели), NLP и CV. Наша цель - приземлить ИИ до реальных продуктовых и бизнес-задач, по-простому рассказать обо всем вокруг ИИ для всей интересующейся публики. Легче всего объяснять на конкретных проектах. Поехали!

На днях под наш нож попали диффузонки и в этой статьемы вам расскажем, как и зачем нужно генерировать картинки, в нашем случае реалистичные концепты архитектурных объектов, с помощью ИИ и за минимальное количество ресурсов

Бизнес постановка

Сделать в краткие сроки MVP сервиса генерации тематических картинок по запросу бизнеса. Например при вводе запроса заказчик должен получить образы зданий, животных или людей в костюмах, а также описать образ конечного продукта

Мы начали с генерации картинок храмов как архитектурных объектов, но наш сервис подходит для любой тематики.

Итог: Наш сервис позволяет экономить время на реализацию проектов, когда необходимо генерировать концепты, искать инсайты, покреативить вместе с ИИ. Бизнес экономит деньги, заказчики получают быструю обратную связь по концептам в виде тематических мудбордов.

Сервис отличается от MidJourney, DALLE и других нейросетей тем, что решение получается специализированное - мы обучаем ИИ под доменные данные компании, чтобы сделать генерацию более подходящей под требования.

Назначение сервиса:

  • Быстрое прототипирование для эффективного поиска решений.

  • Снижение затрат на разработку концепции.

  • Расширение аудитории и повышение репутации компании за счёт внедрения инноваций.

Целевой решение может:

  • Генерировать картинки на основе описания (Text-to-Image)

  • Генерировать другие картинки на основе картинок (Image-to-Image)

  • Изменять окружение в выделенной области (ImageArea-to-Image)

  • Генерировать 3D модели на основе картинки

Дата-блок

Сбор данных

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

Но иногда открытых наборов данных нет, и приходится собирать данные самому. Для последнего проекта мы написали мультипоточный парсер Яндекс-картинок, чтобы получить как можно больше нужных нам картинок. Правда, у таких сервисов есть защита от парсинга -после первых нескольких похожих запросов мы стали получать капчу. Мы адаптировали наш парсер и перепоручили разгадывание капчи. Вуаля, необходимый тестовый набор данных собран.
Очистка и анализ датасета

МЫ собрали все, что можно для MVP сервиса. Но перед стартом обучения нужно почистить датасет, то есть избавиться от мусора и оставить только качественные данные. Датасет для диффузионной модели состоит из картинки и описания. Чистота датасета определяется тем, насколько качественна картинка отображает доменную область и насколько подробно описана картинка.

Например:

  • Качество картинки: нам не нужны картинки животных в датасете, если мы хотим генерировать здания, или нам не нужны картинки собак, если мы хотим белых лошадей.

  • Качество описания: подробное описание, например: "Белая лошадь с пышной гривой, с гордой походкой и в доспехах из серебристого железа, на которой сидит рыцарь в сверкающих на солнце доспехах…"

Как выглядит процесс очистки и анализа датасета. Объясняем просто:

Представь, что у тебя есть огромная коробка с разноцветными кубиками. Твоя задача — отсортировать эти кубики по цветам и формам, чтобы в итоге у тебя получились красивые и аккуратные группы. Но в коробке также есть кубики, которые выглядят странно и не подходят ни к одной группе — их нужно будет отложить в сторону. Вот такой же задачей я занимался, только вместо кубиков у меня были картинки.

  1. Извлечение эмбеддингов картинок с помощью ViT: Представь, что каждый кубик — это картинка. Чтобы понять, какие кубики похожи друг на друга, нам нужно сначала "посмотреть" на них. Для этого я использовал специальные очки, которые называются ViT. Эти очки помогают "увидеть" не просто цвет и форму, но и множество других деталей, которые не всегда заметны на первый взгляд. Когда я "смотрел" на картинки через эти очки, я мог легко определить, какие из них похожи друг на друга.

  2. Сжатие с помощью UMAP: Теперь, когда у меня есть много информации о каждой картинке, мне нужно это всё как-то упростить, чтобы было проще работать. Я использовал волшебную лупу, которая называется UMAP. Эта лупа помогла мне "сжать" всю информацию так, чтобы сохранить самое важное и избавиться от лишнего. Таким образом, я мог легче сравнивать картинки между собой.

  3. Кластеризация с помощью HDBSCAN: Затем я использовал специальный компас, который называется HDBSCAN. Этот компас показал мне, как лучше всего сгруппировать картинки (то есть кубики), основываясь на том, как они похожи друг на друга после "сжатия". Компас помог мне создать красивые и чёткие группы картинок, которые имели много общего.

  4. Удаление шумных картинок: В конце концов, я обнаружил, что некоторые картинки не подходят ни к одной группе. Это были "шумные" картинки — такие, которые выглядели слишком странно или необычно по сравнению с остальными. Я решил их убрать, чтобы они не мешали красоте и порядку моих групп картинок.

Весь этот процесс я делал для того, чтобы очистить данные для диффузионной модели.

Вот как выглядело сортировка кубиков по цветам (группам), то есть картинок по группам. На картинке ниже каждая точка - это картинка и, как можно увидеть, картинки после данного анализа получили определенную структуру и классы, где каждая группа - это определённый цвет.

Для большего понимания, вот примеры нескольких групп:

В этой группе выделились исландские храмы

Вот ещё одна из групп:

И вот пару примеров:

После выделения групп кластеров мы выкинули ненужные для нас картинкии стали думать над тем, как сделать для них человекопонятное описание.

Чтобы создать хорошие и чистые подписи к картинкам, можно обратиться или к копирайтерамили к API OpenAI. Если дать API OpenAI, а именно отправить в GPT-4 картинку и промпт с просьбой подробно и чётко описать картинку, такие данные будут называться синтетическими, то есть сгенерированными с помощью другого ИИ.

Бизнес-процесс

Верхнеуровневые требования

Решение состояло из создания сервиса, в котором пользователь вводит информацию об объекте - это может быть описанием объекта или картинка, на основе которой пользователь хочет сгенерировать похожее изображение.Далее для бизнес-пользователя происходит магия искусственного интеллекта и на выходе наш клиент получает готовые генерации, то есть картинки.

Задачи, которые можно выполнить (писали о них выше, но напомним еще раз):

  • Генерировать картинки на основе описания (Text-to-Image)

  • Генерировать другие картинки на основе картинок (Image-to-Image)

  • Изменять окружение в выделенной области (ImageArea-to-Image)

  • Генерировать 3D модели на основе картинки

В Text-to-Image пользователь вводит:

  • Название объекта

  • Стиль, в котором он хочет изобразить объект

  • Второстепенные объекты или детали

  • Окружение, в котором объект должен находиться

  • Дополнительная информация об генерации - цели генерации и тд

Доступен ввод параметров картинки:

  • Количество изображений

  • Разрешение

  • Пост обработка

Как итог, пользователь получает:

  • Сгенерированные картинки на основе текста

  • Возможность перегенерировать, изменить / продолжить генерацию

В Image-to-Image:

  • Изображение

  • Уточнения по генерации

Как итог, пользователь получает:

  • Сгенерированные картинки на основе других картинок

  • Возможность перегенерировать, изменить / продолжить генерацию

В ImageArea-to-Image:

  • Зона, в которой нужно изменить изображение

  • Уточнения по генерации

Как итог, пользователь получает:

  • Сгенерированные картинки на основе выделенной области

  • Возможность перегенерировать, изменить / продолжить генерацию

Обучение

Давайте поговорим про обучение диффузионной модели. Вспоминаем уроки рисования – нам они сейчас пригодятся:

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

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

В этой аналогии:

  • Большой лист бумаги с случайными мазками и разводами - это начальные "шумные" данные, с которых начинается процесс обучения диффузионной модели.

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

  • Конечная красивая картина - это результат работы диффузионной модели, то есть данные (или изображения), которые модель генерирует после обучения.

Диффузионные модели обучаются, "промакивая" и "очищая" данные множество раз, до тех пор пока не научатся создавать из "шумных" данных красивые и чёткие картинки (или другие типы данных), очень похожие на настоящие. Это позволяет использовать их для создания реалистичных изображений, музыки, текстов и других видов данных.

Вот пример того, как с помощью промакивания волшебной губки получается твоя конечная красивая картинка:

В процессе разработки нашего сервиса мы столкнулись с выбором: использовать уже готовую диффузионную модель или обучить свою собственную. Это важное решение, которое влияет на множество аспектов, таких как затраты времени, ресурсов и качество конечного продукта.

Мы решили сравнить два подхода:

  1. Дообученная диффузионная модель с помощью LORA: В этом случае мы берем базовую модель и обучаем её под наши конкретные задачи. Чтобы лучше понимать, что такое LoRA, представьте, что у вас есть эксперт, который знает очень много всего, но не знает глубоко какой-то вашей доменной темы.С помощью LoRA вы обучаете его под узкую задачу, применяя ваши данные и широкие знания эксперта. Так вот, обучение эксперта может занять много времени и потребовать значительных вычислительных ресурсов.

  2. Готовая диффузионная модель SDXL с Prompt weighting. Здесь мы используем уже готовую модель и настраиваем её поведение с помощью специальных "подсказок" (prompts), что позволяет нам добиться нужных результатов без дополнительного обучения. Другими словами, вы даёте инструкцию эксперту,делая интонацию на более важные для вас слова.

Для справки:

LoRA — это метод, который помогает быстрее и проще обучать модели, не начиная всё с нуля.

Prompt weighting — это способ давать модели точные указания или "подсказки", чтобы она выполняла задачи так, как вам нужно.

SDXL — это просто название одной из таких умных моделей.

Результаты сравнения

После проведения экспериментов оказалось, что второй вариант — использование готовой модели SDXL с настройкой через Prompt weighting — показал себя лучше. Он оказался более эффективным и менее затратным по времени и ресурсам.

Лучше всегда начинать с использования базовой модели.Часто так бывает, что самые простые и базовые подходы могут иметь большую эффективность, чем навороченные методы с точки зрения экономической эффективности и получения требуемого бизнес-результата. Выражаясь продуктово, если ваша задача съездить в соседний магазин за буханкой хлеба вам не нужен бугати- для этой задачи вполне сгодитсясамокат или даже собственные ноги ?. Базовая модель помогает выстроить другие элементы архитектуры. Вам нужно построить любую машину, чтобы добраться от точки А в точку Б. Бывает так, что команды начинают с какой-то одной незначимой для бизнеса детали и шлифуют ее до совершенства, например начинают делать руль Но зачем делать самый красивый и функциональный руль без машины? Так и происходит тогда, когда вы сконцентрированы на обучении модели и забыли про остальные элементы системы.

Важный вывод

Этот опыт показал нам важный урок: обучение модели не всегда является самым разумным подходом с точки зрения экономии денег, ресурсов, качества и времени. Всегда стоит начинать с базового решения и только при необходимости переходить к более сложным и затратным методам.

Практическое значение для бизнеса

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

Некоторые аспекты использования решений ИИ:

Плюсы и минусы:

  • Авторское право

    • Права над картинками, которые были сгенерированные с помощью нашего сервиса, будут принадлежать компании заказчику

    • Но и все иски принимать тоже компании-заказчику

  • Наличие поддержки собственных специалистов и специфичные для архитектуры настройки

    • Собственные разработчики позволяют очень гибко настроить систему под собственные требования

    • Но они могут обойтись вам дорого, так как грамотных специалистов на рынке довольно таки тяжело найти

  • оффлайн режим

    • Вы можете хранить ваши вычисления в вашем контуре и запускать столько, сколько хотите

    • Вам придется оплачивать сервера для вычислений

  • Кастомные датасеты / дообучение модели

    • Самый главный плюс - это дообучение под ваши данные, который даёт огромный прирост для качество генерации под вашу доменную задачу.

Ссылки

Полезные ссылки:

https://habr.com/ru/companies/odnoklassniki/articles/773578/

https://habr.com/ru/articles/756006/

https://huggingface.co/docs/diffusers/main/en/training/lora

https://huggingface.co/blog/stable_diffusion

Контакты

нейро-сети.рф - наша команда

@eboutdatascience - Мой личный телеграм канал, там я рассказываю об Data Science, RoadMap, Собеседования и проектирование систем

@ngmdite - Мой ТГ

Комментарии (6)


  1. Fardeadok
    01.06.2024 18:53
    +4

    Ноль полезной инфы


    1. ngmdite Автор
      01.06.2024 18:53

      Привет!
      Это наша первая статья и хочется развиваться дальше в этом направлении. Я понимаю, что сейчас не всё идеально, поэтому подскажи, пожалуйста:
      - Что ты ожидал? / Что ты получил ?
      - Что хотелось бы получить? (Больше технички, больше бизнесовой части)
      - Какие плюсы статьи / Какие минусы статьи

      Любая конструктивная критика важна, чтобы улучшать продукт, поэтому я буду очень благодарен если ответишь и дашь более открытую рецензию)


  1. LiliJulie
    01.06.2024 18:53
    +2

    Как построить AI-сервис и не прогореть на этом

    Вопрос остается открытым, я так понимаю


    1. ngmdite Автор
      01.06.2024 18:53

      Привет!
      Это наша первая статья и хочется развиваться дальше в этом направлении. Я понимаю, что сейчас не всё идеально, поэтому подскажи, пожалуйста:
      - Что ты ожидал? / Что ты получил ?
      - Что хотелось бы получить? (Больше технички, больше бизнесовой части)
      - Какие плюсы статьи / Какие минусы статьи
      - Какой вывод ты бы хотел получить в конце ?

      Любая конструктивная критика важна, чтобы улучшать продукт, поэтому я буду очень благодарен если ответишь и дашь более открытую рецензию)


  1. digtatordigtatorov
    01.06.2024 18:53

    Статья Кал и получает Кол, если, конечно, авторы уже не на Нем


    1. ngmdite Автор
      01.06.2024 18:53

      Привет!
      Это наша первая статья и хочется развиваться дальше в этом направлении. Я понимаю, что сейчас не всё идеально, поэтому подскажи, пожалуйста:
      - Что ты ожидал? / Что ты получил ?
      - Что хотелось бы получить? (Больше технички, больше бизнесовой части)
      - Какие плюсы статьи / Какие минусы статьи
      - Какой вывод ты бы хотел получить в конце ?

      Любая конструктивная критика важна, чтобы улучшать продукт, поэтому я буду очень благодарен если ответишь и дашь более открытую рецензию)