Аннотация

В этом блоге мы представляем нашу работу в DeepLab над интегрированным мобильным приложением электронной коммерции для классификации объектов с глубоким обучением. Пользователь может сделать снимок с контентом электронной коммерции с помощью мобильного телефона, и приложение предложит аналогичные товары с торговых сайтов. Реализация основана на сверточной нейронной сети, обученной на изображениях электронной коммерции. Модель реализована с помощью Tensorflow и интегрирована в мобильный телефон iPhone, с которого мы можем распознавать изображения электронной коммерции через живое видео. В следующих разделах мы представляем процесс обучения с соответствующими данными, практическими деталями для интеграции CNN в мобильный телефон и результаты полного приложения, которое может предложить впечатляющие впечатления от покупок.

Введение

Электронная коммерция - это деятельность по покупке или продаже товаров в Интернете. Целью этого блога является создание полного мобильного приложения для электронной коммерции с использованием глубокого обучения. В частности, мы используем конвейер обучения для приобретения модели глубокого обучения для классификации продуктов электронной коммерции, а затем интегрируем эту модель в мобильное приложение. Tensorflow предоставляет платформу для создания конвейера для обучения и интеграции наших CNN в качестве приложения tenorflow для Android или iOS, как показано на рисунке 1.

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

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

Пример использования

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

  • Обучение cnn для классификации изображений электронной коммерции (первый конвейер на рисунке 2).
  • Интеграция обученной модели в iPhone (второй конвейер на рис.2).
  • Разработка полного приложения для покупок на примере (третий конвейер на рис. 2).

Классификация изображений для электронной торговли

Начнем с первого упомянутого выше конвейера, а именно с классификации продуктов для сайтов электронной коммерции. Французский сайт электронной коммерции C-Discount уже использовал классификацию продуктов на основе их текста описания. В этой работе мы используем модель, которая классифицирует продукты в соответствии с их изображением содержанием (рис. 3). С этой целью ниже мы представляем:

  • Набор данных, используемый для обучения и оценки.
  • Выбранная модель.
  • Результаты экспериментов.

Набор данных

Набор данных состоит из обучающих изображений 12.371.293, тестовых изображений 3.095.082 с разрешением 180 x 180 и ярлыков 5270 (т. Е. Категории продукта), как предоставлено Kaggle Challenge. Несколько примеров данных электронной коммерции показаны на рис. 4.

Следует упомянуть две важные детали: а) предоставленные данные относятся к продуктам, каждый из которых состоит из 1–4 изображений. Пример включен в Рис.5, где продукт Desktop связан с тремя изображениями. Эта информация важна, потому что мы можем использовать сходство изображений для каждого продукта во время обучения.

б) Иерархия классов: многие проблемы классификации основаны на иерархии классов, что означает, что образец соответствует диапазону от более общих до более конкретных меток классов, как показано на рисунке 6. В нашем случае последние 5270 классов основаны на четырех уровнях иерархии, а классы на уровне - 49, 483, 5263 и, наконец, 5270.

Модель

Для обучения использовалась модель Реснет-101, но для окончательной интеграции в мобильный мы выбрали Реснет-50, не теряя при этом большой точности. На рис. 7 представлены модификации, интегрированные в Resnet для использования иерархии классов. В частности, мы добавили три вспомогательных уровня, чтобы иметь 3 дополнительных выхода в соответствии с уровнями иерархии.

Модификация, интегрированная в Resnet для использования сходства изображений, заключалась в усреднении карт характеристик для каждого продукта перед переходом на последний полностью связанный слой, как показано на рисунке 8. В случае образца продукта, состоящего из 3 изображений, мы усредняем карту характеристик [3, 6, 6, 2048], в результате чего получаем карту характеристик с размерами [6, 6, 2048] , который входит в последний полностью связанный слой.

Результаты

Обзор основных экспериментов представлен на рисунке 9. Методы изображение за изображением (от 1 до 4 столбцов) основаны на моделях, обученных с использованием изображений в качестве обучающих выборок. Последний метод продукт за продуктом (столбец 5) основан на модели, обученной с использованием продуктов (несколько изображений на продукт) в качестве обучающих выборок. Сообщенная точность - это точность набора тестов.

За счет использования сходства изображений для каждого продукта точность увеличилась на 3% (метод 4 по сравнению с методом 5). Используя иерархию классов, мы не добились повышения точности, поэтому мы предпочли немодифицированный, менее сложный Resnet-101. Процесс обучения требовал больших вычислительных затрат из-за большого набора данных, а также из-за 5270 классов.

Хотя мы можем использовать такие информационные подсказки, как иерархия классов и сходство изображений для каждого продукта во время обучения, интеграция таких модель в мобильное устройство нетривиально. Поэтому мы использовали третью модель, которая легче и быстрее для процессов мобильной интеграции. Мы обучили Реснет-50 с нуля на 2 графических процессорах с размером партии 128, график скорости обучения 0,1 от 1 до 4 эпох, 0,01 от 5 до 6 эпох, 0,001 от 7 до 8 эпох и 0,0001 от 9 до 10 эпох.

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

Детали интеграции и кодирования

В следующих разделах мы подробно объясняем процессы интеграции обученной CNN в устройство iOS. Шаги кодирования и обнаруженные проблемы анализируются перед импортом приложения tensorflow для распознавания видео в реальном времени продуктов электронной коммерции в мобильное устройство. Сначала мы представляем процедуры для получения графа модели, а затем этапы обработки этого графа для получения окончательной интеграционной модели.

Экспорт архитектуры модели

В этом разделе мы представляем проблемы, возникающие при создании модельного графа. Во-первых, что мы подразумеваем под модельным графом? Tensorflow предоставляет способ получения имен узлов графа тензорного потока и соответствующих операций следующим образом:

tf.train.write_graph(sess.graph_def, directory_to_save_model, model_name, as_text=False)

Правильный экспорт архитектуры модели важен, потому что следующие шаги основаны на этом файле. Это также немного сложно, и на этом этапе нам нужно быть внимательными. Прежде всего, мы не рекомендуем экспортировать модель, используя тот же сценарий, что и для обучения! Когда мы обучаем модель тензорного потока, используемые скрипты слишком сложны, и у нас могут быть узлы в графе тензорного потока, которые не используются для вывода. Мы предлагаем создать новый простой скрипт с заполнителем в качестве входных данных, передать сеть и получить прогноз. Впоследствии tf.train.write.graph можно использовать для получения простого графа модели без избыточных узлов.

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

mkdir -p ~/graphs
curl -o ~/graphs/inception5h.zip \
https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip && unzip ~/graphs/inception5h.zip -d ~/graphs/inception5h

Теперь мы экспортируем имена узлов и операции файла tensorflow_inception_graph.pb в текстовый файл, чтобы просмотреть их, как показано ниже:

gf = tf.GraphDef()
gf.ParseFromString(open(‘tensorflow_inception_graph.pb’, ‘rb’).read())
with open(txt_file, ‘w’) as f:
    for n in gf.node:
        f.write(n.name + ‘ => ‘ + n.op + ‘\n’)

Мы можем заметить, что после входного заполнителя нет узлов предварительной обработки, и заполнитель входит в сеть. Причина в том, что окончательные сценарии, написанные на objective-c, заботятся о предварительной обработке. Итак, цель состоит в том, чтобы экспортировать нашу архитектуру модели без какой-либо предварительной обработки.

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

Другой важный практический вопрос - это пакетная нормализация. Tensorflow предлагает обучение Resnet-50 с использованием нормализации объединенного пакета для повышения производительности. Но процесс интеграции модели в мобильное устройство не поддерживает такого рода пакетную нормализацию, поэтому модель была обучена с помощью fused = True, а затем архитектура была экспортирована с помощью fused = False (а не None). В наших экспериментах точность не изменилась.

Подводя итог, можно сказать, что хороший конвейер для получения правильного графа модели:

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

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

Окончательная модель

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

git clone https://github.com/tensorflow/tensorflow.git

Следующим шагом является процесс замораживания для импорта весов через файл контрольных точек в граф модели.

Замораживание

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

python tensorflow/python/tools/freeze_graph.py \
 — input_graph=path-to-model-graph \
 — output_graph=path-to-frozen-model \
 — input_checkpoint=path-to-checkpoint-file \
 — output_node_names=softmax_1 \
 — input_binary=true

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

Квантование (необязательно)

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

bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
 — in_graph=path-to-frozen-model \
 — out_graph=path-to-quantized-model \
 — inputs=input_1 \
 — outputs=softmax_1 \
 — transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,180,180,3") remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes strip_unused_nodes sort_by_execution_order'

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

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

Отображение памяти

Попытка интегрировать замороженную модель в мобильную версию привела к ошибкам памяти из-за размера графа. Resnet-50 - не очень глубокая CNN, но в нашем случае размер был большим из-за количества выходов (5270 классов). Решением этой проблемы стало преобразование карты памяти нашей модели с помощью этого скрипта:

bazel build tensorflow/contrib/util/convert_graphdef_memmapped_format
bazel-bin/tensorflow/contrib/util/convert_graphdef_memmapped_format \
 — in_graph=path-to-frozen-model \
 — out_graph=path-to-memmaped-model

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

Интеграция

Теперь модель с отображением памяти можно импортировать в мобильный телефон. Мы объясняем процесс интеграции MacBook с High Sierra OS. Если у вас нет xcode, вы можете установить его:

xcode-select — install

После установки xcode вам нужно скопировать эту папку из клонированного репозитория tenorflow:

tenorflow / examples / ios / camera

Впоследствии вы должны изменить его в соответствии с вашими потребностями. Все эти шаги были выполнены с использованием fabfile, но лучше их просмотреть. Теперь внутри папки camera вам нужно установить модуль следующим образом:

pod install

Последний шаг перед импортом модели в устройство ios - это изменения, которые необходимо внести в сценарий вывода, написанный на objective-C.

Модификации кода

Перед открытием рабочего пространства xcode код предварительной обработки был изменен внутри CameraExampleViewController.mm. В нашем случае для флага отображения памяти установлено значение true, потому что мы ранее использовали сценарий convert_graphdef_memmapped_format:

const bool model_uses_memory_mapping = true;

Мы также изменили значения предварительной обработки для получения того же предварительно обработанного изображения, что и в процессе обучения:

const int wanted_input_width = 180;
const int wanted_input_height = 180;
const int wanted_input_channels = 3;
const float input_r_mean = 123.68f;
const float input_g_mean = 116.78f;
const float input_b_mean = 103.94f;
const std::string input_layer_name = "input_1";
const std::string output_layer_name = "softmax_1";

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

for (int c = 0; c < wanted_input_channels; ++c) {
    out_pixel[c] = (in_pixel[c] — input_mean) / input_std;
}

В это:

out_pixel[2] = in_pixel[2] — input_r_mean;
out_pixel[1] = in_pixel[1] — input_g_mean;
out_pixel[0] = in_pixel[0] — input_b_mean;

Следует обратить внимание, так как изображение получено в формате BGR. Конечно, мы должны заменить текстовый файл ярлыков нашим файлом ярлыков. В следующем разделе описывается процедура импорта через xcode.

Импорт модели

Нам нужно подключить iPhone к macbook и открыть рабочее пространство xcode:

open tf_camera_example.xcworkspace

Заключительные шаги:

  • Импортируйте свою учетную запись Apple в xcode.
  • Выберите подключенный iPhone в качестве устройства.
  • В общих настройках обновите имя идентификатора пакета.
  • Выбери себя в команде.

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

С точки зрения разработки программного обеспечения у нас есть папка mobile в рабочем репозитории, а папка camera используется для модели. Репозиторий тензорного потока может быть клонирован как подмодуль в случае создания новой модели. Таким образом, мы можем сделать простые попытки интеграции сразу после обучения. Действительно полезно использовать fabfile для загрузки нужных пакетов, а также запускать интеграцию (кроме процесса xcode) с помощью 1 команды. В следующем разделе представлены результаты видео в реальном времени для распознавания изображений в электронной коммерции.

Результаты интеграции

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

Выводы

В этом руководстве мы представили конвейер для использования глубокого обучения в приложении электронной коммерции, которое помогает пользователям делать покупки с помощью снимков изображений или видео (рис. 11). После завершения части глубокого обучения общая конструкция торгового приложения является вопросом разработки iOS. С точки зрения кодирования, мы многое поняли из-за проблем, которые возникли при интеграции Resnet-50 в iPhone.

Tensorflow также представил tf-lite для интеграции CNN, но необходимо сделать много улучшений, поэтому сейчас мы используем предоставленный график, который обучен на вызове Imagenet.

Наиболее важные области улучшения:

  • Создание законченного ios-приложения, которое распознает объект и предлагает пользователю перейти на эквивалентный сайт электронной коммерции с продуктами из той же категории.
  • Дополнительные эксперименты по улучшению уже существующей одиночной модели изображение за изображением.
  • Экспериментируйте с использованием реальных наборов данных электронной коммерции для повышения производительности.
  • Модификации приложения для интеграции многовидовой модели продукт за продуктом с повышением точности.

В будущем мы планируем использовать новейший конвейер tf-lite, который предоставляет tenorflow. Модель Resnet, которую мы использовали, еще недостаточно хорошо поддерживается, поэтому мы можем интегрировать ее в будущем через tf-lite.

Наконец, интеграция модели в ios mobile оказалась действительно хорошей базой для создания полноценного приложения, обеспечивающего незабываемые впечатления от покупок! Сквозной трубопровод показан на рисунке 12.

Ссылки

  1. TF-mobile (ссылка)
  2. Kaggle Challenge (ссылка)
  3. Блог Пита Уордена ( ссылка)
  4. Мощные приложения электронной коммерции 2017 (ссылка)
  5. Resnet CNN Каймин Хэ, Сяню Чжан, Шаоцин Рен, Цзянь Сунь 2015 г. (pdf)
  6. Пример покупок Ашиш Каре, Хиранмай Гош, Джайдип Шанкар Джаганнатан, 2009 г. (pdf)
  7. Соответствующие фотографии уличной одежды М. Хади Киапур, Сюйфэн Хан, Светлана Лазебник, Александр К. Берг, Тамара Л. Берг, 2015 г. (pdf)