Отображение слишком большого количества "кожи" в программном обеспечении

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

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

Michael Stum 04.11.2008 23:54

лол, для этого где-то должно быть применение!

Andrew Bullock 05.11.2008 00:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
2
5 320
14

Ответы 14

Я сомневаюсь, что существует какое-либо готовое программное обеспечение, которое может определить, загружает ли пользователь непослушную картинку. Лучше всего разрешить пользователям помечать изображения как «Только для взрослых» с помощью кнопки рядом с изображением. (Уточнение: я имею в виду пользователей, отличных от того, кто загрузил изображение - аналогично тому, как сообщения могут быть помечены как оскорбительные здесь, в StackOverflow.)

Также рассмотрите этот обзор попытки сделать то же самое в специализированном продукте: http://www.dansdata.com/pornsweeper.htm.

Ссылка, конечно, украдена из сегодняшнего подкаста StackOverflow :).

Вы действительно доверяете пользователям сайта проверять «злой бит», когда они загружают сомнительное изображение?

Peter M 04.11.2008 23:58

Я думаю, он имеет в виду, что другие пользователи будут отмечать это как оскорбительное / только для взрослых. (И копия будет отправлена ​​мне = D)

StingyJack 04.11.2008 23:59

@StingyJack или реализовать список пользователей, чтобы все это рассылать =)

Seiti 05.11.2008 01:03

Для этого есть готовая бесплатная программа, вот github.com/EugenCepoi/nsfw_api :)

eugen 14.10.2018 09:34

@eugen Этому ответу почти 10 лет, и я подозреваю, что стремительный рост ML означает, что теперь это гораздо более осуществимое предложение!

JSBձոգչ 16.10.2018 10:58

Мы не можем даже написать фильтры, которые обнаруживают грязные слова точно в блогах, и ваш босс просит для детектора порно? CLBUTTIC!

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

Craig 05.11.2008 00:01

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

NotMe 05.11.2008 00:33

Я думаю, вы подозреваете, что один и тот же алгоритм используется для изображений и слов. Людей вроде вас стоит задрать (что, как ни странно, звучит хуже, чем исходное слово, напоминает мне шутку о смерти от бонго-бонго :-)).

Tim Ring 10.11.2008 12:32

Боюсь, я не могу помочь вам указать правильное направление, но я помню, как читал об этом раньше. Это было в контексте того, что люди жаловались на то, что детские фотографии были пойманы и помечены ошибочно. По крайней мере, я могу дать вам надежду, что вам не придется изобретать колесо самому ... Кто-то еще шел по этому пути!

IIRC, решение заключалось в том, чтобы полностью запретить детские фотографии.

Joel Coehoorn 05.11.2008 00:20

Лучше всего работать с изображением в цветовом пространстве HSV (см. здесь для преобразования rgb в hsv). Цвет кожи у всех рас практически одинаков, меняется только насыщенность. Работая с изображением в HSV, вы можете просто искать цвет кожи.

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

Обновлено: для работы с зернистыми изображениями вы можете сначала выполнить средний фильтр на изображении, а затем уменьшить количество цветов, чтобы сначала сегментировать изображение, вам придется поиграть с настройками на большом наборе предварительно классифицированных (для взрослых или нет) изображения и посмотрите, как ведут себя значения, чтобы получить удовлетворительный уровень обнаружения.

Обновлено: Вот код, который должен делать простой подсчет (не тестировал, это быстрое мэшап некоторого кода от здесь и rgb до hsl здесь)

Bitmap b = new Bitmap(_image);
BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);
byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
byte* scan0 = (byte*)bData.Scan0.ToPointer();

int count;

for (int i = 0; i < bData.Height; ++i)
{
    for (int j = 0; j < bData.Width; ++j)
    {
        byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;

        byte r = data[2];
        byte g = data[1];
        byte b = data[0];

        byte max = (byte)Math.Max(r, Math.Max(g, b));
        byte min = (byte)Math.Min(r, Math.Min(g, b));

        int h;

        if (max == min)
            h = 0;
        else if (r > g && r > b)
            h = (60 * ((g - b) / (max - min))) % 360;
        else if (g > r && g > b)
            h = 60 * ((b - r)/max - min) + 120;
        else if (b > r && b > g)
            h = 60 * ((r - g) / max - min) + 240;


        if (h > _lowerThresh && h < _upperThresh)
            count++;
    }
}
b.UnlockBits(bData);

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

Kip 06.11.2008 17:18

Возможно, Порно Испытание дыхания будет полезен - как сообщается на Slashdot.

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

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

Думаю, мы тоже пойдем по этому пути.

Craig 05.11.2008 00:40

Или передайте его на аутсорсинг Mechanical Turk

John Sheehan 06.11.2008 08:36

По этому поводу есть дружелюбный мультфильм: ars.userfriendly.org/cartoons/?id=20081210

ConcernedOfTunbridgeWells 24.12.2008 20:19

Интересный вопрос с теоретической / алгоритмической точки зрения. Один из подходов к проблеме - пометить изображения, которые содержат большие участки телесного цвета (как объяснил Трулл).

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

Очень хорошее предложение. Его достаточно легко реализовать, и, вероятно, он будет работать довольно хорошо.

Hannes Ovrén 15.11.2008 16:42

Я знаю, что либо Flickr, либо Picasa реализовали это. Я считаю, что эта процедура называлась FleshFinder.

Совет по архитектуре этого:

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

Вы можете использовать обычный System.Drawing, если хотите, но если вам действительно нужно обработать много изображений, было бы лучше использовать собственный код и высокопроизводительную графическую библиотеку и P / вызывать процедуру из вашего сервиса.

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

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

Это интересный момент. Я слышал, как люди из Google раньше говорили, что при наличии достаточного количества данных все можно решить с помощью статистики. Алгоритмы не нужны всегда. Например, проверка орфографии на Google.com основана на статистике, а не на алгоритме проверки орфографии.

Craig 05.11.2008 00:54

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

Andrew Bullock 05.11.2008 01:27

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

Andrew Bullock 05.11.2008 01:28

@Trull: Вероятно, вы могли бы просеять SO gravatars для изображений, которые находятся в категории безопасных. В интернете полно тестовых изображений в категории "непослушные". :)

Bill the Lizard 05.11.2008 17:59

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

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

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

heltonbiker 13.12.2012 20:08

@heltonbiker А потом получаются пиар-катастрофы, такие как Facebook, который недавно блокировал изображения людей, обнаженных смотрел, хотя они и не были (заметьте, Facebook использует модераторов человек, а не программное решение). А кроме плохого пиара это просто попахивает цензурой. У каждого свое, но если бы мне потребовалось реализовать аналогичное решение, которое предпочитает ложные срабатывания, а не ложноотрицания, это могло бы стать основанием для отставки.

Konrad Rudolph 13.12.2012 20:38

Риган Ап-апид представил доклад на WorldComp '08 именно по этой проблемной области. Документ якобы здесь, но для меня время ожидания сервера истекло. Я присутствовал на презентации статьи, и он рассказал о сопоставимых системах и их эффективности, а также о своем собственном подходе. Вы можете связаться с ним напрямую.

Ах, на самом деле это может быть еще одна статья Ригана, но она все равно может быть полезной.

Rasmus Faber 05.11.2008 17:28

Толпа от Долорес Лабс может помочь вам. Я все время читаю их блог, потому что они, кажется, любят статистику и краудсорсинг и любят об этом говорить. Они используют механический турк Amazon для большей части своей обработки и знают, как обрабатывать результаты, чтобы получать правильные ответы. По крайней мере, загляните в их блог, чтобы увидеть несколько интересных статистических экспериментов.

См. Основополагающую статью «В поисках голых людей» Флека / Форсайта, опубликованную в ECCV. (Передовой).

http://www.cs.hmc.edu/~fleck/naked.html

Как упоминалось выше Биллом (и цитатой Крейга из Google), статистические методы могут быть очень эффективными.

Вы можете изучить два подхода:

  • Нейронные сети
  • Многовариантный анализ (MVA)

Подход MVA будет заключаться в получении «репрезентативной выборки» приемлемых изображений и неприемлемых изображений. Данные X будут массивом байтов из каждого изображения, Y будет назначен вами как 1 для неприемлемого и 0 для приемлемого. Создайте модель PLS, используя эти данные. Сопоставьте новые данные с моделью и посмотрите, насколько хорошо она предсказывает Y.

Вместо этого бинарный подход можно иметь несколько значений у (например, 0 = приемлемое, 1 = купальник / нижнего белья, 2 = порнографический)

Чтобы построить модель, вы можете взглянуть на программное обеспечение с открытым исходным кодом или есть ряд доступных коммерческих пакетов (хотя они, как правило, недешевы).

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

Удачи (и в худшем случае вы сможете потратить время на сбор непослушных картинок в качестве разрешенного и оплачиваемого занятия!)

Другие вопросы по теме