Реализация кераса « Изображение внедорожников для нерегулярных отверстий с использованием частичных свертков », https://arxiv.org/abs/1804.07723. Огромный крик авторов Гулин Лю, Фитсум А. Реды, Кевин Дж. Ши, Тинг-Чун Ван, Эндрю Тао и Брайан Катанзаро из Nvidia Corporation за выпуск этой удивительной газеты, для меня было отличным опытом обучения, чтобы реализовать архитектуру,, Частичный сверточный слой и потери функционируют.

Самый простой способ попробовать несколько прогнозов с помощью этого алгоритма - это перейти на www.fixmyphoto.ai, где я развернул его в приложении без сервера с выводом функций AWS Lambda.
Если вы хотите покопаться в коде, первичные реализации нового уровня кераса PConv2D , а также UNet архитектуру с использованием этих частичных сверточных слоев можно найти в libs/pconv_layer.py и libs/pconv_model.py , соответственно - это где можно найти большую часть реализации. Помимо этого, я настроил четыре ноутбука Юпитера, в которых подробно рассказывается о нескольких шагах, которые я сделал во время реализации сети, а именно:
Шаг 1: Создание случайных нерегулярных масок
Шаг 2: Реализация и тестирование реализации уровня PConv2D
Шаг 3: Реализация и тестирование архитектуры UNET с помощью слоев PConv2D
Шаг 4: Обучение и тестирование окончательной архитектуры на ImageNet
Шаг 5: Упрощенная попытка прогнозировать произвольные размеры изображения через изображение Чункинг
Я перенес веса VGG16 из Pytorch в керас; Это означает 1/255. Масштабирование пикселей может использоваться для сети VGG16, аналогично Pytorch.
Вы можете либо перейти непосредственно к ноутбуке шага 4, либо в качестве альтернативы использовать CLI (обязательно загрузите преобразованные веса VGG16):
python main.py
--name MyDataset
--train TRAINING_PATH
--validation VALIDATION_PATH
--test TEST_PATH
--vgg_path './data/logs/pytorch_to_keras_vgg16.h5'
Детали реализации находятся в самой газете, однако я постараюсь обобщить некоторые детали здесь.
В статье они используют методику, основанную на окклюзии/дефекции между двумя последовательными кадрами в видео для создания случайных нерегулярных масок-вместо этого я решил просто создать простую функцию генератора маски, которая использует OpenCV, чтобы нарисовать несколько случайных нерегулярных форм Затем я использую для масок. Позже подключение новой техники генерации маски не должно быть проблемой, и я думаю, что конечные результаты также довольно приличные, используя этот метод.
Ключевым элементом в этой реализации является частичный сверточный слой. По сути, учитывая сверточный фильтр w и соответствующий смещение B , вместо нормальной сверты: в обычной свертке: следующая частичная свертка:

где ⊙ размножение в стиле элемента, а м -бинарная маска 0s и 1s. Важно отметить, что после каждой частичной свертки маска также обновляется, так что, если свертка была в состоянии установить свой выход, по крайней мере, на одном действительном входе, то маска удаляется в этом месте, т.е.

Результатом этого является то, что с достаточно глубокой сетью маска в конечном итоге будет всем (т.е. исчезает)
Конкретные детали архитектуры можно найти в статье, но, по сути, она основана на нететической структуре, где все обычные сверточные слои заменяются частичными сверточными слоями, так что во всех случаях изображение передается через сеть вместе с маской Полем Следующее дает обзор архитектуры. 
Функция потерь, используемая в статье, является довольно интенсивной и может быть рассмотрена в статье. Короче говоря, это включает в себя:
Взвешивание всех этих терминов потерь следующим образом: 
Сеть обучалась на ImageNet с размером партии 1, и каждая эпоха была указана как 10 000 партий длиной. Кроме того, обучение проводилось с использованием оптимизатора ADAM на двух этапах, поскольку нормализация партии представляет проблему для замаскированных свертков (поскольку среднее значение и дисперсия рассчитывается для пикселей отверстия).
Скорость обучения 1 -го этапа 0,0001 для 50 эпох с включенной нормализацией партии во всех слоях
Стадия 2 -го обучения 0,00005 для 50 эпох, где нормализация партии во всех кодирующих слоях отключена.
Время обучения для показанных изображений было абсолютно безумным долго, но это, вероятно, из -за моей плохой личной установки. Несколько тестов, которые я пробовал на 1080TI (с размером партии 4), указывают на то, что время обучения может составлять около 10 дней, как указано в статье.