Эксперименты, решающие сложные бизнес-задачи, размещенные на Hackerearth компанией FactorBranded Data Warriors с помощью [Power of fastai library]

[Меры предосторожности: входящая стена текста с анализом. Также есть нежелательный монолог. Ниже в значительной степени используются библиотеки fastai. Если у вас есть некоторый опыт работы с fastai libs, код будет иметь большой смысл]

Справочная информация о проблеме:

Автоматизированная система классификации футболок по принту или рисунку. Нам предоставляется 70 000 изображений с их категориями (проблема классификации изображений) с набором для проверки из более чем 15 000 изображений, которые мы можем протестировать на Hackerearth.

Изображение сайта myntra с категориями - Abstract / Biker / Checked / Solid и т. Д.

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

Примечание:

Сделал трехдневный перерыв в работе, чтобы решить эту проблему и проблему с доставкой (решение обеих проблем потребовало значительных усилий). Поразмыслив над проблемой, я смог достичь точности ~ 72% (7th / 2300 в настоящее время - дата 23/3/2018) с подходом Densenet (ссылка). Получение 45 ГБ на моем сервере пространства документов было трудным, с последующим получением огромных изображений в свертке (обрезка / изменение размера и выполнение надлежащей предварительной обработки) и удалением неисправных / не отвечающих ссылок.

Этот блог не о том, как я достиг 72%, а скорее о шагах, которые я предпринимаю для улучшения модели глубокого обучения. И передача обучения от VGG16 / Resnet18 дала точность около 65–70%.

Обзор задачи и анализ результатов, обеспечивающих точность 72%:

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

Разделите данные на 80–20 (20% от 70 000 в качестве набора для перекрестной проверки), и матрица неточностей будет следующей:

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

Почему эта проблема сложна? Из-за ЭТО!

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

Взглянем на некоторые ошибочно классифицированные изображения:

Планируйте ночь вперед: возможно, попадете в тройку лидеров? Давай попробуем.

Если сомневаетесь, всегда делайте АНСАМБЛЬ.

Поскольку я продолжаю применять глубокое обучение для решения проблем компьютерного зрения, мне всегда рекомендовали создать множество высокопроизводительных архитектур, чтобы выиграть соревнование. В конце концов, архитектура-победительница конкурса Imagenet 2016 была ансамблем из 6 моделей. Давайте запачкаем руки с ансамблем, сначала выяснив отдельные высокопроизводительные арки

Как мы находим высокопроизводительные архитектуры:

  1. Найдите интуитивно понятное изменение размера или кадрирование.
  2. Измените масштаб до размера изображения, чтобы можно было быстро проанализировать результаты.
  3. Настройте гиперпараметры, чтобы не допустить переобучения
  4. Повторите попытку для различных вариантов архитектуры (Densenet / Resnet / Inception-Resnet / Resnext), выбирая наиболее эффективные параметры для каждой архитектуры.
  5. Наконец, соберите их. Ансамблирование - это самая простая часть, такая простая как ([A] + [B] + [C] + [D]) / 4

Шаг 1. Изменение размера или обрезка

Давайте возьмем изображение выше и сделаем кадрирование.

Обрезка в 400 пикселей сверху, 100 пикселей снизу и по 50 пикселей по бокам дает следующее.

Вышеупомянутое должно быть разумным изображением для передачи в сеть, поскольку на большинстве изображений человек смотрит в одном направлении. Небольшая модификация transforms.py, чтобы получить вышеуказанную реализацию:

Функция scale_min - поскольку изображения хранятся в формате numpy, мы можем просто нарезать их для обрезки

r,c,*_ = im.shape
im = im[400:r-100,50:c-50,:]
r,c,*_ = im.shape

Шаг 2. Изменение масштаба изображения

У экземпляров Paperspace P4000 есть несколько ограничений. Для изображений размером 320x320 с размером пакета 64 требуется около 15 минут для предварительной обработки (как отметил Джереми в классе 8 (поделится ссылкой, когда fast.ai, часть 2, курс 2018 года будет открыт с исходным кодом), узкое место действительно происходило во время обработки данных увеличение.)

Примечание. Расширение данных по умолчанию - CropType.CENTER, мы должны загружать все изображение (но с измененным масштабом), поэтому CropType.NO имеет смысл для этой проблемы.

Шаг 3. Повторение для разных архитектур. Учитывая ограничения экземпляра P4000, мы можем проводить обучение только на последних уровнях (precompute = True).

Разделение набора данных: ( 54676,13668)

Архитектура 1: Densenet

1.1 - Densenet 121 (Код):

Выводы после тренировки на Dn121

Точность 75,24 (для набора перекрестной проверки) с 0,4 в качестве параметров исключения

0,005 было хорошей скоростью обучения

Матрица недоразумений для Dn121 - выпадение при 0,4

Диагональные данные выглядят ярче (хороший знак)

Параметры выпадения при 0.20 немного лучше, хотя val_loss для них немного выше. Матрица неточностей при ps = 0,2

1.2 - Densenet 161 (Код): - Ядро вылетало при размере 320x320 (разбитое сердце -.-)

Повторный запуск с num_workers = 2 в качестве обходного пути (предварительная обработка теперь @ 30 мин)

Оценка 74,09 при ps на 0,2

Матрица неточностей (normalize = True)

Оценка 73,4 при ps = 0,4 (лучше не обобщает)

1.3 - Densenet 201 (Код):

Получил максимальную хорошую оценку 75,24

Результат - Densenet121 и Densenet201 одинаковы (75,24 с точностью 61% и 58% по сравнению с графиком) - Примечание для себя: данные проверки, используемые для DN121 и DN201, совпадают? а получение 75,24 подразумевает, что и более глубокая, и мелкая сеть имеют схожие возможности распознавания шаблонов в отношении этой проблемы.

Использование Densenet121 - рассуждение: частично лучшая классификация графики (0,61 против 0,58)

Почему параметр 0,2 PS дает лучшие результаты?

Заставляет меня задуматься о том, что небольшая переобучение - это, возможно, неплохая идея? Обычные параметры отсева составляют 0,5 (отбрасывается 50% значений), снижение на 20% означает, что мы уменьшаем обобщение для точности.

Может быть, ансамбль Overfit Dn121 с Generalized Dn121 даст лучший результат? - ДЕЛАТЬ

Архитектура 2: Широкие остаточные сети (Бумага)

2.0- Один из вариантов архитектуры (WRN50)

Подходит только на основе параметров отсева. Опять ограничения.

Отсев при 0,40 дает максимальный результат 73,4% точности.

Отсев при 0,20 дает оценку 74,6% точности (опять же, больше параметров - ›лучший результат). Мы начинаем видеть закономерность.

Я хотел убедиться, что то, что подается в CNN, на самом деле было обрезанным изображением (нужно было сделать это раньше), как мы того желали. Вспомогательный метод для проверки загружаемого изображения

def show_img(im, figsize=None, ax=None):
    if not ax: fig,ax = plt.subplots(figsize=figsize)
    ax.imshow(im)
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    return ax
x,y=next(iter(data.val_dl))
show_img(data.val_ds.denorm(to_np(x))[0]);

Вуаля,

Возвращаясь к WRN:

Давайте посмотрим на Матрицу путаницы (далее CM),

Для WRN лучше всего подходит Dropout @ 0.2.

Результат: выберите WRN, @ 0,2

Архитектура 3: InceptionNetV4 - вариант GoogleNet, победивший в 2015 году на конкурсе imagenet Challenge (Код).

Dropout @ 0,4, дает точность 67%, а Dropout @ 0,2 дает точность 71%

Давайте посмотрим на CM, когда ps = 0,4

Результат: точность 71% не так уж и впечатляет. Игнорируйте начальную сеть для этой проблемы.

Архитектура 3: InceptionResnet (Бумага) (Код)

Анализ

Плато точности при 67% (для PS = 0,4) и 71% (для PS = 0,2)

CM при PS = 0,4

CM при PS = 0,2

Судя по всему, ансамбль InceptionV4 и InceptionResnet превзошел Resnet151. Поскольку мы получаем точность 71% с InceptionV4, InceptionResnet, мы можем спокойно игнорировать архитектуры Resnet для этой проблемы.

Результат: безопасно игнорировать архитектуры InceptionV4, InceptionResnet, Resnet

Архитектура 4: ResNext (Бумага) - Окончательная архитектура (Код)

4.1: ResNext50

Из приведенных выше попыток ясно, что PS = 0,2 (или, может быть, 0,1 или ниже - TODO) даст наилучшие результаты.

Точность стабилизировалась на уровне 70,6 (при PS = 0,4).

CM при PS = 0,2 (точность 73,7) - увеличение на 3%?

Результат: используйте ResNext, снова с PS = 0,2, лучшие результаты

Примечание: поскольку точность зависит от параметров отсева (около 3%), мы должны выбрать наилучшие параметры отсева.

Шаг 3.1: эксперименты по выбору наилучших параметров отсева

Как? Возьмите нашу лучшую архитектуру и соответствующим образом измените отсев - Dn121

Копаясь в исходном коде, параметры исключения по умолчанию равны [0,25,0,50], что означает, что 25% параметров случайно отбрасываются на начальных уровнях, а 50% - на последних уровнях? -Не уверен-TODO: Копай еще.

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

Его воскресенье и возвращение к выбору лучших параметров отсева

Пробовал по умолчанию [0,25,0,5], [0,1], [0,2], [0,4], [0,6]. Судя по всему, 0.2 немного лучше

Для 0,1 потери при обучении упали до 0,2, но потери при проверке не уменьшились (переобучение)

0.2 - лучший

Шаг 3.2: Эксперименты по выбору лучшего размера для передачи в сеть

Интуитивно понятно, что удаление 400 пикселей сверху и 100 пикселей снизу, по 50 пикселей по бокам имеет смысл. Но что, если руки и их различное положение вызывают неправильную классификацию нашего классификатора:

Пример:

Давайте возьмем изображение слева, обрезка на 400 пикселей и 100 пикселей сверху даст два цвета посередине, и это не будет классифицировано как сплошное (но на самом деле так)

Лучший способ - это, возможно, обнаружить объект и найти, где находятся рубашки (с ограничивающей рамкой вокруг рубашки и обрезать ее), и передать его в сеть. - ЗАДАЧИ

А пока попробуем другой вариант, взяв центр 320x320 (большинство деталей можно интерпретировать из центра рубашки? - Давайте попробуем.

Для fastai lib увеличение данных происходит для определенной архитектуры и определенного размера и хранится в папке tmp в виде массивов numpy, и снова запуск 320x320 не будет выполнять фактически необходимое увеличение, а повторно использовать данные tmp (не уверен в этом) Изменить: увеличение данных происходит во время выполнения

Давайте попробуем 310x310 и проверим изображения, которые мы загружаем в сеть (с crop_type = CropType.CENTER)

Точность составляла @ ~ 74%, но что привлекло мое внимание, так это точность Solid (94%, наша самая эффективная модель дала около 91%), что имеет смысл, потому что обрезка в центре удаляет изученные функции. из-за странного фонового рисунка или некоторых аксессуаров, которые носит человек, позирующий. Точность цветовой блокировки составляет @ 54% против 60% (потому что сеть не видит всю рубашку) - ›Опять же, чтобы понять, почему ансамбль будет работать.

Время для ансамбля

Попытка первая: ансамбль DN121 и DN201 и проверка результатов проверки, установленных на hackerearth и наших наборах перекрестной проверки (Код)

76,8 точность по ансамблю dn121 и dn201 (ОХХХХХХХ! АНСАМБЛЬ РАБОТАЕТ!)

Лучший CM на данный момент (со значительными улучшениями цветочных, Checked, ColorBlocked)

Пора отправить в Hackerearth, чтобы проверить их набор для валидации [Будем надеяться, что ансамбль сработает!]

Хм… Получил 72,887 баллов (немного ниже, чем мой лучший результат 72,941), хотя CM выглядит намного лучше.

Попытка вторая: ансамбль Dn121 и Dn201 с ResNext (Код)

77.2 точность - небольшое улучшение

Результат на Hackerearth- 73,5 - (улучшение 0,5% :)) - Моя первая ансамбля, улучшившая результаты

Попытка третья: ансамбль Dn121 и Dn201 с ResNext (но с разделением валидации 95%, 5%)

Точность 77,4% - еще более незначительное улучшение - но это слишком небольшой набор для проверки

Результат на Hackerearth - 73,599 (разница примерно 0,1) Существенного улучшения нет.

Попытка четвертая: Финал - Ансамбль Dn121, Dn201, WRN, ResNext (Код)

Получил точность 77,6%. Вернулся к разделению 80/20.

Результат на Hackerearth - 74,05% (немного лучше)

Улучшение ~ 1,8% с ансамблем, наши ансамблевые модели не сильно отличаются, может быть причиной

Что мы можем сделать дальше:

  1. Важно: мы тренируемся на последних слоях. Размораживайте и тренируйте начальные слои, используя разную скорость обучения
  2. Дифференциальные параметры обучения
  3. Увеличить лучше (повернуть / перевернуть?)
  4. Пробовать разные размеры? (512x512 или 1024x1024)
  5. Сменить оптимизаторы. (Адаград / Адам, Мы используем SGD с импульсом)

Выход на производственный уровень (что необходимо):

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

То, что я мог бы сделать лучше

  1. Уделите время данным. Когда я просмотрел несколько изображений набора данных, одной расшифровки шаблона недостаточно. Есть много категорий, в которых имеет значение содержание текста. Например. Если на рубашках есть Нью-Йорк, он классифицируется как «Люди и места», а «Арсенал» - это спорт и майка - их сложно изучить с помощью нейронных сетей, и мы должны создать алгоритм обнаружения текста - мы плохо справляемся с людьми и Места, Спортивная и Командная майка и Университетская форма (Все они имеют текст (Универсальность подразумевает номера на футболках)
  2. Сохранение и загрузка веса
  3. Немного лучше комментируете в коде?
  4. Векторизованное прогнозирование

Что-то не так с проверкой, установленной на Hackerearth

  1. ~ 300 ссылок отсутствуют, но они не учитываются, хотя установка полосатого дает немного лучший результат.
  2. Мультиклассовая, а не одноклассовая классификация изображений

Пример:

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

3. Похожие изображения в разных классах (из обучающего набора, одно в музыке, другое в людях и местах).

Окончательная лучшая матрица путаницы, которая у нас есть. Давайте посмотрим на нашу модель в наборе офлайн-валидации, который нам будет предоставлен до окончания конкурса (сначала @ 76% сейчас = ›еще 150 изображений классифицированы правильно).

Примечание.

Были различные утечки данных, которые я использовал для получения точности ~ 75–76%, в основном относящиеся к супергероям и спортивным командам, в URL-ссылках были имена супергероев, например. Бэтмен / Рассвет справедливости и т. Д. - Не уверен, было ли это разрешено.

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

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