Pull to refresh

Comments 49

Вы ведь продолжите писать? И очень интересная тема, и котики! Perfect match!
Спасибо, постараюсь) В следующей серии будет про время.
Спасибо за статью, познавательно.
Насчет выводов. Лично У меня есть идея, что при анализе реального мира мозг ориентируется на трехмерное представление объектов. То есть он хранит в памяти именно трехмерные образы, умея проводить их матчинг с текущим двумерным зрительным представлением. Потому что не хватит никакой памяти на хранение всех возможных ракурсов для сравнения, в отличие от грубой трехмерной модели объекта (вероятно, так же основанной на фичах) + карт текстур для закраски.

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

Использует ли кто-нибудь данный подход в машинном обучении?
Совершенно логичная мысль) На этот счет есть фраза, кажется, того же Джоффри Хинтона (первоисточник уже не нашел), про то, что «Computer vision is inverse computer graphics». То есть если в трехмерной графике у нас есть модель, которая поворачивается и демонстрируется на экране разными сторонами, то для компьютерного зрения тоже должна существовать какая-то трехмерная модель абстрактного котика, куда будут «укладываться» все проекции, которые мы видим.

По поводу прикладного использования — навскидку, можно почитать статью про transforming autoencoders. Идея там такая — вместе с картинкой для обучения кладем в алгоритм еще и информацию о том, где она находится, а на выходе заставляем алгоритм эту информацию предсказывать — так, чтобы он, увидев распознанный объект, мог сделать предположение о том, какой стороной он повернут.
Несколько лет назад на хабре высказывалась эта идея в комментариях к подобной статье. Интересно, через какое время она снова возникнет и когда появится реализация?
Трехмерную картинку мира нужно еще вначале реконструировать по зрительным образам, а эта задача чрезвычайно сложна. Человек распознает порядка 10 различных признаков глубины, причем «хардварных» из них только два (бинокулярное зрение / конвергенция и аккомодация), а все остальное основано на чистой обработке 2D — прямом распознавании в совершенно плоской картинке различных признаков глубины. В числе прочих признаков достоверно известно что в некоторых ситуациях человек реконструирует 3D по опыту знакомых ему трехмерных объектов. Т.е. он ВНАЧАЛЕ распознает по плоскому изображению знакомый ему объект и ПОТОМ это создает у него иллюзию определенных размеров, положения и глубины объекта.
Разве нельзя сделать точно такое же кодирование, как в статье, только не массивом двумерных штрихов, а набором трехмерных линий, углов, срезов?
Можно. Если уже есть трехмерная картинка, то её в принципе можно кодировать подобным образом. Очень сложно (поскольку воксельных данных на многие порядки больше чем пиксельных), но в принципе можно. Проблема в том что трехмерной картинки у человека изначально нет, а есть только два плоских изображения на которые он может влиять парой способов.
У человека не 3D зрение, а стерео. Плюс мы видим объекты в движении.

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

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

Движение объекта тоже является ценным. По движению мы достраиваем невидимые стороны объектов. Если мы и объекты неподвижны, то мы тоже ошибемся.

Думаю, компьютерному зрению нужно подавать стерео-картинки или небольшие фрагменты видео (2-5 кадров), тогда алгоритмы будут определять объекты намного точнее.
Спасибо большое, большая часть статьи написано простым и понятным языком, так что можно дать почитать совсем не программисту, и он поймёт.
Было бы здорово увидеть больше статей в такой же манере.
Спасибо, надеюсь, что их будет. Мне иногда кажется, что большая часть материалов по этой теме страдает какой-то демонстративной научностью — много математики, тумана, непонятно, что эти нейросети вообще умеют, и где там AI уже.
Кстати, хорошее замечание про простой русский язык. Читал несколько статей в последнее время на эту же тему и тихонько понимал, что надо идти работать грузчиком. Здесь же вам большой плюс, если бы мог) В этой статье все ясно и понятно.
Статья читается отлично, даже есть элемент юмора ->
поэтому эта вырезана из выступления Эндрю Ына (основатель Coursera) про deep learning

Такой вариант русифицирования его фамилии я ещё не встречал :)
Вот вы будете смеяться, но он так в русской википедии назван) Я не знаток транслитерации корейского, но:
1) на форуме курса Machine learning как-то был вопрос, как правильно читать эту фамилию, и присутствующие носители языка сказали, что мол, носовое «н», как в слове England.
2) один Ким Чен с такой фамилией в медиа уже присутствует. Хотя на самом деле последний слог в его фамилии — «ун» ( Kim Jong Un в латинице). В общем, темная вещь этот хангыль)
Спасибо за хорошее видео по биологическим экспериментам с кошками!

По поводу самой статьи — честно говоря, ожидал большего.

1. Из прочтения названия и начала статьи возникло ощущение, что нам расскажут, как сделать метод распознавания кошек от собак средствами Deep Learning с качеством 98% на хорошей выборке (Kaggle). Этого не произошло, и это главное разочарование.

2. Обучение алгоритма происходит в этих строках

«learning = MiniBatchDictionaryLearning(n_components=49)
features = learning.fit(data).components_»

Что конкретно здесь происходит? Каким способом идет подстройка модели к словарю? Про это можно и нужно рассказать.

3. Алгоритм сопоставления визуальных слов и векторов признаков (features) на их основе имеет примерно такое же отношение к Deep Learning, как колесо и трактор. У трактора есть колесо, но совершенно необязательно, что любой механизм с колесом — это трактор. То, что картинку можно представить как суперпозицию других картинок, которые формируют базис — это очень старая вообще идея, возникшая задолго до Deep Learning. Это и eigenfaces и эпитомы и много что еще.

4. Вообще, главная «фишка» глубокого обучения состоит в том, что эти самые «визуальные слова» или «признаки» получаются автоматически во время процедуры «предобучения» (pre-training). То есть, визуальные слова-признаки — это не какие попало нарезанные куски одной картинки, а картинки, которые сгенерировались в итоге предобучения без учителя, суть которого — восстанавливать исходные изображения для задачи «бутылочное горлышко» с помощью алгоритмов RBM, Stacked Autoencoders или других алгоритмов.
Еще раз перечитал, более внимательно — хочу извиниться перед автором и забрать назад свое раздражение по поводу «неглубокости» алгоритма, извините за каламбур. Действительно, это имеет отношение к Deep Learning поскольку а) здесь используются автоенкодеры для поиска информативных частей картинки, которые используются как признаки и б) вручную формируется иерархичность, глубина иерархии определяется размером визуальных слов-признаков.
Спасибо за подробный отзыв) Конечно, это условно-обзорный пост, который оставляет за занавеской много деталей — в том числе то, что происходит под капотом DictionaryLearning, и чем всякие там orthogonal matching pursuit отличается от lasso-lars. Очевидно, писался он скорее для людей не в теме) Про Kaggle немного света пролить могу: например, победитель челленджа — некто Pierre Sermanet из группы Яна ЛеКуна, использовавший свою штуку под названием OverFeat, которая позиционируется как natural feature extractor и использует сверточные сети (куда без них).

Про третий пункт — это да, было такое лирическое отступление. Вся эта идея dictionary learning была взята совершенно из сторонней темы и других источников — просто так уж вышло, что мы можем приспособить ее для обучения признакам, из которых потом будем составлять иерархию (вот тут уже появляется глубокость). Вместо этого мы могли использовать какую-нибудь RBM с тем же успехом. Наверное, стоило об этом уточнить подробнее — потому что про линейное кодирование картинки можно много увлекательного рассказать самого по себе.
Да уж, без сверточных сетей действительно никуда. Спасибо за статью и ссылки. Да, она написана для новичков — и поэтому за деревьями не всегда сразу видно лес (а он есть). Вообще, критиковать всегда намного легче, чем писать ))

Желаю успехов!
Ого! Хабр как всегда в тему. Недели две назад задумался над тем, что устал пользоваться готовыми нейронными сетями без их понимания и хочу несколько сам запрогать-потестировать. И сейчас упёрся именно в свёрточные сети. Не понимаю я механизм обучения свёрточного слоя. Как я понимаю, у вас тут выделение главных компонент достаточно близко к нему реализовано? Кстати да, чем в целом тот подход что тут у вас приведён отличается от свёрточных сетей?

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

learning = MiniBatchDictionaryLearning(n_components=49)
features = learning.fit(data).components_

Может я неправильно его смысл понял. Если так, то поясните что там происходит тогда.
Я вас понял, да) Про сверточные сети, к сожалению, вообще ничего не знаю и не могу сориентировать. Про «выделение компонент» — здесь мы решаем задачу разложения матрицы на линейную сумму составляющих, и решаться она, на самом деле, может кучей разных способов:

— PCA, который вы упомянули — вполне подходит
— автоэнкодеры, машины Больцмана, прочая традиционная атрибутика из области unsupervised feature learning
— … внезапно, даже K-means

Есть, правда, важная деталь. Компоненты должны обладать парой условий: должны хорошо генерализоваться (то есть нам нужно не идеальное разложение одной картинки, а какое-никакое приемлемое, но чтобы подходило для всех), и они должны сами по себе иметь какой-то смысл с точки зрения распознавания. Именно для этого мы устраиваем всю возню с разными уровнями и выделением границ — потому что, например, в случае с лицами ничто не мешало нам прогнать вот эти две строчки кода сразу для больших картинок и получить что-нибудь похожее на eigenfaces.

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

А вот когда вы эти компоненты получили — насколько я очень смутно понимаю, потом уже в ход идет сверточность. Допустим, знаем, что где-то на изображении 800x600 спрятано лицо размера 160x160. Чтобы понять, где именно, возьмем наш лицо-компонент и начнем проходиться им по всей картинке с шагом в один пиксель, постоянно проверяя, не найдется ли хорошего совпадения — это, собственно, и есть свертка. Результат прохода добавим себе в выборку для следующего этапа обучения, и когда таких наберется прилично — будем учиться искать среди фильтрованных картинок те, где свертка дала хороший результат (то есть в процессе прохода мы-таки наткнулись на лицо). Это, справедливости ради, очень туманное представление, которое у меня где-то есть про сверточные сети, и очень возможно, что я неправ)
Такое впечатление, что весь каскад работает только на дивергенцию признаков, на первом слое находятся элементарные признаки, на следующем, — определённые сочетания элементов первого уровня в пространстве, и так далее. Надо как-то обеспечить конвергенцию, иначе — комбинаторный взрыв. Есть же инварианты, например, угол поворота «фичи», масштабирование, параллельный перенос. Сейчас, кажется, лица предварительно центруют перед запуском в ИНС, но рано или поздно сетевые алгоритмы должны вобрать в себя эту функцию. Чтобы на верхнем уровне было не
>>несколько наиболее встречающихся расположений — фронтальное, пол-оборота направо и налево, плюс разные цвета кожи
а разная высота лба, форма рта, разрез глаз (ну и цвет кожи тоже).
Тут, между прочим, могут найтись интересные грабли, потому что вообще говоря, фичи с разным масштабом и углом поворота — «не invariant, а equivariant» (Хинтон лидирует по объемам цитирования в этом посте и комментах)). То есть мы-то, конечно, понимаем, что кошка, перевернутая вверх ногами — та же самая кошка, что и не перевернутая, но у нас при этом появляется дополнительная информация о том, что она все-таки перевернутая. И вообще говоря, мы не должны распознавать их как одно и то же. Косвенным подтверждением того, что наш с вами мозг не всегда с легкостью вращает и масштабирует увиденное, может быть mental rotation — тот факт, что мы не можем читать текст вверх ногами, не делая неких осознанных усилий по переворачиванию букв.
В качестве многообещающего подхода на этот счет я там выше приводил ссылку на transforming autoencoders — к сожалению, маловато демонстративных данных пока, но то что есть, выглядит круто. Если доберусь до следующего поста по теме, обязательно напишу про это.
Про перевёрнутый текст не соглашусь, по-моему, он читается настолько же просто (по крайней мере, русский). Усилия иногда приходится прикладывать, чтобы восстанавливать правильный порядок слов (при быстром чтении они начинают переставляться), но буквы узнаются (и складываются в слова) сразу, как картинки. Почти так же легко читается и зеркальный текст. С английским текстом и формулами хуже — для их перевёрнутого варианта действительно приходится соображать.
А не пробовали засекать количество слов в минуту обычным и перевернутым способом? В принципе, конечно, в таком восприятии нет ничего невозможного — немного практики по чтению таких текстов, и перевернутая буква становится такой же распознаваемой картинкой, чем обычная. Но зеркальный текст, например, я читаю очень медленно — перевернутый еще куда ни шло)
Попробовал. Перевёрнутый примерно вдвое медленнее — на отрывок в 120 слов ушло 39 секунд против 17. На зеркальный вариант — около 100 секунд.
Но я не думаю, что мозг переворачивает или отражает все буквы. Скорее, там идёт runtime расшифровка закодированного текста — попытка угадать, какой крючок какой букве соответствует. Проблемы возникают на редких и необычных для русского языка словах, там действительно приходится отражать буквы в голове.
с бувками еще ничего, а вот узнавать перевернутые лица мозг практически не способен, можете на друзьях проверить. Но опять же, здесь во многом вопрос набора обучающих данных — с перевернутыми буквами мозг сталкивается регулярно, а с лицами практически никогда. получается, «вращение» не работает в мозге автоматически, а надстраивается следующим слоем?
с бувками еще ничего, а вот узнавать перевернутые лица мозг практически не способен, можете на друзьях проверить.

??? Вполне узнаю, хотя, наверное, медленнее.
Что касается «автоматичности», то реализация механизма неизвестна, можно строить предположения, например о том, что механизм не запрограммирован генетически, а приобретается при обучении. То, что распознавание перевернутого лица занимает больше времени, возможно, действительно указывает на то что основной прямой путь от первичной зрительной коры к области лиц с этой задачей сам не справляется, и требует либо нескольких проходов, либо задействует другие пути и поля, «надстраивается следующим слоем», можно и так сказать, наверное.
Совершенно верно, находя инвариант, мы попутно извлекаем признак (угол поворота кошки). Непонятно, как сети находить инварианты. Возможно, наблюдая за движущимися объектами.
98,8% — это очень круто!
С таким качеством распознавания скоро уже идей для капч не останется :)
Согласен, впечатляет) Причем если скачать датасет и посмотреть на примеры, впечатляет еще сильнее — там полно картинок типа «фигура человека во весь рост и маленький, еле заметный котик на руках». Примеры в посте как раз оттуда, но не самые показательные.
А про капчи — идею с собачками всегда можно развить чуть дальше)
image

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


Гм, там как раз про это чётко написано:
«The training archive contains 25,000 images of dogs and cats. Train your algorithm on these files and predict the labels for test1.zip (1 = dog, 0 = cat).»
Судя по размеру файла, тестовая выборка примерно в два раза меньше обучающей.

А ещё ниже написано про возможные пути реального читерства, и как организаторы с этим борются :)
Спасибо, ясно. Но поскольку тестовая выборка общедоступна и классификация гоняется на компьютерах участников, то ничего не мешало обучить алгоритм и на этой выборке.
Предложенный механизм борьбы в виде релиза новой тестовой выборки перед концом соревнований заведомо нерабочий — эта новая выборка все равно вначале поступает участникам, которые имеют возможность вначале дообучить свои классификаторы, добиться подгонкой хороших результатов и лишь после этого опубликовать результат на новой выборке.
Для исключения читерства необходимо было бы забрать у участников их алгоритмы и скормить этим алгоритмам заранее неизвестную выборку.
Этого, как я понимаю, сделано не было.
Как Вы обучать без ответов собрались?
Обучающая выборка должна быть доступна, я про то что тестовая выборка должна от неё отличаться и быть неизвестна
Ну так, так и есть, тестовая выборка отличается от обучающей, и ответы для неё неизвестны. Как Вы обучать на тесте-то собрались?
А, понял о чем Вы. Ответы для тестовой выборки может (в пределах тысячи картинок) сделать и человек. Собственно как Вы результат теста проверять-то будете :)?
Так проверять-то система будет, а не человек, посылающий решение.

Картинок в тесте там 12.5к — многовато для человека.
Для автоматической проверки вначале человек должен вначале вручную составить разметку.
Хотя 12.5к картинок — это уже прилично, работы по разметке на день
Да, и на странице соревнования описано, что они могут сделать для противостояния этому. У них там 3 миллиона картинок — могут тест и на 200к выдать.
ОК, разделение формально есть, но оно не защищено адекватным образом от читерства (см. выше)
Авторы даже не позаботились расписать подробно какие меры ими были предприняты в ходе борьбы с читерством.
Это не в сторону ImageNet рассуждения? (http://image-net.org/challenges/LSVRC/2014/)
Общее замечание: недавно была опубликована прекрасная статья которая хорошо критиковала именно тот подход который Вы здесь изложили :).

Эта картинка и предисловие — из челленджа на Kaggle, который проходил осенью прошлого года. Забегая вперед, на последний вопрос вполне можно ответить «да» — десятка лидеров справилась с заданием на 98.8%, что на удивление впечатляет.


Насколько я могу судить по условиям конкурса, там от алгоритма требовалось всего лишь разделить изображения в фиксированном наборе. Прямо до такой степени что авторам пришлось аж специально оговаривать что запрещено встраивать в алгоритм простую распознавалку знакомых изображения и комплект ручной разметки для тестового набора :D. Для капчи может это и разумный подход (там набор все ж таки ограничен), но о распознавании с точностью 98.8% реальных изображений речь здесь не идет даже близко.

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


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

Про разложение — спасибо за замечание, надо было отдельно оговорить, что нас интересует именно overcomplete basis.
но о распознавании с точностью 98.8% реальных изображений речь здесь не идет даже близко


Судя по вот этому обсуждению, можно вполне реально честно получить на конкурсных данных точность под 97%, никуда не подглядывая и ничего вручную не размечая.
Есть просьба-вопрос от новичка в теме:
Как я видел, словарь строится на определенном наборе изображений, заданных все-таки в пикселях. Допустим, в обучающем наборе с лицами будут присутствовать одновременно портреты крупным планом и в полный рост. Правильно ли я понимаю, что даже при хорошем результате в словаре мы получим отдельно лица крупным планом и отдельно генерализации человеческих фигур? Где почитать о том, как в данном случае решается проблема масштаба определяемого элемента на исходном изображении?
Так и есть, да. Насчет масштаба и прочих пространственных трансформаций мне наиболее многообещающей кажется идея с transforming autoencoder (уже выше мелькала ссылка). Смысл в том, что в параметры картинки вкладывается не только ее пиксельное содержимое, но и информация о, допустим, масштабе, с которым глаза/камера смотрит на объект. На выходе ваша модель должна, аналогично, предсказывать масштаб, с которым изображен объект, который, по его мнению, он нашел.

Откуда брать эту самую изначальную информацию о масштабе? Нам, видимо, нужен какой-то супервайзинг — либо вы должна сами руками проставить на тренировочной выборке нужные значения, либо можно попробовать считерить и генерировать тренировочную выборку с помощью условной камеры с зумом — когда вы знаете, что зум вперед/движение вперед означает изменение в масштабе.
Вот еще конспект лекции на тему, там несколько более доступно написано. К сожалению, коварный Хинтон нигде не приводит примера этих своих пространственных капсул, так что приходится фантазировать из общей идеи.
Sign up to leave a comment.

Articles