Вопрос довольно общий, знаю.
Но я здесь немного уточню что бы было не так расплывчасто.
Интересует общая сжатая теория. С какой статьи лучше начать?
Интересуют актуальные библиотеки C#
Интересует приблизительная реализация уже созданной в нескольких вариациях идеи -
скармливаешь нейронке много изображений-пар: большое и маленькое. А нейронка учитс
делать из маленького большое и потом сравнивает сделанное большое и то большое которое ему скормили что бы понять что сделано не так. Какую нейронку лучше выбрать под даную задачу?
Не слишком ли сложная и на сколько вообще реальная задачка в 3, если учесть что я вообще ни бум-бум в нейронных сетях?
Если задача непосильная для новичка в НС, то с каких задач-тренировок лучше начинать?
Ответы
Ответ 1
Одна из самых изысканных задач для НС приведена в этой статье, можно понять уровен
проблематики и алгоритмов, которые задействуются для решений подобного класса задач и где действительно нужна НС. Примеры на OpenCV, что тоже замечательно.
OpenCV - Библиотека с самой открытой лицензией и исходным кодом, написана на C++. Под C# есть wrapper'ы - EmguCV, OpenCV for Unity (можно и без Unity использовать).
Есть адаптация для Visual Studio (C++), Objective C, Android Studio, Python.
Даже для умеренно сложных задач НС обычно не нужна, и не очень даже применима - част
приходится делать обработку видеопотока в реальном времени, а НС не самая быстрая штука далеко. По этой и еще ряду причин большинство разработчиков, уверенных поначалу что им нужна НС, от этой идеи впоследствии отказываются.
Благо в OpenCV реализовано огромное количество алгоритмов на все случаи жизни - почти всё, что связано с обработкой видео и изображений там есть.
После редактирования автором вопроса редактирую ответ :-)
Большинство алгоритмов, реализованных в доступных пакетах, в основном предназначен
для down-scaling, спрос на это очевиден - камера снимает в большом разрешении, а в Интернеты лучше постить, предварительно уменьшив фотку - этим пользуются все активные пользователи Интернетов и соцсетей.
Up-scaling задача тоже достаточно хорошо проработана, просто спрос на нее несоизмерим
меньше - тем не менее любой дизайнер отлично знает, что нужно делать, чтобы изображение можно было без проблем увеличивать - взять Corel Draw или другой пакет векторной графики, то есть сделать изображение векторным.
Таким образом, если маленькое растровое изображение преобразовать в векторы, сделат
up-scaling, мы скорее всего уже получим что-то интересное - обратите внимание на программ
Potrace. В OpenCV готового для raster->vector ничего нет. Хотя из доступных инструментов и можно слепить что-то, врядли получится лучше чем у Potrace - всё-таки там люди занимались этой проблемой специально. Potrace идёт с исходниками и подробным описанием алгоритмов, так что простор для творчества полный :-)
И самое интересное на десерт - пора взглянуть на ваше увеличенное изображение,
путем сравнения с полученным в результате векторизации и up-scaling результатом выявит
отклонения. Выявленные отклонения могут являться материалом для обучения НС. Например, можно пойти путем векторизации большого изображения, выявления соответствия кривых и сравнения их характеристик. По результатам обучения НС начнет выдавать некие рекомендации по коррекции кривых в произвольных изображениях.
Может быть даже замахнуться на добавление кривых, типа дополнительных цветовых контуро
градиента (хотя градиент в полученном изображении проще будет сгладить с помощью функций Blur и т.п.)
Ответ 2
Если хотите изучить математический аппарат нейронных сетей, то рекомендую начат
с изучения перцептрона. Найти статьи по этому типу ИНС несложно.
С библиотеками по нейронным сетям на C# довольно плохо дела обстоят. Для C# лучшая
на мой взгляд, библиотека от Microsoft - Microsoft cognitive toolkit. (https://github.com/Microsoft/CNTK/wiki)
Из минусов: нельзя обучать и строить модель сети в коде C#/.NET и пока реализация в бета-версии, так что могут быть баги. Из плюсов: легко строить различные сети с помощью скриптового языка Brainscript, есть поддержка вычислений/обучения модели на GPU от nVidia (на C#/.NET можно только вычислять), поддерживаются различные типы нейронных сетей.
На гитхабе в разделе Wiki можете найти всю интересующую вас информацию и пример
для реализации ИНС с помощью Microsoft cognitive toolkit в C#. Ещё можете посмотреть нейронные сети в математическом фреймворке Accord, но, насколько я помню, там не очень много возможностей и вычисления доступны только на ЦП.
Конкретно для данной задачи я бы применил свёрточную нейронную сеть. http://engineering.flipboard.com/2015/05/scaling-convnets здесь даже можете посмотреть примерную архитектуру такой сети для поставленной вами задачи.
Если нейронную сеть с нуля не собираетесь писать, то вполне посильная :)
Попробуйте изучить для начала многослойный перцептрон и реализовать его, например для решения задачи XOR.
Ответ 3
Дополню предыдущие ответы относительно CNTK. Недавно вышедшая версия 2.2 имеет уж
полноценный биндинг к C#. Соответственно, можно не только применять, но и обучать сеть, не переключаясь на Python или BrainScript.
Комментариев нет:
Отправить комментарий