e
В одном из эпизодов сериала «Чёрное зеркало» женщина использовала для своей дочери систему, которая блокировала все жестокие, негативные или неподобающие жизненные реалии. Возможно, скоро нейросети действительно будут помогать в родительском контроле: во всяком случае, исследователь Пранит Бедапуди (Praneeth Bedapudi) уже научил их ставить цензуру на фотографиях с обнажёнными людьми.
Классификацию изображений реализовать достаточно легко, если пользоваться библиотеками Deep Learning и огромным числом готовых решений с открытым исходным кодом. То есть, если у вас есть готовый датасет для тестирования и проверки классификационных моделей. Но получить набор данных для конкретной задачи иногда бывает затруднительно. Обнаружение обнажённой натуры и NSFW (Not safe/suitable for work, что означает Небезопасно/неподходящее для работы) — как раз одна из таких проблем, для которых почти нет датасетов в открытом доступе.
В первой части этого проекта мы собираем данные и реализуем обнаружение цензуры с помощью классификации. Во второй части мы научим нейросеть определять «приватные» участки изображений и скрывать их с помощью алгоритма детектирования объектов.
Что мы делаем: наша цель — создать хороший набор с открытым исходным кодом и предоставить предварительно обученную на нём модель.
Зачем: мы верим, что для этой задачи не нужно изобретать велосипед. На момент публикации статьи мы нашли всего два решения для обнаружения цензуры — open_nsfw от Yahoo и nsfw_model от разработчика с ником GantMan. Модель Yahoo давно устарела, а её исходные данные недоступны. Сеть GantMan появилась, когда мы уже начали наш проект — сравнение с ней можно посмотреть ниже.
Мы решили начать с Reddit. Составили список NSFW разделов, собранных в основном с сайта scroller (его специально сделал разработчик с ником faroix). После загрузки и просмотра (не рекомендуется детям и слабонервным) с помощью приложения RipMe около 1000 изображений из каждого раздела мы обнаружили серьёзную проблему. Почти все фотографии были очень высокого разрешения, и их общий размер составил ~260 ГБ. Но встречались и снимки плохого качества. Чтобы как-то уравновесить их, мы добавили скриншоты из видео с PornHub. Это необходимо для того, чтобы впоследствии нейросеть могла распознавать цензуру на изображениях любого качества.
Пока мы проделывали эту работу, другой энтузиаст GantMan выложил в открытый доступ модель, обученную на собранных alexkimxyz данных. Поэтому мы связались с ним и получили его датасет.
# Изменение размера и удаление дубликатов mogrify -geometry x320 * fdupes -rdN ./
Используя эти команды для нормализации изображений и удаления дубликатов, мы получили 178601 снимков из PornHub, 121644 из Reddit и 130266 из набора данных GantMan.
Мы думали, что на этом самая сложная часть работы закончилась, но мы ошибались. Поскольку нейронные сети пытаются уменьшить потери, отсутствие большого количества фотографий в «безопасной» категории приведёт к тому, что наша модель будет просто детектировать людей.
Поэтому нам понадобились изображения с необнажёнными людьми. Немного подумав, мы решили, что наиболее подходящим для их сбора местом будет Facebook. Мы просканировали фотографии профилей с помощью Graph API и составили список безопасных разделов, отобрав для каждого из них ~1000 изображений с помощью RipMe. После изменения размера и удаления дубликатов мы получили 68948 снимков из Facebook, 98359 из набора данных GantMan и 55137 из Reddit.
Мы использовали отличную библиотеку для дополнения изображений Augmentor вместе с fit_generator из Keras.
Следующий фрагмент кода демонстрирует дополнение обучающей выборки:
# Случайный поворот, увеличение, шум, контраст, искажение и яркость pipeline.rotate(probability=0.2, max_left_rotation=20, max_right_rotation=20) pipeline.flip_left_right(probability=0.4) pipeline.flip_top_bottom(probability=0.8) pipeline.zoom(probability=0.2, min_factor=1.1, max_factor=1.5) pipeline.random_distortion(probability=0.2, grid_width=4, grid_height=4, magnitude=8) pipeline.random_brightness(probability=0.2, min_factor=0.5, max_factor=3) pipeline.random_color(probability=0.2, min_factor=0.5, max_factor=3) pipeline.random_contrast(probability=0.2, min_factor=0.5, max_factor=3) pipeline.skew(probability=0.2, magnitude=0.4)
Для обучения мы использовали GTX 1080Ti, 12 ГБ VRAM и 64 ГБ системной памяти. Размер пакета установлен на 32 с Xception, а размер входных изображений — 256х256.
Примечание: Классификационные модели в Keras не используют регуляризацию. То есть, они не вводят дополнительные ограничения, исключающие ошибки в данных и позволяющие избежать переобучения. Чтобы добавить регуляризацию (Dropout или L2), запустите цикл по каждому слою:
# Для l2 for layer in model.layers: layer.W_regularizer = l2(..) # Или для dropout: добавьте dropout между полностью связанными слоями # и переопределите модель с помощью функционального API.
Применяя SGD (стохастический градиентный спуск) с моментом (momentum), модель достигает точности 0.9347 по данным GantMan.
Найти правильные данные для оценки такой модели очень сложно. Визуализация наготы имеет тысячи вариантов (см. Правило 34), и создать всеобъемлющую тестовую выборку практически невозможно. Но хотя бы для понимания того, как работает нейросеть, мы использовали данные, собранные Aditya Ananthram. На самом деле даже они не слишком подходят для тестов. Самый действенный способ протестировать и улучшить подобную модель — использовать помощь сообщества. Поскольку тестовые данные находятся в разных категориях, мы отображаем классы “nsfw_porn”, “nsfw_explicit_nudity”, “nsfw_simulated_porn” в категории «ню» (“nude”), а «sfw» - в «безопасной» (“safe”).
Для оценки модели с тестовой выборкой GantMan мы отнесли классы “hentai”, “porn” к категории «ню», а “drawings”, “neutral”, “sexy” — к «безопасной».
Как ни странно, все три проекта получили одинаковые оценки, хотя допускали ошибки на разных изображениях. Например, модель GantMan терпит неудачу со снимками Джеффа Голдблюма, а NudeNet – нет. Точно так же NudeNet не может классифицировать те изображения, с которыми справляется GantMan. За пару месяцев работы над этим проектом мы нашли множество примеров, на которых облачный API от Google с треском провалился. Поскольку большинство из них — NSFW, мы не можем вам их показать.
Спустя некоторое время мы нашли другой набор данных для проверки нейросети. Он показал следующие результаты:
Зачем: главный недостаток классификации изображений — отсутствие контроля над деталями. Если мы хотим работать только с определённой частью фотографии, то необходимо использовать алгоритмы по обнаружению объектов.
Предположим, что кто-то допускает размещение снимков с обнажённой грудью или ягодицами, но против демонстрации половых органов или каких-либо других комбинаций частей тела. Достичь этого только с помощью классификации невозможно, поэтому пришлось прибегнуть к распознаванию объектов. Мы использовали данные, собранные Jae Jin и его командой. В них содержится 5789 изображений со следующим распределением меток:
Мы дополнили датасет, случайным образом добавив к снимкам размытие, смещение и т. д.
Поскольку в данных наблюдается дисбаланс классов, для обнаружения объектов мы решили применить RetinaNet от FAIR. RetinaNet использует изменение кросс-энтропийной потери Focal Loss, которое предназначено для повышения эффективности одноэтапного обнаружения объектов.
Применив resnet-101 в качестве бэкэнда, мы получили представленные ниже результаты тестирования:
Нейросеть можно использовать как для обнаружения обнажённого тела, так и для цензуры. Поэтому мы тестируем её на тех же датасетах, с которыми проверяли классификатор. Если на изображении обнаружена любая из меток “BUTTOCKS_EXPOSED”, “*_GENETALIA_EXPOSED”, “F_BREAST_EXPOSED”, мы помечаем его как «ню», если нет — как «безопасное». Распределение меток выбрано в соответствии с тестовой выборкой. Например, снимки с обнажённой мужской грудью или животом представлены в категории “sfw”.
Детектор NudeNet работает лучше, чем Open NSFW, nsfw_model и классификатор NudeNet. В него добавлена функция, закрывающая нежелательные части nsfw-изображений. Пример её работы:
Проект NudeNet доступен на GitHub.
Предварительно обученные модели можно найти в папке /NudeNet-Models.
Для установки и использования нейросети выполните следующий фрагмент кода:
# Установка проекта pip install git + https://github.com/bedapudi6788/NudeNet # Использование классификатора from NudeNet import NudeClassifier classifier = NudeClassifier('classifier_checkpoint_path') classifier.classify('path_to_nude_image')
NudeNet можно использовать для цензурирования обнажённых фигур на любых изображениях, даже если они занимают совсем немного места на фотографии. Как вы могли заметить, сеть работает ещё и с анимационным контентом, что делает её незаменимым инструментом для родительского контроля.
С оригинальной статьёй можно ознакомиться на сайте medium.com.
Многие предприниматели жалуются на сложный и слишком изобильный документооборот: много документов приходится оформлять. Но при…
Чтобы легально пользоваться результатами чужого труда в своем бизнесе, нужно за это заплатить. И неважно,…
Франшизы предоставляют предпринимателям возможность использовать популярные бренды, эффективные бизнес-модели и поддержку со стороны материнской компании.…
Некоторые компании сосредотачивают в своих руках и производственные мощности, и права на то, что на…
У любой компании есть адрес, по которому она «прописана», то есть зарегистрирована в ЕГРЮЛ. Но…
Подросток может заниматься бизнесом, но с учетом важных условий, прописанных в законе. Разбираемся, как несовершеннолетнему…