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


Использовать программу просто. Слева окно для рисования. Под ним три кнопки: отменить, отчистить и случайный рисунок. Между квадратами кнопка «process». Она превращает рисунок в кота.

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


Глаза — это страшно.

Работает неидеально. Особенно скверно, когда обрабатываются глаза. Определение границ картинки не всегда чёткое. Из-за этого появляются дополнительные глаза, или они не появляются вовсе.

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

Модная сумка к лету. Экслюзивный дизайн!

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


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


Для самых маленьких отлично подойдет советская классика, которая славится своей простотой, добротой и приятной картинкой. Например, «Крокодила Гена», «Простоквашино», «Ну, погоди!», «Бременские музыканты», «Летучий корабль», «Винни Пух», «Малыш и Карлсон» и многие другие. Вы можете даже вместе с ребенком сесть и понастольгировать по детству. Также для детей малого возраста есть множество современных обучающих мультов, которые отличаются не только более яркой картинкой, но наполнением.


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


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


Подростки, несмотря на то, что считают себя уже взрослыми, все равно ещё любят смотреть мультфильмы. Для подростков уже более смелые и не такие безобидные как детские. В них преобладают развлечения, взрослые шутки, подростковые проблемы. В основном это зарубежные многосерийные мультфильмы, такие как «Симсоны», «Гриффины», «Футурама» и т.д.


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


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

Совсем недавно разработчик Кристофер Гессе явил миру свое детище – проект . С помощью нейросети нарисованные коты превращаются в «реальных». В основе идеи находится система машинного обучения от Google, названная TensorFlow. Edges2cats разделен на два «поля». В первом пользователь рисует кота (или нечто, на него похожее), а во втором нейросеть старается сделать так, чтобы рисунок походил на реальное животное.

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

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



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

В рассказе нам поможет Дмитрий Сошников - технический евангелист Microsoft, член Российской ассоциации искусственного интеллекта, преподаватель функционального и логического программирования ИИ в МАИ, МФТИ и ВШЭ, а также наших курсов .

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

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

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

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

Банки фильтров и биологическое зрение

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

В области машинного зрения наработаны банки фильтров - наборы фильтров для выделения основных особенностей объектов.

Похожая «архитектура» используется и в биологии. Ученые считают, что человеческое зрение не определяет все изображение целиком, а выделяет характерные особенности, уникальные черты, по которым мозг и идентифицирует объект. Соответственно, для быстрого и корректного распознавания объекта можно определить максимально уникальные черты. К примеру, у котов это могут быть усы - веерные горизонтальные черточки на изображении.

Разделение весов (Weight Sharing)

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

Это требует специализированной архитектуры сети:

  • сверточные сети для работы с изображениями
  • рекуррентные сети для работы с текстом / последовательностями
Нейронные сети, эффективно использующиеся в распознавании изображений, в которых применяются специальные свёрточные слои (Convolution Layers).

Основная идея заключается в следующем:

  • Используем weight sharing для создания «фильтрующего окна», пробегающего по изображению
  • Примененный к изображению фильтр помогает выделить фрагменты, важные для распознавания
  • В то время как в традиционном машинном зрении фильтры конструировали вручную, нейросети позволяют нам сконструировать оптимальные фильтры с помощью обучения
  • Фильтрацию изображения можно естественным образом совместить с вычислением нейронной сети


Для обработки изображений используется свертка, как и в обработке сигналов.

Опишем функцию свертки со следующими параметрами:

  • kernel - ядро свёртки, матрица весов
  • pad - сколько пискелей надо добавить к изображению по краям
  • stride - частота применения фильтра. Например, для stride=2 будем брать каждый второй пиксель изображения по вертикали и горизонтали, уменьшив разрешение вдвое
In : def convolve(image, kernel, pad = 0, stride = 1): rows, columns = image.shape output_rows = rows // stride output_columns = columns // stride result = np.zeros((output_rows, output_columns)) if pad > 0: image = np.pad(image, pad, "constant") kernel_size = kernel.size kernel_length = kernel.shape half_kernel = kernel_length // 2 kernel_flat = kernel.reshape(kernel_size, 1) offset = builtins.abs(half_kernel-pad) for r in range(offset, rows - offset, stride): for c in range(offset, columns - offset, stride): rr = r - half_kernel + pad cc = c - half_kernel + pad patch = image result = np.dot(patch.reshape(1, kernel_size), kernel_flat) return result
In : def show_convolution(kernel, stride = 1): """Displays the effect of convolving with the given kernel.""" fig = pylab.figure(figsize = (9,9)) gs = gridspec.GridSpec(3, 3, height_ratios=) start=1 for i in range(3): image = images_train conv = convolve(image, kernel, kernel.shape//2, stride) ax = fig.add_subplot(gs[i]) pylab.imshow(image, interpolation="nearest") ax.set_xticks() ax.set_yticks() ax = fig.add_subplot(gs) pylab.imshow(kernel, cmap="gray", interpolation="nearest") ax.set_xticks() ax.set_yticks() ax = fig.add_subplot(gs) pylab.imshow(conv, interpolation="nearest") ax.set_xticks() ax.set_yticks() pylab.show()
In : blur_kernel = np.array([, , , , ], dtype="float32") blur_kernel /= 273

Фильтры

Blur

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


In : show_convolution(blur_kernel)

Вертикальные края

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


In : vertical_edge_kernel = np.array([, , , , ], dtype="float32") vertical_edge_kernel /= 166
In : show_convolution(vertical_edge_kernel)

Горизонтальные края

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


In : horizontal_bar_kernel = np.array([, [-2, -8, -13, -8, -2], , [-2, -8, -13, -8, -2], ], dtype="float32") horizontal_bar_kernel /= 132
In : show_convolution(horizontal_bar_kernel)

Контурный фильтр

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


In : blob_kernel = np.array([, , , , , , , , ], dtype="float32") blob_kernel /= np.sum(np.abs(blob_kernel))
In : show_convolution(blob_kernel)
Таким образом работает классический пример с распознаванием цифр: у каждой цифры есть свои характерные геометрические черты (два круга - восьмерка, косая черта на половину изображения - единица и т.д.), по которым нейронная сеть может определить что за объект. Мы создаем фильтры, характеризующие каждую цифру, каждый из фильтров прогоняем по изображению и сводим ошибку к минимуму.


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

Основная идея свёрточной сети

  • Создаем в нейросети свёрточный слой, который обеспечивает применение фильтра к изображению.
  • Обучаем веса фильтра по алгоритму обратного распространения
К примеру, у нас есть изображение i , 2 сверточных фильтра w c выходами o . Элементы выходного изображения будут вычисляться следующим образом:

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

Алгоритм таков:
  • Фильтр с одними и теми же весами применяется ко всем пикселям изображения.
  • При этом фильтр «пробегает» по всему изображению.
  • Мы хотим обучать эти веса (общие для всех пикселей) по алгоритму обратного распространения.
  • Для этого надо свести применение фильтра к однократному умножению матриц.
  • В отличие от полносвязного слоя, весов для обучения будет меньше, а примеров - больше.
  • Хитрость - im2col

im2col

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

Close