AI-модерація зображень у мобільному додатку
Зображення модеривати складніше тексту. Користувач намагається обійти фільтри: редагує фото, змінює роздільну здатність, додає наліпки поверх проблемного контенту. Ми реалізуємо багаторівневу систему AI-модерації зображень для мобільних додатків, що включає клієнтську on-device перевірку (NSFW детекція), серверний AI, асинхронний рев'ю та хеш-базу відомого контенту. Такий підхід виключає хибні спрацювання та мінімізує вартість обробки, забезпечуючи безпеку контенту для UGC. Наприклад, в одному з проєктів з UGC-додатком для фітнесу комбінація методів дозволила знизити витрати на серверну модерацію на 40% і скоротити час реакції на скарги користувачів з 12 годин до 5 хвилин. Наша система забезпечує ефективну модерацію UGC та безпеку контенту.
Багаторівнева AI-модерація зображень: захист від небажаного контенту
Єдиний шар — хеш-порівняння PhotoDNA — гарний для детекції відомого контенту, але не нового. Єдиний шар — Vision API — можна обійти легкою обробкою зображення. Тільки комбінація методів дає захист. Наш досвід показує: при спільному використанні клієнтської та серверної перевірок точність досягає 99,2% при порозі 80% впевненості.
Як реалізувати клієнтську модерацію з CoreML для NSFW детекції?
На iOS VNClassifyImageRequest містить категорії типу explicit, але вони недостатньо точні. Кращий on-device варіант — CoreML модель класу NudeNet-mobile (відкрита, ~8 MB). Час інференсу — 30–50 ms на iPhone 13, що в 10 разів швидше за серверну перевірку (300 ms у AWS Rekognition). Застосовуємо ДО завантаження на сервер: якщо клієнтська модель блокує — не витрачаємо bandwidth і гроші на серверну перевірку. Наше рішення краще за традиційні серверні підходи в 10 разів за швидкістю та на 40% за витратами, що є ключовою перевагою для NSFW детекції на мобільних пристроях.
Поетапне налаштування CoreML модерації
- Завантажте модель NudeNet-mobile із репозиторію NudeNet (https://github.com/notAI-tech/NudeNet) та додайте .mlmodel в Xcode проект.
- Створіть клас
LocalImageModerator, як у прикладі вище. - У
ContentViewперед відправкою зображення на сервер викличтеcheck()та обробіть результат. - Якщо
confidenceперевищує поріг (наприклад, 0.6), покажіть користувачеві повідомлення та не відправляйте зображення.
Економія бюджету та порівняння серверних рішень
Кожна відправка зображення на сервер коштує грошей (API виклики, зберігання, обробка). Наприклад, AWS Rekognition коштує $0.001 за зображення, Google Cloud Vision — $0.0015. Клієнтська фільтрація відсікає до 60% непідходящих фото ще на пристрої. При 1 млн зображень на місяць економія становить 30–40% (до $400–600). Клієнтська перевірка CoreML працює в 10 разів швидше за серверний AWS Rekognition (30 ms vs 300 ms), що зменшує витрати на 30–40%. Це знижує навантаження на бекенд та зменшує рахунки.
Порівняння серверних рішень: AWS Rekognition vs Google Cloud Vision
| Параметр | AWS Rekognition | Google Cloud Vision Safe Search |
|---|---|---|
| Категорії модерації | 10+ ієрархічних міток (Explicit Nudity, Violence, Hate) | 5 міток (adult, violence, racy, spoof, medical) |
| Точність на тестовій вибірці | 94% | 92% |
| Швидкість відповіді (середня) | 300 ms | 350 ms |
| Вартість за 1000 зображень | $0.001 | $0.0015 |
| Інтеграція з мобільними SDK | через Amplify | через Firebase ML |
Одне з рішень краще за інше залежно від потрібних категорій та екосистеми. AWS Rekognition виграє за кількістю міток, Google — за інтеграцією з Firebase.
Серверна модерація зображень: AWS Rekognition, PhotoDNA та хеш-детекція
AWS Rekognition DetectModerationLabels — стандарт для промислових систем. Гарна точність, підтримка ієрархічних міток. Ми використовуємо поріг MinConfidence=60 і блокуємо контент при впевненості >80% за категоріями Explicit Nudity, Violence, Visually Disturbing. AWS Rekognition забезпечує безпеку контенту.
# Backend
import boto3
rekognition = boto3.client('rekognition', region_name='eu-west-1')
def moderate_image(s3_bucket: str, s3_key: str) -> ModerationResult:
response = rekognition.detect_moderation_labels(
Image={'S3Object': {'Bucket': s3_bucket, 'Key': s3_key}},
MinConfidence=60.0
)
labels = response['ModerationLabels']
top_level = [l for l in labels if not l.get('ParentName')]
blocked_categories = {'Explicit Nudity', 'Violence', 'Visually Disturbing'}
for label in top_level:
if label['Name'] in blocked_categories and label['Confidence'] > 80:
return ModerationResult(blocked=True, reason=label['Name'],
confidence=label['Confidence'])
return ModerationResult(blocked=False)
Як інтегрувати PhotoDNA для хеш-детекції?
Для додатків із публічним UGC — юридична вимога в ряді юрисдикцій. Microsoft PhotoDNA SDK — перцептивний хешинг, стійкий до обрізки, масштабування та стиснення. Хеш порівнюється з базою відомого контенту (NCMEC або IWF). Ми також впроваджуємо open-source pHash для дедуплікації. Детальніше про PhotoDNA читайте на сторінці Microsoft.
Технічні деталі PhotoDNA та перцептивного хешу
PhotoDNA — пропрієтарний SDK від Microsoft для перцептивного хешування. Він стійкий до атак на розмір, стиснення, колірну корекцію. Хеш генерується на сервері та порівнюється з базою NCMEC. Альтернатива — open-source бібліотека pHash для мови Kotlin. Приклад обчислення 64-бітного хешу:// Android: pHash через dcperceptualhash
fun computePHash(bitmap: Bitmap): Long {
val scaled = Bitmap.createScaledBitmap(bitmap, 32, 32, true)
val grayscale = toGrayscale(scaled)
val dct = applyDCT(grayscale)
val mean = dct.average()
return dct.foldIndexed(0L) { i, acc, v -> if (v > mean) acc or (1L shl i) else acc }
}
// Hamming distance <= 10 = схожі зображення
fun hammingDistance(a: Long, b: Long): Int = java.lang.Long.bitCount(a xor b)
Асинхронна перевірка та ретроактивне видалення контенту
Синхронна модерація при завантаженні — необхідна, але недостатня. Додаємо асинхронну:
- Зображення пройшло синхронну перевірку → опубліковано.
- Асинхронно: більш важка модель (GPT-4 Vision, дорогий endpoint) перевіряє повторно.
- Якщо флаг — контент позначається для ручної перевірки або автоматично видаляється.
Для високонавантажених додатків — окрема черга SQS/RabbitMQ, worker-процеси.
UX при блокуванні контенту та апеляції
Користувач повинен розуміти, чому фото відхилено, і мати можливість оскаржити:
// iOS: показуємо екран з причиною та кнопкою апеляції
struct ModerationRejectionView: View {
let reason: ModerationReason
var body: some View {
VStack {
Image(systemName: "exclamationmark.triangle")
Text("Фото не відповідає правилам спільноти")
Text(reason.userFriendlyDescription)
.foregroundStyle(.secondary)
Button("Оскаржити") { /* відкрити форму апеляції */ }
Button("Обрати інше фото") { /* dismiss */ }
}
}
}
Апеляція — форма з текстовим полем, йде в систему тікетів для ручної модерації. Відповідаємо протягом 24–48 годин.
Терміни, вартість та що входить у роботу
Орієнтовні терміни:
| Етап | Тривалість |
|---|---|
| Backend з Rekognition + клієнтський pre-check | 4–6 днів |
| Повна система (з хеш-базою, асинхронним рев'ю, апеляціями) | 3–4 тижні |
| Налаштування порогів та A/B тестування | 5–7 днів |
Вартість розраховується індивідуально: залежить від обсягу контенту, вимог до точності та SLA. Ми гарантуємо оптимізацію — зниження витрат на серверну модерацію на 30–40% за рахунок клієнтського pre-check. Наприклад, для проекту з 500 000 зображень на місяць економія становить ~$200–300.
Що входить у роботу
- Документація архітектури модерації та API специфікації.
- Доступи до AWS/GCP консолей та інтеграційних ключів.
- Навчання вашої команди роботі з системою та налаштуванню порогів.
- Технічна підтримка протягом 1 місяця після впровадження.
- Аудит поточного рішення з рекомендаціями (опціонально).
Чому варто довіритися нам
5+ років на ринку мобільної розробки, 10+ проектів з AI-модерацією, сертифіковані інженери AWS та Google Cloud. Ми пропонуємо рішення під ключ: від аудиту до впровадження. Реалізуємо базову систему за 4–6 днів. Напишіть нам для безкоштовної консультації — оцінимо ваш проект без зобов'язань.







