Не судите книгу по обложке
Вы, должно быть, часто слышали эту фразу, но она не на 100% верна. Мы часто судим о чем-то по первому увиденному, в том числе выбираем место для проживания. Tiket.com готов предоставить пользователям лучший опыт, чтобы они могли легко определить, как выглядит отель. Это означает, что мы должны поместить изображение здания или спальни в качестве основного изображения вместо изображения ванной комнаты.
Учитывая приведенные выше примеры, мы видим, что здание отеля установлено в качестве основного изображения для страницы сведений о конкретном отеле. Как правило, эти изображения размещаются в верхней части страницы сведений об отеле на сайте tiket.com. Когда мы нажимаем на одно из изображений, открывается представление галереи, содержащее заголовок, относящийся к выделенному изображению.
Поэтому нам нужно классифицировать наши изображения по нескольким соответствующим категориям: экстерьер, спальня, ванная комната и т. д. Этот тип задач ранее выполнялся командой контента вручную. Поскольку количество отелей (включая изображения для каждого отеля) растет в геометрической прогрессии, нам нужно, чтобы эта трудоемкая задача выполнялась быстро и автоматически. Всего существует 23 категории, которые мы можем классифицировать следующим образом:
В этом случае изображение помечается только одной меткой. По сути, мы можем сформулировать эту проблему науки о данных как проблему многоклассовой классификации.
Источник данных
Изображения сортируются и помещаются в соответствующие папки ярлыков. Папка может содержать изображения с разными расширениями файлов, например. .jpg, .jpeg, .png. Кроме того, папка содержит файл CSV с дополнительными URL-адресами изображений с метками. Нам нужно предоставить сценарий предварительной обработки, чтобы упростить конвейер импорта обучения. Для этого исследовательского эксперимента набор данных, который мы смоделировали, очень несбалансирован. Всего доступно 86 тыс. изображений со следующим распределением. В следующем разделе мы расскажем, как эти 86-килобайтные изображения будут разбиты на сегменты для дальнейшей обработки данных.
TFRecord
TFRecord — это пользовательский формат данных для хранения последовательности двоичных записей, разработанный Tensorflow. Преобразование ваших данных в двоичный формат может значительно повысить производительность конвейера импорта и помочь сократить время обучения модели. Что еще более важно, он требует меньше места на диске и занимает меньше времени для чтения с диска. TFRecord хранит данные последовательно. Следовательно, он обеспечивает быстрый процесс потоковой передачи из-за малого времени доступа. Для нас также выгодно, что TFRecord изначально интегрирован в API tf.data TensorFlow, что упрощает выполнение пакетной обработки, перетасовки и кэширования.
Для контекста обработки изображения не только строка байтов необработанного изображения, но и его метаданные могут храниться как TFRecord. Нам нужно указать структуру данных перед тем, как записать их в файл. В этом случае мы сохраняем функции, то есть необработанные байты изображения, метку изображения и размер изображения (длину, ширину и глубину) в tf.train. Пример структуры, затем сериализуйте ее и используйте tf.python_io.TFRecordWriter для записи на диск.
При обучении модели классификации изображений мы неоднократно запускаем наши обучающие выборки в процессе обучения, и порядок должен быть полностью случайным для каждой эпохи. Если мы сохраним все изображения в один большой файл TFRecord, процесс перетасовки не уместится в памяти. Следовательно, нам нужно разделить набор данных на несколько файлов TFRecord (называемых осколками). В течение каждой эпохи мы перемешиваем имена файлов сегментов, чтобы получить глобальное перемешивание, и используем буфер перемешивания, чтобы получить локальное перемешивание.
В идеале один шард TFRecord должен иметь размер около 100 МБ. В нашем случае это около 250 изображений на фрагмент. В целях обучения файлы TFRecord будут разделены на наборы данных для обучения и проверки. Поэтому для нас чрезвычайно важно выполнять стратифицированную выборку по классам изображений при сохранении изображения в сегменте, чтобы гарантировать, что каждый сегмент будет иметь одинаковое распределение.
Из 86 тысяч записей, которые у нас есть в общей сложности, сгенерировано 344 сегмента. Чтобы убедиться, что каждый сегмент имеет одинаковое распределение, мы делим записи из каждого класса поровну между сегментами. Затем оставшиеся изображения распределяются по некоторым осколкам. В этом случае осколки будут содержать ровно одну дополнительную запись для конкретного класса.
Преобразование необработанных данных изображений в файлы TFRecord может сократить время обучения на 59% за эпоху.
Эффективная сеть
Глубокое обучение появилось для решения проблем с изображениями, поскольку доказано, что глубокое обучение снижает усилия по разработке признаков данных изображения. В мире компьютерного зрения обычно используется сверточная нейронная сеть (ConvNets). ConvNets часто разрабатываются с фиксированным бюджетом ресурсов, а затем масштабируются для большей точности.
Раньше это можно было сделать, увеличив одно из измерений сети (то есть глубину, ширину и разрешение). Эти размеры описываются следующим образом.
- Глубина: количество слоев в сети
- Ширина: количество фильтров в сверточном слое.
- Разрешение: высота и ширина входного изображения.
Google представила EfficientNets в 2019 году, семейство моделей, состоящее из нескольких архитектур, которые масштабируются по сравнению с базовой архитектурой EfficientNet-B0. Он использует метод составного масштабирования для увеличения размера модели для достижения большей точности. Он использует составной коэффициент для равномерного масштабирования ширины, глубины и разрешения сети.
Интуиция, стоящая за методом составного масштабирования, заключается в том, что если размер входного изображения больше, сети требуется больше слоев для увеличения рецептивного поля и больше каналов для захвата более мелких структур.
Эффективность масштабирования модели сильно зависит от базовой сети. Вместо масштабирования модели из существующей сети (например, MobileNets и ResNet) была разработана новая архитектура под названием EfficientNet-B0 с использованием Поиска нейронной архитектуры.
В EfficientNet существует 8 архитектур моделей (т. е. от B0 до B7). Чем выше используемая степень, тем большей точности мы можем достичь, требуя больше ресурсов. Для этого эксперимента мы могли бы начать с базовой модели и увеличивать степень модели до тех пор, пока она соответствует нашим возможностям ресурсов.
Следует отметить, что для каждой архитектуры EfficientNet требуется разный размер входного изображения, как показано на следующем рисунке.
Трансферное обучение
Трансферное обучение для EfficientNet может значительно сэкономить время и вычислительную мощность, необходимые для обучения моделей. Это также помогает достичь более высокой точности. Мы используем предварительно обученные веса, чтобы инициировать веса вместо случайных весов. В этом эксперименте мы используем предварительно обученные веса из ImageNet и Noisy Student.
Предварительно обученные веса Noisy Student создаются путем самообучения модели. Noisy Student прошел обучение архитектуре EfficientNet. Сначала модель была обучена на наборе данных ImageNet, который помечен, а затем использовался в качестве модели учителя для создания псевдометок для немаркированных изображений. Впоследствии была обучена более крупная модель с комбинацией как помеченных, так и псевдопомеченных изображений. Этот процесс обучался итеративно с привлечением модели ученика, которая рассматривалась как модель учителя. Во время обучения модели ученика были добавлены шумы (например, отсев, стохастическая глубина и увеличение данных), чтобы модель ученика могла обобщать лучше, чем модель учителя.
Тонкая настройка
Процесс тонкой настройки проводится в 2 этапа. На первом этапе выполняется тонкая настройка только первого верхнего слоя, а на втором этапе некоторые из верхних слоев размораживаются.
K-кратная перекрестная проверка
Мы используем метод перекрестной проверки в k-кратном порядке, чтобы найти лучшие гиперпараметры. Во-первых, данные разбиваются на проверочные (90%) и тестовые (10%) наборы. В процессе тонкой настройки набор для проверки поезда случайным образом разбивается на k равных частей. Во время каждой итерации одна кратность исключается из процесса обучения и становится проверочным набором для оценки производительности модели. Итерации повторяются k раз, пока каждая складка не будет использована один раз в качестве проверочного набора.
Гиперпараметр
- Базовая модель: EfficientNet-B0, .., EfficientNet-B7
- Дополняющие слои (произвольно обрезать, вращать, переводить изображение в начале)
- Размер партии
- Скорость обучения
- Количество слоев разморозки
- Эпохи
- Предварительно обученные веса: ImageNet, Noisy Student
Эксперимент
Наша лучшая модель достигла точности 80,2% для топ-1. Из-за ограниченности ресурсов мы экспериментировали только до EfficientNet-B2.
Лучшая модель
Вот основные выводы, которые мы могли сделать в ходе эксперимента:
- Модель с более высокой степенью дает лучшую точность.
- Отключение дополнительных слоев повышает точность.
- Изменение размера партии не дает существенного улучшения.
- Модель может не сойтись, если скорость обучения слишком мала, даже после увеличения эпох. Это может привести к тому, что модель застрянет на неоптимальном решении.
- Предварительно обученные веса шумного ученика работают лучше, чем предварительно обученные веса ImageNet.
- Слишком малое количество размораживаемых слоев может привести к ухудшению точности, в то время как слишком большое количество слоев также не приводит к значительному повышению точности.
Порог оценки
Выход EfficientNet — это вероятность того, что изображение принадлежит каждому классу. Например, изображение может строго принадлежать к одному классу, имея показатель вероятности, превышающий 0,9 для одного класса. Иногда оценки вероятности могут быть равномерно распределены по нескольким классам и, как правило, дают низкие оценки. Низкая оценка вероятности указывает на то, что изображение может быть не распознано ранее в обучающем наборе или оно содержит более одной метки.
Обычно мы предсказываем класс с наибольшей вероятностью в качестве метки. Чтобы избежать неправильной маркировки, мы устанавливаем определенный порог. Если оценка вероятности верхнего предсказанного класса превышает пороговое значение, метка будет установлена как этот класс. В противном случае он будет помечен как другое. Мы находим порог, который оптимизирует оценку F1 для каждого класса. Следовательно, у каждого класса может быть свой порог. Используя этот подход, мы прогнозируем около 5% данных как другие. Когда эти изображения отбрасываются, точность остальных данных достигает 83,2 %.
Проблемы
Зашумленный набор данных
Постоянной проблемой, с которой мы столкнулись при решении этой проблемы, является наличие очень зашумленного набора данных. Другими словами, в нашем наборе данных много неправильных меток! Эта проблема довольно распространена в области науки о данных. Нам нужен маркировщик данных и четкие инструкции по маркировке, чтобы получился чистый набор данных. Тем не менее, построенная нами модель EfficientNet по-прежнему способна хорошо обобщать.
Несколько меток на изображении
Некоторые изображения могут содержать две или более сцен. Поскольку мы принимаем только одну метку, предсказанная метка может отличаться от фактической. Тем не менее, прогнозируемая метка также приемлема при проверке качества (т. е. ручной оценке человеческим глазом).
Несколько интерпретаций в образе
Некоторые изображения также сбивают с толку из-за их схожих свойств. Например, и в гостиной, и в общей зоне есть диваны. Для людей мы могли бы легко различать, если бы знали местоположение, будь то внутри или снаружи спальни. Кроме того, в некоторых отелях нет отдельных помещений для ресторана и общей зоны, поэтому сцены иногда легко интерпретируются неправильно.
Возможные улучшения
- Применяйте увеличение только к классам меньшинства, чтобы увеличить выборки.
- Пересмотрите обучающие данные, построив модель учителя из небольших золотых данных, чтобы дать псевдометки остальным данным.
Рекомендации
[1] Тан, Минсин и Куок Ле. «Efficientnet: переосмысление масштабирования модели для сверточных нейронных сетей». Международная конференция по машинному обучению. ПМЛР, 2019.
[2] Се, Цичжэ и др. «Самообучение с шумным студентом улучшает классификацию imagenet». Материалы конференции IEEE/CVF по компьютерному зрению и распознаванию образов. 2020.
[3] https://keras.io/examples/vision/image_classification_efficientnet_fine_tuning/