Пользователь
0,0
рейтинг
4 апреля 2011 в 10:31

Разработка → Licenzero: простые движения

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

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

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


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

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



На той же странице, где показан результат работы детектора движения, есть еще примеры роликов, на которых детектор ошибается.
borges @borges
карма
53,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (38)

  • 0
    Можно сделать проще — анализировать звук, а ещё лучше совмещать анализ звука и видео.

    Механик точно во время ремонта кардана не будет томно дышать и вскрикивать в оргазме при починке техники.
    • +11
      Конечно мы так и делаем. Про звук статья еще будет. Мы просто решили писать про каждый детектор в отдельности, потому что они сильно разные, различное время было потрачено на разработку, различные технологии применялись.
  • –3
    И ни одной нормальной картинки не будет!? Мы требуем примеров! (:
    • +1
      Так здесь же примеры. Первый ролик — пример работы детектора, остальные — примеры неправильного отнесения роликов к классу порно.
  • +2
    Само видео мы положили к себе на сайт

    знакомое видео:)

    Если серьезно, то интересно с каким ядром делается свертка?
    • +2
      Видео пропускается через фильтры вот такого вида:
      spatio-temporal filter
      После чего мы получаем количественные показатели движения по разным направлениям. Эта картинка приблизительная, точнее я не нашел, а вообще детектор движения делал spsp. Он лично общался с теми людьми, которые разрабатывают это направление, он и писал код детектора. Если интересно, напишите ему, он обязательно ответит.
      • +8
        О, так вот оно какое, сферическое порно в вакууме.
  • +3
    А как быть с круговыми движениями? Справляется ли этот метод с ними?
    И это… пишите название фильма ;)
    • +1
      Да, справляется. Главное чтобы движения были ритмичными. А названий фильмов, к сожалению, не знаю. У нас для тренировки использовались в основном небольшие ролики с видеохостингов.
      • +6
        Это значит, что скоро начнут снимать порно в зелено-красных нейлоновых комбинезонах с аритмичными движениями под шум стройки? :)
  • +13
    ваш порнофильтр умеет отбирать качественное незанудное порно?
    • +4
      Ага, думали над тем чтобы классифицировать порно. Но, конечно, дальше шуточек дело не пошло.
      • +21
        Зря. Фильтр качественного порно пользовалстя бы значительно большим коммерческим успехом.
    • +1
      проблема в том что у каждого человека свои критерии выбора — тут имхо сложновато будет разделить на отличное и зануднобанальное порно и чтоб сразу и всем понравилось
      но вообще конечно пройтись бы этим фильтром по самизнаетекакомуресурсу и нормально рассортировать… больно много фигни однообразной стало
      • 0
        Ну например, если в конце кончают на лицо — то с 80% вероятностью это занудное порно.
        • +1
          а в вдруг до этого было нечто нереально крутое и фееричное? только из-за концовки на 80% отметать качественный прон
        • +1
          Порно без happy-end'а? :)
          • +2
            В конце должен быть ребенок и свадьба?
  • +10
    Заметно, что характерные для порнографических роликов движения выражаются характерной, легко узнаваемой кривой. Также, по этой кривой можно оценить количество персонажей в видеоролике и направления и скорость их движений.

    У кого-то чертовски необычная работа.
    • +3
      «можно оценить количество персонажей в видеоролике» — прррелестно =)))
    • 0
      Ага, вы попробуйте сосредоточиться на работе, когда у вас постоянно
      … изображения округлых, мягко освещенных форм (обнаженное тело)

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

      Это сколько же и пришлось пересмотреть, прежде чем написать все эти алгоритмы. Бедные ребята. :))
      • 0
        Будем надеяться, что разработка этих алгоритмов не повлияла на их личную жизнь :)
        • +3
          Хотя, на этапе знакомства звучит очень круто:

          Девушка: «А чем ты занимаешься?» (ожидание скучного ответа)
          Разработчик: «Мы фильтруем скучное порно от интересного!»
  • 0
    > Скорость движения может быть использована для оценки времени акта. На наших данных заметно, что приближаясь к окончанию ролика, амплитуда движений увеличивается, а период — сокращается. (Данная оценка интересна, но ненадежна, и мы не используем ее на практике).
    Учитывая тот факт, что анализируются весь ролик, хочется спросить: сколько ресурсов ест такой анализатор?
    • 0
      Точных замеров мы еще не делали, поскольку еще есть идеи по улучшению правильности классификации (то есть, пока приоритет у нас — минимизация ошибки). Но приблизительно — полминуты работы одного ядра процессора на минуту видео (правда, сюда же включено время декодирования видео ffmpeg-ом).
  • +1
    Интересно пробовал ли кто-либо снимать энцефалограммы с людей при просмотре порно-роликов чтоб точнее указать программе на какие именно паттерны обращать внимание при распознавании?:)
    • 0
      Я думаю это индивидуально. Вполне вероятно, что кто-то среагирует на механика с карданом:)
  • +1
    Последний ролик у вас на сайте удивил. Значит, играя эту тему на гитаре, я занимаюсь чем-то жутко неприличным? :)
  • –1
    В качестве безумной идеи: попробовать распознавание образов с целью реконструировать скелетную анимацию в 3D — так чтоб движение камеры не воспринималось как смена содержимого в кадре. Еще: самые слабо-меняющиеся участки по краям кадра воспринимать как фон: если в нем не происходит трансформации, то считаем что камера не меняет угол направления, но сама может двигаться в одной плоскости; поэтому можно вычленить объекты на переднем плане и что с ними происходит. «Связанные» (т.е. между которыми нет резких контуров или просветов через которые виден фон) пятна можно объединять в персонажа. В каждом пятне выбираем узловую точку и объединяем их в скелет. Потом можно смотреть, как двигаются скелеты, т.е. как часто и с каким ритмом меняются углы между ребрами. После чего уже легко классифицировать все что угодно.

    С другой стороны, страшно становится: вдруг власти возьмут на вооружение и начнут зачищать вообще все-все. А потом можно вообще развить технологию на предмет изучения мозговой активности: тех, кто неправильно мыслит будут тоже зачищать или брать на карандаш в массовом порядке автоматически.
  • +1
    Это 5! А вроде не пятница и 1 апреля уже прошло.
    • +1
      Вы так шикарно описывали амплитуду движения мужчины влево и женщины вправо, что у меня право нет слов. Вы о**енны!
    • 0
      Да-да. Поэтому и не стали в пятницу публиковать, чтобы не мешать с первоапрельскими постами.
  • +1
    А а отсечение по частоте «колебаний» не проводили? Тот же ролик с карданом вроде бы можно было довольно легко забраковать.
  • 0
    А какая в среднем получилась предсказательная способность у построенной модели? Вы указываете цифру >70% для отдельного ролика, а для 10/100/9000 случайных пользовательских роликов?
    Ролики какого содержания вызывали ложные срабатывания (кроме секса с гитарой и карданом)?
    На каких конфигурациях проводился анализ и сколько времени он занимал — хотя бы в секундах на Мб?
    А статья понравилась… Преподобный Байес гордился бы вами!..
    • 0
      Не для отдельного ролика, а для целых роликов. Мы тестируем на 3500 роликах. 1500 — специальные порноролики, 2000 — случайные пользовательские ролики.
      По времени работы я пока не писал, потому что мы используем и CPU и GPU (CUDA), в дальнейшем GPU будем больше использовать. А сейчас пока 1 минута видео обрабатывается приблизительно за 30 секунд (на одном ядре CPU).
  • 0
    Замаскированный тест про порнуху
    • 0
      Замаскированный?
  • +1
    Большое спасибо за идею превращения кривой в слова для применения Байесовской фильтрации! Не приходило в голову :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.