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