Компьютерное зрение — это именно те интересные задачи, о которых мечтают украинские сеньоры, разбирая очередной гуано-код веб-проекта за сыр и автомобиль. Тема, в которую включено множество адски сложного матана, шаманства и просто компьютерной магии. Причем всё это часто по сложности сравнивается с квантовой теорией, хотя практической пользы от последней гораздо меньше.
Так вот, компьютерное зрение — это определенный набор алгоритмов, в большинстве случаев эвристических, каждый из которых может взять один образ, сравнить с другим и выдать степень их соответствия или принять некое решение (опять же, на основе соответствия распознаваемых образов и соответствия им определенного решения или действия). Причем эффекты применения разные: от отнесения пиксела изображения к фону или образу (бинаризация) до определения траектории движения в 3D-пространстве. В некоторых случаях и там, и там в основе может использоваться одна и та же алгоритмическая база.
Теория
Допустим, перед вами ставится задача обыкновенного поиска изображений в базе на основе эталонного изображения. Вы берете один из методов — ну, скажем, попиксельного сравнения после выравнивания контраста и эквализации. Скорость работы — просто супер, полностью линейная O(N), где N — количество пикселов, а O = двум операциям — эквализации и обычному сравнению двух изображений. Вот только при этом любой поворот, изменение масштаба, да и банальный сдвиг изображения относительно эталонного из базы — уже беда. Понимаешь, что скорость — это, конечно хорошо, вот только качество ниже плинтуса. В результате берешь какой-нибудь уголковый детектор Хариса, где происходит поиск и выделение опорных точек с последующим их сравнением, реализуешь его и получаешь, что качество, конечно, супер, причем практически инвариантно к масштабу, повороту и смещению. Вот только скорость упала в 1500 раз. Оптимизируешь детектор в нечто типа SIFT’а, где незначительные детали отбрасываются, и сопоставление точек производится в некотором радиусе, а верхний предел количества опорных точек задан константой. Вместо картинок в базе уже хранишь их индекс (вычисленные дескрипторы). Скорость уже всего в 15 раз ниже по сравнению с первым вариантом, качество распознавания чуть упало по сравнению с оригиналом. Тимлида все устраивает, и решение идет в продакшен.
Ты рад, ты крайне рад, потому что результаты магии оказались успешны. А потом оказывается, что по новым требованиям нужно распознавать зашумленные и размытые картинки. Ты выдираешь из головы последние волосы и идешь читать материалы про scale-space.
Проблемы
Одна из основных проблем в CV состоит в том, что компьютеры медленные, они жутко медленные, и имеют крайне мало памяти, ведь обычная матрица типа float в A4 при разрешении 600dpi (35 мегапикселов) занимает в памяти 140 мегабайт, а иногда для работы требуется
По поводу скорости — проблема в том, что любой человек очень умный, даже если кажется, что тупой. Зрительная кора — это 20% от объема мозга. В среднем мозге 8 миллиардов нейронов, при этом один нейрон имеет около 20K синапсов, и бета-ритм (в состоянии бодрствования) составляет от 14 до 30 Гц. В результате, чтобы смоделировать человекоподобную систему зрения на основе матрицы связей с типом float, нам понадобится вычислительный модуль с полпетабайта ОЗУ под задачу и с пиковой производительностью почти 20 экзафлопс. Нет, такие компьютеры уже даже есть, вот только их пока пара на весь мир.
Практика
Продемонстрировать вышесказанное можно на примере Apple Siri, искин-помощницы для смартфонов iPhone, ядро которой использует суперкомпьютер Watson, обладающий объемом памяти в 15 Тб ОЗУ и суммарной вычислительной мощностью в 24 Тфлопса. Огромные вычислительные возможности, работа 8 ведущих университетов на протяжении 40 лет — и в результате интеллект на уровне
Поиск решения в компьютерном зрении — поиск алгоритмов, которые позволят экспериментально найти набор особенностей, которые более-менее соответствуют качеству решения данной задачи (пусть даже и хуже возможного решения человеком), но при этом вполне способны работать online для решения задачи. Это крайне шаманский процесс. Причин несколько. Одна из них — эвристика большинства алгоритмов. К примеру, теорема Колмогорова-Арнольда-Хехт-Нильсонагласит, что двумерная нейросеть с нелинейной функцией активации нейрона способна смоделировать любой детерминированный процесс. Нет, это, конечно, классно, но решение — как из анекдота: «пришёл математик на пожар, вычислил, что решение есть, и пошел дальше». Всё, вплоть до уровней нейросети, количества связей и активационных функций нейронов, приходится подбирать после камлания типа метода отжигаили генетических алгоритмов. C новомодными SVM не намного лучше: да, математический базис есть, SVM — это нахождение максимальной разделяющей гиперплоскости (которая может быть и криволинейной поверхностью). Вот только для решения приходится подбирать нечто рабочее из десятка ядер. Несколько методов нахождения этих плоскостей, похоже, основаны на чистой магии.
Еще сложнее найти описатели сцены, которые четко и однозначно позволяют описать данный класс, причем, в идеальном случае, не пересекаются для разных классов. При нахождении достоверных описателей скорость может возрасти на порядки за счет сокращения домена измерений при сохранении или даже улучшении качества. К примеру, стоит задача определить через веб-камеру, достаточно ли на улице освещения, чтобы не включать фонарь. Все очень просто: считаете значение яркости, и по пределу включаете фонарь. Всё, решение есть, причем простое. Внезапно оказывается, что у веб-камеры есть неотключаемый ночной режим, который выставляет практически одинаковую яркость картинки и для дня, и для ночи. Тогда рассчитываем изменение контраста (у ночного режима оно должно быть ниже). И тут внезапно оказывается, что какой-то censored разместил камеру прямо под фонарем, и причина глюков не в ночном режиме.
Заключение
Работа в области ИИ, или компьютерного зрения, — очень шаманский процесс. Ты получаешь задачу, просматриваешь известные и уже ранее использованные методы решения, просматриваешь статьи, где описаны другие способы решения. После чего строишь гипотезу решения. В данном случае строится гипотеза по нахождению особенностей, и неважно, будут это опорные точки или карта глубины для перевода объекта в 3D. Далее подбирается алгоритм классификации. Алгоритм классификации несколько менее влияет на качество, чем неправильный подбор особенностей, но все-таки он важен. По сути, подбор алгоритма — это как выбор фреймворка: разница есть, но в проценты. Неправильный выбор описателей намного болезненнее. Далее тестируешь свою гипотезу на входном тестовом наборе (да, здесь разработка без предварительной разработки тестовых модулей попросту невозможна, без неё в конечном результате вообще нет смысла) и иногда получаешь высокое качество классификации и низкую скорость, иногда наоборот. А иногда — оба случая вместе, низкое качество и фиговую скорость :). И уже на основе полученных данных ты принимаешь решение: корректировать гипотезу до полного схождения с тестовыми данными (это больше похоже на баг-фиксинг, когда ты совершенно не представляешь, почему выскакивает именно этот баг) или отбросить её полностью и начать с другой. И так — до победного конца, пока качество и приемлемая скорость не сойдутся. В результате, в редких случаях, имеем превращение шестёрок в восьмерки, так как это хоть и не оптимально, но приемлемо.
Подытожив, давайте определимся, что же такое работа разработчиком в компьютерном зрении. Во-первых, это интересно, в противном случае я бы в эту область не пошёл: работать в Web в разы проще. Это одновременно совмещение работы бизнес-аналитика, разработчика, тестировщика и баг-фиксера, причем над одной и той же задачей. Ну, и это еще, похоже, единственная область, где разработка в духе MIT