Отображение слишком большого количества «скинов» в программном обеспечении - PullRequest
31 голосов
/ 04 ноября 2008

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

Ответы [ 14 ]

37 голосов
/ 05 ноября 2008

Лучше всего иметь дело с изображением в цветовом пространстве 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);
34 голосов
/ 05 ноября 2008

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

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

21 голосов
/ 04 ноября 2008

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

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

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

15 голосов
/ 04 ноября 2008

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

11 голосов
/ 05 ноября 2008

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

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

6 голосов
/ 17 февраля 2009

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

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

5 голосов
/ 05 ноября 2008

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

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

3 голосов
/ 05 ноября 2008

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

3 голосов
/ 05 ноября 2008

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

Подсказка по архитектуре:

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

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

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

1 голос
/ 05 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...