• English
  • Français (coming soon)
  • Deutsch (coming soon)
  • Español (coming soon)
  • Português (coming soon)
  • Italiano (coming soon)
  • 繁體中文 (coming soon)
  • 日本語 (coming soon)
  • Polski (coming soon)
  • Svenska (coming soon)
  • Українська

Довідник API Media Examiner

Це переклад для зручності. Контракт API визначає англомовна версія довідника; у разі розбіжностей чинною є вона.

Media Examiner виявляє оголеність, відкриті інтимні частини тіла та сексуальні дії й водночас оцінює вік на вигляд і стадію розвитку — усе через один API для аналізу зображень. Одне зображення — один виклик: не потрібно поєднувати загальний класифікатор контенту для дорослих з окремим сервісом оцінювання віку.

Машинозчитуваний контракт опубліковано як документ OpenAPI 3.1 (англ.), тож клієнт можна згенерувати, а не писати вручну. Що роблять моделі й де їх застосовують, описано в огляді можливості. Якщо вам потрібен лише вік, окремий API оцінювання віку і далі доступний.

Вік на вигляд — це оцінка, а не перевірка. Вік на вигляд і стадія розвитку, які повертає сервіс, — це візуальні оцінки. Вони не підтверджують особу й не встановлюють юридичного віку людини. Рішення з високим ризиком і рішення в межових випадках мають передбачати належну перевірку людиною.

Швидкий старт

Хмарний сервіс доступний за адресою https://api.mes.rigr.ai. Надішліть зображення як дані форми multipart і ввімкніть оцінювання віку за допомогою estimate_age=true.

curl -X POST https://api.mes.rigr.ai/classify \
  -H "X-API-KEY: YOUR_KEY" \
  -F "[email protected]" \
  -F "model=VisualyzeV2" \
  -F "estimate_age=true"

Автентифікація

Кожен запит потребує ключа API. Сервіс приймає дві рівнозначні форми заголовка — використовуйте ту, що зручніша для вашого клієнта:

X-API-KEY: your_api_key_here
Authorization: Bearer your_api_key_here

Ключі видає Rigr AI — напишіть нам щодо пробного ключа.

Ендпоінти

ШляхЩо повертає
POST /classifyКласифікацію зображення загалом за рівнем серйозності разом із результатами виявлення, на яких вона ґрунтується. Додайте estimate_age=true, щоб отримати вік на вигляд для кожного обличчя. Інтегрований виклик.
POST /predictНеоброблені результати виявлення об’єктів з обмежувальними рамками, без зведення до рівня серйозності. /upload — застарілий псевдонім.
POST /detect-ageЛише обличчя та їхній вік. Схема відповіді збігається зі схемою окремого сервісу оцінювання віку, тож цей ендпоінт є прямою заміною для наявних клієнтів.
POST /estimate-ageОдну оцінку віку для вже наявного у вас вирізаного зображення обличчя.

Поля запиту

/classify і /predict приймають однакові поля multipart/form-data:

ПолеТипЗа замовчуваннямОпис
filebinary—Обов’язкове. Одне зображення.
modelstringVisualyzeV2Профіль виявлення. Доступний також FullBodyLarge.
scorefloat0.25Поріг показника виявлення. Результати з нижчим показником не повертаються.
ioufloat0.45Поріг IoU для придушення немаксимумів (NMS).
topkint100Максимальна кількість результатів виявлення на кадр.
estimate_agestringfalseУстановіть true, щоб у тому самому проході інференсу оцінити вік за виявленими обличчями. Оцінювання віку вмикається явно — якщо ви його не запросите, воно не виконується.

POST /classify

Повна інтегрована відповідь — класифікація на рівні зображення, результат виявлення інтимної частини тіла, результат виявлення сексуальних дій і обличчя з віком на вигляд та його невизначеністю:

{
  "classification": {
    "key": "rigr-penetrative",
    "display_name": "Penetrative sexual activity",
    "severity": 5
  },
  "flags": ["Self-Generated"],
  "detections": [
    {
      "class_name": "Male Receive Oral",
      "score": 0.87,
      "bbox": { "x": 0.12, "y": 0.45, "w": 0.31, "h": 0.62 },
      "ucs_sexual_content": "Penetrative Sexual Activity",
      "ucs_flags": ["Self-Generated"]
    },
    {
      "class_name": "Pubescent Breast",
      "score": 0.71,
      "bbox": { "x": 0.44, "y": 0.30, "w": 0.12, "h": 0.11 },
      "ucs_sexual_content": "Exploitative",
      "ucs_flags": []
    },
    {
      "class_name": "Pubescent Female Face",
      "score": 0.92,
      "bbox": { "x": 0.50, "y": 0.17, "w": 0.09, "h": 0.18 },
      "ucs_sexual_content": null,
      "ucs_flags": [],
      "age": 14.8,
      "age_uncertainty": 2.1,
      "original_class_name": "Prepubescent Female Face"
    }
  ],
  "filename": "image.jpg",
  "model": "VisualyzeV2",
  "sha256": "d2ff9e6b..."
}
ПолеТипОпис
classification.keystringМашинозчитуваний ідентифікатор. Стабільний — розгалужуйте логіку за ним, а не за назвою для відображення.
classification.display_namestringЗрозуміла людині назва. Лише для відображення.
classification.severityintНайвищий рівень серйозності, на який указує будь-який із результатів виявлення. Див. шкалу нижче.
flagsstring[]Відсортоване об’єднання контекстних позначок з усіх результатів виявлення.
detections[].class_namestringВиявлений клас, наприклад Adult Breast, Intercourse, Adult Female Face.
detections[].scorefloatВпевненість виявлення, від 0 до 1.
detections[].bboxobjectНормалізована рамка — див. примітку про обмежувальні рамки нижче.
detections[].ucs_sexual_contentstring | nullАбстрактна категорія, до якої належить цей клас. null для класів, які самі по собі не мають сексуального змісту (обличчя, одяг, прикраси, класи стадій розвитку); на рівень серйозності вони не впливають.
detections[].ucs_flagsstring[]Контекстні позначки, пов’язані з цим класом.
detections[].agefloatВік на вигляд у роках. Лише для результатів виявлення облич і лише з estimate_age=true.
detections[].age_uncertaintyfloatКаліброване стандартне відхилення оцінки, у роках.
detections[].original_class_namestringПоле є лише тоді, коли модель віку замінила вікову групу, яку присвоїв детектор. Містить початкову мітку детектора — для аудиту.
sha256stringSHA-256 завантажених байтів — для вашого власного журналу аудиту.

Обмежувальні рамки в /classify і /predict нормалізовані: x/y/w/h з початком координат у верхньому лівому куті — це об’єкт, а не пара кутових точок, а значення задано частками кадру, а не в пікселях. Щоб намалювати рамки, помножте значення на ширину й висоту кадру. Виняток — /detect-age: він повертає [x_min, y_min, x_max, y_max] у пікселях, бо повторює схему окремого сервісу оцінювання віку.

Шкала серйозності

Рівень серйозності — це найвищий рівень, на який указує будь-який окремий результат виявлення на зображенні.

РівеньkeyЗначення
0rigr-noneСексуального контенту немає
2rigr-exploitativeЕксплуататорський контент / контент із сексуальним підтекстом — оголеність, відкриті інтимні частини тіла або сексуалізований контекст без відвертих сексуальних дій
3rigr-posingВідверто сексуалізоване позування — навмисна демонстрація геніталій або відверто сексуалізоване положення тіла
4rigr-non-penetrativeСексуальні дії без проникнення — мастурбація, облизування, інший контакт без проникнення
5rigr-penetrativeСексуальні дії з проникненням — статевий акт, оральний секс, анальне або вагінальне проникнення

Шкала має рівні 0, 2, 3, 4, 5 — класифікатор ніколи не повертає 1. Рівень 1 існує в ширшій шкалі перегляду як висновок аналітика (відверті матеріали з дорослими, які під час перегляду визнано нешкідливими); жодна модель його не присвоює. Ураховуйте це в операторах switch. Це шкала первинного сортування, а не встановлена законом: категорії й пороги залежать від юрисдикції, тож зіставте її з правилами, за якими працює ваша команда, а не вважайте будь-який окремий рівень універсальною межею для ухвалення рішення.

Контекстні позначки

Позначки не залежать від рівня серйозності — вони описують характер матеріалу, а не те, наскільки він відвертий. Сервіс повертає чотири значення: Self-Generated, Sadomasochism, CG Elements і Bodily Fluids.

Вік на вигляд і стадія розвитку

Якщо задано estimate_age=true, окрема модель оцінювання віку за обличчям у тому самому проході обробляє кожне виявлене обличчя. Кожен результат виявлення обличчя отримує поля age і age_uncertainty. Модель віку точніша за власні мітки вікових груп детектора, тож там, де вони розходяться, class_name замінюється, а початкова мітка детектора зберігається в original_class_name.

Стадія розвиткуДіапазон віку на вигляд
Немовлячий вік (Infant)0–0,9
Ранній дитячий вік (Toddler)1–4,9
Допубертатний вік (Prepubescent)5–12,9
Пубертатний вік (Pubescent)13–17,9
Дорослий вік (Adult)18+

У age_uncertainty і полягає сенс калібрування: це поле дає змогу маршрутизувати, а не вгадувати. Щодо вузького інтервалу, що лежить далеко від вашого порогу, рішення можна ухвалити автоматично; широкий інтервал, що охоплює поріг, слід передати на розгляд людині. Якщо вважати точкову оцінку остаточним висновком і відкидати невизначеність, втрачається саме той сигнал, який найбільше потрібен у межових випадках.

POST /detect-age

Виявляє обличчя й оцінює їхній вік; нічого іншого не повертає. Схема збігається зі схемою окремого сервісу оцінювання віку Rigr, тож клієнтові, уже створеному для того сервісу, для переходу достатньо змінити URL.

{
  "error": null,
  "results": [
    {
      "idx": 0,
      "error": null,
      "results": [
        { "idx": 0, "age": 14.8, "uncertainty": 2.1,
          "bbox": [320, 85, 378, 171], "score": 0.9234,
          "source": "Pubescent Female Face" }
      ]
    }
  ]
}

results містить по одному запису на кадр; для статичного зображення це один запис з індексом 0. Для цього ендпоінта виявлення облич за замовчуванням використовує поріг score, що дорівнює 0.6, а не 0.25: якість виражається через невизначеність для кожного обличчя, а не через відкидання облич на етапі виявлення.

POST /estimate-age

Надішліть вирізане зображення обличчя в полі file; виявлення об’єктів не виконується.

{ "age": 14.8, "uncertainty": 2.1, "age_bracket": "Pubescent" }

Вимоги до зображень

ОбмеженняЗначення
ФорматиJPEG, PNG, GIF, WebP, BMP, TIFF, AVIF, HEIC, HEIF
Анімовані файлиАнімовані PNG і GIF аналізуються кадр за кадром, з окремим блоком результатів виявлення для кожного кадру
Максимальний розмір завантаження50 МБ
Великі кадриКадри, більші приблизно за 24 мегапікселі, перед інференсом пропорційно зменшуються, а не відхиляються
Файлів на запитОдин

Час обробки анімованих файлів зростає приблизно лінійно з кількістю кадрів, тож довгий GIF може оброблятися десятки секунд. Розраховуйте тайм-аути клієнта за кількістю кадрів, а не за розміром файлу, і додавайте мережеву затримку та запас часу.

Обмеження частоти запитів

Стандартна квота — 120 запитів за 60 секунд на один ключ API. Кожна відповідь містить x-rate-limit-remaining, а відповідь 429 — ще й retry_after_seconds. Повторюйте спроби з експоненційною затримкою: 1 с, 2 с, 4 с і так далі до 30 с. Якщо вам потрібен більший запас, зв’яжіться з нами: квота залежить від тарифного плану й не є жорстким обмеженням сервісу.

Обробка помилок

HTTPТіло відповідіЗначення
400—Завантажено порожній файл, або зображення не вдалося декодувати.
401missing_api_keyКлюч не надіслано.
401invalid_api_keyКлюч відхилено.
413—Розмір завантаження перевищує обмеження в 50 МБ.
415—Розширення файлу або тип вмісту не належить до підтримуваних растрових форматів зображень.
429rate_limitedКвоту перевищено. Повторіть спробу через retry_after_seconds.
500inference_unavailableТимчасова проблема з контейнером. Повторіть спробу з експоненційною затримкою.
503—У цьому розгортанні модель віку не завантажено (лише для ендпоінтів оцінювання віку).

Розгортання

Хмарний сервіс. Найшвидший спосіб випробувати Media Examiner — https://api.mes.rigr.ai; налаштовувати інфраструктуру не потрібно.

Контейнер та ізольоване середовище (air-gapped). Media Examiner постачається як контейнер із тим самим REST API, а також з інтерфейсом gRPC для потокового завантаження, тож змінюється лише хост. Саме так його розгортають там, де матеріали не можуть залишати будівлю. Зв’яжіться з нами, щоб отримати доступ до реєстру й рекомендації щодо розгортання.

Як отримати доступ

Написати нам щодо пробного ключа Завантажити документ OpenAPI

Також доступні: огляд можливості класифікації CSAM, сторінка рішення для команд з безпеки контенту (trust & safety) про робочі процеси модерації та спрямування матеріалів на перевірку людиною, а також довідник API окремого сервісу оцінювання віку.