Определение проблемы

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

Типичная проблема, которую мы решаем, - это классификация двоичных изображений типов A и ~ A. Давайте посмотрим на проблему с отрицательным набором данных. У нас уже есть некоторое количество изображений, собранных по разным классификациям. Большинство этих изображений можно использовать в качестве отрицательного набора данных для решения любой следующей проблемы. Это сократит время на подготовку следующего набора данных примерно вдвое. Но как их выбрать автоматическим или полуавтоматическим способом?

Первоначальное решение

Допустим, мы собрали несколько изображений для положительной части набора данных. Можем ли мы создать какой-нибудь слабый классификатор, основанный только на положительных результатах, и использовать его для выбора отрицательных? Есть одна модель классификации / новизны и обнаружения выбросов, которые предназначены для решения очень похожей проблемы: описать некоторый класс, используя только экземпляры этого класса. Но обычно они работают с относительно небольшим количеством функций и не используются для работы с изображениями. Есть отличное сообщение в блоге Аникет Бхатнагар, описывающее подход именно к этой проблеме: https://hackernoon.com/one-class-classification-for-images-with-deep-features-be890c43455d. Основная идея состоит в том, чтобы извлечь функции CNN на изображении из некоторой предварительно обученной сети CNN перед последним слоем и еще больше уменьшить их количество с помощью PCA.

В этом подходе есть два привлекательных момента:

  • Поскольку нам нужен классификатор только для выбора негативов, единственной существенной характеристикой является точность негативов. Таким образом, мы можем легко поиграть с пороговыми значениями модели, чтобы иметь дело с компромиссами матрицы путаницы.
  • Поскольку нам не нужно обучать сеть глубокого обучения, только классические алгоритмы машинного обучения, размер необходимого набора данных положительных результатов относительно невелик. ~ 1000 или меньше изображений достаточно, чтобы получить практически неограниченное количество негативных изображений с точностью более 90%.

Вот характеристики зависимости различных алгоритмов от размера обучающей выборки в наборе данных «food_5k» (упомянутом в исходном сообщении в блоге).

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

Проблема с соотношением сторон изображения

Проблемы возникли, когда мы попытались проверить одни и те же алгоритмы на разных наборах данных. Были рассмотрены еще три темы: «огнестрельное оружие», «алкоголь» и «война и террор».

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

Похоже, что набор данных food_5k состоит из изображений, относительно близких к квадратам. Но остальные наборы данных содержат изображения с различным соотношением сторон. Например, есть много видеокадров с соотношением сторон 16: 9.

Результаты модели глубокого обучения оптимизированы для квадратных изображений. Собственно Реснет-152 занимает матрицу 3х224х224. Если размер нашего изображения больше 224x224, лишняя часть пикселей изображения просто не будет связана со следующим слоем. Это объясняет, почему результаты для темы «война и террор», где контент распределен по всему изображению, лучше, чем для «огнестрельного оружия» и особенно «алкоголя», где интересный контент обычно локализован в какой-то части изображения, а эта часть изображения могут быть просто вне области, рассчитанной сетью. Так что правильная подготовка изображения (изменение размера / кадрирование) является важной частью проблемы.

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

Вот рассмотренные нами подходы и соответствующие результаты.

Точно изменить размер до 224x224

Измените размер изображения точно до 224x224. В таком случае соотношение сторон не сохраняется и, согласно нашим экспериментам на разных задачах, дает плохие результаты, поэтому даже не было включено в эксперименты.

Изменение размера самой большой стороны до 224

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

Обрезка изображений с учетом содержимого

Также можно попробовать изменить само изображение, выделив его значимую квадратную часть. Существует ряд алгоритмов автоматической обрезки изображений с учетом содержимого. Мы использовали библиотеку https://github.com/jwagner/smartcrop.js. Он учитывает края, цвет кожи, области высокой насыщенности и еще несколько аспектов. Здесь результаты неоднозначны. В некоторых комбинациях предмет / алгоритм они немного лучше нашей базы (размер минимальной стороны до 224), в некоторых - хуже. Отклонения от базового варианта не слишком велики. Вероятно, это можно объяснить двумя факторами. Во-первых, предметы, контент которых распределен по всему изображению, менее чувствительны к любому типу кадрирования. С другой стороны, концепция хорошего урожая слишком зависит от контекста и ее трудно автоматизировать. Например, используемая библиотека имеет тенденцию сохранять части изображений, содержащих людей, и это не всегда то, что нам нужно (например, в случаях огнестрельного оружия и алкоголя).

Существуют дополнительные интересные алгоритмы суммирования изображений или перенацеливания, такие как двунаправленное сходство (http://www.wisdom.weizmann.ac.il/~vision/VisualSummary/bidirectional_similarity_CVPR2008.pdf), Seam Carving (http: //www.eng.tau.ac.il/~avidan/papers/imretFinal.pdf ) или визуальный ретаргетинг естественных изображений с использованием внутренней GAN ( https://www.youtube.com/watch?v= zC8Y4Mhb7Fk & index = 5 & list = PLNiWLB_wsOg4xrvT-GHU_DK_XyxY1s9OP & t = 0s ). Но для любого алгоритма мы можем представить себе проблему классификации, когда такое автоматическое изменение размера изображения не подходит, поэтому дальнейшие эксперименты в этом направлении не были продолжены.

Ручная обрезка

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

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

Нарезка

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

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

Что касается шага среза, шаг в 50% от размера среза выглядит достаточно хорошо. Для изменения размера перед нарезкой существует следующий компромисс. Когда изображение разделено на слишком много фрагментов (например, без изменения размера вообще), это занимает много времени и приводит к тому, что интересный контент распределяется на множество фрагментов. Когда изображение уменьшено до минимального логического размера (минимальная сторона до 224), разрешение деталей может быть недостаточно детальным. Мы попробовали три варианта:

  • нарезка без изменения размера
  • изменить размер минимальной стороны до 720 перед нарезкой
  • изменить размер минимальной стороны до 224 перед нарезкой

Второй вариант в большинстве случаев давал наилучшие результаты.

Теперь по поводу представления наборов признаков для моделей. Первая идея - объединить наборы функций срезов в один более крупный набор функций. Но есть две проблемы. Во-первых, такой составной набор велик. Скажем, для изображений с четырьмя срезами мы получаем 2048 функций. Такое количество функций слишком велико для рассматриваемых алгоритмов, и это как раз причина использования PCA в первоначальном подходе. Но даже если нам удастся извлечь значимые функции из такого гораздо большего набора функций, второй вопрос заключается в том, как решить, какое количество фрагментов следует объединить. Различные изображения из набора данных для обучения / проверки могут иметь разные размеры и разное количество срезов, но размер набора конкатенированных функций должен быть постоянным. Поэтому нам нужно найти наибольшее количество срезов, по крайней мере, для наборов данных для обучения и проверки, и решить, как заполнить недостающие части объединенного набора функций для большинства изображений: дополнять ли его функциями одного из срезов или какого-либо типа агрегация.

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

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

Есть еще одна интересная особенность срезного варианта, которая не позволяет поставить ему однозначное первое место. Как указано выше, наиболее важной статистической характеристикой для данной задачи является отрицательная точность. Но большинство типов изменения размера дают не слишком низкие значения ~ 75- ~ 95% также для отрицательного и положительного отзыва и F1. В случае нарезки так бывает не всегда. Для части алгоритмов / субъектов вспоминание негативов значительно снижено (до ~ 20–30%). Фактически это означает, что нам нужен больший немаркированный набор данных, чтобы получить такое же количество негативов.

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

Выводы

Итак, выводы:

  • Тип изменения размера существенно влияет на точность негативов. Точность генерации негативов может варьироваться в пределах ~ 20%.
  • Разные алгоритмы по-разному реагируют на разные типы изменения размера. Решение о подходящем типе изменения размера для одного алгоритма может быть менее подходящим для другого алгоритма.
  • Различные задачи классификации (предметы) имеют разную чувствительность к выбору типа изменения размера
  • Наиболее многообещающими типами изменения размера являются изменение размера вручную и нарезка. Из вариантов нарезки изменение размера до 720 + нарезка с агрегацией (максимум) функций на фрагменты дала наилучший результат. Эти варианты дали наилучшие результаты для большинства комбинаций алгоритм / субъект.
  • Некоторые варианты изменения размера (особенно связанные с нарезкой) значительно снижают запоминание негатива. В таких случаях у нас есть компромисс между точностью сгенерированного набора данных негативов и количеством немаркированных изображений, которые могут нам понадобиться для этого. Например, легко найти алгоритм и тип изменения размера, которые обеспечивают точность более 90% и отзывчивость более 20% для каждого тестируемого объекта (например, в случае SVM одного класса и точность нарезки варьируется в пределах 0,94% -99% и это не только подходящая комбинация). Но если требуемый отзыв составляет не менее 50%, не существует комбинации алгоритма и типа изменения размера с точностью выше 90%.