Як ми автоматизуємо фотомодерацію в продукті за допомогою ML
Усі статті, обговорення, новини про AI — в одному місці. Підписуйтеся на DOU | AI!
Привіт! Мене звати Ілля, я Machine Learning Engineer в Quarks. Це продуктова IT-компанія, що створює продукти й технології в галузі Social Discovery та онлайн-знайомств.
Одним з основних елементів будь-якого подібного сервісу є фотографії користувачів. Вони відіграють ключову роль у створенні зв’язків між людьми та сприяють потенційним метчам.
Щомісяця наші користувачі завантажують приблизно 5 мільйонів фотографій. Вкрай важливо, щоб ці зображення відповідали нашим вимогам щодо якості, безпеки, а також юридичним документам.
Аби гарантувати відповідність встановленим стандартам, всі завантажені зображення проходять через модерацію. Відповідні критерії для відображення на платформі розробили наші юридична та контент-команди.
У цій статті я хотів би поділитися нашим досвідом та розповісти, як ми автоматизували процес модерації фотографій за допомогою машинного навчання.
Проблема «відкладеної» модерації
Раніше процес мав такий вигляд: юзер завантажує фотографію, вона потрапляє до черги модерації, команда вручну переглядає кожне зображення та ухвалює рішення — допустити фото чи ні. Поки користувач чекає на апрув першої фотографії, він не може повноцінно користуватися застосунком.
До певного моменту такий флоу нас влаштовував, оскільки давав змогу уважно стежити за якістю фото на платформі. Однак масштабувати подібний процес важко через низку проблем:
- швидкість модерації безпосередньо залежить від обсягів фотопотоку. Якщо модератори перевантажені, то користувач довше чекає на затвердження першого фото в профілі та довше не потрапляє в продукт, що впливає на користувацький досвід;
- брак модераторів та постійна необхідність збільшення команди через збільшення обсягів фото;
- взимку — ризик повного блекауту команди фотомодерації, адже 80 % людей перебуває в Україні.
Тому ми поставили собі мету — поліпшити User Experience. Потрібно було прискорити потрапляння людини на платформу, не збільшуючи навантаження на команду модерації та кількість людей у ній, зберігаючи при цьому безпечність продукту на достатньому рівні.
Яке рішення ми знайшли
Щоби час допуску в застосунок не залежав від кількості фотографій у черзі на модерацію, а якість зображень у продукті була високою, ми вирішили затверджувати фото користувачів автоматично й модерувати їх «пізніше». Однак у цього підходу також були недоліки:
- певний відсоток дуже ризикових та неприйнятних для продукту фото, які могли побачити інші користувачі раніше, ніж їх приберуть модератори;
- не найкращий User Experience, якщо користувач одержав автоматично схвалене зображення та повний доступ до продукту, а потім фото прибрали модератори.
Щоб досягти своєї мети й водночас розв’язати ці проблеми, ми вирішили покращити наявні
Так, якщо жодна з них не відхилила зображення, ми більше впевнені в його якості, модератори рідше прибирають фото після автоматичного затвердження, а передивлятися вручну потрібно лише ті зображення, в яких моделі «сумніваються».
Раніше ми використовували дві моделі — для детекції обличчя (вона визначає, чи є обличчя на фото, але не збирає біометричні дані) та NSFW-контенту (зображення порнографічного характеру).
Запровадити постмодерацію одразу ми не могли: якість моделей була недостатньо високою, до того ж вони не покривали всі причини відмов.
Інакше кажучи, навіть якщо обидві моделі «пропустили» фотографію, ймовірність, що вона відповідає всім правилам, не надто висока.
Ці фото відхилили б і модератори, але довіра до моделі уже під питанням. Старі моделі були натреновані на незбалансованих та не дуже якісних даних, ми врахували ці помилки в нових моделях.
Тоді автоматичними були лише відхилення та їхня частка в загальному фотопотоці становила 7%. А от всі затвердження робилися вручну. Однак, щоб постмодерація працювала ефективно, потрібно відхиляти дуже високий відсоток поганих фото автоматично.
Тому ми вирішили робити окремі моделі на різні причини відхилення.
Які моделі ми напрацювали
Під час модерації фото в режимі реального часу модератори мають лише дві кнопки — «Прийняти» та «Відхилити», тож вони не зазначають причини відхилень.
Аби зрозуміти, що саме автоматизовувати найперше, а також перевірити коректність роботи моделі, коли ми уже запустили її в продакшн, ми зробили окремий інструмент для розмітки фото. Він працює так:
- на вхід подається CSV-файл із посиланням на пул релевантних зображень;
- вказуються потрібні лейбли (приклади можна побачити на скріні);
- модератор передивляється зображення та зазначає причину відхилення для кожного.
Отримавши дані щодо причин найчастіших відхилень та точності наявних моделей, ми взялися за розробку та покращення. Підхід до роботи з кожною моделлю був однаковим: шукаємо готові робочі рішення й тестуємо.
Якщо все добре та ефективно — впроваджуємо, якщо ні — перенавчаємо або створюємо свою з нуля.
Обличчя
Найперше ми взялися за модель, яка визначає, чи є на зображенні обличчя. Тут все порівняно просто. Face detection — це відома задача комп’ютерного зору, тож під неї є багато сучасних
Після ресерчу я знайшов найоптимальніший для нас варіант — RetinaNet. Ця модель показала хороші результати за важливими для нас метриками.
Головна — це precision, тобто ймовірність, що фото дійсно треба відхилити, якщо так «радить» модель. Вона складала 99,4 %. Інший вагомий показник — це recall, ймовірність, що модель відхилить фото, якщо фото треба дійсно відхилити. Цей показник складав >98 %. Також модель відпрацьовувала за менше, ніж 100 мс на CPU, що теж було досить важливо, оскільки у нас в розпорядженні не було відеокарт.
Ми знайшли імплементацію RetinaNet у вигляді сервісу та інтегрували. Тепер 40 % від усіх відхилень визначає саме ця модель. Щоб зробити це вручну, знадобилося б приблизно п’ять модераторів.
Adult-зображення
Готові рішення, що були на той момент, не задовольняли нас за якістю. Тому ми вирішили навчати власну модель, для чого зібрали та розмітили потрібний датасет.
Нас не до кінця задовольнив precision першої версії моделі, тому зробили ще пару ітерацій. Використовуючи один інструмент, я побачив, що модель дуже «тригериться» на написи на фото — проблема датасету. Знайти цю проблему допоміг Grad-CAM, який підсвічує на фото місця, які найбільше вплинули на рішення моделі.
На промодерованих фото користувачів зазвичай немає тексту, тому проблема не суттєва, але це заважало моделі генералізувати знання про adult-контент та ускладнювало оцінку її роботи. Декілька нехитрих маніпуляцій — і ми поповнили датасет фотографіями з текстом, як негативними прикладами.
У наступних ітераціях я помітив, що навіть якщо фото неприйнятне, але на ньому є обличчя, здатність моделі коректно оцінювати фото зменшується. Тому ми поповнили датасет релевантними зображеннями та знову перенавчили модель.
Технологія не дала шаленого приросту автоматизації, однак у неї були інші задачі: зменшити кількість подібних фото для модераторів та запобігти потраплянню в продукт неприйнятних зображень.
Групові фото
Наступною в черзі на автоматизацію була причина «декілька облич». На перший погляд, все дуже просто: потрібно рахувати, скільки облич повертає модель face detection.
Але знайшлося багато неочевидних моментів. Наприклад, на фото може бути одна людина, але воно зроблене в людному місці, на фоні пам’ятника, з постером і т.д.
Спроба навчити нейромережу на подібних зображеннях провалилася. Лінійна модель на співвідношеннях розмірів облич теж не зовсім вийшла.
Натомість спрацювала доволі проста ідея: розглядати кожне фото як табличні дані, що складаються з вихідних даних моделі face detection та інших фіч.
Зробити модель на табличних даних сьогодні дуже просто, тому ми використали техніку Gradient Boosting та отримали цілком задовільний результат. Правда фото, де людина стоїть поруч з пам’ятником, все ж заскладні для такої моделі :)
Текст
Не всі зображення з текстом потрібно відхиляти — фото біля вказівника чи текст на одязі цілком прийнятні. Тому за архітектурою ця модель схожа на таку ж для групових фото, тобто таку, де є детектор (або ж feature extractor) та класифікатор.
Складність була в тому, що детектор тексту на фото знайти важко. Більшість варіантів працювали непристойно довго та «орієнтувалися» на завдання text recognition.
Однак пізніше я натрапив на чудову бібліотеку від Intel — OpenVINO, яка створена для оптимізації моделей під їхні процесори. Ця бібліотека містить набір готових оптимізованих моделей на всі випадки життя.
Що в результаті
Завдяки покращенню старих моделей та впровадженню нових нам вдалося:
- підвищити частку автоматичних відхилень з 7% до 20%;
- збільшити частку автоматично схвалених фото з 0 до 18%. Наші моделі покривають широкий спектр причин відхилення, тому якщо всі вони «кажуть», що з фото все гаразд, то ймовірність того, що ми фото відхилимо, стає вкрай малою;
- перевести 50% фотопотоку на постмодерацію, коли фото схвалюється одразу, але модератори потім переглядають його в вільному темпі;
- пришвидшити можливість повноцінно використовувати продукт внаслідок постмодерації та user-expereince користувачів.
Таким чином, ми автоматично модеруємо ~40% усіх фото (порівняно з ~7% на старті) та відправляємо ~50% зображень на постмодерацію (0% на старті), не змушуючи юзера чекати на схвалення фото та пришвидшуючи його можливість повноцінно використовувати продукт.
Також це дало змогу зменшити фактичне навантаження на модераторів та збільшити швидкість модерації фото і, як наслідок, доступу юзера до продукту
Але це, звичайно, не все: ми продовжуємо роботу над наявними та новими моделями, а також планомірно підвищуємо відсоток автоматизації та покращуємо досвід наших користувачів.
2 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів