Pull to refresh

Обучение нейросети в речном круизе или история одного мини-проекта

Reading time15 min
Views5.9K

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

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

Небольшое вступление

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

Это мы при выборе летнего отдыха. 2022 год
Это мы при выборе летнего отдыха. 2022 год

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

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

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

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

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

О речных круизах. Выбор теплохода и каюты

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

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

Карта судоходных рек европейской части России
Карта судоходных рек европейской части России

Несмотря на то, что основной парк лайнеров довольно старый (мы, например, плавали на теплоходе «Константин Коротков» который был построен в 1976 !!! году), теплоходы довольно комфортные и проходят реновацию («Коротков» прошел реновацию в 2020 году). Во время путешествия, на стоянках, мы часто проходили через другие суда -  и вот некоторые из них были не в самом лучшем состоянии, обшитые внутри деревом, потемнели и изрядно износились.

Теплоход "Константин Коротков" Северный речной вокзал 2022
Теплоход "Константин Коротков" Северный речной вокзал 2022

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

Необходимо обращать внимание на класс теплохода:

  • Эконом

  • Стандарт

  • Комфорт

  • Люкс

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

Схема палуб «Константин Коротков» (с сайта Водоход)
Схема палуб «Константин Коротков» (с сайта Водоход)

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

Вид из окна нашей каюты
Вид из окна нашей каюты

О цветовом пространстве LAB

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

Для нашего эксперимента достаточно понимания,  что каждый пиксель этой цветовой модели состоит из трех координат: L - светлота и хроматические составляющие — A и B. Первая обозначает положение цвета в диапазоне от зеленого до красного, вторая — от синего до желтого.

L - светлота (Lightness), от 0 до 100

A - цвет от зеленого до красного, от - 128 до 128

B - цвет от синего до желтого, от - 128 до 128

Если разобрать фотографию на три слоя и оставить только слой L, то фотография будет черно-белой.

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

Для работы с LAB будет использоваться библиотека scikit-image.

from PIL import image

from skimage.color import rgn2lab

my_image= image.open(«image_name_file»)

my_image = my_image.convert('RGB')

my_image_lab = rgb2lab(my_image)

my_image_lab.shape

(1280, 960, 3)

В результате в my_image_lab будет находится массив, с размерностью фотографии, 1280 на 960 пикселей и значения LAB в каждом пикселе, например, посмотрим какие значения в пикселе с координатами [0,0]:

my_image_lab[0,0]

array([ 15.07521656, -12.67294754,  18.01043186])

При обучении координата L не используется, а нам необходимо только обучить сеть как транслировать координаты A и B цифровой фотографии в координаты  A и B пленочной фотографии. 

“Ну с фотографиями на теплоходе точно проблем не будет. Речные пейзажи - прекрасны. Вот в круизе и буду заниматься обучением” - так думал я.

Программа дня на теплоходе

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

Мероприятия разделены на три группы:

  • Для маленьких детей (детские игры с аниматорами)

  • Мероприятия для подростков (мафия, настольные игры)

  • Мероприятия для взрослых

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

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

  • Концерты

  • Рукоделие

  • Интеллектуальные игры

  • Танцы

  • Театральные и поэтические представления

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

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

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

Все туристы снимают одно и то же или история про обучающую выборку

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

Где же брать исходные данные? 

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

Хотелось найти бесплатные исходные данные, чтобы можно было провести серию экспериментов.

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

Я решил попробовать действовать по такому алгоритму:

  • Нахожу в сети фотографии известных объектов снятых на пленку (искал на Flickr в специализированных группах)

  • Через поиск Яндекс картинки ищу похожие фотографии

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

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

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

Сможете угадать где пленка, а где цифра?
Сможете угадать где пленка, а где цифра?

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

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

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

Ниже простая функция трансформации, которой на вход подается фотография и настройки трансформации.

from PIL import ImageEnhance

def transform_image(img_pil,brightness,contrast,color):

    if (brightness != 0):

        enhancer = ImageEnhance.Brightness(img_pil)

        img_pil = enhancer.enhance(brightness)

    if (contrast != 0):

        enhancer = ImageEnhance.Contrast(img_pil)

        img_pil = enhancer.enhance(contrast)

    if (color != 0):

        enhancer = ImageEnhance.Color(img_pil)

        img_pil = enhancer.enhance(color) 

    return img_pil

На каждую пленочную фотографию я применял несколько трансформаций, получалось примерно так (один из вариантов):

Пример трансформации фотографии
Пример трансформации фотографии

Питание на теплоходе

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

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

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

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

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

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

Модели обучения

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

Были проработаны несколько моделей обучения:

  • Обучение сверточной нейросети по фрагментам размером 64 х 64 пикселя

  • Обучение  “Случайны лес” (регрессия) по фрагментам размером 1 х 1 пиксель

  • Обучение нейросети (регрессия) по фрагментам размером 1 х 1 пиксель

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

Тестовые фотографии сведены в таблицу в конце этого раздела (все тестовые фотографии были сделаны во время круиза).

Обучение по фрагментам фотографии

Для первого эксперимента были использованы фотографии из первой обучающей выборки (которые мы находили через Яндекс картинки). Каждая фотография была разделена на фрагменты по 64 х 64 пикселя. 

Фактически в Х подавалась матрица 64 х 64 пикселя цифровой фотографии, каждый пиксель которой содержит координаты A и B цветового пространства LAB, а в Y аналогичный фрагмент пленочной фотографии.

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

Размер 64 х 64 был выбран опытным способом - не очень большой и не очень маленький.

Пример фрагмента 64 х 64 пикселя
Пример фрагмента 64 х 64 пикселя

Для обучения использовалось несколько конфигураций нейросети, но лучше всего себя показала следующая конфигурация:

model = Sequential()

model.add(InputLayer(input_shape=(None, None, 2)))

model.add(Conv2D(8, (3, 3), activation='relu', padding='same', strides=2))

model.add(Conv2D(8, (3, 3), activation='relu', padding='same'))

model.add(Conv2D(16, (3, 3), activation='relu', padding='same'))

model.add(Conv2D(16, (3, 3), activation='relu', padding='same', strides=2))

model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))

model.add(Conv2D(32, (3, 3), activation='relu', padding='same', strides=2))

model.add(UpSampling2D((2, 2)))

model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))

model.add(UpSampling2D((2, 2)))

model.add(Conv2D(16, (3, 3), activation='relu', padding='same'))

model.add(UpSampling2D((2, 2)))

model.add(Conv2D(2, (3, 3), activation='tanh', padding='same'))

model.compile(optimizer='adam', loss='mse',metrics=['accuracy'])

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

Пример контуров (слева цвет, справа только каналы A и B)
Пример контуров (слева цвет, справа только каналы A и B)

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

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

Случайный лес

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

Тогда я решил попробовать Случайный лес (регрессия), на вход которой подается координата A и B каждого пикселя

from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor()

Я немного пробовал менять  разные параметры, но результат меня тоже не удовлетворил. 

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

Еще одна сетка

Тогда я решил попробовать обучать регрессию простой нейросетью. Я использовал такую конфигурацию нейросети

model = Sequential()

model.add(Dense(20, input_dim=2, activation='sigmoid'))

model.add(ReLU(1.0))

model.add(Dense(10, activation='sigmoid'))

model.add(ReLU(1.0))

model.add(Dense(5, activation='softmax'))

model.add(Dense(2, activation='linear'))

model.compile(optimizer='adam', loss='mse',metrics=['accuracy'])

Из тестовых вариантов этот вариант мне понравился больше всего.

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

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

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

Экскурсионная программа. Артисты и обслуживающий персонал

В первый день круиза пассажирам предлагается выбрать экскурсионную программу. Проводится встреча, на которой подробно рассказывается о стоянках теплохода и возможных экскурсиях в местах стоянки.  В каждому порту есть бесплатные экскурсии (2-3 на выбор) и платные (дополнительные) экскурсии. Таким образом даже если пассажир был в этом городе, то он может выбрать другую экскурсию. Для первого раза хватает базовых экскурсий.

Почти каждый день теплоход приходит в какой-то порт. Наш путь был такой:

Москва - Мышкин - Горицы - Кижи - Мандроги - Сортавала (Рускеала) - Санкт-Петербург

Стоянки довольно короткие, в среднем, 3,5 - 5 часов. На некоторые города достаточно такого времени, а на некоторые очень сильно не хватает и приходится сильно торопиться, чтобы все посмотреть. Думаю, небольшое время стоянки обусловлено большими переходами между портами.

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

Мне больше всего понравились Кижи

Остров Кижи
Остров Кижи

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

Случайный попутчик
Случайный попутчик
Где-то  далеко на реке
Где-то далеко на реке

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

Закат на реке Ковжа
Закат на реке Ковжа

На теплоходе организовывают досуг  артисты. На нашем теплоходе были:

  • Саксофонист

  • Пианист

  • Скрипач

  • Гитарист

  • Певица

  • Артисты (были небольшие мини спектакли)

  • Дуэт танцоров

  • Поэтесса

  • Ведущий

  • Экскурсовод

  • Детский аниматор

  • Аниматор для подростков

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

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

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

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

Оценка результата

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

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

  • Были выбраны несколько пленочных фотографий (некоторые из них присутствовали в обучающей выборке, а некоторые нет, и сеть их не видела)

  • Из этих фотографий была составлены матрица уникальных кординат A,B. Таким образом сформированы матрица  “идеальных” цветов пленочной фотографии

  • Подсчитывалось количество совпадений тестовых  фотографий после обработки обученной ML

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

Модель

Количество уникальных совпадений цветов (канал A,B)

Необработанные фотографии

399 123

Обучение нейросеть фрагменты 64 х 64 пикселя

351 024

Случайный лес 1 х 1 пиксель

382 802

Нейросеть 1 х 1 пиксель

452 589

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

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

Заключение

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

Правильные ответы
Правильные ответы

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

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

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

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

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

С радостью приму все советы, предложения и критику.

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

Tags:
Hubs:
Total votes 20: ↑18 and ↓2+16
Comments10

Articles