Полное тестирование нескольких API для фильтрации изображений различных категорий, таких как нагота, порнография и расчленёнка.



Человек сразу понимает, что некое изображение является неуместным, то есть NSFW (Not Safe For Work). Но для искусственного интеллекта всё не так ясно. Много компаний сейчас пытаются разработать эффективные средства для автоматической фильтрации такого контента.

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

  • Откровенная нагота
  • Суггестивная нагота (то есть наводящая на мысли об откровенной наготе — прим. пер.)
  • Порнография / половой акт
  • Имитация / анимированное порно
  • Расчленёнка (gore) / насилие

Tl;DR: Если просто хотите узнать лучший API, то можете сразу перейти к сравнению в конце статьи.

Условия эксперимента


Набор данных. Для оценки я собрал свой набор данных NSFW с равным количеством картинок в каждой подкатегории NSFW. Набор данных состоит из 120 изображений с 20 положительными изображениями NSFW для каждой из пяти упомянутых категорий, и 20 изображений SFW. Я решил не использовать общедоступный набор YACVID 180, поскольку он в основном основан на использовании наготы в качестве меры контента NSFW.

Собирать картинки NSFW утомительно, это очень долгая и совершенно мучительная задача, чем объясняется малое количество изображений.

Набор данных доступен для загрузки здесь. [Предупреждение: содержит откровенный контент]

Здесь таблица с необработанными результатами для каждого API и каждого изображения в наборе данных.


Метрики


Каждый из классификаторов оценивается по общепринятым метрикам:

Истинно положительные: TP


Если классификатор называет что-то NSFW и это на самом деле NSFW.

Истинно отрицательные: TN


Если классификатор называет что-то SFW, и это на самом деле SFW.

Ложноположительные: FP


Если классификатор называется что-то NSFW, а это на самом деле SFW.

Ложноотрицательные: FN


Если классификатор называет что-то SFW, а это было на самом деле NSFW.



Точность (accuracy)


Если модель делает прогноз, можно ли ей доверять?

Безошибочность (precision)


Если модель говорит, что изображение NSFW, как часто это правильный прогноз?

Отзыв (recall)


Если все образцы являются NSFW, сколько она идентифицирует?

Оценка F1


Это смесь безошибочности и отзыва, часто похожая на точность.



Оценивались следующие API для модерации контента:


Производительность по категориям


Сначала я оценил каждый API по всем категориям NSFW.

Порнография / половые акты


Google и Sightengine API здесь действительно хороши. Они единственные верно распознали все порнографические изображения. Nanonets и Algorithmia немного отстали с результатом 90%. Microsoft и Imagga показали худшую производительность в этой категории.





Изображения, которые легко идентифицировать, явно порнографические. Все API правильно распознали картинки выше. Большинство из них предсказали NSFW с очень большой уверенностью.



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

Откровенная нагота


Большинство API удивительно хорошо справилось со многими картинками в этой категории, показав уровень обнаружения 100%. Даже самые низкоэффективные API (Clarifai и Algorithmia) показали 90%. Определение наготы всегда было предметом дискуссий. Как видно по результатам, системы обычно терпят неудачу в сомнительных случаях, когда есть вероятность, что изображение всё-таки SFW.





На простых изображениях чётко видна явная нагота. Кто угодно назовёт их NSFW без вопросов. Ни один API не допустил ошибки, а средний балл составили 0,99.



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

Суггестивная нагота


Google опять победил с уровнем обнаружения 100%. Sightengine и Nanonets проявили себя лучше остальных с показателями 95% и 90%, соответственно. Автоматические системы распознают суггестивную наготу почти так же легко, как и явную. Они делают ошибку на картинках, которые обычно выглядят как SFW, лишь с некоторыми признаками наготы.





Опять ни один API не ошибся на явных изображениях NSFW.



В суггестивной наготе API разошлись во мнениях. Как и в явной наготе, у них оказались разные пороги терпимости. Я и сам не уверен, признавать эти картинки SFW или нет.

Имитация / анимированное порно


Все API исключительно хорошо здесь справились с задачей и обнаружили 100% примеров имитации порно. Единственным исключением стала Imagga, которая пропустила одно изображение. Интересно, почему API так хорошо работают на этой задаче? Видимо, алгоритмам легче идентифицировать искусственно созданные изображения, чем естественные.





Все API показали отличные результаты и высокие оценки уверенности.



Единственное изображение, на котором ошиблась Imagga, можно интерпретировать как не порно, если не смотреть на него достаточно долго.

Расчленёнка


Это одна из самых сложных категорий, так как средняя эффективность обнаружения через API составила менее 50%. Clarifai и Sightengine превзошли конкурентов, верно обнаружив 100% изображений этой категории.





Лучше всего API справились с медицинскими изображениями, но даже на самом лёгком из них ошиблись 4 из 12 систем.



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

Безопасные картинки


Безопасными считаются изображения, которые нельзя идентифицировать как NSFW. Сбор данных сам по себе труден, ведь эти картинки должны быть близки к NSFW, чтобы хорошо оценить API. Можно спорить, являются ли все эти изображения SFW или нет. Здесь Sightengine и Google показали худший результат, что объясняет их отличную производительность в других категориях. Они просто называют все сомнительные картинки NSFW. С другой стороны, Imagga тут хорошо справилась, потому что ничего не называет NSFW. Очень хорошо себя проявил также X-Moderator.




Ссылки на оригинальные изображения: SFW15, SFW12, SFW6, SFW4

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


Ссылки на оригинальные изображения: SFW17, SFW18, SFW10, SFW3

На всех трудных для идентификации изображениях SFW демонстрируются более обширные участки кожи или это аниме (системы склонны считать аниме порнографией). Большинство API посчитали изображения с большой площадью оголённого тела как SFW. Возникает вопрос, действительно ли это SFW?

Общее сравнение


Глядя на эффективность API во всех категориях NSFW, а также на их эффективность в правильном распознавании SFW, можно сделать вывод, что лучший результат по F1 и лучшая средняя точность у системы Nanonets: она стабильно хорошо работает во всех категориях. Система Google показывает исключительно хороший результат в категориях NSFW, но слишком часто отмечает безопасные картинки как NSFW, поэтому получила штраф по метрике F1.







По разработчикам


Я сравнил 5 лучших систем по точности и баллу F1, чтобы оценить различия в их производительности. Чем больше площадь лепестковой диаграммы, тем лучше.

1. Nanonets


Система Nanonets не заняла первое место ни в одной категории. Однако это наиболее сбалансированное решение. Наиболее слабое место, где можно ещё поработать над ней — это точность распознавания SFW. Он слишком чувствительна к любому обнажённому участку тела.



2. Google


Система Google лучше всех в большинстве категорий NSFW, но хуже всех в обнаружении SFW. Хочу отметить, что выборку для тестирования я взял с Google, то есть она «должна знать» эти изображения. Это может быть причиной действительно хорошей производительности в большинстве категорий.



3. Clarifai


Clarifai действительно блистает в определении расчленёнки, опережая большинство других API, система тоже хорошо сбалансирована и хорошо работает в большинстве категорий. Но ей не хватает точности в выявлении суггестивной наготы и порнографии.



4. X-Moderator


X-Moderator — ещё один хорошо сбалансированный API. Помимо расчленёнки он хорошо выявляет большинство других видов NSFW. Точность 100% в определении SFW, что выделяет эту систему среди конкурентов.



5. Sightengine


Как и Google, система Sightengine показала почти идеальный результат в идентификации NSFW. Однако не распознала ни одного изображения расчленёнки.



Цены


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



Amazon, Microsoft, Nanonets и DeepAI предлагают самые низкую цену $1000 в месяц для миллиона вызовов API.

Какой лучший API модерации контента?


Субъективный характер контента NSFW затрудняет определение победителя.

Для социального медиа общей тематики, которое больше ориентировано на распространение контента и нуждается в сбалансированном классификаторе, я бы предпочёл Nanonets API по самой высокой оценке F1 для классификатора.

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





Что такое NSFW на самом деле?




Потратив много времени на эту проблему, я понял одну ключевую вещь: на самом деле определение NSFW весьма размыто. У каждого человека будет собственное определение. Что считать приемлемым — в значительной степени зависит от того, что предоставляет собой ваш сервис. Частичная нагота приемлема в приложении для знакомств, но не ресчленёнку. А в медицинском журнале наоборот. Действительно серая область — суггестивная нагота, где невозможно получить правильный ответ.

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


  1. b00taNik
    30.11.2018 15:00

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

    А то совсем отчаялся — хоть сам пиши.


    1. Taraflex
      30.11.2018 19:51

      Stylebot + css

      img {
          filter: blur(30px);
          clip-path: inset(0px 0px);
      }
      

      не хватит?


      1. b00taNik
        30.11.2018 21:18

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


        1. Vi3heim6
          01.12.2018 10:00

          Перестать быть моралфагом не вариант?


          1. b00taNik
            02.12.2018 00:06

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


    1. Ava256
      01.12.2018 10:00

      А вы пробовали Adblock Plus? Вполне возможно что его будет достаточно.


      1. b00taNik
        02.12.2018 00:15

        Эдблоком только если вносить в фильтры все подряд, но из-за этого плывет верстка.


  1. mopsicus
    30.11.2018 21:22

    Делали распознавалку порно на аватарках пользователей, использовали немного переделанный пример из tensorflow. Обучили на 3к картинках — вполне неплохо справляется. Можно ещё улучшить, если разбить картинки на более точные категории и обучить на 10-20к штук.