
Nosso caso é um site de streaming para jogadores, e-esportistas e fãs de transmissões ao vivo do formato Twitch.tv . Alguns usuários transmitem conteúdo de entretenimento, enquanto outros assistem. O conteúdo pode ser muito diferente: jogos, música ao vivo, interativo, mukbang, ASMR, culinária, podcasts, etc. - e, em princípio, não é limitado por nada, exceto a imaginação do streamer.
E as regras da plataforma, que são monitoradas pelos moderadores.
Por que moderar conteúdo inseguro? Há duas razões para isso. O primeiro é a atual legislação russa , segundo a qual a distribuição de pornografia é ilegal. O segundo motivo é a experiência do usuário . A plataforma é voltada para pessoas de todas as idades e não podemos pagar por conteúdo adulto na página inicial.
Quando nos deparamos com a tarefa de rastrear conteúdo não seguro, ficou imediatamente óbvio que não era tão fácil distinguir entre conteúdo seguro e não seguro. A primeira coisa que era importante entender era que pornografia e nudez não são conceitos idênticos.
A pornografia não é necessariamente sobre nudez: sexo com roupa é um conteúdo inseguro e, muitas vezes, só com o tempo é que pode ser distinguido de conteúdo "seguro".
A nudez não tem necessariamente a ver com NSFW: sumô, luta livre, pessoas vestidas de látex - tudo isso é conteúdo seguro, no qual soluções abertas costumam ser resolvidas incorretamente.
Com base nessas considerações, começamos a ver como esse problema pode ser resolvido. Das soluções de código aberto interessantes, o modelo Open NSFW do Yahoo, treinado em dados fechados, já existe há vários anos ( implementação em TF ). Há também um repositório aberto legal do raspador de dados nsfw de Alexander Kim , do qual você pode obter várias centenas de milhares de imagens do reddit, imgur e aparentemente alguns outros sites. As imagens são divididas em cinco classes: pornografia, hentai, erótica, neutra e desenhos . Com base nesses dados, existem muitos modelos, como o tempo, duas
soluções de código aberto sofrem de vários problemas - no geral, a baixa qualidade de alguns modelos, operação incorreta nos casos complexos mencionados e imagens seguras como twerking girls e memes com Ricardo Milos , bem como a revisão problemática, porque ou os modelos estão desatualizados e treinados em dados fechados, ou os dados são muito barulhentos e têm uma distribuição imprevisível.

Concluímos que o contexto temporal é importante para um bom modelo , ou seja, o contexto temporal, com o auxílio dele poderemos captar casos mais complexos na dinâmica. A declaração do problema se torna óbvia.
Reconhecendo ações
Em nosso caso, esta ainda é a mesma classificação binária, mas em vez de uma imagem, alimentamos uma sequência de quadros como entrada.
Como eles resolvem esse problema? No décimo oitavo ano, saiu uma excelente resenha de qure.ai, e parece que desde então não houve nenhum progresso radical no campo, então eu recomendo. Uma pesquisa mais interessante sobre o tema do vídeo tornou-se uma tarefa mais difícil de compreender e recontar o vídeo. Existem grades de gráficos e aprendizagem auto-supervisionada - o segundo dia no último Machines Can See foi totalmente dedicado a isso .
Então, a classificação das ações. A história do progresso nos modelos de redes neurais é aproximadamente a seguinte: primeiro, eles treinaram redes convolucionais tridimensionais do zero (C3D), depois começaram a tentar convoluções com algum tipo de arquitetura recorrente ou mecanismo de atenção; em algum ponto, Andrey Karpaty propôs mesclar visualizações de quadros diferentes de maneiras diferentes, mesmo depois tornou-se um padrão fazer modelos de duas cabeças, onde uma sequência de quadros em BGR / RGB é alimentada para uma entrada e um fluxo óptico denso contado para a outra . Também houve algumas piadas com o uso de recursos adicionais e camadas especiais como o NetVLAD. Como resultado, olhamos para os modelos com melhor desempenho no benchmark UCF101.onde os vídeos são categorizados em 101 ações coletivas. Este modelo acabou sendo a arquitetura I3D da DeepMind, combinou melhor com a gente, então contarei mais sobre isso.
DeepMind I3D
Como linhas de base, tentamos treinar C3D e CNN-LSTM - ambos os modelos levam muito tempo para aprender e convergem lentamente. Então pegamos o I3D e a vida melhorou. São duas redes convolucionais tridimensionais para BGR e fluxo óptico, mas há uma peculiaridade - ao contrário dos modelos anteriores, este é pré-treinado no ImageNet e seu próprio conjunto de dados da Deepmind Kinetics-700 , em que 650 mil clipes e 700 classes. Isso fornece uma convergência extremamente rápida do modelo em algumas horas para uma boa qualidade.
Na produção, usamos apenas um cabeçote RGB, já que é duas vezes mais rápido e o fluxo ótico não cai muito de qualidade, e em algum lugar pode ser ainda pior devido ao fato de que transmitimos principalmente uma tela de computador e webcams, onde o conteúdo às vezes bem estático.
Colocamos 16 quadros no modelo, não 64. Anteriormente, tínhamos uma entrada quadrada, mas levando em consideração as especificidades da plataforma, mudamos a proporção da entrada para 16: 9. A tarefa é uma classificação binária, onde a classe zero não é pornografia, mas a única é pornografia. Treinado com SGD com momentum, ele se saiu um pouco melhor do que Adam. Aumento mínimo - flips horizontais e compressão JPEG. Nada de especial aqui.
Completando o tópico de modelos - depois do I3D, ainda havia modelos EVANet - Busca de Arquitetura Neural para uma sequência de quadros, Redes SlowFast - uma rede com dois canais com taxas de quadros diferentes e um artigo do Google AI - Aprendizagem de Consistência de Ciclo Temporal , mas não os investigamos.
Sobre o que foi ensinado?
Como escrevi acima, os dados são limitados. Ninguém quer publicá-los, é difícil do ponto de vista jurídico e ético - desde as licenças até o consentimento de cada pessoa envolvida no conteúdo. Conjuntos de dados, suas licenças e publicação geralmente são divertidos. Se alguém quiser escrever um artigo sobre isso, eu adoraria lê-lo. Dos conjuntos de dados acadêmicos significativos, existe apenas o NPDI brasileiro e, infelizmente, é pequeno em volume, sua distribuição de dados não é suficientemente diversa, consiste em quadros-chave e o procedimento para obtê-lo não é dos mais fáceis. E também queremos um conjunto de dados do vídeo! Eu tive que montá-lo sozinho.
Um conjunto de dados consiste em um vídeo, o que significa que você precisa gravar um vídeo de algum lugar. Existem duas opções para obtê-los: raspagemde sites pornôs e YouTube e coleta de vídeos manualmente . Cada abordagem tem seus prós e contras.
A raspagem irá potencialmente nos fornecer muito mais variedade de dados, e podemos obter a marcação bem barata dizendo que todos os frames de todos os vídeos de um pornhub condicional não são seguros e todos os frames de todos os vídeos do YouTube são seguros. Existem desvantagens - tudo isso deve ser armazenado em algum lugar, um conjunto de dados deve ser coletado de alguma forma a partir disso, e o mais importante é que há ruído na marcação ingênua de vídeos pornôs. Ambos são erros diretos: introduções, cenas em que todos estão vestidos, close-ups sem características de gênero, menus de jogos hentai - assim como elementos para os quais um modelo pode retreinar: logotipos, telas pretas, cortes de edição. Esse ruído é de uma pequena porcentagem e, no caso de terabytes de vídeo, livrar-se dele é caro. Falaremos sobre isso mais tarde.
A segunda abordagem é a montagem manual. Suas vantagens são que podemos modelar qualquer distribuição desejada dos dados, os dados são mais previsíveis e é mais fácil rotulá-los simplesmente porque há menos deles. Mas também existem desvantagens. Obviamente, com essa abordagem, há menos dados e, além disso, podem sofrer viés de coletor, pois modela a distribuição e pode perder algo.
Optamos pela segunda abordagem. Fizemos uma lista do que poderia acabar em uma plataforma de streaming: uma grande variedade de jogos, animação, anime, tocar instrumentos musicais, reações, memes, destaques de stream - e tentamos cobrir uma ampla variedade de possíveis tipos de conteúdo inseguro - de algo comum a thrash no espírito da pornografia com pterodáctilos. Também mencionamos os jogos de computador, que costumam ser usados para hentai 3D - Overwatch, por exemplo. E eles começaram a coletar. Como resultado, posso destacar dois insights.
Fetichistas são bons coletores de dados
Existem muitas compilações em sites pornôs para todos os gostos, e cada vídeo pode conter trechos de centenas ou dois de vídeos completamente diferentes, o que permite obter um conjunto de dados semelhante ao scraping em termos de variedade e, ao mesmo tempo, é bastante barato marcá-lo.
E youtubers também
Momentos de exemplo: há compilações de destaques do streamer no YouTube, às vezes eles cobrem um ano separado, duram horas e contêm menos de mil edições, ou seja, cenas. Exemplo dois: tops de jogos / anime / séries. Digamos que você precise explicar claramente para as redes neurais o que é anime. Ao mesmo tempo, existe um grande número de estúdios no Japão, cujo estilo está progredindo a cada ano. A solução é baixar um vídeo com tops de anime de alguns anos de um youtuber famoso. Ou você precisa cobrir uma variedade de cenas de um jogo popular. Vá e baixe um vídeo, por exemplo, videogamedunkey para este jogo.
Iteração de dados
Tivemos várias iterações dos dados. No início, eram cerca de cem vídeos, com cerca de 70 horas de duração com a marcação ingênua “todos os frames de sites pornôs - pornografia, tudo do YouTube - culpa”, da qual amostramos sequências de frames mais ou menos uniformemente para o conjunto de dados.
O modelo treinado desta forma funcionou bem, mas devido ao ruído nos dados, os primeiros modelos deram erros em vários tipos de logotipos, telas pretas e garotas vestidas em um sofá de couro preto (͡ ° ͜ʖ ͡ °) . As telas pretas com o próximo 0.817 eram especialmente confusas, mas descobriu-se que havia um erro nos dados - em uma das compilações pornográficas o autor acidentalmente renderizou o vídeo dez minutos a mais do que o necessário, como resultado, havia muitas telas pretas "perigosas" no trem.
Como resultado, marcamos honestamente os dados e esses erros desapareceram. No contexto de raspagem, surge o pensamento de que, se durante a seleção manual de vídeo, tal erro ocorresse, como acontece com telas pretas, então ao raspagem de milhares de vídeos seria ainda mais difícil de rastrear.
Conforme observado - para quase todos os vídeos, usamos a ferramenta do OpenCV CVAT.
Cinco centavos sobre CVAT
Computer Vision Annotation Tool. . , -. — , . XML. .
Então, no decorrer do nosso trabalho, coletamos mais vídeos, atualizamos o catálogo de jogos e, como resultado, agora temos várias centenas de horas de vídeos em várias dezenas de categorias diferentes e sabemos que eles consistem em cerca de 30.000 cenas únicas, além de dados com um asterisco sobre os quais vamos conversar abaixo.
Ótimo, temos dados marcados brutos! Como obtemos um bom conjunto de dados deles? Vídeos de diferentes durações, para cada categoria, vídeos de diferentes tempos e graus de variedade são coletados - como juntar tudo isso? Quantas amostras podemos tirar do conjunto de dados? Sua diversidade é de alguma forma fundamentalmente limitada (como o número máximo de quadros de vídeo), como podemos entender que estamos levando muito?
No início do trabalho, não nos importamos muito com essas questões e apenas pegamos tantas amostras de cada vídeo de uma classe separada de modo que pornografia e não spot no conjunto de dados fossem aproximadamente iguais e o número de amostras fosse determinado intuitivamente ("bem, parece que várias vezes por minuto em quase todos os vídeos que algo radicalmente diferente acontece, vamos tirar 10.000 amostras ”), e então empiricamente usando as métricas dos modelos treinados.
Como resultado, tratamos dessas questões e acabamos com uma ferramenta bastante complexa para reunir conjuntos de dados de vídeo.
Em primeiro lugar, queríamos saber o quanto podemos extrair de nossas compilações de vídeo. É lógico que teremos um pouco mais de clipes usados para cortar amostras diferentes no corte.
Vamos procurar colas de edição
Foi possível utilizar apenas os picos da norma da diferença entre frames adjacentes, mas utilizamos uma rede aberta especificamente para localizar recortes - TransNet . Isso nos deu dois resultados: o primeiro é que aprendemos quantas cenas temos nos dados em princípio, e o segundo é que aprendemos quais categorias de dados têm menor diversidade. Completo hentai, minecraft e outras coisas.
Agora, nossa unidade de corte atômica não é um vídeo inteiro, mas uma cena... Isso nos permite coletar os mais diversos conjuntos de dados, equilibrados por categorias e classes, levando em consideração cenas seguras de vídeos pornôs. Os vídeos são agrupados em pastas de categorias e as cenas são amostradas igualmente para cada classe. Se adicionarmos novos vídeos ao conjunto de dados, o corte / exclusão adicional de amostras desnecessárias ocorrerá ao mínimo, o conjunto de dados não será recortado do zero. Muito confortável.
Coletamos um conjunto de dados de 20.000 amostras no trem, 2.000 na validação e 2.000 no teste, treinamos o modelo, gostamos das métricas do teste e o enviamos para produção.
Vamos falar um pouco sobre a produção - todos os dias verificamos dezenas de milhares de clipes, então mesmo um por cento dos falsos positivos pode enviar spam aos moderadores, então, por algum tempo, coletamos uma variedade de falsos positivos em um modelo com um limite de resposta ligeiramente inferior e, como resultado, obtivemos muitos dados reais. que usamos para treinamento adicional.
Estes são os dados com um asterisco . Eles nos permitiram focar no conteúdo diversificado da plataforma e reduzir a carga sobre os moderadores. Agora, a maioria dos falsos positivos ocorre em novos jogos - por exemplo, em um momento, éramos mais propensos a pegar Death Stranding e Valorant.
O conjunto de dados atual consiste em 30000/5000/3000 amostras de trem / val / teste.
Evolução de nossas métricas em nosso teste, dividida por categorias e comparação com soluções abertas (clicável)
f1- . , precision , f1- .

f1- . , precision , f1- .
Graças aos nossos detectores, o tempo de verificação de toda a plataforma pelos moderadores é reduzido várias vezes. Além da pornografia, pegamos nudez, logotipos de TV e transmissões esportivas, mas essas são histórias para outra época.
Fin.
Uma versão em vídeo do material pode ser vista aqui