Не те игрушки: как мы научили нейросеть бороться с порно в стримах

Всем привет, меня зовут Олег, я занимаюсь компьютерным зрением в команде Видеоаналитики МТС и сегодня расскажу вам, как мы защищаем от небезопасного контента стриминговую платформу WASD.tv, в частности про детектирование порнографии в постановке задачи action recognition.



Наш кейс — это стриминговый сайт для геймеров, киберспортсменов и любителей живых трансляций формата Twitch.tv. Одни пользователи транслируют развлекательный контент, а другие его смотрят. Контент может быть самый разный: игры, живая музыка, интерактивы, мукбанг, ASMR, готовка, подкасты, прочее — и в принципе не ограничен ничем, кроме воображения стримера.

И правил платформы, за соблюдением которых следят модераторы.


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

Когда перед нами встала задача отслеживания небезопасного контента, сразу стало очевидно, что отличить безопасный контент от небезопасного не так-то просто. Первое, что было важно понять — порно и нагота не тождественные понятия.

Порнография — это необязательно про наготу: секс в одежде — это небезопасный контент, и зачастую его можно отличить от “безопасного” контента только в динамике.

Нагота — это необязательно про NSFW: сумо, борьба, одетые люди в латексе — всё это безопасный контент, на котором открытые решения зачастую отрабатывают некорректно.

Исходя из этих соображений, мы начали смотреть, как можно решить эту задачу. Из интересных открытых решений уже несколько лет существует обученная на закрытых данных модель Open NSFW от Yahoo (имплементация на TF). Ещё есть классный открытый репозиторий Александра Кима nsfw data scraper, из которого можно получить несколько сотен тысяч изображений с реддита, imgur и вроде бы каких-то других сайтов. Изображения разбиты на пять классов: порно, хентай, эротика, нейтральный и рисунки. На основе этих данных появилось много моделей, например раз, два
Опенсорсные решения страдают от нескольких проблем — в целом невысокое качество некоторых моделей, некорректное срабатывание на вышеупомянутых сложных кейсах и безопасных изображениях вроде тверкающих девушек и мемов с Рикардо Милосом, а также проблематичность доработки, потому что либо модели устаревшие и обучены на закрытых данных, либо данные очень шумные и с непредсказуемым распределением.



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

Распознавание действий


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

Как вообще решают эту задачу? В восемнадцатом году вышёл отличный обзор от qure.ai, и кажется, что с тех пор радикального прогресса в области не произошло, так что рекомендую. Более интересный ресерч на тему видео перешёл в более сложную задачу понимания и пересказа видео. Там и графовые сетки, и self-supervised learning — этому даже был полностью посвящен второй день на последнем Machines Can See.

Так вот, классификация действий. История прогресса в нейросетевых моделях примерно следующая: сначала проводили обучение трехмерных сверточных сетей с нуля (С3D), затем стали пробовать свёртки с какой-нибудь рекуррентной архитектурой или механизмом внимания; в какой-то момент Андрей Карпатый предложил разными способами мержить представления с разных кадров, еще позже стандартом стало делать двуглавые модели, где на один вход подается последовательность кадров в BGR/RGB, а на другой — посчитанный на них плотный оптический поток. Еще были приколы с использованием дополнительных признаков и специальных слоёв вроде NetVLAD. В итоге мы смотрели на модели, лучше всего показавшие себя на бенчмарке UCF101, где видео разбиты по 101 классу действий. Такой моделью оказалась архитектура I3D от DeepMind, она зашла лучше всего и у нас, поэтому расскажу о ней подробнее.

DeepMind I3D


Как бейзлайны мы пробовали обучать C3D и CNN-LSTM — обе модели долго обучаются и медленно сходятся. Затем мы взяли I3D, и жизнь стала лучше. Это две трёхмерные сверточные сети для BGR и оптического потока, но есть особенность — в отличие от предыдущих моделей, эта предобучена на ImageNet и собственном датасете от Deepmind Kinetics-700, в котором 650 тысяч клипов и 700 классов. Это обеспечивает крайне быструю сходимость модели в несколько часов к хорошему качеству.

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

Мы подаем в модель 16 кадров, а не 64. Раньше у нас был квадратный вход, но, учитывая специфику платформы, мы поменяли соотношение сторон входа на 16:9. Задача — бинарная классификация, где нулевой класс — это не порно, а единичный — порно. Обучали с помощью SGD с моментумом, он показал себя чуть лучше Адама. Аугментации минимальные — горизонтальные флипы и JPEG-компрессия. Тут ничего особенного.

Завершая тему моделей — после I3D еще выходили модели EVANet — Neural Architecture Search для последовательности кадров, SlowFast Networks — сеть с двумя каналами с разным фреймрейтом, и статья Google AI — Temporal Cycle-Consistency Learning , но мы их не исследовали.

На чём обучали-то?


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

Датасет состоит из видео — значит, надо откуда-то взять видео. Есть два варианта, как их получить: скрапинг с порносайтов и ютуба и сбор видео вручную. У каждого из подходов есть свои плюсы и минусы.

Скрапинг обеспечит нам потенциально гораздо большее разнообразие в данных, и мы можем получить разметку достаточно дёшево, сказав, что все кадры всех видео с условного порнхаба — небезопасные, а все кадры всех видео с ютуба — безопасные. Есть минусы — это всё надо где-то хранить, из этого надо как-то собирать датасет, и самое существенное — в наивной разметке порнороликов есть шум. Это как прямые ошибки: интро, сцены, где все одеты, крупные планы без половых признаков, меню хентай-игр — так и элементы, на которые модель может переобучиться: логотипы, черные экраны, монтажные склейки. Такого шума несколько процентов, и в случае терабайтов видео избавиться от него дорого. Об этом мы ещё поговорим.

Второй подход — это ручная сборка. Ее плюсы заключаются в том, что мы можем моделировать любое желаемое распределение данных, данные более предсказуемы, и их проще размечать просто потому, что их меньше. Но есть и минусы. Очевидно, данных при таком подходе получается меньше, и помимо этого они могут страдать от bias’а сборщиков, так как он моделирует распределение и может что-то упустить.
Мы выбрали второй подход. Составили список того, что потенциально могло бы оказаться на стриминговой платформе: самые разные игры, анимация, аниме, игра на музыкальных инструментах, реакции, мемы, хайлайты стримов — и попытались покрыть самые разные возможные типы небезопасного контента — от чего-то обычного до трэша в духе порно с птеродактилями. Отдельно упомянули компьютерные игры, по которым часто делают 3д-хентай — Overwatch, например. И начали собирать. В итоге могу выделить два инсайта.

Фетишисты — неплохие сборщики данных


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

Да и ютуберы тоже


Пример раз: на ютубе есть компиляции хайлайтов стримеров, иногда они покрывают отдельный год, длятся часами и содержат под тысячу монтажных склеек, т.е. сцен. Пример два: топы игр/аниме/сериалов. Скажем, вам надо внятно объяснить нейросети, что такое аниме. При этом в Японии огромное количество студий, стиль которых прогрессирует с каждым годом. Решение — скачать видео с топами аниме за отдельные годы от известного ютубера. Или вам нужно покрыть разнообразие сцен из популярной игры. Идете и качаете ролик например videogamedunkey по этой игре.

Итерации данных


У нас было несколько итераций данных. Сначала это было около ста видео хронометражом около 70 часов с наивной разметкой “все кадры с порносайтов — порно, всё с ютуба — непорно”, из которых мы более-менее равномерно сэмплировали последовательности кадров для датасета.

Обученная таким образом модель работала неплохо, но из-за шума в данных первые модели выдавали ошибки на разного рода логотипах, черных экранах и одетых девушках на черном кожаном диване ( ͡° ͜ʖ ͡°). Особенно сбивали с толку черные экраны со скором 0.817, но оказалось, что в данных была ошибка — в одной из компиляций порно автор случайно отрендерил видео на десять минут дольше нужного, в итоге в трейне было много “опасных” черных экранов.

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

Как размечали — почти для всех роликов использовали инструмент от OpenCV CVAT.

Пять копеек про CVAT
Расшифровывается как Computer Vision Annotation Tool. Разрабатывается в Нижнем Новгороде. Запускается в докере, можно сделать свою мини-Толоку. Проблема — он предназначен для сегментации и детекции, но не для классификации. Пришлось парсить их XML. Потом написали для разметчика свой простенький инструмент.


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

Отлично, у нас есть сырые размеченные данные! Как нам из них получить хороший датасет? Ролики разной длины, для каждой категории собраны видео разного хронометража и степени разнообразия — как это всё связать воедино? Сколько сэмплов мы можем взять из датасета? Его разнообразие как-то фундаментально ограничено (как максимум количеством кадров видео), как нам понять, что мы берем лишнего?

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

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

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

Давайте будем искать монтажные склейки

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

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

Собрали датасет из 20000 сэмплов в трейне, 2000 в валидации и 2000 в тесте, обучили модель, нам понравились метрики на тесте, отправили в продакшн.

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

Это и есть данные со звездочкой. Они позволили нам заточиться на разнообразный контент платформы и снизить нагрузку на модераторов. Теперь в основном ложные срабатывания происходят на новых играх — так, мы одно время чаще ловили Death Stranding и Valorant.

Текущий датасет состоит из 30000/5000/3000 сэмплов train/val/test.

Эволюция наших метрик на нашем тесте, разбитым по категориям, и сравнение с открытыми решениями (кликабельно)


В качестве метрики мы используем f1-меру с подвохом. Мы стараемся делать так, чтобы precision наших моделей стремился к единице, и в таком случае f1-мера становится прокси полноты.



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

Fin.



Видеоверсию материала можно увидеть здесь
МТС
Компания

Комментарии 45

  • НЛО прилетело и опубликовало эту надпись здесь
      +3
      А как же мануальное тестирование?
        +5
        Как я уже писал выше, с данными туго. Никто их публиковать не хочет, это сложно с юридической и этической точек зрения — начиная от лицензий и заканчивая согласием каждого причастного к контенту лица.

        То есть я правильно понимаю, что свой датасет вы тоже публиковать не будете?

          +1
          Короткий ответ — пока таких планов нет
            0
            Без тестирования непонятно какая будет точность определения контента. Как вариант берите записи готовых стримов и прогоняйте тесты. Без тестов и, хотя бы примерных данных о точности толку мало.
              0
              Тестовый датасет есть, мы просто пока не планируем его выкладывать. Метрики на нем указаны на графике под спойлером в конце статьи. Из него можно понять а) какие категории данных есть в датасете б) как наши решения ведут себя в сравнении с открытыми.
                0

                Слайды, Слайды. Были слышны выкрики из зала (Ц)


                Технологии это конечно прекрасно, но еще не мешает культуру нести в массу.
                Просто не понятно с культурной части зачем пихать порно-контент туда где он особо и не нужен.


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


                Третий момент, не можешь победить возглавь. Может стоит делиться пользовательским контентом? Конечно на сторонней плащадке))

                  0
                  Сырые и размеченные данные — два разных зверя. Не все кадры в порно порнографического содержания, об этом я более подробно говорю в статье. Туго именно с размеченными данными.
                    0

                    Контекст важен. Девушки в машине в фильмах)

          +3
          А кто знает, насколько легально использовать эти данные для обучения сети? Ну т.е. навряд ли в пользовательском соглашении ютуба и порносайтов оговорено, что они прямо разрешают использовать их контент в посторонних целях, пусть и для автоматизированного деперсонализированного анализа. Может быть какой-нибудь известный актер боится, что его одетые видео теперь будут баниться на одной из платформ в России, т.к. нейросеть переобучится на его бэкграунде? И совершенно не хочет, чтобы его лицо участвовало в обучении нейросетей?
          Понятно, что так делают практически все, но в каком сейчас состоянии законодательство на этот счет?
            +14
            Конечно не легально. Нейросети то 18-ти нет.
              –6

              Какой смысл рассуждать о легальности, если никто не узнает о факте использования?

                +12
                О-о, так далеко можно зайти.
            • НЛО прилетело и опубликовало эту надпись здесь
                +5

                Лучше бы научили нейросеть искать самое отпадное порно

                  +3

                  Слишком субъективная вещь, под каждого человека долго подгонять.

                    +5

                    Скорее научатся генерировать индивидуальное. Обучение с учителем :)


                    P.S. И хорошо если с осознанным обучением типа кнопок лайк/дизлайк, а не по физиологическим признакам с фитнес браслетов и камер, плюс скорость реакции на дизлайк :)

                      0
                      Скорее научатся генерировать индивидуальное. Обучение с учителем :)

                      До этого ещё очень далеко: раз, два.

                  0

                  Я не разбираюсь в теме, а звук не помогает? По моему его проще анализировать, но он может дать довольно большой прирост качества, а иногда и скорости(мне кажеться))
                  Извините, если в статье есть про это, со второй половины читал по диагонали.

                    +8

                    Могут начать банить видеозаписи матчей по теннису.

                      +2

                      Или серии винкс :)

                      +1
                      Звука в видео может и не быть.
                        0
                        А что делать, если видеоряд идет под музыку, в тишине, или в других неочевидных условиях?
                          +2

                          На PornHub иногда заливают музыкальные клипы с NSFW-видеорядом, а некоторые клипы(SFW-версия) изначально содержат контент "на грани".

                          +11
                          60-е годы двадцатого века: System/360, хиппи, сексуальная революция… 20-е годы двадцать первого века: сотни тех 360 в кармане, нейросети, используем их для цензуры сексуального контента. Печалька.
                            +2

                            Первая половина 19-го века: лошади, мустанги, ковбои, прерии и просторы дикого запада, фронтир, приключения и исследования.
                            20-е годы двадцать первого века: сотня лошадей под капотом самого захудалого А-класса ограничение <100 км/ч на >99.5 мировых автодорог, все уголки планеты исследованы, путешествия — теперь commodity ширпотреб, а космос или глубины океанов — удел немногочисленных смельчаков.

                              +10
                              Плохая аналогия подобна котёнку с дверцей.
                            0

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

                              0
                              Речь не о твитче, а о нашей платформе — твитч был упомянут для упрощения понимания кейса. Модель ускоряет время реагирования модераторов васда, так как они получают алерты в прямом эфире
                              0
                              Есть несколько вопросов:
                              1) сколько по времени от начала и до завершения проекта? и если есть возможность то временные рамки этапов (сбор данных, разметка, итд)
                              2) система банит автоматом или подсовывает оператору видео и тот уже принимает решение?
                                0
                                Первая итерация была реализована за месяц с небольшим, и она работала довольно неплохо. Это был сбор первой итерации данных, более-менее сбалансированная нарезка, поиск моделей, эксперименты, написание какой-то обвязки. Дальше в течение года велись доработки, улучшение качества кода, серверного бэкенда, создание вышеупомянутого пайплайна, потихоньку пополняли каталог видео. Благодаря подходу с компиляциями видео разметка шла относительно быстро.

                                На сегодняшний день система не банит автоматом. Модераторы получают уведомления в прямом эфире. Никто не хочет повторения кейса tumblr
                                +2
                                Датасет состоит из видео — значит, надо откуда-то взять видео. Есть два варианта, как их получить: скрапинг с порносайтов и ютуба и сбор видео вручную.

                                Есть же и третий вариант — создать самому :D

                                  0

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

                                  +1
                                  Хм, а как насчет порно где сумоисты занимаются сексом на ринге, и на голове каждого надета пиратская шляпа?))
                                  0

                                  И первая же мысль "любопытно — а как оно с какой-нибудь Байонеттой, ложноположительно не срабатывает ли?"

                                    0
                                    Да вроде нормально, не замечали особых срабатываний на условных бронелифчиках, панцушотах и zettai ryouiki. К тому же опять же, у нас есть система для дообучения на фолс позитивах, даже если на чем-то валимся, мы это исправляем
                                    0
                                    Так все же, чем порно отличается от непорно?
                                    Тверкающая девушка — не порно. А если на заднем плане перед тверкающей девушкой стоит некто?
                                    Если в кадре нет половых органов, можно ли однозначно утверждать, что это непорно?
                                    Демонстрация половых органов без цели возбуждения (в медицинском аспекте, например) — порно?
                                    Т.е., как вы формализовали разметку?
                                    Как можно потестить на предмет ложнопозитивных \негативных?
                                      +1
                                      Как можно потестить на предмет ложнопозитивных \негативных?

                                      Запилить соответствующие стримы и ждать результатов ))
                                        0

                                        Фетишисты внесут шум

                                        0
                                        Буду отвечать в удобном порядке.
                                        Демонстрация половых органов без цели возбуждения (в медицинском аспекте, например) — порно?

                                        Может быть, это и не порно, но это точно небезопасный контент, который мы хотим обрабатывать (и скорее всего банить). Напоминаю, мы не блокируем стрим автоматически, мы ускоряем работу модераторов с помощью алёртов.
                                        Если в кадре нет половых органов, можно ли однозначно утверждать, что это непорно?

                                        Если в кадре нет ни первичных, ни вторичных половых признаков, мы размечали кадр как непорно. Например, если речь идет о крупном плане на участника процесса. Да, у него/нее странная гримаса, ну и что? Столько сейчас «безопасных» мемов из порно, что не хочется на это переобучаться. Вы КДПВ-то вообще видели :)?
                                        Как можно потестить на предмет ложнопозитивных \негативных?

                                        Никак из-за прослойки в виде человека-модератора
                                        Тверкающая девушка — не порно. А если на заднем плане перед тверкающей девушкой стоит некто?

                                        Это пример далеко из хвоста распределения :). При отлове таких случаев решаем с бизнесом.
                                          –1
                                          Ну в общем, все идёт по заветам Пелевина. SNUFF не за горами, прямым путем идем к дерпантину.
                                          Заголовок спойлера
                                          Сегодня в дерпах заняты специальные актеры, которые много лет занимались по системе Станиславского. Во время съемок они всего лишь воображают, что видят детскую порнографию. Это оговорено в дисклеймере.

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

                                        0

                                        Вспомнил про приложение шазам хотдогов в "кремниевой долине"…
                                        https://www.youtube.com/watch?v=HEHoz39Je44

                                          0
                                          Интересно, а если добавить в видео что-то вроде цветового шума, то сломается ли модель? Т.е. если специально «помешать» распознать картинку ради обхода цензуры.

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

                                          Самое читаемое