Проверяем фото на наличие запрещенки

UPD: Когда мне после добавления этого загрузили в качестве профиля дик пик и при этом оказалось что алгоритмы этого сервиса посчитали его как безопасное фото, то пришлось перейти на AWS, кстати там тоже вполне себе тариф, вот ссылка

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


Как оказалось есть много способов это сделать, и вот некоторые из них:

1 - Написать и обучить свою нейросеть (это сразу в топку, просто я не гугл и у меня нет такого количества ресурсов,  знаний и особенно времени)


2 - Использовать какие-то куски кода с GitHub где что-то "распознается" (тоже в топку, код не мой, не понятно как оно работает и нет уверенности в завтрашнем дне, ну и опять же таки нужно еще и разобраться как оно у них работает)


3 - Использовать API cторонних сервисов, и тут мне стало интересно, так как в этом есть несколько плюсов, как минимум распознавание не очень желательного контента будет не на моем сервере, что значительно позволит действовать более выгодно в плане экономики😁


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


- Amazon Rekognition

- Google

- Microsoft

- Yahoo

- Algorithmia

- Clarifai

- DeepAI

- Imagga

- Nanonets

- Sightengine

- X-Moderator


Так как на основной части некоторых сервисов из списка я уже был и использовал все лимиты, я выбрал Imagga API, начал читать доки и оказалось что все проще чем я думал, по факту вы отправляете им картинку, а они вам в ответ возвращают JSON в котором помимо другой инфы и есть то что мне нужно, процент увиденной запрещенки на фото, от него я и могу отталкиваться.


Внимание: Все что дальше идет взято из доков, так что если вы их прочитали то все что ниже вам уже не нужно😁


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


1 - После регистрации вам выдадут api_key и api_secret, его нужно будет сохранить от сторонних глаз

1 - Лимит, перед тем как отправлять на проверку фото и тратить время можно проверить а не уперся ли я в лимит, и как оказалось это вполне реализуемо, их API предоставляет хорошие доки по API эндпоинтам:

Проверяем фото на наличие запрещенки Распознавание, Python, Знакомства, Длиннопост

Для проверки лимитов нужно обратиться к эндпоинту /usage, сделать это можно многими языками программирования, та даже curl подойдет, я выбрал python (пример по факту взят из тех же доков)

Проверяем фото на наличие запрещенки Распознавание, Python, Знакомства, Длиннопост
в account_data.json()['result'] - хранится определенное количество данных, вот вырезка из доков по ним:
billing_period_end - the date on which your current billing period ends;
billing_period_start - the date on which your current billing period begins;
concurrency - a JSON object, containing the current and maximal concurrency;
daily - a JSON object, containing all days (in Unix time) that you had usage;
daily_for - the current date;
daily_processed - count of successfully processed images for today;
daily_requests - count of sended requests for today;
last_usage - last usage date (in Unix time);
monthly - a JSON object, containing all months (in Unix time) that you had usage;
monthly_limit - your monthly limit of images to process;
monthly_processed - count of successfully processed images for your current billing period;
monthly_requests - count of sended requests for your current billing period;
total_processed - count of successfully processed images from your subscription date until now;
total_requests - count of sended requests from your subscription date until now;
weekly - a JSON object, containing all weeks (in Unix time) that you had usage;
weekly_processed - count of successfully processed images for the current week;
weekly_requests - count of sended requests for the current week;

Зная эти данные уже можно городить проверки и проверки проверок на лимиты, а вот теперь по самом распознавании, все так же просто:

Проверяем фото на наличие запрещенки Распознавание, Python, Знакомства, Длиннопост

Тут мы просто вычитываем все байты из картинки, отправляем их на сервера, там оно собирается в кучу и анализируется сервисом, в ответ приходит JSON, вот данные:


[{'confidence': 97.8026885986328, 'name': {'en': 'nsfw'}}, {'confidence': 2.19188809394836, 'name': {'en': 'underwear'}}]


Этот вывод говорит что картинка на 97.8026885986328 процентов nsfw (не безопасная)

оперируя этими данными и можно сделать проверки. Если не найдете адекватное  обьяснение по выводу то вот - https://docs.imagga.com/#nsfw_beta-categorizer, в целом можно было бы намного больше написать, но это все уже написали в документации.