Содержание

AI генератор лиц — создание фотографий несуществующих людей

Generated.photos - позволяет вам сгенерировать фотографию несуществующего человека.  Генерация произвольных реалистичных лиц с помощью ИИ. Все портреты модельные. Вы можете генерировать необходимые вам фотографии онлайн и использовать их в коммерческих целях.

https://generated.photos/faces

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

Генерируйте фотографии людей любого возраста, пола и разного этнического происхождения.

Где используются сгенерированные фотографии

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

  1. Игровая индустрия
  2. Анонимность в сети
  3. Арт-проекты
  4. Коммерческий сегмент
  5. Научные исследования
  6. Дизайн

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

Генерация произвольных реалистичных лиц с помощью ИИ.

В UI дизайне этот сервис можно использовать в качестве аватар для проекта.

Часто, подобный проект может выручить когда вам надо сделать продукт с таргетом на разные рынки.


Другие похожие проекты

Есть еще один интересный проект на эту тему. Разработчик Филипп Ван, когда-то работающий в Uber, создал сайт Thispersondoesnotexist.com — генератор лиц людей, которых не существует в реальной жизни.

Генератор лиц

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


⚡ Если тебе понравился этот материал, ты можешь подписаться на мой  Instagram / Facebook / Medium / Linkedin. Там ты найдешь больше интересных материалов о дизайне.

QR Code Generator | Create Your Free QR Codes

1

QR-код – это двухмерный штрихкод, который состоит из черных и белых пикселей и позволяет кодировать до нескольких сотен символов. Сохраненную в коде информацию можно затем расшифровать и посмотреть при помощи смартфона или планшета. «QR» означает «Quick Response» (быстрая реакция), такое название объясняется большой скоростью сканирования.

2

Благодаря стремительному распространению смартфонов сегодня QR-коды чаще всего используются для мобильного маркетинга. Печатные материалы, такие как флаеры, плакаты, каталоги или визитки, можно дополнить цифровой информацией, например, веб-сайтами, видео, PDF, фотогалереями или контактными данными. Возможности использования QR-кодов практически безграничны.

3

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

4

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

5

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

6

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

7

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

8

Наряду с соответствующим форматом файла при печати необходимо принимать во внимание дополнительные параметры. Как правило, размер оттиска кода необходимо выбирать в зависимости от количества зашифрованных символов. Чем больше информации шифруется, тем больше требуется места. Кроме того, должно быть обеспечено удобное взаимодействие с пользователем, и код должен считываться без труда. Практика показала, что зачастую достаточно размера не менее 2 x 2 см. Следует воздержаться от размещения QR-кода на неровных поверхностях. Если проспекты или флаеры перегибаются, это также может негативно повлиять на считываемость кода.

9

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

10

Встаньте на место Вашей целевой аудитории и задайте себе вопрос, стали бы Вы сканировать изображенный код. Вам интересно, что скрывается за кодом? Можно ли ожидать дополнительной выгоды? Пользователи затрачивают усилия, чтобы ознакомиться с Вашей рекламой – поэтому предложите им дополнительную выгоду. Оказалось, что использование мобильного веб-сайта с интересным контентом, адаптированным к размеру экрана смартфона, является фактором успеха. К тому же, код с индивидуальным дизайном, например, с Вашим логотипом, является гарантом большего количества сканирований. Такое указание, как например, «Отсканируйте код и узнайте больше», еще более усиливает данный положительный эффект.

11

Практические свойства QR-кода были использованы еще в 1994 году. Denso Wave, японская дочерняя фирма компании Denso, поставщика корпорации Toyota, разработала коды для маркировки узлов и компонентов, чтобы ускорить логистические процессы в сфере производства автомобилей. В Японии, стране происхождения QR-кодов, они сейчас встречаются повсеместно: Практически на каждом рекламном носителе имеется такой код. Японская иммиграционная служба снабдила QR-кодами даже виды на жительство. В Европе популярность QR-кодов также стремительно растет. Сегодня они стандартизированы на международном уровне, очень надежны и считываются даже в том случае, если повреждено или скрыто до 30% их площади.

12

Возможности применения QR-кодов практически безграничны. Особенно на базе URL-адреса можно шифровать самую разную информацию. Сюда относятся домашние страницы, веб-сайты с описанием продукции, видео, фотогалереи, купоны, розыгрыши, контактные формуляры или информационные рассылки, а также страницы в соцсетях. Кроме того, многие другие возможности применения не требуют соединения смартфона с Интернетом. Можно шифровать записи календаря о предстоящих мероприятиях, WiFi-соединения или контактные данные в виде виртуальных визиток (vCard), и затем пользователь может сохранять их в свой мобильный телефон. При этом QR-коды можно отображать на веб-сайтах, вставлять в печатные объявления или наносить на продукты, а также на все прочие ровные поверхности.

Бензиновый генератор PRAMAC E5000 по цене 0 руб - отзывы, характеристики, фото

Максимальная мощность на 220В, кВт:

4,6

Номинальная мощность на 220В, кВт:

3,9

Напряжение, В:

230

Коэффициент мощности, cosφ:

0.9

Наличие автозапуска — АВР:

Нет

Исполнение:

Открытое на раме

Тип генератора:

синхронный

Модель двигателя:

Honda GX270

Тип двигателя:

4-х тактный, воздушного охлаждения

Количество цилиндров:

1 наклонн.

Мощность двигателя, л.с.:

8.4 л.с. (6.3 кВт) - 3600 об/мин

Объем двигателя, см3:

270

Частота вращения двигателя, об/мин:

3000

Система охлаждения:

Принудительная воздушная

Система запуска:

Ручной стартер

Топливо:

Бензин АИ-92

Объем топливного бака, л:

5.3

Расход топлива, л/ч:

1.6 - при 75% наргузке

Объем системы смазки, л:

1.

1

Рекомендуемое масло:

SAE 10W-30

Уровень громкости на расстоянии 7 м, Дб(А):

72

Габаритные размеры, мм:

715x540x490

Защита генератора:

IP 23

Защита розеток:

IP 54

Гарантийный срок, мес:

12

Нейросеть FaceStyleGAN генерирует портреты из селфи в Snapchat

Исследователи из Snap Inc. и Чешского Технологического Университета обучили нейросеть, которая из фотографии пользователя генерирует портрет в желаемом стиле. Пользователь выбирает изображение портрета, на который нейросеть будет опираться при переносе стиля, и сеть в реальном времени генерирует портрет пользователя. Результаты FaceStyleGan сравнимы со state-of-the-art решениями.

Видеодемострация работы FaceStyleGAN

Архитектура нейросети

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

Генеративная нейросеть делится на генератор и дискриминатор. В качестве генератора исследователи модифицировали Perceptual Loss модель от Стэнфорда. Для дискриминатора исследователи взяли PatchGAN архитектуру.

Архитектура модифицированного генератора

Сравнение работы FaceStyleGAN с SOTA решениями

В рамках экспериментов исследователи сравнивали нейросеть с текущими state-of-the-art решениями в стилизации изображений и в генерации из изображения в изображение: FaceStyle, Liao et al., starGAN, Selim et al., Gatys et al., pix2pixHD и pix2pix.

Исследователи попросили 194 респондента дать рейтинг того, как хорошо сгенерированные FaceStyle и FaceStyleGAN портреты передают стиль входного портрета. Оценка выставлялась  от 1 до 10, где 1 — очено плохо, а 10 — очень хорошо. Исследователи затем сравнили результаты с помощью статистического теста. Тест показал, что оба алгоритма показали схожие результаты (средний рейтинг для обоих подходов был 6.8).

Визуальное сравнение работы моделей

Проверка орфографии и пунктуации онлайн, проверить правописание

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

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

Инструмент поддерживает 4 языка.

Орфография

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

Что входит в проверку текста?

  • грамматические ошибки;
  • стиль;
  • логические ошибки;
  • проверка заглавных/строчных букв;
  • типографика;
  • проверка пунктуации;
  • общие правила правописания;
  • дополнительные правила;

Грамматика

Для поиска грамматических ошибок инструмент содержит более 130 правил.

  • Деепричастие и предлог
  • Деепричастие и предлог
  • «Не» с прилагательными/причастиями
  • «Не» с наречиями
  • Числительные «оба/обе»
  • Согласование прилагательного с существительным
  • Число глагола при однородных членах
  • И другие

Грамматические ошибки вида: «Идя по улице, у меня развязался шнурок»

  • Грамматическая ошибка: Идя по улице, у меня...

  • Правильно выражаться: Когда я шёл по улице, у меня развязался шнурок.

Пунктуация

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

  • Пунктуация перед союзами
  • Слова не являющиеся вводными
  • Сложные союзы не разделяются «тогда как», «словно как»
  • Союзы «а», «но»
  • Устойчивое выражение
  • Цельные выражения
  • Пробелы перед знаками препинания
  • И другие

Разберем предложение, где пропущена запятая «Парень понял как мальчик сделал эту модель»

  • Пунктуационная ошибка, пропущена запятая: Парень понял,

  • «Парень понял, как мальчик сделал эту модель»

Какие языки поддерживает инструмент?

Для поиска ошибок вы можете вводить текст не только на Русском языке, инструмент поддерживает проверку орфографии на Английском, Немецком и Французском

Приложение доступно в Google Play

Free Online Photo Mosaic Creator

Mosaically® - Free Online Photo Mosaic Creator

Бесплатно, быстро, легко | Без регистрации

Добро пожаловать в Mosaically

Mosaically® позволяет создавать собственную фотомозаику из ваших собственных изображений. Он также позволяет вам делиться своей фотомозаикой и приглашать других добавлять свои фотографии.

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

Зачем создавать фотомозаику?

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

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

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

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

Как добиться наилучшего результата

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

Сколько это стоит?

Создавать, делиться и сотрудничать - бесплатно. Нажмите кнопку «Поделиться» на своей мозаике, чтобы бесплатно скачать мозаику и видео в низком разрешении.

Могу ли я заказать распечатки?

Откуда вы отправляете?

Mosaically Inc.- американская компания, расположенная недалеко от Чикаго в Нейпервилле, штат Иллинойс. Однако все наши принты сделаны в Германии. Это потому, что самые качественные в мире отпечатки производятся в Германии. Поэтому, когда вы заказываете у нас печать, вы можете быть уверены, что получаете лучшее, что только можете получить в любой точке мира.

Когда я его получу?

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

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

Если вы покупаете загружаемый файл, он становится доступен сразу после покупки. И вы можете сразу отнести его в местную типографию.

100% гарантия возврата денег

Если вы недовольны своей покупкой, мы вернем вам деньги в полном объеме.

Что делает подарок особенным?

Какой лучший подарок вы когда-либо получали? Не самый большой, самый плохой или самый дорогой.Но тот, который по-прежнему дает вам бабочек. Что в нем особенного, так это не сам подарок. Но даритель, их любовь.

Люби и будь любимым

Слезы пожарного

Герой. Рисковать своей жизнью, чтобы спасти других. В связи с его выходом на пенсию его дочь тайно обратилась к своим товарищам-пожарным. Собрал все свои фото вместе за долгие годы. Создал индивидуальный мозаичный портрет его в полном снаряжении. Гигантский принт. Пенсионный праздник. Большое раскрытие. Он плачет от непреодолимой любви.Теперь он висит у него дома, и каждый раз, когда он проходит мимо, он вспоминает все воспоминания того времени, любовь дочери и уважение коллег.

Выходи за меня замуж?

Они полюбили друг друга. Он хотел сделать ей предложение. Он украсил задний двор цветами, свечами и табличкой с надписью «Ты выйдешь за меня замуж?» И сделал индивидуальный мозаичный принт, запечатлевший все их прекрасные воспоминания вместе. Он также был показан на их свадьбе. Теперь он висит у них на стене. И каждый раз, когда они проходят мимо, они вспоминают, как они провели время вместе.

Чат
Сейчас

# мозаика

Passport Photos Maker - лучший фоторедактор

Фотографии на паспорт

Текущие требования к фотографии на паспорт определяются правилами отдельных стран-участниц. Стоит отметить, что формат фото и другие его особенности часто различаются, например: фотография, которую мы используем для паспорта США, скорее всего, не пригодится нам при подаче заявления на вьетнамский паспорт.Однако существует несколько универсальных правил для фотографий на паспорт :

.

Требования к фотографии для паспорта США

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

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

Размер фотографии на паспорт и габариты

Фото для паспорта различаются в первую очередь размером . Некоторые страны разрешают только определенный формат фотографий, другие предлагают несколько возможностей.Примером строго определенного размера фотографии является паспорт США, который всегда должен иметь размеры 2 x 2 дюйма (51 x 51 мм) . Вьетнам, с другой стороны, ожидает фотографии размером 4 х 6 см.

Кандидат должен помнить, что расстояние от кончика волос до низа подбородка должно быть от 1 до 1375 дюймов (т.е. 25-35 мм). Высота глаз человека, видимого на фотографии, также должна быть в пределах 1125–1375 дюймов (28–35 мм) от нижней части фотографии (а не от нижней части подбородка).

Цифровая фотография паспортного размера

Лицо должно занимать определенное место на фотографии размера цифрового паспорта. Утверждается, что лицо заявителя (от макушки, включая волосы, до нижней части подбородка) должно занимать от 50% до 69% высоты изображения.

Размеры фото: Размер цифровой фотографии измеряется в пикселях, а не в дюймах / сантиметрах. Размер фотографии в пикселях должен быть квадратным (т.е.е. высота должна быть равна ширине). Размер фотографии должен быть от 600x600 пикселей до 1200x1200 пикселей, что означает, что фотография с шириной / высотой более 1200 пикселей будет отклонена. То же самое, если ширина / высота фотографии меньше 600 пикселей.

Формат фото: Единственным допустимым форматом изображения является формат файла JPEG. Убедитесь, что ваше изображение не является файлом PNG, поскольку некоторые камеры и фоторедакторы по умолчанию сохраняют изображения в этом формате.

Размер и сжатие файла фотографии: Более того, размер фотографии паспортного формата не может превышать 240 КБ (килобайт) - это означает, что ее, возможно, придется сжать для соответствия требованиям к максимальному размеру файла.Степень сжатия должна быть меньше или равна 20: 1.

Цвет фотографии: Фотография для паспорта должна быть цветной (24 бита на пиксель) в цветовом пространстве sRGB, которое является обычным выводом для большинства цифровых фотоаппаратов.

Фотография паспортного образца

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

Фон для фото на паспорт

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

Паспортное фото освещение, резкое и контрастное

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

Паспорт Фотопечать и качество

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

Очки на фото в паспорте США

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

С 2016 года мы больше не разрешаем использовать очки на фотографиях на паспорт. Мы до сих пор видим четырехглазых соискателей паспорта и их блестящих характеристик! Снимите очки для фотографии на паспорт, чтобы не было задержек с подачей заявки.

Голова и выражение лица в паспорте фото

Фотография на паспорт может быть отклонена, если у вас нет нейтрального выражения лица (или естественной улыбки), с открытыми глазами и закрытым ртом. Опять же, важно, чтобы ваша фотография на паспорт позволяла властям легко подтвердить вашу личность. Смотрите прямо в камеру анфас и помните, что обе стороны вашего лица должны быть одинаково освещены.

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

Что надеть на фото на паспорт?

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

Где я могу получить и распечатать фотографию на паспорт США?

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

Во-вторых, выберите один из вариантов - вы можете получить конвертер фотографий для паспорта бесплатно, хотя фон не удаляется автоматически. Поэтому мы требуем от вас более точного соблюдения рекомендаций.Вы можете сэкономить время и за 5,95 $ скачать профессиональную фотографию на паспорт США с гарантией приема! За 9.95 $ вы также получите распечатку !

В-третьих, если вы остановили свой выбор на цифровой версии фотографии, найдите ближайший пункт копирования фотографий или аптеку с услугой печати фотографий, где вы можете распечатать ее как фотографию 4x6 дюймов (фотография размером с открытку). На таком американском шаблоне биометрической фотографии вы найдете 4 фотографии на паспорт, которые можно вырезать и отправить в паспортный стол США!

Короче говоря, вы можете получить цифровую фотографию на паспорт США здесь и распечатать ее в любой копировальной службе (например, Walmart или Costco). Прокрутите вниз, чтобы увидеть инструкции о том, как сделать биометрическую фотографию, которая будет соответствовать всем официальным требованиям, или просто сделайте снимок, и наш инструмент проверки соответствия ИИ подскажет, что не так!

Имеется ли фотография на паспорте США такого же размера, как и другие фотографии на паспорт?

Фотография на паспорт США является биометрической фотографией, что означает, что фотография должна позволить властям легко распознать владельца паспорта. Большинство требований - стандартные требования к биометрическим фотографиям.Ключевое различие между фотографиями на паспорт во всем мире обычно заключается в размере и фоне фотографии. Например, фото в канадском паспорте имеет размеры 50х70 мм, фото в китайском паспорте - 33х48 мм, а в британском - 35х45 мм. Размер фотографии в паспорте США составляет 2x2 дюйма (51x51 мм) , что довольно необычно. Убедитесь, что ваша фотография соответствует требованиям к фотографии для паспорта США, а не, например, требованиям к фотографии для британского паспорта.

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

Универсальные правила для фото на паспорт США 2х2

  • Встаньте ближе к стене, чтобы минимизировать тени.
  • Выключите верхнее освещение для устранения бликов.
  • Посмотрите прямо в камеру.
  • Голову нельзя поворачивать или наклонять в любом направлении, смотрите прямо перед собой.
  • Следите за тем, чтобы волосы не закрывали лицо и даже брови.
  • Не носите украшения, головные уборы или наушники.
  • Обратите внимание, что объектив камеры должен располагаться на уровне глаз.
  • Хорошо делать снимок с расстояния около 3 футов.
  • Фотография должна включать плечи и немного места над головой.
  • У вас должно быть нейтральное выражение лица.
  • Размер фотографии в паспорте США должен быть ровно 2x2 дюйма. Но не беспокойтесь об этом! Наш инструмент для обрезки фотографий обрежет его соответствующим образом, или вы можете подготовить шаблон фотографии размером 4x6 дюймов и распечатать две фотографии на паспорт США.
  • Фон должен быть белым или кремовым, поэтому не забудьте сделать снимок на фоне стены белого цвета (или мы можем исправить фон автоматически за 5,95 долларов США).

Как сделать фото на паспорт дома?

Чтобы не тратить время и деньги на дорогу в фотостудию, вы можете подумать о том, чтобы сделать фото на паспорт дома… И это отличная идея! Вы можете использовать свой телефон с iOS или Android и загрузить приложение или использовать онлайн-фотоинструмент .Фотосъемка на документ в домашних условиях возможна со 100% гарантией приема! Если вы решили попробовать самостоятельно сфотографировать паспорт, читайте дальше, чтобы узнать больше.

Как начать? Хотя вы уже знаете требования к фотографиям для паспорта США , вы знаете, как позировать и что делать, а также чего избегать при съемке документов.

Если вы надели подходящую по случаю одежду и у вас уже есть все необходимое, вам нужно просто выполнить эти 5 простых шагов о том, как сделать фото на паспорт дома :

  1. Выберите хороший день, когда на улице светло, найдите комнату с белым фоном или повесьте простыню на стену, чтобы получилась простая студия, встаньте ближе к стене, чтобы избежать теней на заднем плане.Не фотографируйте после наступления темноты, и мы рекомендуем не использовать вспышку, потому что это вызывает красные глаза и меняет цвет кожи.
  2. Попросите кого-нибудь сфотографировать вас или поместите камеру на штатив примерно в 3 футах от вас. Не делайте селфи , потому что оно не умещается в документе. Это не фотография, которую вы хотите разместить в социальных сетях, а официальный документ, удостоверяющий личность.
  3. Поза соответствует требованиям официального паспорта США относительно положения головы, выражения лица, куда смотреть, чего не делать и т. Д.
  4. Отправьте свою фотографию через приложение или онлайн-редактор , если вам удалось сделать правильный снимок. Если нет, попробуйте еще раз!
  5. Получить по электронной почте файл, подготовленный для печати или отправки в цифровой версии.

Изготовитель фотографий на паспорт США (онлайн-инструмент)

Наш онлайн-редактор фото для паспорта - это простой в использовании инструмент, с помощью которого вы получите фотографию для паспорта, отвечающую всем требованиям. Все, что вам нужно сделать, это сделать фотографию на свой телефон или цифровую камеру, загрузить ее, и наш фоторедактор для паспорта конвертирует фотографию в размер паспорта, сотрет фон и обрежет его до размера фотографии паспорта.Мы разработали генератор фотографий для паспорта , который отвечает потребностям наших клиентов, независимо от того, нужна ли им фотография в цифровой или печатной форме. Создатель фотографии для паспорта подготовит для вас шаблон фотографии для печати на паспорт, то есть файл в формате 4x6 дюймов (10 x 15 см), готовый к печати. Таким образом вы получите две фотографии 2x2 дюйма (51x51 мм) на одной фотографии формата открытки. Вы можете распечатать его в любом фотокопировальном магазине всего за несколько центов. Если вы предпочитаете получать распечатанные фотографии на паспорт прямо к вам, наш конвертер фотографий для паспорта предлагает вариант доставки.Загрузите онлайн-инструмент для фото и проверьте его сами!

Фоторедактор для паспорта

Фон действительно важен, если сравнивать фотографии с документами. Для американской визы требуется белый или кремовый цвет, и он всегда должен быть простым и без узоров. Наш редактор фона фотографий удаляет неправильный с тенями или ненужные объекты на картинке или с другим цветом и меняет его на правильный, требуемый паспортным столом! Если вы не уверены в требованиях вашей страны, оставьте это нам! Воспользуйтесь нашим инструментом удаления фона, который изменит его на нужный цвет.

Инструмент для обрезки фотографий на паспорт

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

Изменение размера фотографии на паспорт - преобразование фотографии в размер паспорта

Приложение или наш онлайн-сервис автоматически измерит размер, чтобы он соответствовал выбранным размерам документа, и изменит размер вашего изображения до размера 2x2 дюйма, указанного в паспорте США.Изменение размера фото также регулирует четкость и размеры.

Шаблон фото на паспорт

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

Устройство проверки фотографий на паспорт

Последнее, что делает наше приложение, это проверяет финальное изображение, уделяя особое внимание коррекции, качеству и наличию всех важных элементов.Программа проверки фотографий проверяет отправленные фотографии и обеспечивает 100% гарантию принятия. Создайте фотографию на паспорт с помощью нашего онлайн-инструмента для обрезки, конвертера и изменения размера и сэкономьте время и деньги!

Исследование фото-окислительно-восстановительного опреснителя

Две из самых серьезных глобальных проблем, с которыми сталкивается человечество в 21 веке, - это (1) отсутствие доступа к чистой и питьевой воде и (2) потребность в устойчивой энергии.Таким образом, ученые из всех предметных областей активно разрабатывают методы решения проблемы нехватки воды и энергетического кризиса. Здесь мы представляем опреснительный генератор фото-окислительно-восстановительного катализа, который обладает двойной функцией, действуя как в качестве эффективного очистителя солей, так и в качестве преобразователя фотоэлектрической энергии на основе сенсибилизированных красителями солнечных элементов (DSSC). Он состоит из окрашенных полупроводниковых материалов, рециркулирующего окислительно-восстановительного электролита между анодом и катодом и потоков солей. Он использует окислительно-восстановительную реакцию электролита, управляемую фотовозбужденным полупроводником, и одновременно захватывает солевые анионы и катионы посредством связывания в присутствии ионообменных мембран.Предполагается, что ячейка обладает неограниченной способностью удалять соли за счет окислительно-восстановительного катализа тех же окислительно-восстановительных компонентов электролита, в то время как энергия может высвобождаться посредством фотоэлектрического преобразования энергии . Этот метод позволит обойти ограничения энергопотребления при опреснении и эффективно решить две основные проблемы, описанные выше. Текущее исследование произведет революцию в методах опреснения и продвинет опреснение в новую эру.

У вас есть доступ к этой статье

Подождите, пока мы загрузим ваш контент... Что-то пошло не так. Попробуйте снова?

Placeholder.com - Бесплатная услуга заполнителя изображений, одобренная дизайнерами

Раскрытие информации: Ваша поддержка помогает поддерживать работу сайта! Мы зарабатываем реферальный сбор за некоторые услуги, которые мы рекомендуем на этой странице.Узнать больше

Что такое Placeholder.com?

Placeholder.com генерирует пользовательские изображения-заполнители на лету, как эти примеры: -



Как использовать наши заполнители

Просто укажите размер изображения после нашего URL-адреса (https: //via.placeholder .com /) , и вы получите изображение-заполнитель. Таким образом, URL-адрес изображения должен выглядеть так: -

https://via.placeholder.com /150

Вы можете использовать изображения в HTML или CSS, например:

(Обязательно ознакомьтесь с нашими руководствами по HTML и CSS на нашем дочернем сайте HTML.com, если вы ржавый)

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

Как установить размер изображения

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

https://via.placeholder.com /150

… генерирует квадратное фиктивное изображение размером 150 пикселей: -

NB: Размер должен быть первой папкой, указанной в URL-адресе

Как установить форматы изображений

Формат изображения не является обязательным - по умолчанию используется.GIF. Вы можете использовать следующие расширения файлов изображений…

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

  • https://via.placeholder.com/300 .png / 09f / fff
  • https: / /via.placeholder.com/300/09f .png / fff
  • https://via.placeholder.com/300/09f/fff .png

Как установить произвольный текст

Вы можете указать текст для изображения, используя строку запроса в самом конце URL-адреса.

Итак, этот URL…

https://via.placeholder.com/728x90.png ? Text = Посетите + WhoIsHostingThis.com + Buyers + Guide

… создает это изображение размером 728 × 90 (т. е. размеры полноразмерного объявления) : -

Текст не является обязательным. По умолчанию размеры изображения указаны в пикселях.Вы можете использовать символы A-Z, прописные или строчные буквы, цифры и большинство символов. Пробелы обозначаются знаком плюс (+). Например…

https://via.placeholder.com/468x60 ? Text = Посетите + Blogging.com + Now

… создаст это баннерное объявление-заполнитель плюс текст (с пробелами) : -

(PS. Ищете фиктивный текст? Теперь у нас есть lorem ipsum и другие тексты-заполнители для загрузки).

Как установить цвет фона и текста

По умолчанию текст черный, а фон серый.

Цвета представлены в виде шестнадцатеричных кодов после размеров фиктивного изображения. Например, # FF0000 красный. Цвета должны соответствовать размерам . Итак, URL этого изображения…

https://via.placeholder.com/150 / 0000FF / 808080 ? Text = Digital.com
https://via.placeholder.com/150 / FF0000 / FFFFFF ? Text = Down.com
https://via.placeholder.com/150 / FFFF00 / 000000 ? Text = WebsiteBuilders.com
https://via.placeholder.com/150/000000/FFFFFF/?text=IPaddress.net

… создает изображения в форме кнопки 125 × 125 ad: -

Первый цвет всегда является цветом фона, а второй цвет - цветом текста.

Популярные шестнадцатеричные цветовые коды

  • Белый - FFFFFF
  • Черный - 000000
  • Красный - FF0000
  • Синий - 0000FF
  • Желтый - FFFFFF
  • Зеленый - 008000

Новинка! Поддержка WEBP

В январе 2019 года мы добавили поддержку нового формата изображений WEBP от Google.

Новинка! Поддержка HTTPS

SSL - большое дело для любого веб-мастера в 2018 году. Ваши изображения-заполнители будут работать с HTTPS или без него…

http: // via.placeholder.com/300
https: / / via.placeholder.com/300

… вызывается из доменов HTTP или HTTPS.

НОВИНКА! Заполнители для логотипов, текста и баннеров

Есть вопросы?

У нас есть ответы.Пожалуйста, посетите нашу страницу с часто задаваемыми вопросами.

StyleGAN: использование машинного обучения для создания и настройки реалистичных изображений | автор: Джамшед Хан

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

Цель NVIDIA StyleGAN - преодолеть ограничения традиционной GAN, в которой управление отдельными характеристиками данных, такими как черты лица на фотографиях, может оказаться невозможным. Предлагаемая модель позволяет пользователю настраивать гиперпараметры для достижения такого контроля. Кроме того, он учитывает фактор изменчивости в сгенерированных изображениях из-за добавления «стилей» к изображениям на каждом уровне свертки.

Генератор в традиционном GAN по сравнению с генератором, используемым NVIDIA в StyleGAN.

Модель начинается с генерации новых изображений, начиная с очень низкого разрешения (что-то вроде 4x4) и, в конечном итоге, постепенно увеличивается до конечного разрешения 1024x1024, которое на самом деле обеспечивает достаточно деталей для визуально привлекательного изображения.

Количество изображений, обученных за заданное время с помощью метода «прогрессивного роста» по сравнению с традиционным GAN. (Предоставлено: todatascience)

Основным принципом обучения StyleGAN является этот «прогрессивный» метод, который впервые был использован NVIDIA в их ProGAN.Он работает путем постепенного увеличения разрешения, тем самым обеспечивая медленное развитие сети, сначала изучая простую задачу, а затем прогрессирует к изучению более сложных проблем (или, в данном случае, изображений с более высоким разрешением). Такой принцип обучения обеспечивает стабильность и, как было доказано, сводит к минимуму общие проблемы, связанные с сетями GAN, такие как сбой режима. Он также гарантирует, что сначала обрабатываются высокоуровневые функции, прежде чем переходить к более мелким деталям, уменьшая вероятность того, что такие функции будут сгенерированы неправильно (что окажет более сильное влияние на окончательное изображение, чем наоборот).StyleGANs используют аналогичный принцип, но вместо создания одного изображения они генерируют несколько изображений, и этот метод позволяет отделить стили или функции друг от друга.

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

Процесс генерации в ProGAN, который вдохновил то же самое в StyleGAN (Источник: Towards Data Science)

На каждом слое свертки можно использовать разные стили для создания изображения: грубые стили с разрешением от 4x4 до 8x8, средние стили с разрешение от 16x16 до 32x32, или прекрасные стили с разрешением от 64x64 до 1024x1024.

Грубые стили управляют высокоуровневыми функциями, такими как поза объекта на изображении или волосы объекта, форма лица и т. Д. Средние стили управляют такими аспектами, как черты лица. Наконец, тонкие стили покрывают детали изображения, такие как цвет глаз или другие микроструктуры.

Копирование стилей, соответствующих грубому пространственному разрешению, приносит такие высокоуровневые аспекты, как поза, общая прическа, форма лица и очки из источника B, в то время как все цвета (глаза, волосы, освещение) и более тонкие черты лица напоминают источник A.

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

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

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

Промежуточное скрытое пространство с «картографической сетью». (Источник)

Архитектура NVIDIA включает промежуточное «скрытое пространство», которое можно рассматривать как «съемное». Затем в это пространство можно встроить входной скрытый код. Стили или функции, присутствующие в изображениях, на самом деле являются разными формами одного и того же встраивания скрытых векторов, которое используется для нормализации входных данных каждого сверточного слоя.

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

Извлечь текст из изображения | Средство извлечения текста онлайн

Нужно ли мне платить за использование Workbench?

Нет! Workbench на 100% бесплатен. Не требуется лицензии, подписки или даже адреса электронной почты.

Будете ли вы добавлять новые инструменты в Workbench в будущем?

Да!

Наша команда будет продолжать наращивать полезные ресурсы и со временем выпускать их.

Как работает автоматическая пометка AI?

Автоматическая пометка

AI - это функция, используемая платформами управления цифровыми активами (DAM), чтобы помочь пользователям сэкономить время за счет исключения ручной работы, поощрения организации и упрощения поиска файлов.

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

Как работает генератор цветовой палитры?

Генератор цветовой палитры Workbench извлекает серию цветов HEX из изображения при загрузке. Он считает каждый пиксель и его цвет и генерирует палитру, содержащую до 6 HEX-кодов наиболее повторяющихся цветов.

Что такое метаданные?

Метаданные предоставляют информацию о содержимом актива.

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

Что такое управление цифровыми активами?

Управление цифровыми активами (DAM) в последние годы стало критически важной системой для компаний всех отраслей и размеров.DAM - это программная платформа, которую бренды используют для хранения, редактирования, распространения и отслеживания активов своего бренда. DAM предназначены для поощрения организации цифровой архитектуры компании, исключая использование скрытых файлов и папок, которые обычно хранятся на Google Диске или Dropbox.

Системы

DAM масштабируются для хранения огромных количеств цифровых активов, включая, помимо прочего: фотографии, аудиофайлы, графику, логотипы, цвета, анимацию, 3D-видео, файлы PDF, шрифты и т. Д. В дополнение к тщательной организации в центральной части DAM файловой системе эти файлы можно обнаружить с помощью уникальных идентификаторов, таких как их метаданные и теги (автоматически и вручную).

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

Платформы управления цифровыми активами используются маркетинговыми, коммерческими и творческими командами некоторых крупнейших мировых брендов. Хотите узнать больше о том, как DAM может принести пользу вашей команде? Подпишитесь на бесплатную пробную версию Brandfolder или запланируйте демонстрацию с одним из наших экспертов DAM здесь.

Как разработать Pix2Pix GAN для преобразования изображения в изображение

Последнее обновление 18 января 2021 г.

Генеративная состязательная сеть Pix2Pix, или GAN, представляет собой подход к обучению глубокой сверточной нейронной сети для задач преобразования изображения в изображение.

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

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

После прохождения этого руководства вы будете знать:

  • Как загрузить и подготовить спутниковое изображение в набор данных преобразования изображения в изображение карт Google.
  • Как разработать модель Pix2Pix для перевода спутниковых фотографий в изображения карты Google.
  • Как использовать окончательную модель генератора Pix2Pix для перевода специальных спутниковых изображений.

Начните свой проект с моей новой книги «Генеративные состязательные сети с Python», включающей пошаговые руководства и файлы исходного кода Python для всех примеров.

Приступим.

  • Обновлено в январе / 2021 г. : Обновлено, поэтому замораживание слоев работает с нормой партии.

Как разработать генерирующую состязательную сеть Pix2Pix для преобразования изображения в изображение
Фотография сделана Европейской южной обсерваторией, некоторые права защищены.

Обзор учебного пособия

Это руководство разделено на пять частей; их:

  1. Что такое Pix2Pix GAN?
  2. Набор данных преобразования изображений со спутника на карту
  3. Как разработать и обучить модель Pix2Pix
  4. Как переводить изображения с помощью модели Pix2Pix
  5. Как перевести карты Google на спутниковые изображения

Что такое Pix2Pix GAN?

Pix2Pix - это модель генерирующей состязательной сети или GAN, разработанная для универсального преобразования изображения в изображение.

Подход был представлен Филипом Изола и др. в своей статье 2016 года под названием «Преобразование изображения в изображение с помощью условно-состязательных сетей», представленной на CVPR в 2017 году.

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

Модель Pix2Pix - это тип условного GAN, или cGAN, где создание выходного изображения зависит от входа, в данном случае исходного изображения. Дискриминатору предоставляется как исходное изображение, так и целевое изображение, и он должен определять, является ли цель правдоподобным преобразованием исходного изображения.

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

Pix2Pix GAN был продемонстрирован на ряде задач преобразования изображения в изображение, таких как преобразование карт в спутниковые фотографии, черно-белые фотографии в цветные и эскизы продуктов в фотографии продуктов.

Теперь, когда мы знакомы с Pix2Pix GAN, давайте подготовим набор данных, который мы можем использовать для преобразования изображения в изображение.

Хотите разрабатывать сети GAN с нуля?

Пройдите бесплатный 7-дневный ускоренный курс электронной почты (с образцом кода).

Нажмите, чтобы зарегистрироваться, а также получите бесплатную электронную версию курса в формате PDF.

Загрузите БЕСПЛАТНЫЙ мини-курс

Набор данных преобразования изображений со спутника на карту

В этом руководстве мы будем использовать так называемый набор данных « maps », используемый в статье Pix2Pix.

Это набор данных, состоящий из спутниковых снимков Нью-Йорка и соответствующих страниц с картами Google. Проблема перевода изображений связана с преобразованием спутниковых фотографий в формат карт Google или, наоборот, изображений карт Google в спутниковые фотографии.

Набор данных представлен на веб-сайте pix2pix и может быть загружен в виде zip-файла размером 255 мегабайт.

Загрузите набор данных и распакуйте его в текущий рабочий каталог. Будет создан каталог под названием « карты » со следующей структурой:

карты ├── поезд └── val

карты

├── поезд

└── val

Папка поезда содержит 1097 изображений, тогда как набор данных проверки содержит 1099 изображений.

Изображения имеют цифровое имя файла и находятся в формате JPEG. Каждое изображение имеет ширину 1200 пикселей и высоту 600 пикселей и содержит как спутниковое изображение слева, так и изображение Google Maps справа.

Образец изображения из набора данных Maps, включая изображение со спутника и Google Maps.

Мы можем подготовить этот набор данных для обучения модели Pix2Pix GAN в Keras. Мы просто будем работать с изображениями в наборе обучающих данных. Каждое изображение будет загружено, масштабировано и разделено на элементы спутниковой карты и карты Google.В результате получится 1097 пар цветных изображений с шириной и высотой 256 × 256 пикселей.

Функция load_images () ниже реализует это. Он перечисляет список изображений в заданном каталоге, загружает каждое с целевым размером 256 × 512 пикселей, разбивает каждое изображение на элементы спутника и карты и возвращает массив каждого из них.

# загружаем все изображения из каталога в память def load_images (путь, размер = (256,512)): src_list, tar_list = список (), список () # перечисляем имена файлов в каталоге, предполагаем, что все изображения для имени файла в listdir (путь): # загрузить и изменить размер изображения пикселей = load_img (путь + имя файла, target_size = размер) # преобразовать в массив numpy пикселей = img_to_array (пиксели) # разделить на спутник и карту sat_img, map_img = пикселей [:,: 256], пикселей [:, 256:] src_list.добавить (sat_img) tar_list.append (map_img) возврат [asarray (src_list), asarray (tar_list)]

# загрузить все изображения из каталога в память

def load_images (path, size = (256,512)):

src_list, tar_list = list (), list ()

# перечислить имена в каталоге, предполагая, что все файлы изображений

для имени файла в listdir (путь):

# загрузить и изменить размер изображения

пикселей = load_img (путь + имя файла, target_size = size)

# преобразовать в массив numpy

пикселей = img_to_array (пикселей)

# разбить на спутник и карту

sat_img, map_img = пикселей [:,: 256], пикселей [:, 256:]

src_list.append (sat_img)

tar_list.append (map_img)

return [asarray (src_list), asarray (tar_list)]

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

Полный пример приведен ниже.

# загружать, разделять и масштабировать набор данных карт, готовый к обучению из os import listdir из numpy import asarray из numpy import vstack из кераса.preprocessing.image import img_to_array из keras.preprocessing.image import load_img из numpy import savez_compressed # загружаем все изображения из каталога в память def load_images (путь, размер = (256,512)): src_list, tar_list = список (), список () # перечисляем имена файлов в каталоге, предполагаем, что все изображения для имени файла в listdir (путь): # загрузить и изменить размер изображения пикселей = load_img (путь + имя файла, target_size = размер) # преобразовать в массив numpy пикселей = img_to_array (пиксели) # разделить на спутник и карту sat_img, map_img = пикселей [:,: 256], пикселей [:, 256:] src_list.добавить (sat_img) tar_list.append (map_img) возврат [asarray (src_list), asarray (tar_list)] # путь к набору данных путь = 'карты / поезд /' # загрузить набор данных [src_images, tar_images] = load_images (путь) print ('Загружено:', src_images.shape, tar_images.shape) # сохранить как сжатый массив numpy filename = 'maps_256.npz' savez_compressed (имя файла, src_images, tar_images) print ('Сохраненный набор данных:', имя файла)

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

# загрузить, разделить и масштабировать набор данных карт, готовый к обучению

из os import listdir

из numpy import asarray

из numpy import vstack

from keras.preprocessing.image import img_to_array

from keras.preprocessing.image import load_img

from numpy import savez_compressed

# загрузить все изображения из каталога в память

def load_images (путь, размер = (

2): src_list, tar_list = list (), list ()

# перечислить имена файлов в каталоге, предположим, что все являются изображениями

для имени файла в listdir (путь):

# загрузить и изменить размер изображения

пикселей = load_img (путь + имя файла , target_size = size)

# преобразовать в массив numpy

пикселей = img_to_array (пикселей)

# разделить на спутник и карту

sat_img, map_img = пикселей [:,: 256], пикселей [:, 256:]

src_list.append (sat_img)

tar_list.append (map_img)

return [asarray (src_list), asarray (tar_list)]

# путь к набору данных

path = 'maps / train /'

#

загружает набор данных4 [src_images, tar_images] = load_images (путь)

print ('Loaded:', src_images.shape, tar_images.shape)

# сохранить как сжатый массив numpy

filename = 'maps_256.npz'

savez, src_images, tar_images)

print ('Сохраненный набор данных:', имя файла)

При выполнении примера загружаются все изображения в наборе обучающих данных, суммируются их формы, чтобы изображения были загружены правильно, а затем массивы сохраняются в новый файл с именем maps_256.npz в формате сжатого массива NumPy.

Загружено: (1096, 256, 256, 3) (1096, 256, 256, 3) Сохраненный набор данных: maps_256.npz

Загружено: (1096, 256, 256, 3) (1096, 256, 256, 3)

Сохраненный набор данных: maps_256.npz

Этот файл можно загрузить позже с помощью функции load () NumPy и получения каждого массива по очереди.

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

# загружаем подготовленный набор данных из numpy import load из matplotlib import pyplot # загрузить набор данных data = load ('maps_256.npz') src_images, tar_images = данные ['arr_0'], данные ['arr_1'] print ('Загружено:', src_images.shape, tar_images.shape) # сюжет исходных изображений n_samples = 3 для i в диапазоне (n_samples): pyplot.subplot (2, n_samples, 1 + i) pyplot.axis ('выключено') pyplot.imshow (src_images [i] .astype ('uint8')) # построить целевое изображение для i в диапазоне (n_samples): пиплот.подзаговор (2, n_samples, 1 + n_samples + i) pyplot.axis ('выключено') pyplot.imshow (tar_images [i] .astype ('uint8')) pyplot.show ()

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

# загрузить подготовленный набор данных

из numpy import load

из matplotlib import pyplot

# загрузить набор данных

data = load ('maps_256.npz ')

src_images, tar_images = data [' arr_0 '], data [' arr_1 ']

print (' Loaded: ', src_images.shape, tar_images.shape)

# построить исходные изображения

n_samples

для i в диапазоне (n_samples):

pyplot.subplot (2, n_samples, 1 + i)

pyplot.axis ('off')

pyplot.imshow (src_images [i] .astype ('uint8') ))

# целевое изображение графика

для i в диапазоне (n_samples):

pyplot.subplot (2, n_samples, 1 + n_samples + i)

pyplot.ось ('off')

pyplot.imshow (tar_images [i] .astype ('uint8'))

pyplot.show ()

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

Загружено: (1096, 256, 256, 3) (1096, 256, 256, 3)

Загружено: (1096, 256, 256, 3) (1096, 256, 256, 3)

Также создается график из трех пар изображений, показывающий спутниковые изображения вверху и изображения карты Google внизу.

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

График из трех пар изображений, показывающий спутниковые изображения (вверху) и изображения Google Map (внизу).

Теперь, когда мы подготовили набор данных для перевода изображений, мы можем разработать нашу модель Pix2Pix GAN.

Как разработать и обучить модель Pix2Pix

В этом разделе мы разработаем модель Pix2Pix для перевода спутниковых фотографий в изображения Google Maps.

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

Реализация в этом разделе будет использовать структуру глубокого обучения Keras, основанную непосредственно на модели, описанной в документе и реализованной в базе кода автора, предназначенной для получения и генерации цветных изображений размером 256 × 256 пикселей.

Архитектура состоит из двух моделей: дискриминатора и генератора.

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

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

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

Функция define_discriminator () ниже реализует модель дискриминатора 70 × 70 PatchGAN в соответствии с дизайном модели, описанной в статье. Модель берет два входных изображения, которые объединены вместе, и предсказывает исправление вывода предсказаний. Модель оптимизирована с использованием бинарной кросс-энтропии, и используется взвешивание, так что обновления модели дают половину (0,5) обычного эффекта.Авторы Pix2Pix рекомендуют это взвешивание обновлений модели, чтобы замедлить изменения дискриминатора по сравнению с моделью генератора во время обучения.

# определяем модель дискриминатора def define_discriminator (image_shape): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # вход исходного изображения in_src_image = Вход (shape = image_shape) # ввод целевого изображения in_target_image = Вход (shape = image_shape) # объединить изображения по каналам merged = Concatenate () ([in_src_image, in_target_image]) # C64 d = Conv2D (64, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (объединено) d = LeakyReLU (альфа = 0.2) (г) # C128 d = Conv2D (128, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # C256 d = Conv2D (256, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # C512 d = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0.2) (г) # второй последний выходной слой d = Conv2D (512, (4,4), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # вывод патча d = Conv2D (1, (4,4), padding = 'same', kernel_initializer = init) (d) patch_out = Активация ('сигмоид') (d) # определить модель model = Модель ([in_src_image, in_target_image], patch_out) # скомпилировать модель opt = Адам (lr = 0,0002, beta_1 = 0,5) model.compile (loss = 'binary_crossentropy', optimizer = opt, loss_weights = [0.5]) вернуть модель

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

34

35

36

37

38

# определение модели дискриминатора

def define_discriminator (image_shape):

# инициализация веса

init = RandomNormal (stddev = 0.02)

# исходное изображение input

in_src_image = Input (shape = image_shape)

# целевое изображение input

in_target_image = Input (shape = image_shape)

# объединять изображения по каналам

merged (объединить) (объединить) [in_src_image, in_target_image])

# C64

d = Conv2D (64, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (объединено)

d = LeakyReLU (альфа = 0,2) (d)

# C128

d = Conv2D (128, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (альфа = 0.2) (d)

# C256

d = Conv2D (256, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization ( ) (d)

d = LeakyReLU (alpha = 0.2) (d)

# C512

d = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (alpha = 0.2) (d)

# второй последний выходной слой

d = Conv2D (512, (4,4), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (alpha = 0.2) (d)

# вывод патча

d = Conv2D (1, (4,4), padding = 'same', kernel_initializer = init) (d)

patch_out = Activation ('sigmoid') (d)

# определить модель

model = Model ([in_src_image, in_target_image], patch_out)

# compile model

opt = Adam (lr = 0.0002, beta_1 = 0.5)

model.compile (loss = 'binary_crossentropy', optimizer = opt, loss_weights = [0,5])

модель возврата

Модель генератора сложнее модели дискриминатора.

Генератор представляет собой модель кодера-декодера, использующую архитектуру U-Net. Модель берет исходное изображение (например, спутниковое фото) и генерирует целевое изображение (например, изображение Google Maps). Для этого сначала используется понижающая дискретизация или кодирование входного изображения до уровня узкого места, а затем повышающая дискретизация или декодирование представления узкого места до размера выходного изображения. Архитектура U-Net означает, что между уровнями кодирования и соответствующими уровнями декодирования добавляются пропускные соединения, образуя U-образную форму.

Изображение ниже проясняет пропускные соединения, показывая, как первый уровень кодера соединяется с последним уровнем декодера и так далее.

Архитектура генератора U-Net модели
, взятая из преобразования изображения в изображение с помощью условно состязательных сетей

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

Функция define_generator () ниже реализует модель генератора кодера-декодера U-Net. Он использует вспомогательную функцию define_encoder_block () для создания блоков слоев для кодера и функцию decoder_block () для создания блоков слоев для декодера. В выходном слое используется функция активации tanh, что означает, что значения пикселей в сгенерированном изображении будут в диапазоне [-1,1].

# определить блок кодировщика def define_encoder_block (layer_in, n_filters, batchnorm = True): # инициализация веса init = RandomNormal (stddev = 0.02) # добавить слой понижающей дискретизации g = Conv2D (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in) # условно добавить пакетную нормализацию если батчнорм: g = BatchNormalization () (g, обучение = True) # дырявая активация relu г = LeakyReLU (альфа = 0,2) (г) вернуть г # определяем блок декодера def decoder_block (layer_in, skip_in, n_filters, dropout = True): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # добавить слой с повышенной дискретизацией g = Conv2DTranspose (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in) # добавить пакетную нормализацию g = BatchNormalization () (g, обучение = True) # условно добавить отсев если бросил: g = выпадение (0.5) (g, обучение = True) # объединить с пропустить соединение g = Concatenate () ([g, skip_in]) # активация relu g = Активация ('relu') (g) вернуть г # определить модель автономного генератора def define_generator (image_shape = (256,256,3)): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # ввод изображения in_image = Вход (shape = image_shape) # модель кодировщика e1 = define_encoder_block (in_image, 64, batchnorm = False) e2 = define_encoder_block (e1, 128) e3 = define_encoder_block (e2, 256) e4 = define_encoder_block (e3, 512) e5 = define_encoder_block (e4, 512) e6 = define_encoder_block (e5, 512) e7 = define_encoder_block (e6, 512) # бутылочное горлышко, нет норм партии и relu b = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (e7) b = Активация ('relu') (b) # модель декодера d1 = decoder_block (b, e7, 512) d2 = decoder_block (d1, e6, 512) d3 = decoder_block (d2, e5, 512) d4 = decoder_block (d3, e4, 512, dropout = False) d5 = decoder_block (d4, e3, 256, dropout = False) d6 = decoder_block (d5, e2, 128, dropout = False) d7 = decoder_block (d6, e1, 64, dropout = False) # выход g = Conv2DTranspose (3, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d7) out_image = Активация ('tanh') (г) # определить модель model = Модель (in_image, out_image) вернуть модель

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

34

35

36

37

38

39

40

41

42

43

44

45

46

48

51

52

53

54

55

56

57

58

59

60

61

# определение блока кодера

def define_encoder_block (layer_in, n_filters, batchnorm = True):

# инициализация веса

init = RandomNormal (stddev = 0.02)

# добавить слой понижающей дискретизации

g = Conv2D (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in)

# условно добавить пакетную нормализацию

если batchnorm:

g = BatchNormalization () (g, training = True)

# Alucky Relu Activation

g = LeakyReLU (alpha = 0.2) (g)

return g

# определить декодер block

def decoder_block (layer_in, skip_in, n_filters, dropout = True):

# инициализация веса

init = RandomNormal (stddev = 0.02)

# добавить слой с повышенной дискретизацией

g = Conv2DTranspose (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in)

# добавить пакетную нормализацию

g = BatchNormalization () (g, training = True)

# условно добавить выпадение

если выпадение:

g = выпадение (0,5) (g, обучение = True)

# слияние с пропуском соединения

g = Concatenate () ([g, skip_in])

# активация relu

g = Activation ('relu') (g)

return g

# определение модели автономного генератора

def define_generator (image_shape = ( 256,256,3)):

# инициализация веса

init = RandomNormal (stddev = 0.02)

# image input

in_image = Input (shape = image_shape)

# модель кодировщика

e1 = define_encoder_block (in_image, 64, batchnorm = False)

e2 = define_encoder_block3 =

define_encoder_block (e2, 256)

e4 = define_encoder_block (e3, 512)

e5 = define_encoder_block (e4, 512)

e6 = define_encoder_block (e5, 512)

e7 = define_encoder , без пакетной нормы и relu

b = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (e7)

b = Activation ('relu' ) (b)

# модель декодера

d1 = decoder_block (b, e7, 512)

d2 = decoder_block (d1, e6, 512)

d3 = decoder_block (d2, e5, 512)

d4 = decoder_block (d3, e4, 512, dropout = False)

d5 = decoder_block (d4, e3, 256, dropout = False)

d6 = decoder_block (d5, e2, 128, dropout = False)

d7 = decoder_block (d6, e1, 64, dropout = False)

# output

g = Conv2DTranspose (3, (4,4), strides = (2,2), padding = 'same ', kernel_initializer = init) (d7)

out_image = Activation (' tanh ') (g)

# define model

model = Model (in_image, out_image)

return model

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

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

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

Это может быть достигнуто путем определения новой логической модели, состоящей из весов в существующей модели автономного генератора и дискриминатора. Эта логическая или составная модель включает установку генератора поверх дискриминатора. Исходное изображение предоставляется как вход для генератора и дискриминатора, хотя выход генератора подключен к дискриминатору как соответствующее изображение « target ».Затем дискриминатор предсказывает вероятность того, что генератор был реальным переводом исходного изображения.

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

Функция define_gan () ниже реализует это, принимая уже определенные модели генератора и дискриминатора в качестве аргументов и используя функциональный API Keras для их соединения в составную модель. Обе функции потерь указаны для двух выходных данных модели, а веса, используемые для каждого, указаны в аргументе loss_weights функции compile () .

# определить комбинированную модель генератора и дискриминатора для обновления генератора def define_gan (g_model, d_model, image_shape): # сделать веса в дискриминаторе необучаемыми для слоя в d_model.слои: если не isinstance (слой, BatchNormalization): layer.trainable = Ложь # определяем исходное изображение in_src = Вход (shape = image_shape) # подключаем исходное изображение ко входу генератора gen_out = g_model (in_src) # подключить вход источника и выход генератора к входу дискриминатора dis_out = d_model ([in_src, gen_out]) # src image как вход, сгенерированное изображение и вывод классификации model = Модель (in_src, [dis_out, gen_out]) # скомпилировать модель opt = Адам (lr = 0.0002, beta_1 = 0,5) model.compile (loss = ['binary_crossentropy', 'mae'], optimizer = opt, loss_weights = [1,100]) вернуть модель

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

# определить комбинированный генератор и модель дискриминатора, для обновления генератора

def define_gan (g_model, d_model, image_shape):

# сделать веса в дискриминаторе необучаемыми

для слоя в d_model.Layers:

if not isinstance (layer, BatchNormalization):

layer.trainable = False

# определить исходное изображение

in_src = Input (shape = image_shape)

# подключить исходное изображение ко входу генератора

gen_out = g_model (in_src)

# подключите вход источника и выход генератора к входу дискриминатора

dis_out = d_model ([in_src, gen_out])

# src изображение в качестве входа, сгенерированное изображение и выход классификации

model = Model (in_src, [dis_out, gen_out])

# скомпилировать модель

opt = Adam (lr = 0.0002, beta_1 = 0,5)

model.compile (loss = ['binary_crossentropy', 'mae'], optimizer = opt, loss_weights = [1,100])

return model

Затем мы можем загрузить наш набор данных парных изображений в сжатом формате массива NumPy.

Это вернет список из двух массивов NumPy: первый для исходных изображений и второй для соответствующих целевых изображений.

# загрузить и подготовить обучающие изображения def load_real_samples (имя файла): # загружаем сжатые массивы данные = загрузка (имя файла) # распаковать массивы X1, X2 = данные ['arr_0'], данные ['arr_1'] # масштаб от [0,255] до [-1,1] Х1 = (Х1 - 127.5) / 127,5 Х2 = (Х2 - 127,5) / 127,5 возврат [X1, X2]

# загрузить и подготовить обучающие образы

def load_real_samples (filename):

# загрузить сжатые массивы

data = load (filename)

# распаковать массивы

X1, X2 = data ['arr_0'], data [ 'arr_1']

# масштаб от [0,255] до [-1,1]

X1 = (X1 - 127,5) / 127,5

X2 = (X2 - 127,5) / 127.5

возврат [X1, X2]

Для обучения дискриминатора потребуются пакеты реальных и поддельных изображений.

Функция generate_real_samples () ниже подготовит пакет случайных пар изображений из обучающего набора данных и соответствующую метку дискриминатора class = 1 , чтобы указать, что они реальны.

# выбираем партию случайных выборок, возвращаем изображения и выбираем def generate_real_samples (набор данных, n_samples, patch_shape): # распаковать набор данных trainA, trainB = набор данных # выбираем случайные экземпляры ix = randint (0, trainA.форма [0], n_samples) # получить выбранные изображения X1, X2 = поезд A [ix], поезд B [ix] # генерировать "настоящие" метки классов (1) y = единицы ((n_samples, patch_shape, patch_shape, 1)) return [X1, X2], y

# выбрать пакет случайных выборок, вернуть изображения и цель

def generate_real_samples (dataset, n_samples, patch_shape):

# распаковать набор данных

trainA, trainB = dataset

# выбрать случайные экземпляры

ix 0, поезд А.shape [0], n_samples)

# извлекать выбранные изображения

X1, X2 = trainA [ix], trainB [ix]

# генерировать метки 'реальных' классов (1)

y = ones ((n_samples, patch_shape , patch_shape, 1))

return [X1, X2], y

Функция generate_fake_samples () ниже использует модель генератора и пакет реальных исходных изображений для создания эквивалентного пакета целевых изображений для дискриминатора.

Они возвращаются с меткой class-0, чтобы указать дискриминатору, что они поддельные.

# генерировать пакет изображений, возвращает изображения и цели def generate_fake_samples (g_model, samples, patch_shape): # создать поддельный экземпляр X = g_model.predict (образцы) # создать фальшивые метки классов (0) y = нули ((len (X), patch_shape, patch_shape, 1)) возврат X, y

# генерировать пакет изображений, возвращать изображения и цели

def generate_fake_samples (g_model, samples, patch_shape):

# генерировать поддельный экземпляр

X = g_model.предсказать (образцы)

# создать 'поддельные' метки классов (0)

y = нули ((len (X), patch_shape, patch_shape, 1))

return X, y

Обычно модели GAN не сходятся; вместо этого находится равновесие между моделями генератора и дискриминатора. Таким образом, мы не можем легко судить, когда обучение должно быть остановлено. Следовательно, мы можем сохранить модель и использовать ее для периодического генерирования примеров преобразования изображения в изображение во время обучения, например, каждые 10 эпох обучения.

Затем мы можем просмотреть сгенерированные изображения в конце обучения и использовать качество изображения для выбора окончательной модели.

Функция summarize_performance () реализует это, беря модель генератора в момент обучения и используя ее для генерации числа, в данном случае трех, переводов случайно выбранных изображений в наборе данных. Затем исходное, сгенерированное изображение и ожидаемая цель наносятся на график в виде трех рядов изображений, а график сохраняется в файл. Кроме того, модель сохраняется в файл в формате H5, что упрощает загрузку в дальнейшем.

Имена файлов изображений и моделей включают номер итерации обучения, что позволяет нам легко различать их в конце обучения.

# сгенерировать образцы и сохранить как график и сохранить модель def summarize_performance (шаг, g_model, набор данных, n_samples = 3): # выбираем образец входных изображений [X_realA, X_realB], _ = generate_real_samples (набор данных, n_samples, 1) # создать партию поддельных образцов X_fakeB, _ = generate_fake_samples (g_model, X_realA, 1) # масштабировать все пиксели от [-1,1] до [0,1] X_realA = (X_realA + 1) / 2.0 X_realB = (X_realB + 1) / 2.0 X_fakeB = (X_fakeB + 1) / 2.0 # построить реальные исходные изображения для i в диапазоне (n_samples): pyplot.subplot (3, n_samples, 1 + i) pyplot.axis ('выключено') pyplot.imshow (X_realA [i]) # сюжет сгенерировал целевое изображение для i в диапазоне (n_samples): pyplot.subplot (3, n_samples, 1 + n_samples + i) pyplot.axis ('выключено') pyplot.imshow (X_fakeB [i]) # построить реальное целевое изображение для i в диапазоне (n_samples): пиплот.подзаговор (3, n_samples, 1 + n_samples * 2 + i) pyplot.axis ('выключено') pyplot.imshow (X_realB [i]) # сохранить график в файл filename1 = 'plot_% 06d.png'% (шаг + 1) pyplot.savefig (имя_файла1) pyplot.close () # сохраняем модель генератора filename2 = 'model_% 06d.h5'% (шаг + 1) g_model.save (имя_файла2) print ('> Сохранено:% s и% s'% (имя_файла1, имя_файла2))

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

# сгенерировать образцы и сохранить как график и сохранить модель

def summarize_performance (step, g_model, dataset, n_samples = 3):

# выбрать образец входных изображений

[X_realA, X_realB], _ = generate_real_samples (dataset, n_samples, 1)

# создать пакет поддельных образцов

X_fakeB, _ = generate_fake_samples (g_model, X_realA, 1)

# масштабировать все пиксели от [-1,1] до [0,1]

X_realA = (X_realA + 1) / 2.0

X_realB = (X_realB + 1) / 2.0

X_fakeB = (X_fakeB + 1) / 2.0

# построить реальные исходные изображения

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + i)

pyplot.axis ('off')

pyplot.imshow (X_realA [i])

# plot сгенерированное целевое изображение

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + n_samples + i)

pyplot.axis ('off')

pyplot.imshow (X_fakeB [i])

# построить реальное целевое изображение

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + n_samples * 2 + i)

pyplot.axis ('off ')

pyplot.imshow (X_realB [i])

# сохранить график в файл

filename1 =' plot_% 06d.png '% (step + 1)

pyplot.savefig (filename1)

pyplot.close ()

# сохранить модель генератора

filename2 = 'model_% 06d.h5'% (step + 1)

g_model.save (filename2)

print ('> Сохранено:% s и% s'% (filename1, filename2))

Наконец, мы можем обучить модели генератора и дискриминатора.

Функция train () ниже реализует это, принимая заданный генератор, дискриминатор, составную модель и загруженный набор данных в качестве входных данных. Количество эпох установлено на 100, чтобы сократить время обучения, хотя в статье использовалось 200. Размер партии 1 используется, как рекомендовано в статье.

Обучение включает фиксированное количество итераций обучения. В наборе обучающих данных 1097 изображений. Одна эпоха - это одна итерация по этому количеству примеров, при этом размер пакета, равный единице, означает 1097 шагов обучения. Генератор сохраняется и оценивается каждые 10 эпох или каждые 10970 обучающих шагов, а модель будет работать в течение 100 эпох, или всего 109 700 обучающих шагов.

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

Затем модель генератора обновляется, предоставляя реальные исходные изображения в качестве входных данных и предоставляя метки классов 1 (реальные) и реальные целевые изображения в качестве ожидаемых выходных данных модели, необходимой для расчета потерь. Генератор имеет две оценки потерь, а также оценку взвешенной суммы, возвращенную в результате вызова train_on_batch () . Нас интересует только взвешенная сумма баллов (первое возвращаемое значение), поскольку она используется для обновления весов модели.

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

# поезд pix2pix модель def train (d_model, g_model, gan_model, набор данных, n_epochs = 100, n_batch = 1): # определяем выходную квадратную форму дискриминатора n_patch = d_model.output_shape [1] # распаковать набор данных trainA, trainB = набор данных # подсчитываем количество пакетов за период обучения bat_per_epo = интервал (len (trainA) / n_batch) # рассчитываем количество итераций обучения n_steps = bat_per_epo * n_epochs # вручную перечислить эпохи для i в диапазоне (n_steps): # выбрать партию реальных образцов [X_realA, X_realB], y_real = generate_real_samples (набор данных, n_batch, n_patch) # создать партию поддельных образцов X_fakeB, y_fake = generate_fake_samples (g_model, X_realA, n_patch) # обновить дискриминатор для реальных образцов d_loss1 = d_model.train_on_batch ([X_realA, X_realB], y_real) # обновить дискриминатор для сгенерированных образцов d_loss2 = d_model.train_on_batch ([X_realA, X_fakeB], y_fake) # обновить генератор g_loss, _, _ = gan_model.train_on_batch (X_realA, [y_real, X_realB]) # подвести итоги print ('>% d, d1 [%. 3f] d2 [%. 3f] g [%. 3f]'% (i + 1, d_loss1, d_loss2, g_loss)) # подвести итоги работы модели если (i + 1)% (bat_per_epo * 10) == 0: summarize_performance (я, g_model, набор данных)

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

# train pix2pix model

def train (d_model, g_model, gan_model, dataset, n_epochs = 100, n_batch = 1):

# определение выходной квадратной формы дискриминатора

n_patch = d_model.output_shape [1]

# распаковать набор данных

trainA, trainB = dataset

# вычислить количество пакетов на обучающую эпоху

bat_per_epo = int (len (trainA) / n_batch)

# вычислить количество итераций обучения

n_steps = bat_per_epo * n_epochs

# вручную перечислить эпохи

для i в диапазоне (n_steps):

# выбрать партию реальных сэмплов

[X_realA, X_realB], y_real_patch_realBase), y_real_patch_real_sample = natch_real_s000

# создать пакет поддельных образцов

X_fakeB, y_fake = generate_fake_samples (g_model, X_realA, n_patch)

# обновить дискриминатор для реальных образцов

d_loss1 = d_model.train_on_batch ([X_realA, X_realB], y_real)

# обновить дискриминатор для сгенерированных образцов

d_loss2 = d_model.train_on_batch ([X_realA, X_fakeB], y_fake)

# обновить генератор 9_dellossan, _glossan,

train_on_batch (X_realA, [y_real, X_realB])

# суммируем производительность

print ('>% d, d1 [%. 3f] d2 [%. 3f] g [%. 3f]'% (i + 1, d_loss1 , d_loss2, g_loss))

# суммировать производительность модели

if (i + 1)% (bat_per_epo * 10) == 0:

summarize_performance (i, g_model, dataset)

Объединив все это вместе, ниже приведен полный пример кода для обучения Pix2Pix GAN преобразованию спутниковых фотографий в изображения Google Maps.

# пример pix2pix gan для спутника для преобразования изображения в изображение из numpy import load из numpy импортных нулей из множества импортных из numpy.random import randint от keras.optimizers импорт Адам из keras.initializers import RandomNormal из keras.models импорт модели from keras.models import Input из keras.layers импортировать Conv2D из keras.layers import Conv2DTranspose from keras.layers import LeakyReLU из кераса.активация импорта слоев из keras.layers import Concatenate из keras.layers import Dropout из keras.layers import BatchNormalization from keras.layers import LeakyReLU из matplotlib import pyplot # определяем модель дискриминатора def define_discriminator (image_shape): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # вход исходного изображения in_src_image = Вход (shape = image_shape) # ввод целевого изображения in_target_image = Вход (shape = image_shape) # объединить изображения по каналам merged = Concatenate () ([in_src_image, in_target_image]) # C64 d = Conv2D (64, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (объединено) d = LeakyReLU (альфа = 0.2) (г) # C128 d = Conv2D (128, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # C256 d = Conv2D (256, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # C512 d = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0.2) (г) # второй последний выходной слой d = Conv2D (512, (4,4), padding = 'same', kernel_initializer = init) (d) d = BatchNormalization () (d) d = LeakyReLU (альфа = 0,2) (d) # вывод патча d = Conv2D (1, (4,4), padding = 'same', kernel_initializer = init) (d) patch_out = Активация ('сигмоид') (d) # определить модель model = Модель ([in_src_image, in_target_image], patch_out) # скомпилировать модель opt = Адам (lr = 0,0002, beta_1 = 0,5) model.compile (loss = 'binary_crossentropy', optimizer = opt, loss_weights = [0.5]) модель возврата # определить блок кодировщика def define_encoder_block (layer_in, n_filters, batchnorm = True): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # добавить слой понижающей дискретизации g = Conv2D (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in) # условно добавить пакетную нормализацию если батчнорм: g = BatchNormalization () (g, обучение = True) # дырявая активация relu g = LeakyReLU (альфа = 0.2) (г) вернуть г # определяем блок декодера def decoder_block (layer_in, skip_in, n_filters, dropout = True): # инициализация веса init = RandomNormal (стандартное отклонение = 0,02) # добавить слой с повышенной дискретизацией g = Conv2DTranspose (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in) # добавить пакетную нормализацию g = BatchNormalization () (g, обучение = True) # условно добавить отсев если бросил: g = выпадение (0,5) (g, обучение = верно) # объединить с пропустить соединение g = Concatenate () ([g, skip_in]) # активация relu g = Активация ('relu') (g) вернуть г # определить модель автономного генератора def define_generator (image_shape = (256,256,3)): # инициализация веса init = RandomNormal (stddev = 0.02) # ввод изображения in_image = Вход (shape = image_shape) # модель кодировщика e1 = define_encoder_block (in_image, 64, batchnorm = False) e2 = define_encoder_block (e1, 128) e3 = define_encoder_block (e2, 256) e4 = define_encoder_block (e3, 512) e5 = define_encoder_block (e4, 512) e6 = define_encoder_block (e5, 512) e7 = define_encoder_block (e6, 512) # бутылочное горлышко, нет норм партии и relu b = Conv2D (512, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (e7) b = Активация ('relu') (b) # модель декодера d1 = decoder_block (b, e7, 512) d2 = decoder_block (d1, e6, 512) d3 = decoder_block (d2, e5, 512) d4 = decoder_block (d3, e4, 512, dropout = False) d5 = decoder_block (d4, e3, 256, dropout = False) d6 = decoder_block (d5, e2, 128, dropout = False) d7 = decoder_block (d6, e1, 64, dropout = False) # выход g = Conv2DTranspose (3, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d7) out_image = Активация ('tanh') (г) # определить модель model = Модель (in_image, out_image) модель возврата # определить комбинированную модель генератора и дискриминатора для обновления генератора def define_gan (g_model, d_model, image_shape): # сделать веса в дискриминаторе необучаемыми для слоя в d_model.слои: если не isinstance (слой, BatchNormalization): layer.trainable = Ложь # определяем исходное изображение in_src = Вход (shape = image_shape) # подключаем исходное изображение ко входу генератора gen_out = g_model (in_src) # подключить вход источника и выход генератора к входу дискриминатора dis_out = d_model ([in_src, gen_out]) # src image как вход, сгенерированное изображение и вывод классификации model = Модель (in_src, [dis_out, gen_out]) # скомпилировать модель opt = Адам (lr = 0.0002, beta_1 = 0,5) model.compile (loss = ['binary_crossentropy', 'mae'], optimizer = opt, loss_weights = [1,100]) модель возврата # загрузить и подготовить обучающие изображения def load_real_samples (имя файла): # загружаем сжатые массивы данные = загрузка (имя файла) # распаковать массивы X1, X2 = данные ['arr_0'], данные ['arr_1'] # масштаб от [0,255] до [-1,1] X1 = (X1 - 127,5) / 127,5 Х2 = (Х2 - 127,5) / 127,5 return [X1, X2] # выбираем партию случайных выборок, возвращаем изображения и выбираем def generate_real_samples (набор данных, n_samples, patch_shape): # распаковать набор данных trainA, trainB = набор данных # выбираем случайные экземпляры ix = randint (0, trainA.форма [0], n_samples) # получить выбранные изображения X1, X2 = поезд A [ix], поезд B [ix] # генерировать "настоящие" метки классов (1) y = единицы ((n_samples, patch_shape, patch_shape, 1)) return [X1, X2], y # генерировать пакет изображений, возвращает изображения и цели def generate_fake_samples (g_model, samples, patch_shape): # создать поддельный экземпляр X = g_model.predict (образцы) # создать фальшивые метки классов (0) y = нули ((len (X), patch_shape, patch_shape, 1)) вернуть X, y # сгенерировать образцы и сохранить как график и сохранить модель def summarize_performance (шаг, g_model, набор данных, n_samples = 3): # выбираем образец входных изображений [X_realA, X_realB], _ = generate_real_samples (набор данных, n_samples, 1) # создать партию поддельных образцов X_fakeB, _ = generate_fake_samples (g_model, X_realA, 1) # масштабировать все пиксели от [-1,1] до [0,1] X_realA = (X_realA + 1) / 2.0 X_realB = (X_realB + 1) / 2.0 X_fakeB = (X_fakeB + 1) / 2.0 # построить реальные исходные изображения для i в диапазоне (n_samples): pyplot.subplot (3, n_samples, 1 + i) pyplot.axis ('выключено') pyplot.imshow (X_realA [i]) # сюжет сгенерировал целевое изображение для i в диапазоне (n_samples): pyplot.subplot (3, n_samples, 1 + n_samples + i) pyplot.axis ('выключено') pyplot.imshow (X_fakeB [i]) # построить реальное целевое изображение для i в диапазоне (n_samples): пиплот.подзаговор (3, n_samples, 1 + n_samples * 2 + i) pyplot.axis ('выключено') pyplot.imshow (X_realB [i]) # сохранить график в файл filename1 = 'plot_% 06d.png'% (шаг + 1) pyplot.savefig (имя_файла1) pyplot.close () # сохраняем модель генератора filename2 = 'model_% 06d.h5'% (шаг + 1) g_model.save (имя_файла2) print ('> Сохранено:% s и% s'% (имя_файла1, имя_файла2)) # поезд модели pix2pix def train (d_model, g_model, gan_model, набор данных, n_epochs = 100, n_batch = 1): # определяем выходную квадратную форму дискриминатора n_patch = d_model.output_shape [1] # распаковать набор данных trainA, trainB = набор данных # подсчитываем количество пакетов за период обучения bat_per_epo = интервал (len (trainA) / n_batch) # рассчитываем количество итераций обучения n_steps = bat_per_epo * n_epochs # вручную перечислить эпохи для i в диапазоне (n_steps): # выбрать партию реальных образцов [X_realA, X_realB], y_real = generate_real_samples (набор данных, n_batch, n_patch) # создать партию поддельных образцов X_fakeB, y_fake = generate_fake_samples (g_model, X_realA, n_patch) # обновить дискриминатор для реальных образцов d_loss1 = d_model.train_on_batch ([X_realA, X_realB], y_real) # обновить дискриминатор для сгенерированных образцов d_loss2 = d_model.train_on_batch ([X_realA, X_fakeB], y_fake) # обновить генератор g_loss, _, _ = gan_model.train_on_batch (X_realA, [y_real, X_realB]) # подвести итоги print ('>% d, d1 [%. 3f] d2 [%. 3f] g [%. 3f]'% (i + 1, d_loss1, d_loss2, g_loss)) # подвести итоги работы модели если (i + 1)% (bat_per_epo * 10) == 0: summarize_performance (я, g_model, набор данных) # загрузить данные изображения набор данных = load_real_samples ('maps_256.нпз ') print ('Загружено', набор данных [0] .shape, набор данных [1] .shape) # определить форму ввода на основе загруженного набора данных image_shape = набор данных [0] .shape [1:] # определить модели d_model = define_discriminator (image_shape) g_model = define_generator (image_shape) # определить составную модель gan_model = define_gan (g_model, d_model, image_shape) # модель поезда поезд (d_model, g_model, gan_model, набор данных)

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

34

35

36

37

38

39

40

41

42

43

44

45

46

48

51

52

53

54

55

56

57

58

59

60

61

62

63

9 0004 64

65

66

67

68

69

70

71

72

73

74

75

76

77 9000

81

82

83

84

85

86

87

88

89

90

91

92

94

97

98

99

100

101

102

103

104

105

106

107

108

109

1104

1104

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

13

138

137

140138

142

143

144

145

146

147

148

149

150

151

152

153

153

153

158

159

160

161

162

163

164

165

166

167

168

169

0004 170004 170004

0007

0004

175

176

177

178

179

180

181

182

183 9000 7

184

185

186

187

188

189

190

191

192

193

194

195

1

1

200

201

202

203

204

205

206

207

208

209

210

211

212

212

211

212

217

218

219

220

221

222

223

224

225

226

227

228

0003

234

235

236

237

238

239

240

241

242 9 0007

243

244

# пример pix2pix gan для спутника для преобразования изображения в изображение

из numpy import load

from numpy import zeros

from numpy import ones

from numpy.random import randint

from keras.optimizers import Adam

from keras.initializers import RandomNormal

from keras.models import Model

from keras.models import Input

from keras.layers import Conv2D

import from keras.layers Conv2DTranspose

из keras.layers import LeakyReLU

from keras.layers import Activation

from keras.layers import Concatenate

from keras.layers import Dropout

from keras.Layers import BatchNormalization

from keras.layers import LeakyReLU

from matplotlib import pyplot

# определить модель дискриминатора

def define_discriminator (image_shape):

# исходное изображение input

in_src_image = Input (shape = image_shape)

# целевое изображение input

in_target_image = Input (shape = image_shape)

# объединять изображения по каналам

merged = Concatenate, () in_target_image])

# C64

d = Conv2D (64, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (объединено)

d = LeakyReLU (alpha = 0.2) (d)

# C128

d = Conv2D (128, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization ( ) (d)

d = LeakyReLU (alpha = 0.2) (d)

# C256

d = Conv2D (256, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (alpha = 0,2) (d)

# C512

d = Conv2D (512, (4,4), шаги = ( 2,2), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (alpha = 0.2) (d)

# второй последний выходной слой

d = Conv2D (512, (4,4), padding = 'same', kernel_initializer = init) (d)

d = BatchNormalization () (d)

d = LeakyReLU (alpha = 0.2) (d)

# вывод патча

d = Conv2D (1, (4,4), padding = 'same', kernel_initializer = init) (d)

patch_out = Activation ( 'sigmoid') (d)

# определить модель

model = Model ([in_src_image, in_target_image], patch_out)

# скомпилировать модель

opt = Adam (lr = 0.0002, beta_1 = 0,5)

model.compile (loss = 'binary_crossentropy', optimizer = opt, loss_weights = [0,5])

return model

# определить блок кодировщика

def define_encoder_block (layer_in, n_filters, batchnorm = True):

# инициализация веса

init = RandomNormal (stddev = 0,02)

# добавить слой понижающей дискретизации

g = Conv2D (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in)

# условно добавить пакетную нормализацию

, если batchnorm:

g = BatchNormalization () (g, training = True)

# активация утечки relu

g = LeakyReLU (alpha = 0.2) (g)

return g

# определение блока декодера

def decoder_block (layer_in, skip_in, n_filters, dropout = True):

# инициализация веса

init = RandomNormal (stddev7 = 0,02)

# добавить слой с повышающей дискретизацией

g = Conv2DTranspose (n_filters, (4,4), strides = (2,2), padding = 'same', kernel_initializer = init) (layer_in)

# добавить пакетную нормализацию

g = BatchNormalization () (g, training = True)

# условно добавить выпадение

если выпадение:

g = выпадение (0.5) (g, training = True)

# слияние с пропуском соединения

g = Concatenate () ([g, skip_in])

# повторная активация

g = Activation ('relu') (g)

return g

# определение модели автономного генератора

def define_generator (image_shape = (256,256,3)):

# инициализация веса

init = RandomNormal (stddev = 0,02)

# image input

in_image Входные данные (shape = image_shape)

# модель кодировщика

e1 = define_encoder_block (in_image, 64, batchnorm = False)

e2 = define_encoder_block (e1, 128)

e3 = define_encoder_block4 9 = define_encoder_block4 (e2 (e3, 512)

e5 = define_encoder_block (e4, 512)

e6 = define_encoder_block (e5, 512)

e7 =define_encoder_block (e6, 512)

# узкое место, нет пакетных норм 2 и relu 9000 (512, (4,4), шаги = (2,2), паддин g = 'same', kernel_initializer = init) (e7)

b = Активация ('relu') (b)

# модель декодера

d1 = decoder_block (b, e7, 512)

d2 = decoder_block (d1 , e6, 512)

d3 = decoder_block (d2, e5, 512)

d4 = decoder_block (d3, e4, 512, dropout = False)

d5 = decoder_block (d4, e3, 256, dropout = False)

d6 = decoder_block (d5, e2, 128, dropout = False)

d7 = decoder_block (d6, e1, 64, dropout = False)

# output

g = Conv2DTranspose (3, (4,4), шаги = (2,2), padding = 'same', kernel_initializer = init) (d7)

out_image = Activation ('tanh') (g)

# определить модель

model = Model (in_image, out_image)

return model

# определить комбинированную модель генератора и дискриминатора, для обновления генератора

def define_gan (g_model, d_model, image_shape):

# сделать веса в дискриминаторе не обучать в состоянии

для слоя в d_model.Layers:

if not isinstance (layer, BatchNormalization):

layer.trainable = False

# определить исходное изображение

in_src = Input (shape = image_shape)

# подключить исходное изображение ко входу генератора

gen_out = g_model (in_src)

# подключите вход источника и выход генератора к входу дискриминатора

dis_out = d_model ([in_src, gen_out])

# src изображение в качестве входа, сгенерированное изображение и выход классификации

model = Model (in_src, [dis_out, gen_out])

# скомпилировать модель

opt = Adam (lr = 0.0002, beta_1 = 0,5)

model.compile (loss = ['binary_crossentropy', 'mae'], optimizer = opt, loss_weights = [1,100])

return model

# загрузить и подготовить обучающие изображения

def load_real_samples (filename):

# загрузить сжатые массивы

data = load (filename)

# распаковать массивы

X1, X2 = data ['arr_0'], data ['arr_1']

# масштаб от [ 0,255] до [-1,1]

X1 = (X1 - 127,5) / 127,5

X2 = (X2 - 127.5) / 127,5

return [X1, X2]

# выбор пакета случайных выборок, возврат изображений и цель

def generate_real_samples (dataset, n_samples, patch_shape):

# unpack dataset

trainA = набор данных

# выбрать случайные экземпляры

ix = randint (0, trainA.shape [0], n_samples)

# получить выбранные изображения

X1, X2 = trainA [ix], trainB [ix]

# сгенерировать 'реальные' метки класса (1)

y = единицы ((n_samples, patch_shape, patch_shape, 1))

return [X1, X2], y

# генерировать пакет изображений, возвращает изображения и цели

def generate_fake_samples (g_model, samples, patch_shape):

# генерировать поддельный экземпляр

X = g_model.предсказать (образцы)

# создать 'поддельные' метки классов (0)

y = нули ((len (X), patch_shape, patch_shape, 1))

return X, y

# создать образцы и сохранить как график и сохраните модель

def summarize_performance (step, g_model, dataset, n_samples = 3):

# выберите образец входных изображений

[X_realA, X_realB], _ = generate_real_samples (dataset, n_samples, 1)

# создать пакет поддельных образцов

X_fakeB, _ = generate_fake_samples (g_model, X_realA, 1)

# масштабировать все пиксели от [-1,1] до [0,1]

X_realA = (X_realA + 1 ) / 2.0

X_realB = (X_realB + 1) / 2.0

X_fakeB = (X_fakeB + 1) / 2.0

# построить реальные исходные изображения

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + i)

pyplot.axis ('off')

pyplot.imshow (X_realA [i])

# plot сгенерированное целевое изображение

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + n_samples + i)

pyplot.axis ('off')

pyplot.imshow (X_fakeB [i])

# построить реальное целевое изображение

для i в диапазоне (n_samples):

pyplot.subplot (3, n_samples, 1 + n_samples * 2 + i)

pyplot.axis ('off ')

pyplot.imshow (X_realB [i])

# сохранить график в файл

filename1 =' plot_% 06d.png '% (step + 1)

pyplot.savefig (filename1)

pyplot.close ()

# сохранить модель генератора

filename2 = 'model_% 06d.h5'% (step + 1)

g_model.save (filename2)

print ('> Сохранено:% s и% s'% (filename1, filename2))

# train pix2pix models

def train (d_model, g_model, gan_model, dataset, n_epochs = 100, n_batch = 1):

# определить выходную квадратную форму дискриминатора

n_patch = d_model.output_shape [1]

# распаковать набор данных

trainA, trainB = dataset

# рассчитать количество пакетов на обучающую эпоху

bat_per_epo = int (len (trainA) / n_batch)

# вычислить количество итераций обучения

n_steps = bat_per_epo * n_epochs

# вручную перечислить эпохи

для i in range (n_steps select7

): реальных образцов

[X_realA, X_realB], y_real = generate_real_samples (dataset, n_batch, n_patch)

# сгенерировать партию поддельных образцов

X_fakeB, y_fake = generate_fake_samples (g_model_ 9_real) 0004 # обновить дискриминатор для реальных отсчетов

d_loss1 = d_model.train_on_batch ([X_realA, X_realB], y_real)

# обновить дискриминатор для сгенерированных сэмплов

d_loss2 = d_model.train_on_batch ([X_realA, X_fakeB], y_fake)

# обновить генератор 9_dellossan, train_on_batch (X_realA, [y_real, X_realB])

# суммируем производительность

print ('>% d, d1 [%. 3f] d2 [%. 3f] g [%. 3f]'% (i + 1, d_loss1 , d_loss2, g_loss))

# суммировать производительность модели

if (i + 1)% (bat_per_epo * 10) == 0:

summarize_performance (i, g_model, dataset)

# загрузить данные изображения

набор данных = load_real_samples ('maps_256.npz ')

print (' Loaded ', dataset [0] .shape, dataset [1] .shape)

# определить входную форму на основе загруженного набора данных

image_shape = dataset [0] .shape [1:]

# определить модели

d_model = define_discriminator (image_shape)

g_model = define_generator (image_shape)

# определить составную модель

gan_model =define_gan (g_model 9000, train7shape), train7smodel 9000, train_model 9000, train70004 d_model, g_model, gan_model, набор данных)

Пример можно запустить на аппаратном обеспечении ЦП, хотя рекомендуется аппаратное обеспечение ГП.

Пример может занять около двух часов на современном оборудовании с графическим процессором.

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

Потеря сообщается на каждой итерации обучения, включая потерю дискриминатора на реальных примерах (d1), потерю дискриминатора на сгенерированных или поддельных примерах (d2) и потерю генератора, которая представляет собой средневзвешенное значение состязательных и L1 потерь (g).

Если потери дискриминатора стремятся к нулю и остаются там в течение длительного времени, рассмотрите возможность перезапуска обучающего прогона, поскольку это пример неудачного обучения.

> 1, d1 [0,566] d2 [0,520] г [82,266] > 2, d1 [0,469] d2 [0,484] г [66,813] > 3, d1 [0,428] d2 [0,477] г [79,520] > 4, d1 [0,362] d2 [0,405] г [78,143] > 5, d1 [0,416] d2 [0,406] г [72,452] ... > 109596, d1 [0,303] d2 [0,006] г [5,792] > 109597, d1 [0,001] d2 [1,127] g [14.343] > 109598, d1 [0,000] d2 [0,381] г [11,851] > 109599, d1 [1,289] d2 [0,547] г [6,901] > 109600, d1 [0,437] d2 [0,005] г [10,460] > Сохранены: plot_109600.png и model_109600.h5

> 1, d1 [0,566] d2 [0,520] г [82,266]

> 2, d1 [0,469] d2 [0,484] г [66,813]

> 3, d1 [0,428] d2 [0,477] г [79,520 ]

> 4, d1 [0,362] d2 [0,405] г [78,143]

> 5, d1 [0,416] d2 [0,406] г [72.452]

...

> 109596, d1 [0,303] d2 [0,006] г [5,792]

> 109597, d1 [0,001] d2 [1,127] г [14,343]

> 109598, d1 [0,000] d2 [0,381] г [11,851]

> 109599, d1 [1,289] d2 [0,547] г [6,901]

> 109600, d1 [0,437] d2 [0,005] г [10.460]

> Сохранено: plot_109600.png и model_109600.h5

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

В конце прогона у вас будет 10 сохраненных файлов модели и 10 графиков сгенерированных изображений.

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

График спутника на карту Google, переведенные изображения с помощью Pix2Pix после 10 эпох обучения

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

Обратите внимание на первый пример сгенерированного изображения ниже (правый столбец, средняя строка), который содержит больше полезных деталей, чем реальное изображение карты Google.

График спутника на карту Google, переведенные изображения с помощью Pix2Pix после 100 эпох обучения

Теперь, когда мы разработали и обучили модель Pix2Pix, мы можем изучить, как их можно использовать автономно.

Как переводить изображения с помощью модели Pix2Pix

Обучение модели Pix2Pix приводит к созданию множества сохраненных моделей и образцов сгенерированных изображений для каждой из них.

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

В этом случае мы будем использовать модель, сохраненную в конце прогона, например после 100 эпох или 109 600 итераций обучения.

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

Сначала мы можем загрузить набор обучающих данных. Мы можем использовать ту же функцию с именем load_real_samples () для загрузки набора данных, которая использовалась при обучении модели.

# загрузить и подготовить обучающие изображения def load_real_samples (имя файла): # загрузить сжатые файлы данные = загрузка (имя файла) # распаковать массивы X1, X2 = данные ['arr_0'], данные ['arr_1'] # масштаб от [0,255] до [-1,1] Х1 = (Х1 - 127.5) / 127,5 Х2 = (Х2 - 127,5) / 127,5 возврат [X1, X2]

# загрузить и подготовить обучающие изображения

def load_real_samples (filename):

# загрузить сжатые файлы

data = load (filename)

# распаковать массивы

X1, X2 = data ['arr_0'], data [ 'arr_1']

# масштаб от [0,255] до [-1,1]

X1 = (X1 - 127,5) / 127,5

X2 = (X2 - 127,5) / 127.5

возврат [X1, X2]

Эту функцию можно вызвать следующим образом:

... # загрузить набор данных [X1, X2] = load_real_samples ('maps_256.npz') print ('Загружено', X1.shape, X2.shape)

...

# загрузить набор данных

[X1, X2] = load_real_samples ('maps_256.npz')

print ('Loaded', X1.shape, X2.shape)

Затем мы можем загрузить сохраненную модель Keras.

... # модель нагрузки model = load_model ('model_109600.h5')

...

# загрузить модель

model = load_model ('model_109600.h5')

Затем мы можем выбрать случайную пару изображений из набора обучающих данных для использования в качестве примера.

... # выбрать случайный пример ix = randint (0, len (X1), 1) src_image, tar_image = X1 [ix], X2 [ix]

...

# выбрать случайный пример

ix = randint (0, len (X1), 1)

src_image, tar_image = X1 [ix], X2 [ix]

Мы можем предоставить исходное спутниковое изображение в качестве входных данных для модели и использовать его для прогнозирования изображения карты Google.

... # генерировать изображение из источника gen_image = model.predict (src_image)

...

# генерировать изображение из источника

gen_image = model.предсказать (src_image)

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

Функция plot_images () ниже реализует это, обеспечивая красивый заголовок над каждым изображением.

# сюжетное исходное, сгенерированное и целевое изображения def plot_images (src_img, gen_img, tar_img): images = vstack ((src_img, gen_img, tar_img)) # масштаб от [-1,1] до [0,1] изображения = (изображения + 1) / 2.0 title = ['Источник', 'Создано', 'Ожидается'] # построчно строить изображения для i в диапазоне (len (изображения)): # определить подзаговор pyplot.subplot (1, 3, 1 + я) # выключить ось pyplot.axis ('выключено') # построить необработанные данные пикселей pyplot.imshow (изображения [i]) # показать заголовок pyplot.title (заголовки [i]) pyplot.show ()

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

# источник графика, сгенерированные и целевые изображения

def plot_images (src_img, gen_img, tar_img):

images = vstack ((src_img, gen_img, tar_img))

# масштаб от [-1,1] до [0 , 1]

изображений = (images + 1) / 2.0

title = ['Source', 'Generated', 'Expected']

# построчно строить изображения

для i в диапазоне (len (images)):

# define subplot

pyplot.subplot ( 1, 3, 1 + i)

# выключить ось

pyplot.axis ('off')

# построить необработанные данные пикселей

pyplot.imshow (images [i])

# показать заголовок

pyplot .title (заголовки [i])

pyplot.show ()

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

... # построить все три изображения plot_images (src_image, gen_image, tar_image)

...

# построить все три изображения

plot_images (src_image, gen_image, tar_image)

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

# пример загрузки модели pix2pix и ее использования для преобразования изображения в изображение из кераса.модели импортировать load_model из numpy import load из numpy import vstack из matplotlib import pyplot из numpy.random import randint # загрузить и подготовить обучающие изображения def load_real_samples (имя файла): # загружаем сжатые массивы данные = загрузка (имя файла) # распаковать массивы X1, X2 = данные ['arr_0'], данные ['arr_1'] # масштаб от [0,255] до [-1,1] X1 = (X1 - 127,5) / 127,5 Х2 = (Х2 - 127,5) / 127,5 return [X1, X2] # сюжетное исходное, сгенерированное и целевое изображения def plot_images (src_img, gen_img, tar_img): images = vstack ((src_img, gen_img, tar_img)) # масштаб от [-1,1] до [0,1] изображения = (изображения + 1) / 2.0 title = ['Источник', 'Создано', 'Ожидается'] # построчно строить изображения для i в диапазоне (len (изображения)): # определить подзаговор pyplot.subplot (1, 3, 1 + я) # выключить ось pyplot.axis ('выключено') # построить необработанные данные пикселей pyplot.imshow (изображения [i]) # показать заголовок pyplot.title (заголовки [i]) pyplot.show () # загрузить набор данных [X1, X2] = load_real_samples ('maps_256.npz') print ('Загружено', X1.shape, X2.shape) # модель нагрузки model = load_model ('модель_109600.h5 ') # выбрать случайный пример ix = randint (0, len (X1), 1) src_image, tar_image = X1 [ix], X2 [ix] # генерировать изображение из источника gen_image = model.predict (src_image) # построить все три изображения plot_images (src_image, gen_image, tar_image)

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

34

35

36

37

38

39

40

41

42

43

44

45

46

47

# пример загрузки модели pix2pix и ее использования для преобразования изображения в изображение

из keras.models import load_model

from numpy import load

from numpy import vstack

from matplotlib import pyplot

from numpy.random import randint

# загрузить и подготовить обучающие изображения

def load_real_samples ( загрузить сжатые массивы

data = load (filename)

# распаковать массивы

X1, X2 = data ['arr_0'], data ['arr_1']

# масштабировать от [0,255] до [-1,1]

X1 = (X1 - 127.5) / 127,5

X2 = (X2 - 127,5) / 127,5

return [X1, X2]

# источник графика, сгенерированные и целевые изображения

def plot_images (src_img, gen_img, tar_img):

изображений = vstack ((src_img, gen_img, tar_img))

# масштаб от [-1,1] до [0,1]

изображений = (images + 1) / 2.0

заголовков = ['Источник', 'Создано ',' Expected ']

# построчно строить изображения

для i in range (len (images)):

# определять подзаголовок

pyplot.subplot (1, 3, 1 + i)

# выключить ось

pyplot.axis ('off')

# построить необработанные пиксельные данные

pyplot.imshow (images [i])

# показать заголовок

pyplot.title (title [i])

pyplot.show ()

# загрузить набор данных

[X1, X2] = load_real_samples ('maps_256.npz')

print ('Loaded', X1. shape, X2.shape)

# загрузить модель

model = load_model ('model_109600.h5')

# выбрать случайный пример

ix = randint (0, len (X1), 1)

src_image, tar_image = X1 [ix], X2 [ix]

# генерировать изображение из источника

gen_image = model.pred (src_image)

# построить все три изображения

plot_images (src_image, gen_image, tar_image)

При выполнении примера будет выбрано случайное изображение из набора обучающих данных, оно переведено на карту Google и построено сравнение результата с ожидаемым изображением.

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

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

График спутника для преобразования изображения карты Google с помощью окончательной модели Pix2Pix GAN

Мы также можем использовать модель для перевода данного автономного изображения.

Мы можем выбрать изображение из набора данных проверки в разделе maps / val и обрезать спутниковый элемент изображения.Затем его можно сохранить и использовать в качестве входных данных для модели.

В этом случае мы будем использовать « maps / val / 1.jpg ».

Пример изображения из части проверки набора данных карт

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

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

Мы должны загрузить изображение как массив пикселей NumPy размером 256 × 256, изменить масштаб значений пикселей до диапазона [-1,1], а затем расширить размеры одного изображения, чтобы представить один входной образец.

Функция load_image () ниже реализует это, возвращая пиксели изображения, которые могут быть предоставлены непосредственно загруженной модели Pix2Pix.

# загрузить изображение def load_image (имя файла, размер = (256,256)): # загрузить изображение желаемого размера пикселей = load_img (имя файла, target_size = размер) # преобразовать в массив numpy пикселей = img_to_array (пиксели) # масштаб от [0,255] до [-1,1] пикселей = (пикселей - 127,5) / 127,5 # изменить форму до 1 образца пикселей = expand_dims (пикселей, 0) возврат пикселей

# загрузить изображение

def load_image (filename, size = (256,256)):

# загрузить изображение с предпочтительным размером

пикселей = load_img (filename, target_size = size)

# преобразовать в массив numpy

пикселей = img_to_array (пикселей)

# масштаб от [0,255] до [-1,1]

пикселей = (пикселей - 127.5) / 127,5

# изменить форму до 1 образца

пикселей = expand_dims (пикселей, 0)

вернуть пиксели

Затем мы можем загрузить наш обрезанный спутниковый снимок.

... # загрузить исходное изображение src_image = load_image ('satellite.jpg') print ('Загружено', src_image.shape)

...

# загрузить исходное изображение

src_image = load_image ('satellite.jpg ')

print (' Загружено ', src_image.shape)

Как и раньше, мы можем загрузить нашу сохраненную модель генератора Pix2Pix и сгенерировать перевод загруженного изображения.

... # модель нагрузки модель = load_model ('модель_109600.h5') # генерировать изображение из источника gen_image = model.predict (src_image)

...

# загрузить модель

model = load_model ('model_109600.h5 ')

# генерировать изображение из источника

gen_image = model.predict (src_image)

Наконец, мы можем снова масштабировать значения пикселей до диапазона [0,1] и построить график результата.

... # масштаб от [-1,1] до [0,1] gen_image = (gen_image + 1) / 2.0 # построить изображение pyplot.imshow (gen_image [0]) pyplot.axis ('выключено') pyplot.show ()

...

# масштаб от [-1,1] до [0,1]

gen_image = (gen_image + 1) / 2.0

# построить изображение

pyplot.imshow (gen_image [0])

pyplot .axis ('выкл.')

pyplot.show ()

Если объединить все это вместе, ниже приведен полный пример выполнения специального перевода изображения с одним файлом изображения.

# пример загрузки модели pix2pix и использования ее для одноразового перевода изображений из кераса.модели импортировать load_model из keras.preprocessing.image import img_to_array из keras.preprocessing.image import load_img из numpy import load из numpy import expand_dims из matplotlib import pyplot # загрузить изображение def load_image (имя файла, размер = (256,256)): # загрузить изображение желаемого размера пикселей = load_img (имя файла, target_size = размер) # преобразовать в массив numpy пикселей = img_to_array (пиксели) # масштаб от [0,255] до [-1,1] пикселей = (пикселей - 127.5) / 127,5 # изменить форму до 1 образца пикселей = expand_dims (пикселей, 0) вернуть пиксели # загрузить исходное изображение src_image = load_image ('satellite.jpg') print ('Загружен', src_image.shape) # модель нагрузки модель = load_model ('модель_109600.h5') # генерировать изображение из источника gen_image = model.predict (src_image) # масштаб от [-1,1] до [0,1] gen_image = (gen_image + 1) / 2.0 # построить изображение pyplot.imshow (gen_image [0]) pyplot.axis ('выключено') пиплот.показать ()

1

2

3

4

5

6

7

8

9

10

11

12

13

140004

14

18

19

20

21

22

23

24

25

26

27

28

29

30

# пример загрузки модели pix2pix и ее использования для одноразового преобразования изображения

из keras.models import load_model

from keras.preprocessing.image import img_to_array

from keras.preprocessing.image import load_img

from numpy import load

from numpy import expand_dims

from matplot

import image

#

def load_image (filename, size = (256,256)):

# загрузить изображение с предпочтительным размером

пикселей = load_img (filename, target_size = size)

# преобразовать в массив numpy

пикселей = img_to_array (пикселей)

# масштаб от [0,255] до [-1,1]

пикселей = (пикселей - 127.5) / 127,5

# изменить форму до 1 образца

пикселей = expand_dims (пикселей, 0)

вернуть пиксели

# загрузить исходное изображение

src_image = load_image ('satellite.jpg')

print (' Loaded ', src_image.shape)

# загрузить модель

model = load_model (' model_109600.h5 ')

# создать изображение из источника

gen_image = model.predict (src_image)

# масштаб от [-1, 1] до [0,1]

gen_image = (gen_image + 1) / 2.0

# построить изображение

pyplot.imshow (gen_image [0])

pyplot.axis ('off')

pyplot.show ()

При выполнении примера загружается изображение из файла, создается его перевод и отображается результат.

Созданное изображение является разумным переводом исходного изображения.

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

Участок спутникового изображения, переведенный на карты Google с помощью окончательной модели Pix2Pix GAN

Как перевести карты Google на спутниковые изображения

Теперь, когда мы знакомы с тем, как разработать и использовать модель Pix2Pix для перевода спутниковых изображений на карты Google, мы можем также изучить обратное.

То есть мы можем разработать модель Pix2Pix для преобразования изображений карты Google в правдоподобные спутниковые изображения. Для этого требуется, чтобы модель изобрела или представила себе правдоподобные здания, дороги, парки и т. Д.

Мы можем использовать один и тот же код для обучения модели с одной небольшой разницей. Мы можем изменить порядок наборов данных, возвращаемых функцией load_real_samples () ; например:

# загрузить и подготовить обучающие изображения def load_real_samples (имя файла): # загружаем сжатые массивы данные = загрузка (имя файла) # распаковать массивы X1, X2 = данные ['arr_0'], данные ['arr_1'] # масштаб от [0,255] до [-1,1] X1 = (X1 - 127,5) / 127,5 Х2 = (Х2 - 127.5) / 127,5 # возврат в обратном порядке возврат [X2, X1]

# загрузить и подготовить обучающие образы

def load_real_samples (filename):

# загрузить сжатые массивы

data = load (filename)

# распаковать массивы

X1, X2 = data ['arr_0'], data [ 'arr_1']

# масштаб от [0,255] до [-1,1]

X1 = (X1 - 127,5) / 127,5

X2 = (X2 - 127,5) / 127.5

# возврат в обратном порядке

возврат [X2, X1]

Примечание : порядок X1 и X2 обратный.

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

Выполните пример, как прежде.

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

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

> 1, d1 [0,442] d2 [0,650] г [49,790] > 2, d1 [0,317] d2 [0,478] г [56,476] > 3, d1 [0,376] d2 [0,450] г [48,114] > 4, d1 [0,396] d2 [0,406] г [62,903] > 5, d1 [0,496] d2 [0,460] г [40,650] ... > 109596, d1 [0.311] d2 [0,057] г [25,376] > 109597, d1 [0,028] d2 [0,070] г [16,618] > 109598, d1 [0,007] d2 [0,208] г [18,139] > 109599, d1 [0,358] d2 [0,076] г [22,494] > 109600, d1 [0,279] d2 [0,049] г [9,941] > Сохранены: plot_109600.png и model_109600.h5

> 1, d1 [0,442] d2 [0,650] г [49,790]

> 2, d1 [0,317] d2 [0,478] г [56,476]

> 3, d1 [0,376] d2 [0,450] г [48,114 ]

> 4, d1 [0.396] d2 [0,406] г [62,903]

> 5, d1 [0,496] d2 [0,460] г [40,650]

...

> 109596, d1 [0,311] d2 [0,057] г [25,376]

> 109597, d1 [0,028] d2 [0,070] г [16,618]

> 109598, d1 [0,007] d2 [0,208] г [18,139]

> 109599, d1 [0,358] d2 [0,076] г [22,494]

> 109600, d1 [0,279] d2 [0,049] g [9,941]

> Сохранено: plot_109600.png и model_109600.h5

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

График карты Google Map со спутниковым переводом изображений с помощью Pix2Pix после 10 эпох обучения

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

Модель не представляет особых трудностей в создании разумных водных ресурсов, парков, дорог и т. Д.

График карты Google на спутниковые изображения, переведенные с помощью Pix2Pix после 90 эпох обучения

Расширения

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

  • Автономный спутник . Разработайте пример перевода автономных изображений карт Google в спутниковые изображения, как мы сделали для спутниковых изображений в карты Google.
  • Новый образ . Найдите спутниковый снимок совершенно нового места, переведите его на карту Google и сравните результат с фактическим изображением на картах Google.
  • Дополнительная подготовка . Продолжите обучение модели еще на 100 эпох и оцените, приведет ли дополнительное обучение к дальнейшему улучшению качества изображения.
  • Увеличение изображения . Используйте небольшое увеличение изображения во время обучения, как описано в статье Pix2Pix, и оцените, приводит ли это к лучшему качеству сгенерированных изображений.

Если вы изучите какое-либо из этих расширений, я хотел бы знать.
Разместите свои выводы в комментариях ниже.

Дополнительная литература

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

Официальный

API

Сводка

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

В частности, вы выучили:

  • Как загрузить и подготовить спутниковое изображение в набор данных преобразования изображения в изображение карт Google.
  • Как разработать модель Pix2Pix для перевода спутниковых фотографий в изображения карты Google.
  • Как использовать окончательную модель генератора Pix2Pix для перевода специальных спутниковых изображений.

Есть вопросы?
Задайте свои вопросы в комментариях ниже, и я постараюсь ответить.

Развивайте генеративные состязательные сети сегодня!

Разработайте модели GAN за считанные минуты
...с всего несколькими строками кода Python

Узнайте, как это сделать, в моей новой электронной книге:
Генеративные состязательные сети с Python

Он предоставляет руководств для самообучения и сквозных проектов на:
DCGAN , условных GAN , перевод изображений , Pix2Pix , CycleGAN
и многое другое ...

Наконец-то привнесите модели GAN в свои проекты Vision
Пропустите академики. Только результаты.Посмотрите, что внутри .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *