Как я фотографию восстанавливал

в 15:11, , рубрики: javascript, нейросеть, обработка изображений, фотография

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

image

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

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

image

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

{
	"#8c1d25": [1412941, 0, 1413141, 0, 1433141, 0, 1433141, 1412941, 0, 0, 1423141, 1423141, 1433241, 0, 0, 1412941, 0, 1402840, 1433141, 1402941]
}

С функциями я думаю и без объяснения понятно, так что просто расскажу о самых важных функциях:

  • update - После добавления нейрона нам обязательно нужно будет эго обновить, ведь один и тот же результат может быть получен исходя из разных вариантах полученных данных, поэтому если у меня уже имеется такой нейрон я просто суммирую данные в нём с новыми, после чего делю на 2 и поучаю среднее значение (наиболее вероятное сочетание данных).
  • compare - Я подаю сюда название нейрона, с которым хочу проверить и массив с данными, функция после обработки выдаёт процентное соотношение полученных данных с данными в нейроне.

Шаг 1

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

Шаг 2

Нейросеть перебирает все, не пустые пиксели и запоминает, какие цвета находятся вокруг этого цвета в радиусе 2 пикселя. Каждый цвет сохраняется как огромное число, но по сути я просто объединяю подряд RGB (например красный цвет будет: 255.0.0 | 25500). Если цвет уже встречался, то я не перезаписываю его, а получаю средний цвет между новыми и старыми данными, каждого соседнего пикселя. Для уточнения хочу сказать, что сеть можно обучать и по другим фоткам, можно загрузить в неё несколько похожих изображений и тогда она восстановит испорченную фотку до идеального состояния.

Вид записи

image

{
	"#ff9300": [255695, 255880, 2551230, 2551110, 2551700, 2551350, 2551110, 2552050]
}

Шаг 3

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

Brain.search.neuron([255582, 2528910, 2451260, 25511120, 2301300, 2551350, 2551110, 2552050])
// {
//   neuron: "#ff9300"
//   compare: 60
// }

Шаг 4

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

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


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

По этой ссылке сможете подобрать фотографии соотношением 1:1, для тестирования:

www.google.lv/search?q=landscape&biw=1366&bih=678&espv=2&tbs=isz:ex,iszw:400,iszh:400&tbm=isch&source=lnt

Вот некоторые полученные результаты:

image
image
image
image
image

Автор: MoorLex

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js