От «Я не знаю, что такое документация» до «Эй! Я создал API». За два месяца работы здесь я многому научился. Я прекрасно провел время, изучая новую область компьютерных наук вместе с моими коллегами-стажерами. Наша работа в основном связана с машинным обучением. Итак, первую неделю мы провели, знакомясь с ним — просмотром печально известных видеокурсов Эндрю Нг по машинному обучению, реализацией нескольких базовых алгоритмов с помощью Sklearn и чтением практической книги по машинному обучению. Позже нам поручили работать над отдельными проектами. Я завершил два проекта во время моего пребывания здесь. Я кратко опишу их в следующих разделах.

Проект-1: Создание RESTful API для модели машинного обучения с использованием Flask

Поясню название проекта. Я разделяю имя на четыре части: модель ML, API, RESTful, Flask. Проще говоря, модель машинного обучения — это код, который обучает данные прогнозировать результаты на основе аналогичных данных (см. это). В моем случае он создает ограничивающую рамку вокруг обнаруженного объекта, как показано на изображении ниже (эй! Моими объектами являются человеческая одежда, такая как рубашки, серьги, обувь и т. д.).

API – это код, который позволяет двум программам обмениваться информацией. Здесь, в моем случае, API является посредником между моделью ML и внешним интерфейсом (пользовательским интерфейсом). REST – это философия или структура создания API. Flask — это мини-веб-фреймворк Python для создания API.

Поскольку API выступает посредником между моделью машинного обучения и внешним интерфейсом, мне также пришлось создать некоторый пользовательский интерфейс. Поэтому я создал базовую веб-страницу, которая использует изображения в качестве входных данных, а также отображает выходные данные. Эта HTML-страница стала более привлекательной благодаря Nandan, использующему Angular.js. И переходя к Flask, поскольку это относительно новый фреймворк, многие ресурсы, доступные в Интернете, либо неполные, либо слишком жаргонные. Однако после долгих поисков я нашел эти два источника очень полезными: The Flask Mega-Tutorial и Udemy Course. Я рекомендую курс Udemy, если вы совершенно не знакомы с Flask.

Теперь я объясню, как мой API работает функционально (не с кодом). При запуске (запуске кода Flask) API с использованием терминала в качестве вывода будет предоставлена ​​ссылка на локальный хост (например, http://127.0.0.1:5000). Мы просматриваем ссылку, которая отображает страницу, подобную этой.

Вот как это выглядит, когда мы вводим файл, нажимая кнопку Выбрать файл.

Давайте введем это изображение:

Интуитивно понятно, что распознавать объекты в pdf-файле абсурдно. Таким образом, API проверяет, является ли файл допустимым вводом или нет. Он делает это, проверяя расширение имени изображения (он принимает файл, только если его расширения jpg, jpeg, png).

Когда пользователь вводит изображение, оно будет передано в модель ML через API. Предварительно обученная модель машинного обучения, сохраненная в виде файла рассола, возвращает координаты ограничивающей рамки (x, y, w, h). Используя возвращенные им координаты, мы строим прямоугольный блок с помощью OpenCV (OpenCV — это библиотека Python для управления и обработки изображений). И это обработанное изображение будет снова передано обратно в пользовательский интерфейс через API. И конечное выходное изображение будет таким с идентифицированными объектами.

Вот и все с моим первым проектом. Давайте погрузимся в следующий:

Проект-2: Извлечение признаков изображения и сопоставление признаков

Взгляните на постановку проблемы/задачу, поставленную передо мной: Учитывая обширную базу данных изображений женских платьев, исследуйте наилучшие методы извлечения признаков, извлекайте для них признаки и выполняйте сопоставление признаков. Я попытаюсь объяснить этот проект немного теоретически вместе с несколькими изображениями из моего проекта.

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

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

Извлечение признаков – это процесс, при котором определенные интересующие элементы в изображении обнаруживаются и представляются для дальнейшей обработки.
Существует два основных способа извлечения признаков: использование методов извлечения признаков, разработанных вручную, или метода дескриптора (например, SIFT, BRIEF, LBP),
для изучения функций, которые являются различительными в данном контексте (например, разреженное кодирование, автокодировщики, ограниченные машины Больцмана, PCA, ICA, K-средние). Здесь мы следуем первому методу, используя библиотеку OpenCV.

В OpenCV доступно множество алгоритмов извлечения. Поэтому мне пришлось провести небольшое исследование, чтобы найти подходящие для моего случая использования. Наконец, я решил использовать функции SURF, BRIEF, Histogram и LBP. Чтобы не усложнять задачу, два основных алгоритма SIFT(преобразование масштабно-инвариантных объектов), SURF(ускоренные надежные объекты) обнаруживают и описать особенности изображения. гистограмма – это график или график, представляющий распределение интенсивности пикселей в изображении. LBP (локальные двоичные шаблоны) — это дескрипторы текстуры. Сопоставление объектов — это сопоставление/сравнение объектов для поиска идентичных векторов объектов (таким образом, похожих изображений).

Хватит теории. Давайте посмотрим на то же самое в функциональной форме…

На изображении выше шаги обозначены последовательно.

Шаг 1.Изображение (в цветовом формате RGB) преобразуется в изображение в градациях серого (поскольку некоторые алгоритмы, такие как BRIEF и гистограмма, принимают только изображения в оттенках серого ).

Шаг 2. Затем изображение обрезается вдоль области ограничивающей рамки (которая задается вышеприведенным алгоритмом машинного обучения). Зачем мы это делаем? Просто, потому что вам нужны характеристики только платьев, а не моделей, которые в данном случае похожи на шум.

Шаг 3.Затем мы извлекаем функцию, используя описанные выше алгоритмы (SIFT, SURF.. ). Функции хранятся в файле CSV в виде векторов функций. В 4 показаны имена изображений вместе с их характеристиками (2048 из них или 2048 столбцов). Этот шаг извлечения выполняется отдельно для SURF, BRIEF, гистограммы и LBP, поэтому мы получаем четыре разных файла CSV. В моем случае функции представляют собой целые числа и числа с плавающей запятой. Они также могут быть двоичными строками.

Шаг 4.Для сопоставления признаков мы вычисляем манхэттенское расстояние между всеми векторами признаков друг от друга. И мы сохраняем пять лучших совпадений (5 более близких векторов признаков с относительно меньшим манхэттенским расстоянием) для каждого имени изображения в файле CSV.

Мне пришлось представить оба этих проекта моему наставнику, и эти презентации повысили мои коммуникативные навыки. Наставники очень полезны (когда вы запутались в своей работе, общение с вашим (опытным) наставником эквивалентно 2 часам бестолкового гугления 😊). Было весело работать с моими коллегами-стажерами (обсуждения чисел Харди-Рамануджана, несколько вопросов Codechef, споры о культуре Argument в Индии и некоторые полуфилософские дискуссии о жизни 😅).