Проекты по машинному обучению и науке о данных лежат в основе некоторых программ магистратуры в этом году в Школе бизнеса Реда Маккомбса здесь, в Техасском университете в Остине, и один из уроков, которые мы проводили в этом семестре, был посвящен теме «Когнитивные вычисления». ». Наш класс вращался вокруг таких тем, как основы машинного обучения и нейронных сетей, генеративные состязательные сети (GAN), алгоритм верхней границы уверенности (UCB) и оптимизм перед лицом проблем многорукого бандита, и даже анализ предвзятости и этики в применимые модели, а также окончательный проект по их объединению. Этот проект был нашим шансом воплотить некоторые из этих тем в жизнь с помощью нашего собственного исследования последних достижений в мире науки о данных и привнесения ориентированного на бизнес мышления, чтобы понять значение, использование и важность машинного обучения и исследований нейронных сетей.

Мотив

Мы решили развить проект, над которым работал один из наших участников (Style Tansfer),

Классификатор стилей на основе CNN

которые применяли стиль одного изображения или произведения искусства к другому. В этом семестре мы попытаемся сменить тему домена одного изображения на предметную область другого изображения. Чтобы проиллюстрировать это, вот пример:

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

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

Истоки нашего проекта

Наш проект несколько раз менялся, прежде чем стал тем, чем он является сейчас. Сначала мы хотели создать набор моделей, которые могли бы создавать пластины грудинки и плавно размещать их на столе. Мы представляли себе что-то вроде того, «как бы мы все купили столько грудинки, сколько хотели, и положили ее на стол?» своего рода ситуация. Для этого мы хотели обучить GAN и другую сеть брать образы, сгенерированные из GAN, и каким-то образом помещать их на стол.

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

Наши цели

Мы хотели исследовать и создавать сети, которые могли бы анализировать заданную область изображения и применять ее к изображению за пределами области. Чтобы начать работу с этим, мы рассмотрели ряд существующих моделей, которые уже работали для такого рода проектов, но в документах, казалось, работали с наборами данных с большим количеством изображений, от 1000 до 10000 изображений. Имея это в виду, мы решили поработать над набором данных, который подходил бы для нашей темы, барбекю.

Сбор данных

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

Мы следили за несколькими проектами GitHub, чтобы посмотреть, сможем ли мы найти парсер, который мы могли бы адаптировать к нашим потребностям. Самым многообещающим парсером был проект (hhursev) [https://github.com/hhursev/recipe-scrapers], который использовал библиотеку Python под названием BeautifulSoup4 (bs4) для извлечения веб-страниц и очистки присутствующих HTML-элементов. После форка и пары часов работы с проектом мы начали успешно очищать изображения от AllRecipes только для того, чтобы наш ноутбук был заблокирован на их веб-сайте в течение нескольких минут (они отвечали пакетами сброса до установления успешного соединения). С тех пор мы решили использовать Selenium.

Раньше мы работали с Selenium в предыдущем классе, но было легко увидеть, насколько он полезен по сравнению с другими инструментами, поскольку Selenium фактически отображает страницы и имеет инструменты для неявного ожидания отрисовки определенных элементов, которые могут маскировать (в некоторой степени) активность. скребкового бота. Создание бота Selenium для очистки веб-сайта легко показало нам, что мы не можем копировать / вставлять эту функцию на другие веб-сайты, не выполняя огромного количества дополнительной работы, но работа над одним веб-сайтом перед переходом на другой определенно помогла нам понять, что мы искали с точки зрения HTML, например, захват элементов по именам тегов или именам классов, в зависимости от того, как мы могли перемещаться по сайту, чтобы достичь того, что мы хотели, и как сообщить Selenium, чтобы он получил это для нас. Это было бесценное знание, когда нам нужно было получить больше изображений с другого веб-сайта.

Один из самых важных уроков для нас при поиске собственных данных для проекта по науке о данных заключался в том, что работа с доменами, над которыми ранее не работали, требует очень много времени. Это было особенно важно, когда мы видели проекты, в которых некоторые модели преобразования изображения в изображение обучались с более чем 10 000 изображений. Нам удалось очистить только около 200 изображений из AllRecipes, прежде чем перейти к куриным крылышкам. Этот переключатель дал нам более 1000 изображений, но мы знали, что нам понадобится больше.

Наша потребность в большем количестве изображений побудила нас создать еще один скребок для GeniusKitchen и дала нам изображения более высокого качества, которые четко отображали содержание куриных крылышек, а не другие изображения, которые могли бы отображать куриные крылышки с боками или рядом с другими блюдами. В целом мы отобрали более 15000 фотографий с AllRecipes и GeniusKitchen, но в итоге использовали только около 3000 после просмотра фотографий. Понимание источников данных, которые вы хотите очистить, не только позволяет вам увидеть, с каким объемом данных вы можете работать, но и качество данных, что мы наивно не учитывали при выборе нашего домена или источников данных для начала. .

Посмотреть наши работы по скейперам можно здесь: https://github.com/huynhtastic/bbqjr/tree/chickenwings.

Наш новый проект: преобразование объектов

После нескольких попыток мы остановились на проектах по преобразованию объектов: перенос цвета и текстуры одной еды на другую. Для изображения A и изображения B преобразование объекта заменяет объект в изображении A другим объектом из изображения B.

Вот пример того, как работает преобразование объекта:

Пример. От человека в очках к человеку с бородой, от человека с бородой к человеку в очках

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

Для нашего нового проекта мы хотели преобразовать изображения «куриного крыла» в изображения «черничного маффина», используя модели GAN, хорошо известные как Object Transfiguration или Style Transfer, и сравнить их эффективность. Мы выбрали «куриные крылышки» и «черничные маффины» по нескольким причинам. Во-первых, для обоих объектов было достаточно качественных изображений. Качество изображений было особенно важно, потому что модели Python GAN для этого проекта очень чувствительны к подписям или разным объектам, кроме еды - основной еды. Таким образом, модель перестанет работать, если входное изображение содержит много объектов. Во-вторых, поскольку «куриные крылышки» и «черничные маффины» имеют существенные различия по цвету, рисунку и текстуре, мы ожидали, что результаты каждой модели будут явно отличаться от других.

Мы использовали следующие наборы данных для нашего нового проекта. Мы скопировали изображения с GeniusKitchen, веб-сайта рецептов еды, используя Python Selenium, как мы объясняли ранее в нашем блоге.

  • Набор A: Черничные маффины (812 вырезанных изображений)
  • Набор B: Куриные крылышки (812 вырезанных изображений)
  • Обучение (90%); Тест (10%)

GAN?

Первоначальная генерирующая состязательная сеть (GAN) - это модель, используемая для генерации контента. Этим контентом могут быть изображения, текст или музыка. Вассерштейн GAN (WGAN) является усовершенствованием исходной модели GAN. Сети WGAN были первой моделью, которую мы исследовали для создания нашего пиршества из грудинки. Мы много узнали об исходных моделях GAN и моделях WGAN из этой статьи: https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html

Выбор модели: DiscoGAN, CycleGAN, DualGAN и XGAN

Для нашего проекта Image (Object) Transfiguration требуется два GAN;

(Ссылка на изображение: https://www.youtube.com/watch?v=NyAosnNQv_U&t=347s)

Предположим, есть два домена изображений; X и Y. Генератор G принимает X и генерирует G (X), который должен быть близок к Y. Генератор F является обратным G, поэтому он принимает Y и генерирует F (Y), который нацелен на то, чтобы быть близким к X. ( 1) GAN1 имеет Генератор G и Dy. G (X), который нацелен на то, чтобы быть похожим на Y, сравнивается с Y с помощью Dy. (2) GAN2 состоит из генератора F и Dx. F (Y) сравнивается с X дискриминатором Dx. Кроме того, поскольку существует две сети GAN, все модели также измеряют два различных противодействия.

Идея реализации обратного сопоставления и наличия двух GAN распространена среди многих GANS для преобразования объектов, таких как DiscoGAN, CycleGAN и DualGAN. Для этих трех GAN мы также выбрали XGAN («Cross-GAN»), который представляет собой двойной состязательный автокодер (двунаправленный), который выполняет неконтролируемое преобразование изображения в изображение и фиксирует общее представление.

Теоретическое сравнение

1. DiscoGAN

DiscoGAN используется для изучения междоменных знаний с помощью GAN, обнаруживая отношения между двумя непарными, немаркированными наборами данных. Ядро модели основано на двух разных GAN, связанных вместе: каждая из двух связанных моделей изучает отображение из одного домена в другой, а также обратное отображение для реконструкции. Каждый GAN помечен как GAB и GBA, каждый G означает отображение сети генератора из домена A в B (GAB) или из домена B в A (GBA). Схема на рис. 2 ниже помогает понять, как это работает: XA - это входное изображение из домена A. Генератор GAB переводит XA в XAB в домене B. Сгенерированное изображение затем транслируется в изображение домена A XABA, чтобы соответствовать исходному входному изображению. XB, XBA, XBAB имеют аналогичную нотацию. В частности, GAB - это обратное отображение GBA.

DiscoGAN отличается от других сетей GAN своей функцией потерь. Генератор GAB принимает два типа потерь - потерю восстановления LCONSTA, которая измеряет, насколько хорошо исходный вход восстанавливается после последовательности из двух поколений, и стандартную потерю генератора GAN LGANB, которая измеряет, насколько реалистично сгенерированное изображение в области B.

В результате объединения двух моделей общие потери генератора являются суммой потерь GAN и потерь восстановления для каждой частичной модели. Аналогичным образом, общие потери дискриминатора LD представляют собой сумму потерь дискриминатора для двух дискриминаторов DA и DB, которые различают реальные и поддельные изображения области A и области B.

2. CycleGAN

CycleGAN очень похож на DiscoGAN, однако он вводит потерю согласованности цикла, которая аналогична концепции потери восстановления в DiscoGAN. Предположим, что область A и B и генератор G и F. Потеря согласованности цикла измеряет разницу между восстановленным изображением F (G (A)) с действительным A («потеря согласованности прямого цикла») и G (F (B)) с действительным B (“ потеря согласованности обратного цикла »), и цель состоит в том, чтобы свести их к минимуму. Однако между CycleGAN и DiscoGAN есть разница в измерении расстояния и структуре потери реконструкции (или потери согласованности цикла). Во-первых, CycleGAN измеряет расстояние согласованности цикла с потерями на шарнире, но DiscoGAN использует потерю MSE для потери восстановления. CycleGAN использует потерю согласованности за один цикл, в то время как DiscoGAN требует 2 потери восстановления для домена A и B.

3. DualGAN

DualGAN также является членом DiscoGAN, семейства CycleGAN, но он использует ошибку реконструкции, которая имеет аналогичную функцию с потерей согласованности цикла в CycleGAN и потерей восстановления при потере реконструкции в DiscoGAN. DualGAN измеряет расстояние с помощью MAE. Уникальной частью DualGAN является оценка членства, которая измеряет вероятность принадлежности G (A) целевому домену B или вероятность принадлежности F (B) целевому домену A, а DualGAN использует адаптивную к домену GAN для оценки оценки членства. Это работает как состязательная потеря в GAN.

4. XGAN (Cross-GAN)

Основная идея XGAN отличается от CycleGAN, DiscoGAN и DualGAN. XGAN также является непарным преобразованием изображения в изображение, но в нем недавно была потеряна семантическая согласованность. XGAN изучает общее «семантическое представление» домена A и B, а также уникальное семантическое представление A и B. XGAN минимизирует потерю семантической согласованности, чтобы гарантировать, что преобразование изображения в изображение сохраняет семантическое представление. Минимизация потери семантической согласованности - это способ самоконтроля для сохранения семантической информации на уровне функций, а не на уровне пикселей. Это особенно важно, когда очертания (или форма) объектов различаются, поскольку это помогает выходному изображению сохранять форму плавной. Например, CycleGAN, который измеряет только согласованность цикла на уровне пикселей, часто показывает низкую производительность в случае двух существенно разных по форме объектов, неспособных уловить общую семантику высокого уровня (например, изображение лица к лицу).

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

Сравнение моделей

Перед тем, как сравнивать наши результаты, воспользуйтесь простой сравнительной таблицей архитектуры моделей. Здесь я не добавил XGAN, потому что он имеет совершенно другую архитектуру модели по сравнению с DiscoGAN, CycleGAN и DualGAN.

  • Генератор DiscoGAN следует структуре кодер-декодер, такой как DCGAN, и это может привести к низкому разрешению изображения.
  • Из нескольких исследований CycleGAN показал хорошую производительность в преобразовании цвета и текстуры одного домена в другой при обучении, но не смог добиться успеха при тестировании, особенно в случае соседних объектов, например человека, едущего на лошади. CycleGAN (horse2zebra) перевел рисунок зебры как на лошади, так и на человеке.

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

DiscoGAN / CycleGAN / DualGAN

Результаты

Мы запустили DiscoGAN в Pytorch, а остальные GAN в Tensorflow. По какой-то причине DiscoGAN продолжал генерировать черное изображение, здесь мы будем сравнивать только результаты CycleGAN, DualGAN и XGAN.

1. XGAN

Кажется, что XGAN, хотя на бумаге он был наиболее многообещающим, небольшое количество времени на обучение (и небольшое количество эпох = 100) не могло дать нам ничего полезного.

2. Выход DualGAN

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

3. Выход CycleGAN

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

(Тестирование с изображениями, отличными от куриных крылышек и черничных кексов)

Однако, по сравнению с DiscoGAN, CycleGAN успешно выполняет преобразование объектов, не меняя текстуры объектов, кроме куриных крылышек и черничных маффинов.

Выходное полное сравнение

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

Модельные среды и конфигурации серверов

Мы взяли многое из того, что узнали из предыдущего проекта по переносу стилей, и применили это в этом проекте. Работа с большим набором данных изображений позволила нам понять, какая конфигурация нам нужна для запуска этих GAN. В отличие от предыдущего проекта переноса стилей, где мы настроили одну виртуальную машину с поддержкой графического процессора в облаке Google, мы использовали предварительно настроенные экземпляры Paperspace. Использование Paperspace позволило нам обойти многие проблемы, с которыми мы столкнулись при настройке виртуальной машины GPU с нуля, таких как настройка отдельных виртуальных сред с желаемыми инструментами Linux или модулями Python или установка и настройка TensorFlow для взаимодействия с графическим процессором nVIDIA.

Используя Paperspace, некоторые из нас развернули конфигурации Gradient, а другие использовали конфигурации Paperspace Core. Развертывание сочетания конфигураций серверов позволило нам проявить гибкость: экземпляры Gradient P4000 и P5000 для быстрого развертывания и тестирования и настроенный экземпляр Core для выполнения низкоуровневой отладки и запуска предварительно настроенных моделей, которые требовали изменений, таких как требования для различных Python или TensorFlow. среды или разные драйверы CuDNN. Это помогло нам быстро настроить и запустить несколько моделей параллельно в рамках нашего ограниченного графика.

Извлеченные уроки

Из-за проблем, с которыми мы столкнулись при работе над этим проектом, мы сделали ряд выводов, которые, как мы сочли, будут полезны для будущих личных и рабочих проектов в области науки о данных.

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

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

При работе с любым типом модели важно понимать архитектуру сервера, с которой вы работаете. Это важно для отладки, поскольку практически невозможно просто клонировать репозиторий и ожидать, что он сразу запустится. Множество проблем с графическим процессором, с которыми мы столкнулись, потребовали установки новых драйверов CuDNN и установки этих драйверов для среды нашей ОС. Другие проблемы возникли из-за некоторых моделей, требующих настройки для Python 2, и других, требующих среды Python 3. Понимание оборудования, ОС и среды Python позволило нам быстро устранять ошибки выполнения, поэтому мы могли тратить больше времени на работу с применением моделей, вместо того, чтобы ломать голову над исправлением ошибок.

Наконец, работа с CycleGAN и DualGAN затрудняла создание реалистичных изображений. Спринг-роллы с куриными крылышками не создают реалистичных фотографий, как и куриные крылышки с черничными маффинами. Модели преобразования изображения в изображение не дают хороших результатов при использовании доменов разной формы (люди обычно не пекут кексы в форме куриных крылышек). Чтобы действительно получить более качественные результаты при работе с этими двумя GAN, в идеале мы должны выбрать домены, которые могут использоваться для изменения цветовых схем (например, как фотография будет выглядеть весной или осенью), или домены с похожими формами. и может выглядеть реалистично при изменении цвета и текстуры.

Вот и все для этого проекта. Спасибо за чтение!

Ссылка