Pull to refresh

Licenzero: простые движения

Reading time 6 min
Views 7.2K
Двустороннее движениеЭтим постом мы продолжаем цикл статей о том, как мы делали порнофильтр. Сейчас речь пойдет о попытке классифицировать порнографический контент по характерным движениям в кадре.

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

Еще раз про классификацию


Принцип работы большинства систем машинного обучения достаточно прост. Для классификации объектов на классы А и Б, мы описываем их совокупностью некоторых признаков (features), которые можно каким-либо образом измерить. Далее, статистически выводим формулу или выражение, которая, если в нее подставить конкретные значение признаков для конкретного объекта, выдает значение >0 для объектов класса А, и значение <0 для объектов класса Б.

Например, мы хотим автоматически отличить… скажем, красную икру от черной. Признаки — цвет и размер икринки. Выберем несколько икринок черной и красной икры, измерим их, и отразим ситуацию на графике.

ИкраПунктирная линия хорошо разделяет два имеющихся класса объектов. Видим, что красная икра крупнее и светлее черной. Построим формулу для этой линии, например:

z = размер * c1 – цвет * c2 + c0,
где:
c1 и c2 — некоторые коэффициенты, статистически подобранные по результатам наблюдений,
c0 — константа.

Далее, имея какую-то неизвестную икринку, мы подставим ее размер и цвет в нашу формулу, и при z>0 скажем, что икра красная, а при z<=0 – что она черная.

Это все, конечно, широко известно. Существует огромное количество алгоритмов классификации. Например, при создании наших детекторов мы использовали такие методы, как:

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

Анализ движений


Одним из известных и часто применяемых методов анализа движения является optical flow. Например, реализация optical flow присутствует в широко известной библиотеке OpenCV. Принцип работы напоминает поиск векторов движения при кодировании видео в формате mpeg — в одном кадре выбираются некоторые фрагменты изображения, которые ищутся в следующем кадре (например, методом SAD). Движение объектов соответствует смещению фрагментов изображения между кадрами.

Однако, попробовав реализовать optical flow у себя, мы обнаружили, что:
  • при наличии в изображении округлых, мягко освещенных форм (обнаженное тело), optical flow зачастую неправильно определяет направление движения;
  • результаты работы — то есть, векторы движения — сложно классифицировать методами машинного обучения;
  • даже при использовании собственной, оптимизированной реализации optical flow вместо OpenCV, затраты времени на вычисления получились неприемлемо большими;
  • кроме того, мы из компании Inventos, наш логотип — велосипед.
То есть, мы решили пойти своим путем.

Как у нас


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

Поясним применение свертки на простом, двухмерном примере. Допустим, вы применяете операцию «выделение края» (detect edges) к изображению в графическом редакторе.

Графический редактор создает маску размером 3x3, накладывает ее на изображение, начиная с каждого пикселя, и перемножает соответствующие числа и суммирует результаты умножения. Результатом является одно число – можно сказать, что оно тем больше, чем сигнал под маской похож на саму маску.

Стопка кадровAналогичным образом, но в трехмерном пространстве (двумерные координаты пикселя в кадре + время или номер кадра в качестве третьего измерения), работают и использованные нами фильтры.

Что мы делаем:
  • Собираем кадры видеоролика в «стопку».
  • Применяем к получившейся структуре данных операцию трехмерной свертки. В этом случае, мы можем создать маску, которая будет выдавать большие числа в случае наличия движения в каком-то заранее выбранном направлении с заранее выбранной скоростью.
  • Применив несколько таких масок, мы можем оценить количество движения в каждом кадре, в каждом пикселе, в каждом из нескольких заранее выбранных направлений.
  • Просуммировав значения результатов свертки сигнала во всех пикселях, мы можем качественно (по направлению) и количественно оценить движение в целом кадре в любой момент времени.

На рисунке ниже показан результат работы нашего фильтра движения на небольшом отрывке порноролика. Само видео мы положили к себе на сайт во избежание забанивания на видеохостингах. Картинка в центре — текущий кадр из ролика. Картинки вокруг него – результат фильтрации последовательности кадров нашими фильтрами. Каждый результат соответствует одному из двенадцати выбранных направлений движения. Зеленые кривые – это график количества движения в каждом направлении на протяжении нескольких десятков кадров.

Графики движений

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

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

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

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

Классификация движений


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

Для оценки кривых можно использовать существующие системы фильтрации словесного спама, основанные на методе Баейса. Каждая кривая может быть превращена в последовательность «слов» следующим образом:
  1. Выберем некоторую длину слова. Каждое слово будет соответствовать, скажем, 3 секундам из видео.
  2. Найдем среднее значение амплитуды кривой на каждом отрезке времени.
  3. На каждом кадре, для каждой амплитуды кривой выше средней, добавим к нашему «слову» «букву» 1, а для каждой амплитуды ниже средней — «букву» 0.

Таким образом, наш ролик превратится набор «слов». Скажем, слова, похожие на 0110011 зачастую наблюдаются в порнороликах.

После превращения видеоролика в описание в виде набора таких «слов», тренировка обычного спам-фильтра для фильтрации порнографии — это уже просто дело техники.

Попробовали мы и SVM, но из-за специфического характера исходных данных все же остановились на спам-фильтрах.

Точность классификации


Ни одна из систем автоматической классификации не дает 100% правильных результатов. При использовании только оценки движения нами была достигнута точность классификации 78,3%.

Много это или мало. С одной стороны, это не так много, все таки ошибка довольно высока. Но тут стоит отметить некоторые моменты:
  • Речь идет именно о классификации отдельного ролика. В тестировании использовались ролики, которые загружают пользователи на видеохостинги. Если же говорить о точности классификации порнографических сцен (то есть фрагментов, в которых присутствует половой акт), то здесь точность была выше 95%.
  • Детектор движения прекрасно дополняет другие детекторы порнографии (по цвету, или по объектам в кадре), поскольку имеет мало с ними общего.

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



На той же странице, где показан результат работы детектора движения, есть еще примеры роликов, на которых детектор ошибается.
Tags:
Hubs:
+66
Comments 38
Comments Comments 38

Articles