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

По представленному графику, отражающему динамику развития технологии по годам, можно заметить, что существенный прогресс был достигнут в 2010 году. С 2015 года технология превзошла отметку в 94,9%, что представляет собой любопытный показатель. Стоит отметить, что известный специалист в области Data Science Эндрю Карпатый в 2014 году определил способность к распознаванию котов на изображениях с точностью 94,9% (приблизительно 95 из 100). В 2014 году Карпатый превосходил компьютеры в этой области, однако в 2015 году ситуация изменилась. На сегодняшний день роботизированные системы демонстрируют более высокую точность распознавания котов, чем человек.
Компьютерное зрение — это не зрение

Компьютерное зрение (CV), несмотря на название, не является прямым аналогом человеческого зрения. Для понимания CV необходимо обратиться к устройству человеческого глаза, истинно совершенной системе. Человеческий глаз, состоящий из оптики и мышц, способен автоматически фокусироваться, следить за объектом и адаптироваться к уровню освещения.
Сенсорная часть глаза, ретина, содержит палочки и колбочки – фоторецепторы, преобразующие световое возбуждение в нервные импульсы. Колбочки отвечают за цветовосприятие, а палочки – за восприятие черно-белых изображений.
Свет, попадая на оптику глаза, фокусируется, адаптируется к интенсивности освещения и проецируется на ретину. Там свет фиксируется колбочками и палочками, преобразуется в нервные импульсы, которые затем интерпретируются мозгом, позволяя нам узнавать объекты – кошку или собаку.
Несмотря на всю сложность и “магичность” человеческого зрения, компьютеры превосходят нас в распознавании образов.
Причина кроется в том, что CV, по сути, является алгоритмическим процессом умножения матриц, что компьютеры выполняют с гораздо большей скоростью и точностью. Человек же, несмотря на прогресс в области искусственного интеллекта, лучше справляется с творческими задачами, такими как придумывание названий.
Термин “компьютерное зрение” звучит более заманчиво, чем “алгоритмическое распознавание образов”, хотя именно это и является его сутью.
Несмотря на название, машинное обучение не является настоящим обучением в том смысле, к которому мы привыкли. Машины не способны к самостоятельному познанию и выводу. Они лишь эффективно выполняют матричные операции, основанные на принципах оптимизации функций.
Подобно тому, как в средней школе мы изучали таблицы производных для поиска критических точек функции (минимумов или максимумов), машинное обучение использует алгоритмы, направленные на поиск оптимальных значений параметров модели. Производная, определяемая как скорость изменения функции в данной точке, служит мерой ее возрастания или убывания. Геометрически она интерпретируется как тангенс угла наклона касательной к функции.
Таким образом, суть машинное обучения сводится к поиску наилучших параметров модели, минимизирующих функцию потерь.

Если производная функции равна нулю в определённой точке, это означает, что касательная к графику функции в этой точке параллельна оси абсцисс. Другими словами, функция достигает локального экстремума (максимума или минимума) в данной точке, поскольку её значение не изменяется ни в сторону увеличения, ни в сторону уменьшения.
Для нахождения таких точек необходимо продифференцировать функцию, приравнять полученную производную к нулю и решить уравнение. В области машинного обучения процесс аналогичный, но с некоторыми усложнениями. Функции, используемые в машинном обучении, как правило, обладают высокой сложностью и зависят от большого количества переменных, что затрудняет вычисление производной аналитическим способом. Для решения этой задачи применяются численные методы.
Машины — не учатся
Любая модель машинного обучения представляет собой функцию, пусть и весьма сложную. Данная функция принимает на вход объекты, с которыми нам предстоит выполнить определенные действия (например, идентифицировать котов на изображениях). Функция характеризуется множеством аргументов или параметров, обозначаемых греческой буквой θ.

Изначально значения параметров θ задаются случайным образом, что приводит к произвольным результатам. Для достижения желаемой точности модель обучается на наборе изображений с известным результатом (наличие или отсутствие кота).
Сравнивая прогнозы модели с истинными значениями, мы вычисляем функцию ошибки (loss), которая количественно отражает степень несоответствия модели реальности. Чем меньше значение функции loss, тем точнее модель.
Задача оптимизации заключается в нахождении таких значений параметров θ, при которых функция loss достигает минимума. Для этого используется метод дифференцирования функции loss по θ и последующего решения уравнения, приравнивая производную к нулю. В большинстве случаев аналитическое решение недостижимо, поэтому применяются численные методы.
Таким образом, путем минимизации функции loss мы находим оптимальные значения параметров θ, что обеспечивает наилучшую точность модели.
Машинное обучение, по сути, сводится к поиску оптимального набора числовых параметров, которые позволяют функции генерировать желаемые значения.
Важно отметить, что научное сообщество ещё не пришло к окончательному пониманию механизмов человеческого обучения. Следовательно, утверждать, что алгоритмы машинного обучения точно имитируют этот процесс, было бы неверным.
Как уже упоминалось, машины не обучаются в традиционном смысле этого слова. Они выполняют вычисления, подбирая значения параметров посредством матричных операций.
Две большие проблемы или как компьютерное зрение распознаёт котиков
У компьютерного зрения есть две большие проблемы:
Размер входного изображения.
Любая растровое изображение, включая изображение котика, может быть представлено в виде матрицы. Цветное изображение состоит из нескольких таких матриц. Например, в аддитивной цветовой модели RGB используется три матрицы, каждая из которых соответствует определенному цветовому каналу: красному, зелёному или синему. Значение в каждой ячейке матрицы отражает интенсивность соответствующего цвета.
Таким образом, даже небольшое изображение размером 16×16 пикселей будет представлено 768 числами (16 * 16 * 3). При решении задачи распознавания объектов, таких как кошки, неизвестно, какие именно пиксели несут существенную информацию, а какие – нет. Поэтому для обработки необходимо учитывать все пиксели изображения.
В результате, модель, предназначенная для решения этой задачи, будет иметь почти тысячу входных параметров. К ним добавляются дополнительные параметры модели, даже для небольшого изображения. Это приводит к большому объему вычислений. Несмотря на то, что компьютеры превосходят людей в выполнении таких вычислений, размер входного изображения остаётся существенным ограничением для алгоритмов компьютерного зрения.
Дополнительной проблемой является то, что нерелевантные пиксели могут негативно влиять на работу модели, отвлекая её от ключевой информации.

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

Как решали проблемы в ML
Для решения указанных проблем требовалось снижение размерности обрабатываемых данных. Вместо анализа всех пикселей изображения, необходимо было сосредоточиться на тех, которые несут наибольшую информацию для идентификации объекта – кота.
Желательно было бы также обеспечить инвариантность этих пикселей к деформациям. Иными словами, при изменении формы или размера изображения (например, сжатии или повороте) координаты ключевых пикселей должны оставаться относительно стабильными. Это позволит компьютеру, анализируя измененные данные, корректно идентифицировать объект как кота, даже если его внешний вид несколько отличается от исходного.
В машинном обучении данная задача называется “feature engineering” или “отбор признаков”. Суть этого процесса заключается в выделении из входных данных наиболее релевантной информации.
Например, при распознавании котов на изображениях можно было бы сфокусироваться на таких признаках как лапы, хвост и усы, игнорируя остальные пиксели.
В прошлом, когда вычислительные мощности были ограничены, отбор признаков осуществлялся исключительно человеком. Это касалось всех задач машинного обучения, а не только компьютерного зрения. Эксперт анализировал набор данных, определял важные и несущественные признаки, удалял ненужную информацию, а также преобразовывал и усиливал значимые данные (например, вычислял площадь объекта). После этого полученные данные использовались для обучения модели. Если результат оказывался неудовлетворительным, весь процесс отбора признаков повторялся. Это было характерно для классического машинного обучения.

Существует множество методов преобразования изображения в набор существенных графических признаков. Один из таких методов – гистограмма направленных градиентов (HOG) – проиллюстрирован на рисунке выше. Этот метод, появившийся в начале 2000-х годов, демонстрировал неплохие результаты в задачах распознавания образов, сокращая размерность признакового пространства исходного изображения примерно в десять раз.
Например, если изображение содержит десятки тысяч пикселей, то после применения HOG получается вектор из тысячи элементов. Этот сжатый вектор затем подавался на вход классификатору, который определял наличие или отсутствие объекта (например, кота) на изображении.
Однако следует отметить два важных момента: алгоритм HOG разработан человеком, который определил порядок и способ математических операций для получения сжатого вектора. Несмотря на то, что HOG показывал хорошие результаты в задачах распознавания образов, он не привел к революционным изменениям в области машинного зрения. Как уже упоминалось, HOG начал использоваться в 2000-х годах (согласно Википедии – в 2005 году). В то же время, на слайде, демонстрирующем развитие технологий, 2005 год не отмечен, а годы 2008 и 2009 характеризуются лишь скромными показателями роста.
Глубокое обучение
В 2010 году произошло знаменательное событие – появление глубокого обучения (Deep Learning).
Ранее, в классических моделях машинного обучения, отбор признаков из данных осуществлялся человеком. Чем опытнее был специалист, тем точнее получались модели. Схема выглядела следующим образом: данные – человек – модель. Человек анализировал данные и определял, какие характеристики важны для модели, а какие нет. Исключив человека из этой цепочки, точность моделей неизбежно снижалась.

Глубокое обучение решило эту проблему путем увеличения размера и сложности моделей. Вместо того чтобы полагаться на человеческий отбор признаков, огромные модели Deep Learning обучаются непосредственно на сырых данных, самостоятельно определяя, какие характеристики наиболее значимы.
Такой прорыв стал возможен благодаря двум ключевым факторам:
- Рост объемов данных: к 2010 году человечество накопило и сохранило огромные массивы данных, необходимые для обучения моделей Deep Learning.
- Увеличение вычислительной мощности: доступность более мощных вычислительных ресурсов позволила эффективно обучать сложные модели Deep Learning.
В результате, Deep Learning не только демонстрирует более высокую точность, чем традиционные методы машинного обучения, но и оказывается более экономичным. Стоимость обучения модели Deep Learning часто ниже, чем оплата труда высококвалифицированного специалиста по отбору признаков.
Революция Deep Learning коснулась многих областей машинного обучения, в том числе обработки текста, распознавания речи и компьютерного зрения. В последнем, например, получили широкое распространение сверточные нейронные сети.
Свёрточные нейронные сети
Термин «свёртка» получил широкую известность благодаря сверточным нейронным сетям. Несмотря на то, что он изначально происходит из области функционального анализа (математики), его применение в контексте нейронных сетей сделало его понятным и доступным для более широкой аудитории.
Формула свёртки может показаться сложной на первый взгляд, но её принцип можно проиллюстрировать на простом примере.

Представьте госпиталь с планом госпитализации пациентов: один пациент в понедельник, два во вторник, три в среду и так далее до пятницы. Существует также план лечения, определяющий количество таблеток, которые пациент должен принимать ежедневно: три таблетки в день госпитализации, две на следующий день, одна ещё через день, после чего пациент выписывается.
Наша задача – рассчитать общее количество необходимых таблеток для лечения всех пациентов согласно плану госпитализации.
Простой подсчёт показывает, что всего нужно 90 таблеток (15 пациентов * 6 таблеток на пациента).
Теперь необходимо распределить эти таблетки по дням, чтобы определить, сколько их потребуется ежедневно.
В понедельник понадобится три таблетки для одного пациента. Во вторник – восемь таблеток: шесть для двух новых пациентов и две для пациента, госпитализированного в понедельник. В среду потребуется четырнадцать таблеток: девять для трёх новых пациентов, четыре для пациентов, поступивших во вторник, и одна для пациента, госпитализированного в понедельник.
Таким образом, с помощью метода свёртки мы можем эффективно обработать данные о пациентах и плане лечения, чтобы определить количество необходимых таблеток в каждый конкретный день.
Несмотря на то, что расчет количества необходимых лекарственных препаратов для пациентов является выполнимой задачей, она сопряжена с определенными неудобствами. Требуется постоянно отслеживать информацию о поступлении и выписке пациентов, а также о количестве оставшихся таблеток для каждого из них.
В то же время, данная задача не представляет собой сложную математическую проблему и может быть решена посредством простых арифметических операций. Целью является разработка универсального алгоритма, применимого к любой ситуации госпитализации и плану лечения. Желательно, чтобы данный алгоритм был легко реализуемым и позволял создать простую универсальную программу.
Предлагаемый метод решения основан на инвертировании плана прибытия пациентов и последующем совмещении его с планом приема таблеток. Инвертированный план госпитализации записывается в обратном порядке, а план приема таблеток располагается так, чтобы крайняя правая цифра инвертированного плана госпитализации находилась над крайней левой цифрой плана лечения.
В результате на первом шаге под единицей оказывается тройка из плана госпитализации. Умножив тройку на единицу, получаем три – количество таблеток, необходимое первому пациенту в первый день.
Сдвигая план госпитализации на один шаг вправо, получаем тройку под двойкой, а двойку под единицей. Последовательно умножая цифры плана приема таблеток на цифры инвертированного плана госпитализации, получаем количество таблеток, необходимых во второй день (шесть плюс два равно восемь).
Аналогичным образом, двигая “окошко” по плану госпитализации и планe приема таблеток, можно легко рассчитать общее количество таблеток, необходимое для лечения всех пациентов.
Данный метод позволяет решить задачу оптимизации расчета потребности в лекарственных препаратах с помощью простой и алгоритмизируемой операции.

Легко проверить, что цифры, которые получились — 3, 8, 14, 20, 26, 14, 5 — в сумме дают 90 таблеток. Это и есть свёртка, так она работает. Математически это как будто бы такое хитрое умножение двух функций, результатом которого становится третья функция, оценивающая корреляцию первых двух.
Свёртка в компьютерном зрении
В области компьютерного зрения сверточные операции реализуются аналогичным образом, но с большей сложностью. Исходное изображение представляется в виде двумерной матрицы. В отличие от одномерной свертки, используемой в примере с больницей, где одномерные массивы смещались друг относительно друга, в компьютерном зрении количество измерений увеличивается на единицу из-за двумерной природы изображения. Цветные изображения добавляют еще и каналы.
Аналогично смещению одномерных массивов, мы перемещаем по матрице изображение “окно” меньшего размера. На каждом шаге это окно выделяет фрагмент изображения. Значения пикселей в выделенном фрагменте поэлементно умножаются на соответствующие числа в окне, а затем полученные произведения суммируются. Результатом является одиночное число, которое записывается в новую матрицу.

В процессе свертки происходит конденсация информации из участка изображения в единое число. Это число отражает значения пикселей в “скользящем окне” (фильтре) и записывается в новую матрицу.
Свёрточный фильтр, также называемый ядром, содержит параметры модели (θ), которые подбираются для достижения наилучшей производительности модели. Оптимизация осуществляется посредством вычисления производной функции потерь по параметрам θ и изменения этих параметров в направлении уменьшения функции потерь.
Современные модели компьютерного зрения преимущественно строятся на основе сверточных нейронных сетей, которые состоят из множества сверточных слоев. Каждый слой характеризуется:
- размерностью входных данных (размером изображения и количеством каналов);
- размером фильтра;
- количеством фильтров в слое;
- принципом “скольжения” фильтра по изображению (шаг, выход за границы изображения).
В результате обработки входной матрицы изображением сверточными фильтрами слоя генерируются новые матрицы, называемые каналами. Важно отметить, что каждый сверточный слой уменьшает размер изображения, но, как правило, увеличивает количество каналов.

В случае применения монохромного изображения размером 28×28 в качестве входных данных для сверточной нейронной сети, первый сверточный слой с N1 ядрами 5×5 преобразует входное изображение в N1 матриц размера 24×24.
Каждый результат свертки представляет собой матрицу меньшего размера по сравнению с исходным изображением, но общее количество матриц увеличивается. Визуальное представление сверточной сети в виде трехмерной структуры отражает тот факт, что каждый сверточный слой генерирует множество матриц.
Матрицы, полученные на первом сверточном слое, поступают на вход второго слоя, где они подвергаются дальнейшему сжатию до размера 12×12. Количество матриц на втором слое также равно N1.
В процессе прохождения через слои изображения обычно уменьшаются в размере, но могут увеличиваться (хотя это не обязательно) в количестве каналов. В завершении полученный результат преобразуется в плоский вектор. Этот вектор подается на вход классификатора, который чаще всего реализован в виде полносвязных слоев нейронной сети, зарекомендовавших себя в задачах классификации.
Обучение классификатора направлено на определение вероятности наличия кота на изображении и решение поставленной задачи.
Алгоритм вариативнее человека
В классическом машинном обучении человек вручную разрабатывал алгоритмы для представления изображения в компактной форме, сохраняя важную информацию для обработки. Сверточные нейронные сети, как часть Deep Learning, автоматизируют этот процесс.
Сверточные слои самостоятельно извлекают из изображения компактное представление информации и передают его модели (например, классификатору) для принятия решения. При обучении распознаванию котиков, модель сама определяет значимые признаки, что повышает эффективность по сравнению с ручным подходом.
Например, HOG (диаграмма ориентированных градиентов), хотя и эффективный метод, является универсальным и одинаково обрабатывает изображения с кошками и людьми. Сверточные нейронные сети, напротив, обучаются на конкретной задаче (например, распознавание котиков) и самостоятельно подбирают важные признаки, которые могут существенно отличаться от выбранных человеком.
Обучение той же архитектуры для распознавания людей может привести к выбору совершенно других признаков. Эта большая вариативность способствует более высокой точности моделей.
Важно отметить, что матрицы, полученные в результате сверточных слоев, называются feature maps (карты признаков) – это те самые фичи, которые выделяет сеть для улучшения распознавания.
Визуализация feature maps может быть интересна исследователям: снятие сигналов со слоя и преобразование их обратно в изображение позволяет увидеть, как сеть “видит” объект.

На представленном рисунке слева изображена курица, а справа – результат обработки этого изображения сверточной нейронной сетью, так называемая “feature map”. Данная “feature map” была получена из промежуточного слоя сети. При внимательном рассмотрении можно заметить множество фрагментов, напоминающих части тела курицы: головы, гребни, глаза и клювы разного размера и положения.
Некоторые исследователи считают, что подобное изображение является скорее эстетическим приемом, чем точным научным результатом. Однако основная идея заключается в том, что нейронная сеть, проанализировав изображение курицы, создала новое изображение, отражающее ее ключевые признаки. Важно отметить, что полученная “feature map” будет достаточно схожей для различных изображений куриц, обрабатываемых данной сетью.
Нейронная сеть модифицирует и искажает исходное изображение, выделяя специфические детали, такие как клювы и глаза.
Важно понимать, что данное изображение не следует рассматривать как строго научный результат. Тем не менее, оно может служить наглядной иллюстрацией процессов, лежащих в основе компьютерного зрения.
Заключение
Компьютерное зрение (CV) представляет собой важную и многообещающую технологию с широким спектром применений. В наши дни CV используется во многих сферах жизни, от биометрической аутентификации, позволяющей оплачивать покупки улыбкой или разблокировать телефон лицом, до повышения безопасности дорожного движения за счет систем видеонаблюдения.
В медицине CV применяется для анализа медицинских изображений, таких как КТ-снимки, что помогает врачам в постановке диагнозов. На промышленных предприятиях CV используется для контроля качества продукции. Примеры применения CV можно продолжать бесконечно, поскольку везде, где присутствуют изображения, существует потенциал для использования этой технологии.
Несмотря на свою сложность, CV активно развивается и представляет собой перспективное направление для изучения. Во-первых, это чрезвычайно увлекательная область, а во-вторых, ее освоение может быть весьма полезным и прибыльным. В IT-индустрии, как известно, наблюдается дефицит квалифицированных специалистов, и CV не является исключением.
Важно помнить, что даже сложная технология может быть изучена по частям. Каждый отдельный элемент CV доступен для понимания, поэтому желаем вам удачи в этом увлекательном путешествии!



