Комментарии 104
Если не секрет, код на видеокарте — CUDA или OpenCL?
Чистый C++ или из под какого-то другого языка и/или GPGPU фреймворка?
2) добавить .h файл, где описать функции нужные для внешнего использования:
#ifdef __cplusplus
extern «C» {
#endif
//sample function
int __declspec (dllimport) func(unsigned char* buf,int W,int H,int *output1);
}
не забыть включить этот хедр в cu файл и описать эти функции
еще удобно назначить сборку этой dll в папку сборки dotNET проекта
3) откыть вторую студию (и так и держать обе отрытых всегда), и в dotNET проекте в класс, где оперировать этими функциями планируете:
[DllImport(«cudaDll.dll», CallingConvention = CallingConvention.Cdecl)]
static extern int func(byte[] buf, int W, int H, ref int output1);
удобно достаточно сделано, указатель — это и массив передать можно из dotNET и ref-ом вернуть значение.
Ну а потом в студии, где CUDA проект, можно назначить для debug-а исполняемый файл, как для CUDA отладчика/профайлера, так и MVSC участков C++ кода. а dotNET проект просто вызывает нативные функции из dll.
Если честно, то и на уровне идеи не совсем понятно, что там на вход идет, что внутри происходит и что на выход...
Все законы преобразований нам позволяет знать либо жизненный опыт, либо формула геом.преобразований 12 строках кода
Возникает несколько вопросов:
- Гипотеза (судя по рисунку) — это некоторое ROI на изображении, имеющее заданные параметры положения, наклона и размера?
- Как именно происходит распознавание конкретных цифр/букв? Внутри каждого окна запускается классификатор?
- Что происходит в процессе обучения? Подстраиваются параметры для каждой из гипотез с целью, чтобы окна накидывались на картинку не рандомно а наиболее эффективным образом?
Пока оно мне видится как шаг назад относительно Deep Learning, больше смахивая на DPM.
некоторое ROI для зоны номер 1 — да. для зоны 2 — перспективное преобразование, описывание 4х угольником (ну тоже ROI, просто исковерканное).
да, каждая миниколонка-гипотеза решает а не припомнила она какую-то ситуацию. Не, там не SVM, попроще, но можно и ее в конкретной реализации.
в процессе обучения выбирается такой контекст (гипотеза, миниколонка), которая приводит видимую картинку к одному из воспоминаниний и формируется портрет. но не в этом примере. Скоро об этом напишет длиииную статью AlexeyR.
deformable part models (тотже автор позже перешел на DL и накреативил семейство RCNN детекторов объектов).
ок, уже ответили
ну и правильный ответ: «конечно, модель настолько крута, что включает в себя и DPM!» ))
Происходит фильтрация, что-то типа beam search, фильтра калмана или решета эратосфена:
Вместо того, чтобы сначала применить один фильтр (картинка -> границы номера), а потом второй (картинка->цифры) к наилучшему результату первого фильтра, составляются два списка наилучших результатов каждого фильтра, и оставляются те из них, которые максимально удовлетворяют взаимным ограничениям.
Это может с точки зрения полноты оказаться лучше, чем брать результаты одного фильтра, и потом для каждого результата применять другой фильтр.
Возможно, взят неудачный пример, потому как мне кажется, в данном случае по скорости получится не лучше, чем beam search для beam size = 10 (т.е. оставляем 10 лучших результатов первого фильтра, потом для каждого из них прогоняем второй фильтр).
Но есть задачи, где данный подход творит чудеса, например, для unsupervised-построения списка слов по темам для английского языка (например: актёры, президенты, бизнесмены, бренды телефонов, виды фруктов) из зашумлённых источников MS Research получили среднюю точность около 92.8%, в то время, как конкуренты — 70-85%:
http://research.microsoft.com/en-us/projects/probase/default.aspx
Или, например, для обучения при распознавании речи с помощью нейросетей используется метод вычисления ошибки CTC (Connectionist Temporal Classification), который по сути дела, накладывает на нейросеть функцию ошибки, которая зависит от ответа нейросети — по сути, глядя на положение других букв, предсказанное нейросетью, и выделяя диапазоны, где данная буква или звук может находиться, и поддерживая пропорциональную положительную обратную связь для этих мест (и отрицательную обратную связь для остальных диапазонов): https://i.gyazo.com/56ef8b991da9f2eebdfe17aaf3eff3d0.png
Метод, рассмотренный в посте, предлагает способ объединения нескольких уже натренированных нейросетей для получения более точного результата — в этом его ценность. Предполагается, что так же действует и мозг человека — учёные утверждают, что разные зоны коры обладают разной функциональностью, и намного более точный и полезный результат для многих задач может образовываться при взаимодействии этих зон.
Конечно, чем-то, конечно, эта мысль кажется банальной для тех, кто занимался оптимизацией запросов к базам данных, но, тем не менее, все методы фильтрации в наше время являются эвристическими, и кроме beam search, использованного метода и метода ансамбля экспертов больше методов-то особо и нет.
Ещё хочу добавить, что я уверен, без потери точности данный метод может быть заменён маленькой нейросетью, вычисляющей по результатам двух нейросетей итоговый результат — качество объединения этих фильтров. Фактически, авторы настроили параметры этой третьей нейросети вручную по своему набору данных.
(Соответственно, можно всё это заменить на одну большую нейросеть, объединяющую эти три...)
Так что перечитайте: «Волна, описывающая текущее состояние мозга, может выступать аналогом запроса к базе данных. Так же, как результат операции над отношениями есть отношение, так и ответ мозга может быть совокупностью ассоциативно связанных описаний, совмещенных в одной волновой картине.» — чем это отличается от описания механизма работы оператора JOIN в RDBMS? :)
Ещё одну ссылку хочу дать. Те же идеи, но в другой обёртке, позволяющей применить их для слежения за объектами на смартфонах. Алгоритм Predator: https://habrahabr.ru/post/116824/
С большим интересом прочитал вашу статью, несмотря на то, что специалистом в этой теме не являюсь.
Насколько я понял, данный метод позволяет обойтись без обучения нейросети на тысячах изображений, и достаточно совсем небольшой выборки? При этом, в отличие от классических нейронных сетей, эта позволяет искать нужную информацию на изображении вне зависимости от ее перспективного искажения, поворота и прочего? Какая при этом достигается точность? Выше, чем при использовании «классических» сетей?
Я два года назад познакомился с «Логикой мышления» Алексея, очень понравилось, но к сожалению, на практике не удалось поиграться.
пространственные искажения тут не обучались, а прямо запрограммированы. Что не отменяет того, что нужно уметь обучаться им. Только это можно делать с помощью любого визуального мусора, например, мотая головой.
Серьезно, никакой информации в статье нет, только красивые картинки и оперирование эзотерическими (особенно для неспециалиста) терминами.
Область очень интересная, и если все честно, то результаты супер крутые, но пока есть ощущение, что это какая-то псевдонаука.
Напишите, пожалуйста, статью с подробным описанием технологии, с формулами и по возможности кодом.
Пишите в ЛС, если какие-то места кажутся совсем туманным именно Вам, — я поясню те моменты, с кусками кода, если потребуется. Можете сразу писать AlexeyR, он автор концепции.
Единственное общее, что современные нейронные сети имеют с мозгом — это изначальная мотивация и название. В остальном это набор перемножений матриц + крайне удачный алгоритм подбора элементов этих матриц. К тому же, все наработки нейрофизиологов скорее заключаются в том, как соединены нейроны внутри мозга (вот тут я могу быть неправ, поправьте, если не так). Гораздо более важная вещь — это как эти соединения формируются, о чем толком ничего неизвестно.
> Лично для меня важная проверка адекватности идеи — ее конструктивность. Можно ли вооружиться этой идеей и соорудить что-нибудь реально работающее?
Не согласен. Очень просто сделать алгоритм, который просто работает. Очень сложно сделать алгоритм, который работает лучше, чем все остальное в мире.
По делу — очень хочется увидеть количественное сравнение с теми же нейронными сетями. Несколько примеров показывают только качественный результат, вы могли их выбрать среди кучи неудачных срабатываний, и так далее. Если бы было — нейросети точность X%, ваше X+1%, тогда не было бы вопросов. Ну и да, 15 секунд на картинку это очень-очень долго.
«Очень сложно сделать алгоритм, который работает лучше, чем все остальное в мире.» А с другой стороны не так уж и сложно, если только мне надо решить эту задачу.
тут вопрос ресурсов: когда на другой стороне этот же алгоритм пишут несколько корпораций и в каждой сотни специалистов (каждый круче меня, например)… я лучше сделаю прототип, который мне подскажет куда двигаться дальше и двинусь дальше. И шанс дойти до серьезной модели, которую уже действительно можно в чем-то сделать лучше, повысится. Может окажется тупик, но мне кажется не рационально залипать на автомобильных номерах )).
«сразу будет видно, что к чему» — не уверен. Ну например, мы использовали «автомобильный номер выглядит так» (а это 8-9 знаков очень строго геометрически расположенные, если правильную перспективу подобрать). CNN такую штуку не соберет и всегда кто-то кто капнет скажет «аааа, а вы вот тут так мощно подсказали!», или «да и база у вас маленькая!». И вообще, совершенно не хочется в таких простых задачах бодаться с CNN, тем более что в этом случае можно чуть ли не математически показать эквивалентность в последствии полученных решений и по выч.результатам и по выделенным моделям в итоге внутри нейронной сетки. Что и разумно.
Что касается «обучить сеть с 6-тью софтмаксами на выходе более-менее стандартной архитектуры, непредобученную, по датасету в 1000 неповёрнутых номеров», то такой подход даёт точность уровня 60%. Я это пробовал.
Нужно понимать, что у подхода, который тут представлен имеется кардинальное отличие от современных нейронных сетей. Процессы обучения и область применимости принципиально разные. Сравнить их на одном и том же датасете на сегодняшний день нельзя. Нейронные сети будут лучше работать когда задачу сложно сформулировать, но можно представить большим набором данных. Представленный тот подход — когда может существовать описательная модель данных, которую можно разложить и подсунуть.
Да, я не то что хорошо в подходе Редозубова разбираюсь, но Вася мне регулярно какие-то забавные идеи оттуда рассказывает.
> Нужно понимать, что у подхода, который тут представлен имеется кардинальное отличие от современных нейронных сетей.
В статье подход то толком не описан, слишком мало деталей. Можете объяснить, в чем заключается кардинальное отличие?
Кардинальное отличие в том, что Spartial Transformer не дает идей, как речь распознавать, как смысл текста и прочее-прочее. А тут нет ограничений. Обучить как идентификаторы (понятия) меняются в разных контекстах, выделить портреты часто встречающихся (с учетом контекста), передать на след. зоны и так дальше до удобно-интерпретируюемых понятий. Т.е. кажется, что значительно универсальнее + есть идеи про сверхбыстрое обучение (если за эталон брать deeplearning).
Deep Learning в сверхбыстрое обучение тоже умеет, но нужна предварительная фаза предобучения (я сейчас не про обучить на imagenet+дообучить там где надо, хотя это тоже чем-то похоже). В то, о чем вы писали про обучится с одного примера, Deep Learning толком не умеет, да. Но это дело времени, я уверен.
В общем реквестирую более детальную статью с алгоритмом обучения, иначе это будет бесконечный диалог :)
Но я повторяю: сравнение некорректно. Как минимум потому что нужны большие датасеты для обучения сетей, а тут они не нужны.Тут — каждый пример значимый и референсный. Мне сложно объяснить концепцию, могу лишь предложить перечитать статьи Редозубова (вроде он даже продолжение обещает), а непонятные вопросы вытрясать из него и из Васи напрямую.
Преимущество модели — безусловно, взаимное обучение нейросетевых фильтров: когда из нескольких кандидатур, предложенных одним фильтром, можно выбрать наилучший результат с оглядкой на другой фильтр, и произвести дообучение фильтра. А потом наоборот.
P.S. А насчёт нейросети вы не совсем правы. Однослойная нейросеть обучается на полном MNIST с качеством 92%, а двухслойная на 1000 случайных изображений из MNIST должна показать результат около 90% по точности, если не ошибаюсь. Шестислойной сети (если я вас правильно понял) 1000 изображений конечно же не хватит, она существенно недообучится.
Поэтому мне бы хотелось попробовать повторить с помощью нейросетей ваш подход и посмотреть, получится ли результат лучше вашего.
Ваши базы номеров и машин у меня скачаны, может, пора их наконец-то использовать? :)
(я ведь весь этот путь прошёл в 2011 году с HTM — у меня были и проекции тоже! правда, там свои заморочки были)
Что меняется в модели со временем? Из чего состоит модель?
Без деталей, мне нужно только потоки данных, понять, что с чем и когда сравнивается и какие изменения с моделью данных происходят.
Если я правильно понял, модель цифр и знака загружается один раз и не изменяется. Но тогда каким образом она сравнивается с другими данными?
Вы перебираете все возможные позиции каждой цифры и смотрите коэффициент соответствия? Или что происходит?
«очно! точно цифра 2 была (или буква «В»), как мне ее однажды показали. Так и передадим на следующую зону: это цифра 2, смещена X,Y, повернута так и вот такой машстаб» — значит что, это бинаризация с вручную выбранным уровнем отсечки?
Хм… результаты из поста получены при тренировке на 22 картинках?
- 22 картинки буков и цифр
- 1 картинка того как номер выглядит
- Явно прописанная модель как можно преобразовывать символы, по сути границы допустимости того, как можно описать номер
И это всё. Остальное обирается/строиться и додумывается самим алгоритмом.
Более того, как бы это сказать… меня слегка удивляет, что авторы сами первым делом не занялись такой, казалось бы, довольно напрашивающейся и первоочередной проверкой своих идей на практике. А то «вы все застряли в сороковых годах, а у нас тут кардинально новая концепция мышления» — это звучит замечательно (хоть и несколько эзотерично), но наверное, надо первым делом хотя бы проверить, что она работает и обгоняет всех этих немодных Лекунов, Хинтонов и прочую публику?
Если получится решить какую-то задачу на уровне топовых современных решений и сделать публикацию на какой-нибудь конференции (желательно высокого уровня), то к исследованиям подключатся и другие люди.
А ждать вау-эффекта и делиться идеями с относительно небольшой аудиторией ИМХО значительно замедляет прогресс.
Другое дело, если практических результатов уровня других решений получить не получается ни на какой задаче. Тогда правда возникает вопрос, реально ли получить такие результаты вообще.
Если получится решить какую-то задачу на уровне топовых современных решений и сделать публикацию на какой-нибудь конференции (желательно высокого уровня), то к исследованиям подключатся и другие люди.
Нынче модно выкладывать свои ML проекты на arxiv/gitxiv… там стоящую идею заметят и без конференций.
Не знал об этом. Но стоящую идею и на конференцию наверное возьмут? Хотя наверняка и не знаю, сам до публикаций еще не добрался.
Но идея одна и та же: стоит дать возможность другим людям, работающим в области, оценить, опробовать и развивать идею.
В ML сейчас такая движуха, что новые проекты и статьи появляются на основе еще не опубликованных статей, поэтому для получения проще выложить в паблик препринты + код, чем ждать какого-нибудь CVPR/ICML. Ну и да, сейчас хорошим тоном считается выложить коды к статье на github.
Но ведь это значительно повышает объемы информации. Если я вижу статью с топовой конференции, или препринт принятой туда статьи — то я могу рассчитывать на определенное качество статьи. А читать все препринты от всех неизвестных исследователей — никакого времени не хватит.
Да, это проблема) Немного помогает фильтрация по знакомым фамилиям авторов… но читать приходится много, чтобы ничего не упустить.
Даже если читать только статьи с конференций, то там все равно развесистые списки литературы, которые обычно тоже надо прочитать.
Ну то есть публикация препринтов имеет смысл если уже есть имя. А так вполне возможно, что статью не заметят. С таким объемом информации читать препринты от любого ноунейма вряд ли кто-то будет мне кажется.
Наличие кода и публикация его вместе со статьей на gitxiv повышают для проекта шансы быть замеченым.
Еслить верить этой табличке, то люди решают задачу распознавания цифр с точностью ~98%
Извините за такие сумбурные слова, но это действительно круто)
Такой момент. Вы проводили только обучение или еще и валидацию на картинках, которые модель раньше не видела?
Вот те картинки выше — это на тренировочных или на валидационных?
Вот есть первый уровень, на вход прходят иозбражение, голые пиксели.
На выход он должен выдать X,Y, ориентацию и масштаб для каждого знака в номере.
Как он это делает конкретно и как обучается? «В итоге вышло 700000 гипотез» — как они формируются, как тренируются, и какие из них идут на следующий уровень во время собственно распознавания?
Далее есть второй уровень, куда приходит видимо картинка и некоторые гипотезы из прошлого уровня.
Она проверяет все возможные проективные преобразования и запоминает что в зависиости от чего?
Совсем не нейронные сети