Разработка системы распознавания изображений на основе аппарата искусственных нейронных сетей
Описание искусственных нейронных сетей. Типы машинного обучения. Анализ существующих библиотек. Разработка алгоритма распознавания дорожных знаков с применением глубоких сверточных сетей и дополнительного классификатора J48. Результаты обучения алгоритма.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 30.07.2016 |
Размер файла | 1,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Правительство Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего профессионального образования
«Национальный исследовательский университет
«Высшая школа экономики»
Факультет информатики, математики и компьютерных наук
Кафедра информационных систем и технологий
Выпускная квалификационная работа
на тему «Разработка системы распознавания изображений на основе аппарата искусственных нейронных сетей»
Нижний Новгород
2015
Введение
Темой данного исследования является разработка системы распознавания изображений на основе аппарата искусственных нейронных сетей. Задача распознавания изображений является очень важной, так как возможность автоматического распознавания компьютером изображений приносит множество новых возможностей в развитии науки и техники, таких, как разработка систем поиска лиц и других объектов на фотографиях, контроля качества производимой продукции без участия человека, автоматического управления транспортом и множество других.
Что касается искусственных нейронных сетей, то в последние годы данный раздел машинного обучения получается все большее развитие в связи со значительным повышением вычислительных мощностей существующих компьютеров и повсеместном распространении применения графических карт для вычислений, что позволяет обучать нейронные сети гораздо большей глубины и сложной структуры чем раньше, которые, в свою очередь, показывают значительно лучшие результаты по сравнению с другими алгоритмами для многих задач, в особенности задачи распознавания изображений. Данное направление развития нейронных сетей получило название deep learning (“глубокое обучение”) и является одним из наиболее успешных и быстро развивающихся в настоящее время. Так, например, по результатам ежегодного соревнования по распознаванию изображений ImageNet-2014 подавляющее большинство успешных алгоритмов использовало глубокие сверточные сети.
Так как задача распознавания изображений является очень обширной и в большинстве случаев требует отдельного подхода для различных типов изображений, то рассмотреть задачу распознавания изображений в целом в рамках одного исследования практически невозможно, поэтому было принято решение для примера рассмотреть отдельно такую подзадачу распознавания изображений, как распознавание дорожных знаков.
Таким образом, основной целью данного исследования была разработка системы распознавания изображений на основе искусственных нейронных сетей для изображений дорожных знаков. Для достижения данной цели были сформулированы следующие задачи:
1. Выполнение аналитического обзора литературы по теме искусственных нейронных сетей и их применения для задачи распознавания изображений
2. Разработка алгоритма для распознавания дорожных знаков с применением аппарата искусственных нейронных сетей
3. Разработка прототипа системы распознавания изображений на основе разработанного алгоритма. Результатом выполнения данной задачи должен являться программный комплекс, позволяющий пользователю загрузить изображение и получить предсказание класса данного изображения
4. Проведение экспериментальных исследований. Необходимо провести исследования и оценить точность работы полученного алгоритма
В ходе проведенного исследования все поставленные задачи были выполнены. Конкретные результаты по каждой из них будут описаны в основной части работы.
Глава 1. Обзор литературы.
1.1 Машинное обучение
Нейронные сети, которые подробно рассматриваются в данной работе, являются одной из разновидностей алгоритмов машинного обучения, или machine learning. Машинное обучение - это один из подразделов искусственного интеллекта. Основным свойством алгоритмов machine learning является их способность обучаться в процессе работы. Например, алгоритм построения дерева решений, не имея никакой предварительной информации о том, что представляют собой данные и какие в них существуют закономерности, а только некоторый входной набор объектов и значения некоторых признаков для каждого из них вместе с меткой класса, в процессе построения дерева сам выявляет скрытые закономерности, то есть обучается, и после обучения способен предсказывать класс уже для новых объектов, которые он не видел ранее.
Выделяют два основных типа машинного обучения: обучение с учителем и обучение без учителя. Обучение с учителем предполагает, что алгоритму кроме самих исходных данных предоставляется некоторая дополнительная информация о них, которую он может в дальнейшем использовать для обучения. К числу наиболее популярных задач для обучения с учителем относятся задачи классификации и регрессии. Например, задачу классификации можно сформулировать следующим образом: имея некоторый набор объектов, каждый из которых относится к одному из нескольких классов, необходимо определить, к какому из этих классов относится новый объект. Задача распознавания дорожных знаков, которая была рассмотрена в этой работе, является типичной разновидностью задачи классификации: существует несколько видов дорожных знаков - классов, и задача алгоритма - «распознать» знак, то есть отнести его к одному из существующих классов.
Обучение без учителя отличается от обучения с учителем тем, что алгоритму не предоставляется никакой дополнительной информации кроме самого набора исходных данных. Наиболее популярным примером задачи обучения без учителя является задача кластеризация. Суть задачи кластеризации состоит в следующем: на вход алгоритму подается некоторое количество объектов, принадлежащих разным классам (но какому классу принадлежит какой объект неизвестно, может быть неизвестно также само количество классов), и цель работы алгоритма - разбить это множество объектов на подмножества «схожих» объектов, то есть принадлежащих одному классу.
Среди всех алгоритмов машинного обучения выделяют несколько основных семейств [15]. Если речь идет о задаче классификации, к наиболее популярным таким семействам относятся, например:
· Классификаторы, основанные на правилах (Rule-based Classifiers) - основная идея таких классификаторов заключается в поиске правил отнесения объектов к тому или иному классу в форме “IF - THEN”. Для поиска таких правил обычно используются некоторые статистические метрики, также часто встречается построение правил на основе дерева решений.
· Логистическая регрессия - основная идея заключается в поиске линейной плоскости, максимально точно разделяющей пространство на два полупространства так, что объекты разных классов принадлежат разным полупространствам. При этом уравнение целевой плоскости ищется в виде линейной комбинации входных параметров. Для обучения подобного классификатора может применяться, например, метод градиентного спуска.
· Байесовский классификатор - как следует из названия, классификатор основан на теореме Байеса, которая записывается в форме
Идея классификатора в данном случае заключается в том, чтобы найти класс с максимальной апостериорной вероятностью при условии, что все параметры имеют те значения, которые они имеют для классифицируемого экземпляра. В общем случае данная задача предполагает предварительного знания очень большого количества условных вероятностей и, соответственно, огромного размера обучающей выборки и высокой сложности вычислений, поэтому на практике чаще всего применяется разновидность байесовского классификатора, называемая Наивным Байесовским классификатором, в которой предполагается, что все параметры независимы друг от друга, соответственно, формула принимает гораздо более простой вид и для ее использования требуется знать лишь небольшое количество условных вероятностей.
Хотя данное допущение обычно является далеким от реальности, наивный байесовский классификатор часто показывает неплохие результаты [29].
· Деревья решений - в упрощенном виде, данный алгоритм заключается в построении дерева, в котором каждый узел соответствует некоторому тесту, который выполняется над параметрами объекта, а листьями являются итоговые классы. Существует множество разновидностей деревьев решений и алгоритмов их построения. Например, один из наиболее популярных алгоритмов - C4.5.
· Нейронные сети - модель, представляемая в виде совокупностей элементов (нейронов) и связей между ними, которые в общем случае могут быть направленными или не направленными и имеют некоторые веса. В ходе работы нейронной сети на часть ее нейронов, называемых входными, поступает сигнал (входные данные), который некоторым образом распространяется и преобразуется, и на выходе сети (выходных нейронах) можно видеть результат работы сети, например, вероятности отдельных классов. Нейронные сети будут рассмотрены в данной работе более подробно в следующем разделе.
· Машины опорных векторов - концепция алгоритма заключается также, как в случае логистической регрессии, в поиске разделяющей плоскости (или нескольких плоскостей), однако способ поиска данной плоскости в этом случае отличается - ищется плоскость такая, что расстояние от нее до ближайших точек - представителей обоих классов максимально, для чего обычно используются методы квадратичной оптимизации.
· Ленивые классификаторы (Lazy learners) - особая разновидность алгоритмов классификации, которые, вместо того чтобы предварительно строить модель и в дальнейшем принимать решения об отнесении объекта к тому или иному классу на ее основе, основываются на идее, что похожие объекты чаще всего имеют один и тот же класс. Когда такой алгоритм получается на вход объект для классификации, он ищет среди просмотренных ранее объектов похожие на него и, пользуясь информацией об их классах, формирует своей предсказание относительно класса целевого объекта.
Можно видеть, что алгоритмы классификации могут иметь самые различные идеи и в своей основе и, разумеется, для разных типов задач показывают различную эффективность. Так, для задач с небольшим количеством входных признаков, могут оказаться полезными системы, основанные на правилах, если для входных объектов можно быстро и удобно вычислить некоторую метрику похожести - ленивые классификаторы, если же речь идет про задачи с очень большим количеством параметров, которые к тому же трудно идентифицировать или интерпретировать, таких как распознавание изображений или речи, наиболее подходящим методом классификации становятся нейронные сети.
1.2 Нейронные сети
Искусственные нейронные сети являются одной из широко известных и используемых моделей машинного обучения. Идея искусственных нейронных сетей базируется на имитации нервной системы животных и людей.
Упрощенная модель нервной системы животных при этом представляется в виде системы клеток, каждая из которых имеет тело и ответвления двух типов: дендриты и аксоны. В определенный момент клетка получает сигналы от других клеток через дендриты и, если эти сигналы будут достаточной силы, возбуждается и передает это возбуждение другим клеткам, с которыми она связана, через аксоны. Таким образом сигнал (возбуждение) распространяется по всей нервной системы. Модель нейронных сетей устроена аналогичным образом. Нейронная сеть состоит из нейронов и направленных связей между ними, при этом каждая связь имеет некоторый вес. При этом часть нейронов является входными - на них поступают данные из внешней среды. Затем на каждом шаге нейрон получает сигнал от всех входных нейронов, вычисляет взвешенную сумму сигналов, применяет к ней некоторую функцию и передает результат на каждый из своих выходов. Также сеть имеет некоторое количество выходных нейронов, которые формируют результат работы сети. Так, для задачи классификации выходные значения этих нейронов могут означать спрогнозированные вероятности каждого из классов для входного объекта. Соответственно, обучение нейронной сети заключается в подборе таких весов для связей между нейронами, чтобы выходные значения для всех входных данных оказывались максимально близкими к действительным.
Выделяется несколько основных типов архитектур нейронных сетей:
· Сеть прямого распространения (feed-forward network) - подразумевает, что нейроны и связи между ними образуют ациклический граф, где сигналы распространяются только в одном направлении. Именно такие сети являются наиболее популярными и широко изученными, и их обучение представляет наименьшие трудности.
· Рекуррентные нейронные сети (recurrent neural networks) - в таких сетях, в отличие от сетей прямого распространения, сигналы может передаваться в обоих направлениях, и могут поступать на один и тот же нейрон несколько раз в процессе обработки одного входного значения. Частной разновидностью рекуррентных нейронных сетей является, например, машина Больцмана. Основной трудностью в работе с такими сетями является их обучение, так как создать эффективный алгоритм для этого в общем случае является сложной задачей и до сих пор не имеет универсального решения.
· Самоорганизующиеся карты Кохонена - нейронная сеть, предназначенная в первую очередь для кластеризации и визуализации данных.
В истории развития нейронных сетей выделяют 3 основных периода подъема. Первые исследования в области искусственных нейронных сетей относятся к 40-м годам 20 века. В 1954 году Дж. Маккалок и У. Питтс опубликовали работу «Логическое исчисление идей, относящихся к нервной деятельности» [27], в которой были изложены основные принципы построения искусственных нейронных сетей. В 1949 году была опубликована книга Д.Хебба «Организация поведения», где автор рассмотрел теоретические основы обучения нейронных сетей и впервые сформулировал концепцию обучения нейронных сетей как настройку весов между нейронами. В 1954 году В.Кларк впервые осуществил попытку реализовать аналог сети Хебба с помощью компьютера. В 1958 году Ф. Росенблатт предложил модель персептрона, который представлял собой по сути нейронную сеть с одним скрытым слоем [31]. Принципиальный вид персептрона Росенблатта представлен на рисунке 1.
Рисунок 1, персептрон Росенблатта
Данная модель обучалась с помощью метода коррекции ошибок, который заключался в том, что веса остаются неизменными до тех пор, пока выходное значение персептрона корректно, в случае же ошибки вес связи изменяется на 1 в сторону, обратную знаку произошедшей ошибки. Данный алгоритм, как было доказано Росенблаттом, всегда сходится. Используя такую модель, удалось создать компьютер, распознающий некоторые буквы латинского алфавита, что, несомненно, было большим успехом в то время.
Однако интерес к нейронным сетям существенно снизился после публикации М. Минским и С. Папертом книги «Персептроны» (“Perceptrons”) в 1969 году [28], где они описали существенные ограничения, которые имеет модель персептрона, в частности, невозможность представления функции исключающего или, а также указали на слишком высокие требования к требуемой вычислительной мощи компьютеров для обучения нейронных сетей. Так как данные ученые имели очень высокий авторитет в научном сообществе, нейронные сети были на некоторое время признаны малоперспективной технологией. Ситуация изменилась только после создания в 1974 году алгоритма обратного распространения ошибки.
Алгоритм обратного распространения ошибки (backpropagation algorithm) был предложен в 1974 году одновременно и независимо двумя учеными, П.Вербосом и А. Галушкиным. Данный алгоритм основан на методе градиентного спуска. Основная идея алгоритма заключается в распространении информации об ошибке от выходов сети к ее входам то есть в обратном направлении по отношению к стандартному походу. При этом веса связей корректируются на основе дошедшей до них информации об ошибке. Основное требование, которое накладывает данный алгоритм - то, что функция активации нейронов должна быть дифференцируема, так как метод градиентного спуска, что неудивительно, вычисляется на основе градиента.
Алгоритм обратного распространения ошибки позволяет легко обучать сеть, имеющую несколько скрытых слоев, что позволяет обойти ограничения персептрона, блокирующие развитие данной отрасли ранее. С математической точки зрения данный алгоритм сводится к последовательному перемножению матриц - что является достаточно хорошо изученной и оптимизируемой задачей. Кроме того, данный алгоритм хорошо параллелизуется, что позволяет существенно ускорить время обучения сети. Все это совместно привело к новому расцвету нейронных сетей и множеству активных исследований в данном направлении.
Алгоритм backpropagation, в то же время, имеет ряд проблем. Так, использование градиентного спуска предполагает риск схождения к локальному минимуму. Другой важной проблемой является долгое время обучения алгоритма при наличии большого количества слоев, так как ошибка в процессе обратного распространения имеет свойство все сильнее уменьшаться при приближении к началу сети, соответственно, обучение начальных слоев сети будет происходить крайне медленно. Еще одним недостатком, свойственным нейронным сетям в целом, является сложность в интерпретации результатов их работы. Обученная модель нейронной сети представляет собой некоторое подобие черного ящика, на вход которой подается объект и на выходе получается прогноз, однако определить, какие признаки входного объекта при этом учитывались и какой из нейронов за что отвечает, обычно достаточно проблематично. Это делает нейронные сети во многом менее привлекательными по сравнению, например, с деревьями решений, в которых обученная модель сама по себе представляет некоторую квинтессенцию знаний о рассматриваемой предметной области и исследователю легко понять, почему данный объект был отнесен к тому или иному классу.
Данные недостатки, в сочетании с тем, что, хотя нейронные сети и показывали неплохие результаты, эти результаты были сравнимы с результатами других классификаторов, например, набирающих популярность машин опорных векторов, при этом результаты последних были гораздо проще в интерпретации а обучение требовало меньшего времени, привело к очередному спаду развития нейронных сетей.
Этот спад завершился только в 2000-х годах 21 века, когда появилось и стало распространяться понятие deep learning, или глубокого обучения. Возрождению нейронных сетей способствовало появление новых архитектур, таких, например, как сверточные сети, restricted bolzman machines, стэковые автоенкодеры и т.д., которые позволили добиться существенно более высоких результатов в таких сфера машинного обучения, как распознавание изображений и речи. Существенным фактором для их развития стало также появление и распространение мощных видеокарт и их применение для вычислительных задач. Видеокарты, отличаясь значительно большим количеством ядер по сравнения с процессором, пусть и меньшей мощности каждое, идеально подходят для задач обучения нейронных сетей. Это в сочетании с существенно возросшей в последнее время производительностью компьютеров в целом и распространением вычислительных кластеров позволило обучать существенно более сложные и глубокие архитектуры нейронных сетей, чем ранее.
1.3 Deep learning
Одной из наиболее важных проблем, с которыми приходится сталкиваться при использовании алгоритмов машинного обучения, является проблема выбора правильных признаков, на основе которых производится обучение. Особенно значимой становится данная проблема при рассмотрении таких задач, как распознавание изображений, распознавание речи, обработка естественного языка и тому подобных, то есть тех, где отсутствует очевидный набор признаков, которые могут быть использованы для обучения. Обычно выбор набора признаков для обучения осуществляется самим исследователем путем некоторой аналитической работы, и именно выбранный набор признаков во многом определяет успешность работы алгоритма. Так, для задачи распознавания изображений в качестве таких признаков может служить преобладающий цвет в изображении, степень его изменения, наличие на изображении четких границ или что-то еще. Более подробно вопрос распознавания изображений и выбора правильных признаков для этого будет рассмотрен в соответствующей главе.
Однако такой подход имеет существенные недостатки. Во-первых, данный подход подразумевает существенный объем работы по выявлению признаков, причем эта работа осуществляется вручную исследователем и может требовать больших затрат времени. Во-вторых, выявление признаков, на основании которых можно получить качественный алгоритм, в данном случае становится во многом случайным, к тому же, таким образом маловероятно, что будут приняты во внимание признаки, которые могут оказывать важное влияние на внутреннюю структуру изображения, но при этом неочевидны для человека. Таким образом, особенно привлекательной выглядит идея автоматического определения признаков, которые в дальнейшем могут быть использованы для работы алгоритмов машинного обучения. И именно такую возможность предоставляет использование подхода deep learning.
С точки зрения теории машинного обучения, deep learning является подмножеством так называемого representation learning. Основная концепция representation learning - как раз таки автоматический поиск признаков, на основании которых в дальнейшем будет работать некоторый алгоритм, например, классификации.
С другой стороны, еще одна важная проблема, с которой приходится сталкиваться при использовании машинного обучения - это наличие факторов вариации, которые могут оказать существенное влияние на внешний вид исходных данных, однако при этом не имеют отношения к самой их сути, которую исследователь и пытается анализировать [5]. Так, в задаче распознавания изображений такими факторами могут являться угол, под которым предмет на изображении повернут к наблюдателю, время суток, освещение и т.д. Так, в зависимости от точки зрения и погоды красная машина может иметь на фотографии различный оттенок и форму. Поэтому для подобных задач, например, идентификации предмета, изображенного на фотографии, выглядит разумным учитывать не конкретные низкоуровневые факты, такие как цвет определенного пикселя, а характеристики более высокого уровня абстракции, например, наличие колес. Однако очевидно, что определить на основе исходного изображения, присутствуют ли у него колеса - задача нетривиальная, и ее решение напрямую может быть весьма сложным. Кроме того, наличие колес - только одно из огромного множества возможных признаков, и определение их всех и составление алгоритмов для проверки изображения на наличие их выглядит не очень реалистичным. Именно здесь исследователи могут использовать все преимущества подхода deep learning. Deep learning основан на предоставлении исходного объекта в виде иерархической структуры признаков, таким образом, что каждый следующий уровень признаков строится на основе элементов предыдущего уровня. Так, если речь идет об изображениях, в качестве самого низшего уровня будут выступать исходные пиксели изображения, следующим уровнем будут отрезки, которые можно выделить среди этих пикселей, затем - углы и другие геометрические фигуры, в которые складываются отрезки. На следующем уровне их фигур образуются уже узнаваемые для человека объекты, например, колеса, и наконец, последний уровень иерархии отвечает за конкретные предметы на изображении, например, автомобиль.
Для реализации подхода deep learning в современной науке используются многослойные нейронные сети различных архитектур. Нейронные сети идеально подходят для решениях задачи выявления из данных и построения иерархического множества признаков, так как, по сути, нейронная сеть представляет собой совокупность нейронов, каждый из которых активируется только если входные данные удовлетворяют определенным критериям - то есть представляет собой некоторый признак, при этому правила активации нейрона - то, что и определяет данный признак - обучаются автоматически. В то же время, нейронные сети в своем наиболее распространенном виде, сами по себе представляют иерархичную структуру, где каждый следующий слой нейронов использует в качестве своего входа выходы нейронов предыдущего слоя - или, другими словами, признаки более высокого уровня формируются на основе признаков более низкого уровня.
Распространению данного подхода и, в связи с этим, очередному расцвету нейронных сетей, послужило три взаимосвязанных причины:
· Появление новых архитектур нейронных сетей, заточенных для решения определенных задач (сверточные сети, машины Больцмана и т.д.)
· Развитие и доступность вычислений с использованием gpu и параллельных вычислений в целом
· Появление и распространение подхода послойного обучения нейронных сетей, при котором каждый слой обучается отдельно с помощью стандартного алгоритма backpropagation (обычно на неразмеченных данных, то есть по сути происходит обучение автоенкодера), что позволяет выявить существенные признаки на данном уровне, а затем все слои объединяются в единую сеть и происходит дообучение сети уже с применением размеченных данных для решения конкретной задачи (fine-tuning). Данный подход имеет два существенных преимущества. Во-первых, таким образом существенно повышается эффективность обучения сети, так как в каждый момент времени обучается не глубокая структура, а сеть с одним скрытым слоем - в результате исчезают проблемы с уменьшением значений ошибки по мере повышения глубины сети и соответствующим снижением скорости обучения. И во-вторых, данный подход к обучению сети позволяет использовать при обучении неразмеченные данные, которых обычно гораздо больше чем размеченных - что делает обучение сети более простым и доступным для исследователей. Размеченные данные в таком подходе требуются только в самом конце для донастройки сети на решение определенной задачи классификации, и при этом, поскольку общая структура признаков, описывающих данные, уже создана в процессе предыдущего обучения, для донастройки сети требуется значительно меньше данных, чем для первоначального обучения с целью выявления признаков. Кроме сокращения требуемого количества размеченных данных, использование подобного подхода позволяет обучить один раз сеть с использованием большого количества неразмеченных данных и затем использовать полученную структуру признаков для решения различных задач классификации, донастраивая сеть с помощью различных наборов данных - за гораздо меньшее время, чем потребовалось бы в случае полного обучения сети каждый раз.
Рассмотрим чуть более подробно основные архитектуры нейронных сетей, обычно используемые в контексте глубокого обучения.
· Многослойный персептрон - представляет собой обычную полносвязную нейронную сеть с большим количество слоев. Вопрос о том, какое количество слоев считается достаточно большим, не имеет однозначного ответа, но обычно сети, имеющие 5-7 слоев, уже считаются «глубокими». Данная архитектура нейронных сетей, хотя и не имеет принципиальных отличий от сетей, которые использовать ранее до распространения понятия глубокого обучения, может оказаться весьма эффективной в случае успешного решения задачи ее обучения, что являлось главной проблемой работы с такими сетями ранее. В настоящее время данная проблема решается путем использования для обучения сети графических карт, что позволяет ускорить обучение и, соответственно, провести большее количество итераций обучения, или послойного обучения сети, упомянутого ранее. Так, в 2012 году Ciresan с коллегами опубликовали статью «Deep big multilayer perceptrons for digit recognition» [11], в которой сделали предположение, что многослойный персептрон с большим количеством слоев, в случае достаточной продолжительности обучения (которая достигается за разумное время с использованием параллельных вычислений на gpu) и достаточном количестве данных для обучения (которое достигается путем применения различных случайных трансформаций к исходному множеству данных) может показать результативность не худшую чем другие, более сложные модели. Их модель, представляющая собой нейронную сеть с 5 скрытыми слоями, при классификации цифр из датасета MNIST, показала процент ошибки 0.35, что лучше, чем опубликованные ранее результаты более сложных моделей. Также, путем объединения нескольких обученных таким образом сетей в единую модель, им удалось снизить показатель ошибки до 0.31%. Таким образом, несмотря на кажущуюся простоту, многослойный персептрон является вполне успешным представителем алгоритмов глубокого обучения.
· Stacked autoencoder (стэковый автоенкодер) - данная модель тесно связана с многослойным персептроном и в целом с задачей обучения глубоких нейронных сетей. Именно с использованием стэкового автоенкодера реализуется послойное обучение глубоких сетей. Однако данная модель используется не только для целей обучения других моделей, а часто имеет большое практическое значение сама по себе. Чтобы описать суть стэкового автоенкодера, рассмотрим сначала понятие обычного автоенкодера. Автоенкодер представляет собой алгоритм обучения без учителя, в котором в качестве ожидаемых выходных значений нейронной сети выступают ее же входные значения. Схематически модель автоенкодера представлена на рисунке 2:
Рисунок 2, классический автоенкодер
Очевидно, что задача обучения подобной модели имеет тривиальное решение, если количество нейронов в скрытом слое равно количеству входных нейронов - тогда скрытому слоя достаточно просто транслировать свои входные значения на выход. Поэтому при обучении автоенкодеров вводятся дополнительные ограничения, например, количество нейронов в скрытом слое устанавливается значительном меньшим чем во входном слое, либо применяются особые методики регуляризации, направленные на то, чтобы обеспечить высокую степень разреженности нейронов скрытого слоя [2]. Одно из наиболее распространенных применений автоенкодеров в чистом виде - это задача получения сжатого представления исходных данных. Так, например, автоенкодер с 30 нейронами в скрытом слое, обученный на датасете MNIST, позволяет восстановить на выходном слое исходные изображения цифр практически без изменений, что означает, что на самом деле каждое из исходных изображений можно достаточно точно описать только 30 числами. В данном своем применении автоенкодеры часто рассматриваются в качестве альтернативы методу главных компонент. Стэковый же автоенодер представляет собой по сути комбинацию нескольких обычных автоенкодеров, обучаемых слой за слоем. При этом выходные значения обученных нейронов скрытого слоя первого из автоэнкодеров выступают в качестве входных значений для второго из них и т.д.
· Сверточные сети - одна из наиболее популярных в последнее время моделей глубокого обучения, применяющаяся в первую очередь для распознавания изображений [23]. Концепция сверточных сетей построена на трех основных идеях:
o Локальная чувствительность (local receptive fields) - если говорить о задаче распознавания изображений, это означает, что на распознавание того или иного элемента на изображении должно в первую очередь оказывать влияние его непосредственное окружение, в то время как пиксели, находящиеся в другой части изображения, скорее всего с данным элементом никак не связаны и не содержат информации, которая помогла бы правильно его идентифицировать
o Разделенные веса (shared weights) - наличие в модели разделенных весов фактически олицетворяет предположение, что один и тот же объект может быть найден в любой части изображения, при этом для его поиска во всех частях изображения применяется один и тот же паттерн (набор весов)
o Сабсемплинг (subsampling) - концепция, позволяющая сделать модель более устойчивой к незначительным отклонениям от искомого паттерна - в том числе, связанным с мелкими деформациями, изменением освещения и т.д. Идея сабсемплинга заключается в том, что при сопоставлении с паттерном учитывается не точное значение для данного пикселя или области пикселей, а его агрегация в некоторой окрестности, например, среднее или максимальное значение.
С математической точки зрения, основой сверточных нейронных сетей является операция матричной свертки, которая заключается в поэлементном перемножении матрицы, представляющей собой небольшой участок исходного изображения (например, 7*7 пикселей) с матрицей того же размера, называемой ядром свертки, и последующее суммирование полученных значений. При этом ядро сверки представляет собой по сути некоторый шаблон, а полученное в результате суммирования число характеризует степень похожести данной области изображения на этот шаблон. Соответственно, каждый слой сверточной сети состоит из некоторого количества шаблонов, и задача обучения сети заключается в подборе правильных значений в этих шаблонах - так, чтобы они отражали наиболее значимые характеристики исходных изображений. При этом каждый шаблон сопоставляется последовательно со всеми частями изображения - именно в этом находит выражение идея разделения весов. Слои такого типа в сверточной сети называются слоями свертки. Кроме слоев свертки, в сверточных сетях присутствуют слои сабсемплинга, которые заменяют небольшие области изображения одним числом, тем самым одновременно уменьшая размер образца для работы следующего слоя и делая сеть более устойчивой к небольшим изменениям в данных. В последних же слоях сверточной сети обычно используется один или несколько полносвязанных слоев, обучаемых для выполнения непосредственно классификации объектов. В последние годы использование сверточных сетей стало фактически стандартом при классификации изображений и позволяет добить наилучших результатов в этой области.
· Ограниченные машины Больцмана (Restricted Boltzmann Machines) - еще одна разновидность моделей глубокого обучения, в отличие от сверточных сетей, применяемая в первую очередь для задачи распознавания речи. Машина Больцмана в своем классическом понимании представляет собой неориентированный граф, ребра в котором отражают зависимости между узлами (нейронами). При этом часть нейронов является видимыми, а часть скрытыми. С точки зрения нейронных сетей машина Больцмана представляет собой по сути рекуррентную нейронную сеть, с точки зрения статистики - случайное марковское поле. Важными понятиями для машин Больцмана являются понятия энергии сети и состояния равновесия. Энергия сети зависит от того, какое количество сильно связанных между собой нейронов одновременно находятся в активированном состоянии, задача же обучения такой сети состоит в ее схождении к состоянию равновесия, при котором ее энергия минимальна. Основным недостатком подобных сетей являются большие проблемы с обучением их в общем виде. Для решения данной проблемы Дж. Хинтоном с коллегами была предложена модель ограниченно машины Больцмана (Restricted Boltzmann Machines), которая накладывает ограничение на структуру сети, представляя ее в виде двудольного графа, в одной части которого находятся только видимые нейроны, а в другой - только скрытые, соответственно, связи присутствуют только между видимыми и скрытыми нейронами. Данное ограничение позволило разработать эффективные алгоритмы для обучения сетей такого вида, благодаря чему был осуществлен существенный прогресс в решении задач распознавания речи, где данная модель практически вытеснила популярную ранее модель скрытых сетей Маркова.
Теперь, рассмотрев основные понятия и принципы глубокого обучения, кратко рассмотрим основные принципы и эволюцию развития распознавания изображений и то, какое место в нем занимает deep learning.
1.4 Распознавание изображений
Распознавание изображений является важным и интересным разделом компьютерной науки, имеющим самые различные применения в реальной жизни. Так, распознавание изображений может применяться для задачи распознавания автомобильных номеров, идентификации наличия пешеходов на дороге, поиска и распознавания лиц на фотографиях, системах для управления каким-либо устройством жестами, проведения автоматического контроля качества на производстве - и это только очень небольшое подмножество практических применений распознавания изображений. Поэтому неудивительно, что интерес исследователей в области computer science и искусственного интеллекта к распознаванию изображений появился еще в 60-х годах 20 века и эта область науки активно развивается до сих пор.
Существует множество формулировок для задачи распознавания изображений, и определить ее однозначно достаточно сложно. Например, можно рассматривать распознавание изображений как задачу поиска и идентификации на исходном изображении некоторых логических объектов.
Распознавание изображений обычно является сложной задачей для компьютерного алгоритма. Это связано, в первую очередь, с высокой вариативностью изображений отдельных объектов. Так, задача поиска автомобиля на изображении является простой для человеческого мозга, который способен автоматически идентифицировать у объекта наличие важных для автомобиля признаков (колеса, специфическая форма) и при необходимости «достаивать» картинку в воображении, представляя недостающие детали, и крайне сложной для компьютера, так как существует огромное количество разновидностей автомобилей разных марок и моделей, имеющих во многом разную форму, кроме того, итоговая форма объекта на изображении сильно зависит от точки съемки, угла, под которым он снимается и других параметров. Также немаловажную роль играет освещение, которое оказывает влияние на цвет полученного изображения, а также может делать незаметными или искажать отдельные детали.
Таким образом, основные трудности при распознавании изображений вызывают:
· Вариативность предметов внутри класса
· Вариативность формы, размера, ориентации, положения на изображении
· Вариативность освещения
Для борьбы с этими трудностями на протяжении истории развития распознавания изображений были предложены самые различные методы, и в настоящее время в этой сфере уже удалось добиться существенного прогресса.
Первые исследования в области распознавания изображений были опубликованы в 1963 году Л.Робертсом в статье «Machine Perception Of Three-Dimensional Solids», где автор сделал попытку абстрагироваться от возможных изменений в форме предмета и сконцентрировался на распознавании изображений простых геометрических форм в условиях различного освещения и при наличии поворотов. Разработанная им компьютерная программа была способна идентифицировать на изображении геометрические объекты некоторых простых форм и формировать их трехмерную модель на компьютере.
В 1987 году Ш.Улманом и Д.Хуттенлохером была опубликована статья «Object Recongnition Using Alignment» [19] где они также сделали попытку распознавания объектов относительно простых форм, при этом процесс распознавания был организован в два этапа: сначала поиск области на изображении, где находится целевой объект, и определение его возможных размеров и ориентации (“alignment”) с помощью небольшого набора характерных признаков, и затем попиксельное сравнение потенциального изображения объекта с ожидаемым.
Однако попиксельное сравнение изображений имеет множество существенных недостатков, таких как его трудоемкость, необходимость наличия шаблона для каждого из объектов возможных классов, а также то, что в случае попиксельного сравнения может осуществляться только поиск конкретного объекта, а не целого класса объектов. В некоторых ситуациях это применимо, однако в большинстве случаев все же требуется поиск не одного конкретного объекта, а множества объектов какого-либо класса.
Одним из важных направлений в дальнейшем развитии распознавания изображений стало распознавание изображений на основе идентификации контуров. Во многих случаях именно контуры содержат большую часть информации об изображении, и в то же время рассмотрение изображения в виде совокупности контуров позволяет его существенно упростить. Для решения задачи поиска контуров на изображении классическим и наиболее известным подходом является детектор Кэнни (Canny Edge Detector), работа которого основана на поиске локального максимума градиента [8].
Другим важным направлением в области анализа изображений является применение математических методов, таких как частотная фильтрация и спектральный анализ. Данные методы применяются, например, для сжатия изображений (JPEG сжатие) или повышения его качества (фильтр Гаусса). Однако, поскольку данные методы не связаны непосредственно с распознаванием изображений, более подробно они здесь рассматриваться не будут.
Еще одна задача, которая часто рассматривается в связи с задачей распознавания изображений - это задача сегментации. Основная цель сегментации - это выделение на изображении отдельных объектов, каждый из которых затем может быть отдельно изучен и проклассифицирован. Задача сегментации значительно упрощается, если исходное изображение является бинарным - то есть состоит из пикселей только двух цветов. В этом случае задача сегментации часто решается с применением методов математической морфологии [34]. Суть методов математической морфологии заключается в представлении изображения как некоторого множества двоичных значений и применении к этому множеству логических операций, основные среди которых это перенос, наращивание (логическое сложение) и эрозия (логическое умножение). С применением данных операций и их производных, таких как замыкание и размыкание, появляется возможность, например, устранить шум на изображении или выделить границы. Если подобные методы применяются в задаче сегментации, то наиболее важной их задачей становится как раз таки задача устранения шума и формирования на изображении более-менее однородных участков, которые затем легко найти с помощью алгоритмов, аналогичных поиску связных компонент в графе - это и будут искомые сегменты изображения.
Что касается сегментации RGB-изображений, то одним из важных источников информации о сегментах изображения может стать его текстура. Для определения текстуры изображения часто применяется фильтр Габора [12], который был создан в попытках воспроизвести особенности восприятия текстур человеческим зрением. В основе работы данного фильтра лежит функция частотного преобразования изображения.
Другое важное семейство алгоритмов, используемых для распознавания изображений - это алгоритмы, основанные на поиске локальных особенностей. Локальные особенности представляют собой некоторые хорошо различимые области изображения, которые позволяют соотнести изображение с моделью (искомым объектом) и определить, соответствует ли данное изображение модели и, если соответствует, определить параметры модели (например, угол наклона, примененное сжатие и т.д.). Для качественного выполнения своих функций локальные особенности должны быть устойчивы к афинным преобразованиям, сдвигам и т.д. Классическим примером локальных особенностей являются углы, которые часто присутствуют на границах различных объектов. Наиболее популярным алгоритмом для поиска углов является детектор Харриса [16].
В последнее же время все большей популярностью пользуются методы распознавания изображений, основанные на нейронных сетях и глубоком обучении. Основной расцвет этих методов наступил после появления в конце 20 века сверточных сетей (LeCun, [23]), которые показывают значительно лучшие результаты в распознавании изображений по сравнения с остальными методами. Так, большая часть лидирующих (и не только) алгоритмов в ежегодном соревновании по распознаванию изображений ImageNet-2014 использовала в том или ином виде сверточные сети.
1.5 Распознавание дорожных знаков
Распознавание дорожных знаков в общем виде - это одна из многочисленных задач распознавания изображений или, в некоторых случаях, видеозаписей. Эта задача имеет большое практическое значение, так как распознавание дорожных знаков используется, например, в программах автоматизации управления автомобилем. Задача распознавания дорожных знаков имеет множество вариаций - например, идентификация наличия дорожных знаков на фотографии, выделение на изображении участка, представляющего собой дорожный знак, определение, какой конкретный знак изображен на фотографии, заведомо являющейся изображением дорожного знака и т.д. Обычно выделяют три глобальные задачи, связанные с распознаванием дорожных знаков - их идентификация среди окружающего ландшафта, непосредственно распознавание, или классификация, и так называемый трекинг - здесь подразумевается возможность алгоритма «следить», то есть держать в фокусе дорожный знак в видеоряде. Каждая из этих подзадач сама по себе является отдельным предметом для исследования и имеет обычно свой круг исследователей и традиционных подходов. В данной работе внимание было сосредоточено на задаче классификации дорожного знака, изображенного на фотографии, поэтому рассмотрим ее более подробно.
Данная задача является задачей классификации для классов с несбалансированной частотой. Это значит, что вероятность принадлежности изображения различным классам различна, поскольку некоторые классы встречаются чаще, чем другим - например, на российских дорогах знак ограничения скорости «40» встречается существенно чаще, чем знак «Сквозной проезд запрещен». Кроме того, дорожные знаки образуют несколько групп классов таких, что классы внутри одной группы сильно схожи между собой - например, все знаки ограничения скорости выглядят очень похоже и отличаются лишь цифрами внутри них, что, конечно, существенно осложняет задачу классификации. С другой стороны, дорожные знаки имеют четкую геометрическую форму и небольшой набор возможных цветов, что могло бы существенно упростить процедуру классификации - если бы не тот факт, что реальные фотографии дорожных знаков могут быть сняты с разных ракурсов и при различном освещении. Таким образом, задача классификации дорожных знаков, хотя и может рассматриваться как типичная задача распознавания изображений, но для достижения наилучшего результата требует особого подхода.
До определенного момента времени исследования по этой теме были достаточно хаотичны и не связаны между собой, так как каждый исследователь ставил между собой собственные задачи и использовал собственный набор данных, так что не было возможности сравнить и обобщить имеющиеся результаты. Так, в 2005 году Bahlmann с коллегами в рамках комплексной системы распознавания дорожных знаков, поддерживающей все 3 упомянутые ранее подзадачи распознавания дорожных знаков, реализовали алгоритм распознавания знаков, работающий с точностью 94% для дорожных знаков, относящихся к 23 различным классам [23]. Обучение было произведено на 40000 изображениях, при этом количество изображений, соответствующих каждому классу, варьировалось от 30 до 600. Для детектирования дорожных знаков в данной системе применялся алгоритм AdaBoost и вейвлеты Хаара, а для классификации найденных знаков - подход, основанный на алгоритме Expectation Maximization. Система распознавания дорожных знаков с ограничениями скорости, разработанная Moutarde в 2007 году, имела точность до 90% и была обучена на множестве в 281 изображение [30]. В этой системе были использованы детекторы окружностей и квадратов для обнаружения дорожных знаков на изображений (для европейских и американских знаков соответственно), в которых затем выделялась каждая цифра и классифицировалась с помощью нейронной сети. В 2010 году Ruta с коллегами разработали систему для детектирования и классификации 48 различных типов дорожных знаков с точностью классификации 85,3% [32]. Их подход был основан на поиске в изображении окружностей и многогранников и выделении в них небольшого количества особых регионов, которые позволяют отличить данный знак от всех остальных. При этом было применено особое преобразование цветов изображений, названное авторами Colour Distance Transform и позволяющее сократить количество цветов, присутствующих на изображении, а соответственно - увеличить возможности по сравнению изображений и сократить размер обрабатываемых данных. Broggie с колленами в 2007 году предложили трехступенчатый алгоритм для детектирования и классификации дорожных знаков, состоящий из сегментации цветов, определения формы и нейронной сети, однако в их публикации отсутствую количественные показатели результатов работы их алгоритма [7]. Гао и др. в 2006 году предложили систему распознавания дорожных знаков, основанную на анализе цвета и формы предполагаемого знака и показавшую точность распознавания 95% среди 98 экземпляров дорожных знаков [13].
Ситуация с разрозненностью исследования в сфере распознавания дорожных знаков изменилась в 2011 году, когда в рамках конференции IJCNN (International Joint Conference on Neural Networks) было проведено соревнование по распознаванию дорожных знаков. Для данного соревнования был разработан набор данных GTSRB (German Traffic Sign Recognition Benchmark), содержащий более 50000 изображений дорожных знаков, расположенных на дорогах Германии и принадлежащих 43 различным классам. На основе данного набора данных было проведено соревнование, состоящее их двух этапов. По результатам второго этапа была опубликована статья “Man vs. Computer: Benchmarking Machine Learning Algorithms for Traffic Sign Recognition”, где приводится обзор результатов конкурса и описание подходов, использованных наиболее успешными командами [35]. Также по следам данного мероприятия был опубликован ряд статей самими авторами алгоритмов - участниками соревнования, а данный набор данных впоследствии стал базовым бенчмарком для алгоритмов, связанных с распознаванием дорожных знаков, аналогично всем известному MNIST для распознавания рукописных цифр.
К числу наиболее успешных в данном соревновании алгоритмов относится комитет сверточных сетей (команда IDSIA), многошкальная сверточная сеть (Multi-Scale CNN, команда Sermanet) и случайный лес (Random Forests, команда CAOR). Рассмотрим каждый из этих алгоритмов чуть более подробно.
Комитет нейронных сетей, предложенный командой IDSIA из итальянского Dalle Molle Institute for Artificial Intelligence Research во главе с D. Ciresan, достиг точности классификации знаков 99,46%, что выше точности человека (99,22%), оценка который была проведена в рамках того же конкурса. Данный алгоритм был впоследствии более подробно описан в статье “Multi-Column Deep Neural Network for Tra?c Sign Classi?cation” [9]. Основная идея подхода заключается в том, что к исходным данным были применены 4 различных метода нормализации: корректировка изображения (Image Adjustment), выравнивание диаграммы (Histogram Equalization), адаптивное выравнивание диаграммы (Adaptive Histogram Equalization) и нормализация контраста (Constrast Normalization). Затем для каждого набора данных, полученных в результате нормализации, и исходного набора данных было построено и обучено по 5 сверточных сетей со случайно инициализированными начальными значениями весов, каждая из 8 слоев, при этом для входных значений сети при обучении применялись различные случайные трансформации, что позволило повысить размер и вариативность обучающей выборки. Результирующее предсказание сети формировалось путем усреднения предсказания каждой из сверточных сетей. Для обучения данных сетей применялась реализация с использованием вычислений на gpu.
...Подобные документы
Искусственные нейронные сети как одна из широко известных и используемых моделей машинного обучения. Знакомство с особенностями разработки системы распознавания изображений на основе аппарата искусственных нейронных сетей. Анализ типов машинного обучения.
дипломная работа [1,8 M], добавлен 08.02.2017Первое систематическое изучение искусственных нейронных сетей. Описание элементарного перцептрона. Программная реализация модели распознавания графических образов на основе перцептрона. Интерфейс программы, основные окна. Составление алгоритма приложения.
реферат [100,5 K], добавлен 18.01.2014Понятие искусственного нейрона и искусственных нейронных сетей. Сущность процесса обучения нейронной сети и аппроксимации функции. Смысл алгоритма обучения с учителем. Построение и обучение нейронной сети для аппроксимации функции в среде Matlab.
лабораторная работа [1,1 M], добавлен 05.10.2010Рост активности в области теории и технической реализации искусственных нейронных сетей. Основные архитектуры нейронных сетей, их общие и функциональные свойства и наиболее распространенные алгоритмы обучения. Решение проблемы мертвых нейронов.
реферат [347,6 K], добавлен 17.12.2011Создание программного средства, осуществляющего распознавание зрительных образов на базе искусственных нейронных сетей. Методы, использующиеся для распознавания образов. Пандемониум Селфриджа. Персептрон Розенблатта. Правило формирования цепного кода.
дипломная работа [554,8 K], добавлен 06.04.2014Понятие и свойства искусственных нейронных сетей, их функциональное сходство с человеческим мозгом, принцип их работы, области использования. Экспертная система и надежность нейронных сетей. Модель искусственного нейрона с активационной функцией.
реферат [158,2 K], добавлен 16.03.2011Особенности нейронных сетей как параллельных вычислительных структур, ассоциируемых с работой человеческого мозга. История искусственных нейронных сетей как универсального инструмента для решения широкого класса задач. Программное обеспечение их работы.
презентация [582,1 K], добавлен 25.06.2013Общие сведения о принципах построения нейронных сетей. Искусственные нейронные системы. Математическая модель нейрона. Классификация нейронных сетей. Правила обучения Хэбба, Розенблатта и Видроу-Хоффа. Алгоритм обратного распространения ошибки.
дипломная работа [814,6 K], добавлен 29.09.2014Диагностический анализ изучения алгоритмов обучения нейронных сетей "с учителем". Сбор входных и выходных переменных для наблюдений и понятие пре/пост процессирования. Подготовка и обобщение многослойного персептрона, модель обратного распространения.
курсовая работа [249,3 K], добавлен 22.06.2011Различные методы решения задачи классификации. Нейросетевые парадигмы, методы обучения нейронных сетей, возникающие при этом проблемы и пути их решения. Описание программной реализации классификатора, его функциональные возможности и результаты обучения.
дипломная работа [1,0 M], добавлен 28.12.2015Нейронные сети как средство анализа процесса продаж мобильных телефонов. Автоматизированные решения на основе технологии нейронных сетей. Разработка программы прогнозирования оптово-розничных продаж мобильных телефонов на основе нейронных сетей.
дипломная работа [4,6 M], добавлен 22.09.2011Способы применения технологий нейронных сетей в системах обнаружения вторжений. Экспертные системы обнаружения сетевых атак. Искусственные сети, генетические алгоритмы. Преимущества и недостатки систем обнаружения вторжений на основе нейронных сетей.
контрольная работа [135,5 K], добавлен 30.11.2015Описание технологического процесса напуска бумаги. Конструкция бумагоделательной машины. Обоснование применения нейронных сетей в управлении формованием бумажного полотна. Математическая модель нейрона. Моделирование двух структур нейронных сетей.
курсовая работа [1,5 M], добавлен 15.10.2012Нейрокомпьютеры и их применение в современном обществе. Некоторые характеризующие нейрокомпьютеры свойства. Задачи, решаемые с помощью нейрокомпьютеров. Типы искусственных нейронов. Классификация искусственных нейронных сетей, их достоинства и недостатки.
курсовая работа [835,9 K], добавлен 17.06.2014Анализ существующих алгоритмов распознавания режимов работы газотурбинного двигателя. Метод группового учета аргументов, метод Байеса. Применение технологий системного моделирования на этапе проектирования интеллектуальной системы распознавания режимов.
курсовая работа [1,4 M], добавлен 11.04.2012Анализ применения нейронных сетей для прогнозирования ситуации и принятия решений на фондовом рынке с помощью программного пакета моделирования нейронных сетей Trajan 3.0. Преобразование первичных данных, таблиц. Эргономическая оценка программы.
дипломная работа [3,8 M], добавлен 27.06.2011Модели нейронных сетей и их реализации. Последовательный и параллельный методы резолюции как средства логического вывода. Зависимость между логическим следованием и логическим выводом. Применение технологии CUDA и реализация параллельного алгоритма.
дипломная работа [1,5 M], добавлен 22.09.2016Обзор и анализ распространенных искусственных нейронных сетей. Функциональное назначение слоев сети, алгоритмы обучения. Описание функциональных возможностей разработанной программной системы. Анализ исследовательской эксплуатации и возможных применений.
дипломная работа [1,3 M], добавлен 19.05.2011Сущность и функции искусственных нейронных сетей (ИНС), их классификация. Структурные элементы искусственного нейрона. Различия между ИНС и машинами с архитектурой фон Неймана. Построение и обучение данных сетей, области и перспективы их применения.
презентация [1,4 M], добавлен 14.10.2013Изучение методов разработки систем управления на основе аппарата нечеткой логики и нейронных сетей. Емкость с двумя клапанами с целью установки заданного уровня жидкости и построение нескольких типов регуляторов. Проведение сравнительного анализа.
курсовая работа [322,5 K], добавлен 14.03.2009