Когда изображения становятся рассказчиками

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

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

Святой Грааль

Гигантский онлайн-рынок, такой как Индиамарт, имеет тысячи макрокатегорий для перечисления различных продуктов. Продукт должен быть отнесен к наиболее подходящей микрокатегории на платформе. [Для получения дополнительной информации об определении макро-категории и микрокатегории см. Здесь похвальный раздел сообщения: Моя проблема, мой путь]

Цель этой публикации - развить интуицию и понимание того, как нейронные сети можно обучить определять микрокатегорию продукта по его изображениям.

Например, в макро-категории «Кожаные защитные перчатки» могут быть различные микрокатегории, такие как Промышленные кожаные перчатки, Кожаные сварочные перчатки, Хромированные кожаные перчатки и т. Д. . Мы намерены классифицировать нашу продукцию таким образом, чтобы всегда классифицировалось изображение Промышленные Кожаные Защитные перчатки . в микрокатегорию Промышленные Кожаные Защитные перчатки . Аналогичным образом, изображение Work Boot всегда предсказывает микрокатегорию Safety Work Boot, где его макро-категория - «Safety Boots». .

Давайте теперь посмотрим на концепции, используемые в классификации изображений. Если вы хотите сразу перейти к реализации, пропустите раздел «Что скрывается? - Основы технологии».

Что под капотом? -Основы технологий

Мы собираемся использовать сверточные нейронные сети (CNN) для классификации изображений продуктов с помощью контролируемого обучения и запускать его на PyTorch (, который является фреймворком искусственного интеллекта, разработанным Facebook). Для этого мы используем модель ResNet Facebook, которая предварительно обучена на более чем миллионе изображений из базы данных ImageNet.

Что такое предварительно обученная модель?

Предварительно обученная модель была предварительно обучена на наборе данных и содержит веса, которые представляют особенности того набора данных, на котором она была обучена. Изученные функции часто можно перенести на другие данные.

Что такое глубокое обучение?

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

В математике свертка - это математическая операция над двумя функциями для получения третьей функции, которая выражает, как форма одной изменяется другой.

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

Остаточное обучение пытается решить проблемы как сложности обучения более глубоких нейронных сетей, так и их насыщающей точности с глубиной.

Что такое остаточное обучение?

Как правило, CNN состоит из нескольких слоев, которые обучены выполнению поставленной задачи. Сеть изучает несколько функций низкого / среднего / высокого уровня в конце своих слоев. При остаточном обучении вместо того, чтобы пытаться изучить некоторые особенности, мы пытаемся изучить некоторые остаточные.

Остаточное значение можно просто понять как вычитание изученного объекта за вычетом входных данных этого слоя.

ResNet делает это, напрямую соединяя вход n-го слоя с некоторым (n + x) -м слоем. Он использует ReLU (ReLU означает выпрямленный линейный блок и является типом функции активации).

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

ResNet34 - это остаточная сеть на 34 уровня. Также доступны другие варианты, такие как ResNet50, ResNet101 и ResNet152.

Системные Требования

Загрузите или клонируйте модель ResNet по ссылке Facebook Github.

Установите зависимости Torch ResNet на Ubuntu 14.04+:

См. Инструкции по установке для получения пошагового руководства.

Давайте начнем!

Предварительные требования. Для дальнейшего продвижения предполагается базовое понимание команд Python и Linux.

КАК МЫ ИСПОЛЬЗУЕМ RESNET ДЛЯ НАБОРА ТАМОЖЕННЫХ ДАННЫХ?

Сбор данных-

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

Мы загрузили изображения с URL-адресов в структуру папок, организованную как:

Имена ярлыков хранятся как имена отдельных папок, и каждая из них имеет связанные изображения. Вся эта структура заключена в другую папку, которую следует назвать «поезд». Точно так же другая папка с именем 'val', для которой задана проверка (т. Е. Папки с названиями этикеток с изображениями продуктов), должна храниться в том же месте, что и 'train'. [Эта папка стандарт организации предоставляется Facebook и необходим для работы его модели]

В нашем сценарии структура должна выглядеть примерно так:

train/<Micro_category_ID1>/<Product_ID1.jpg>
train/<Micro_category_ID2>/<Product_ID1.jpg>
val/<Micro_category_ID1>/<Product_ID1.jpg>
val/<Micro_category_ID2>/<Product_ID1.jpg>

Для этого мы использовали следующую команду Linux, которая должна запускаться в Терминале по пути «поезд»:

while read -r mcat_id product_id url; do if [ ! -d "${mcat_id}" ]; then mkdir -p ${mcat_id}; fi; cd $mcat_id; wget -O $product_id $url; cd ..; done < tsvfilename

Эта команда считывает идентификатор микрокатегории, идентификатор продукта и URL-адрес изображения из файла tsv и итеративно загружает изображение по соответствующему пути к папке микрокатегории, переименовывая его в идентификатор продукта (для облегчения последующей идентификации).

Вуаля! У нас есть данные для обучения. Чего ждать? Нет, его все еще нет!

Далее следует одна из важнейших процедур, которые необходимо выполнить для получения желаемых результатов.

Очистка данных-

Мы хотим подготовить однородный набор входных данных, чтобы избежать вероятности того, что модель будет смещена в сторону изображений с определенными идентификаторами микрокатегорий во время обучения и, следовательно, всегда будет предсказывать эти микрокатегории.

Мы разработали сценарий оболочки, который преобразует все изображения в .jpeg (как по имени, так и по формату, за исключением .png, .gif и т. Д.), Удаляет загруженные ошибочные файлы, удаляет повторяющиеся файлы и уменьшает размеры всех изображений до 224 X 224 пикселей (если ширина или высота больше 224 пикселей).

Мы выбрали размер изображения 224 X 224 пикселей, потому что ошибки top1 и top5 для этого параметра наблюдаются меньше. Подробности смотрите в разделе this.

В рейтинге top1 вы проверяете, совпадает ли прогнозируемый высший класс (имеющий наибольшую вероятность) с целевой меткой.

В случае результата top5 вы проверяете, является ли целевая метка одним из ваших 5 лучших прогнозов (5 с наивысшими вероятностями).

Этикетка Загрузка-

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

Чтобы снабдить модель данными, охватывающими различные виды изображений продуктов, получаемых от пользователей каждый день, мы выполнили аугментацию изображений на существующем наборе данных.

Следующий скрипт Python использовался для зеркального отражения каждого изображения, вращая его по часовой стрелке, против часовой стрелки, также было создано зернистое изображение для каждого изображения.

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

Например, в макро-категории «Надувная мебель» в микрокатегории «Надувной диван» больше товаров с изображениями, чем в микро-категории «Надувной диван».

Мы использовали скрипт Python, который умножает изображения в папках с идентификаторами категории Micro в папке train. В настоящее время мы приняли коэффициент умножения как 98 процентиль (т. Е. Учитывается одно изображение из всех изображений отдельной папки, где покрывается 98% изображений от общего числа).

Хорошо, что наконец-то пошли на тренировку!

Обучение модели-

Используйте файл main.lua в папке, загруженной с Github, т.е. fb.resnet.torch, для обучения слоев модели с нашим собственным набором данных.

th ~/fb.resnet.torch/main.lua -nClasses 122 -nEpochs 100 -data ~/imageclassification/train/ -save ~/Desktop/imageclassification_c122e100b30t4g1 -batchSize 30 -nThreads 4 -nGPU 1
  • -nClasses - это количество ярлыков (т. е. идентификаторов микрокатегорий).
  • -data - это путь к папке поезда.
  • -save - это путь к папке, в которой будут сохранены все модели (т.е. файлы .t7) (модель создается в конце каждой эпохи в этой новой указанной папке, т.е. ~ / Desktop / imageclassification_c122e100b10t4g1, где каждая модель обучается над данными предыдущей модели.)
  • -batchSize - количество изображений, снятых для тренировки в каждую эпоху.
  • - nEpochs - это количество итераций, которые мы хотим, чтобы наша модель выполнялась (мы также получаем ошибки top1 и top5 в конце каждой эпохи, которые используются для анализа лучшей модели)
  • -nThreads - количество потоков, используемых графическим процессором.
  • - nGPU - количество графических процессоров, которые мы собираемся использовать для обучения.

Другой параметр - -depth (здесь не используется), поэтому по умолчанию у нас есть модель ResNet-34. Будь 50, у нас была бы модель ResNet-50.

Во время обучения можно использовать различные другие параметры в зависимости от вашего удобства и доступности ресурсов. Их можно изучить:

th main.lua --help

Ладно! Запустим команду!

СДЕЛАНО!

В зависимости от размера набора обучающих данных и скорости системы вам следует набраться терпения и предоставить своему ученику достаточно времени, чтобы хорошо учиться :)

main.lua автоматически создает две дополнительные модели параллельно, то есть model_best.t7 и latest.t7 в папке -save.

model_best.t7 - это копия модели, созданной в эпоху с наименьшим количеством ошибок top1 и top5.

latest.t7 - это полностью обученная модель, т.е. модель, созданная последней эпохой.

Эти две модели не всегда одинаковы. В нашем случае лучшая модель была создана в эпоху 99, но последней была модель из эпохи 100. Итак, мы использовали model_best.t7 для тестирования.

Тестирование модели-

classify.lua (в папке fb.resnet.torch / pretrained /) используется для получения 5 лучших прогнозов из model_best.t7 для всех наших тестовых изображений.

Здесь важно отметить, что classify.lua выводит метки прогнозов из файла imagenet.lua (в той же папке, т. Е. «Pretrained»).

Итак, мы заменяем старые метки в imagenet.lua (названия птиц, животных и т. Д. Из базы данных ImageNet) на наши собственные значения меток, то есть идентификаторы микрокатегорий.

А теперь давайте протестируем нашу лучшую модель!

Мы выбрали несколько ярлыков из «train» и скопировали их в «val», чтобы проверить точность нашей обученной модели на тех же данных, на которых она была обучена.

Приведенная ниже команда тестирования выводит 5 лучших прогнозируемых результатов для каждого изображения в «val» вместе с их прогнозируемыми вероятностями:

for f in ~/imageclassification/val/* ;do ( [ -d $f ] && cd "$f" && echo Entering into $f && th ~/fb.resnet.torch/pretrained/classify_new.lua ~/Desktop/imageclassification_c122e100b30t4g1/model_best.t7 $f/*  >> ~/Desktop/imageclassification_c122e100b30t4g1.txt); done

Последствия

Созданный текстовый файл был проанализирован путем преобразования его в файл Excel.

В файле Excel указанные выше прогнозы разделены в виде столбцов (с использованием сценария R) для идентификатора исходной микрокатегории и идентификатора продукта (из локального пути к изображениям), а также тега Прогнозируемая микрокатегория 1, прогнозируемая вероятность микрокатегории 1.

Проверив соответствие прогнозируемой и исходной микрокатегории, мы обнаружили, что прогнозы верны в 99,28% случаев. Это те случаи, на которых обучалась модель.

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

В этом случае выше порога 50% достоверности (вероятности) модели, который охватывает 80% данных, мы наблюдаем точность как 95,38%.

Точность модели составляет 1,00, а чувствительность / отзывчивость - 0,95. Матрица неточностей для этого результата представлена ​​как:

Что нас ждет впереди…

  • Мы также работаем над анализом точности прогнозов на уровне категории макросов.
  • Мы намерены использовать извлечение признаков, чтобы найти похожие изображения среди разных микрокатегорий. Полезный сценарий для этой цели, то есть exract-features.lua, находится в папке fb.resnet.torch / prehibited.
  • Мы хотим использовать классификацию изображений для выявления запрещенного контента на платформе.

Вскоре будут опубликованы следующие публикации из этой серии, посвященные достижению вышеуказанных целей.

Я надеюсь, что эта статья помогла вам расширить свои знания об использовании Resnet для индивидуальных бизнес-кейсов. Если у вас есть какие-либо вопросы или комментарии, я хотел бы услышать от вас. Вы можете связаться со мной по адресу [email protected]

Благодарим Викрама Варшни, Аюш Гупту, Ашутоша Сингха, Мукеша Кумара за расширенную поддержку.