Завдання
Маркетплейси вимагають від головного фото товару білий фон, різкість, нормальну експозицію і щонайменше 1 000 px по короткій стороні. Продавець знімає на телефон, завантажує і дізнається про проблему, коли картка вже висить і не продає, або коли модерація її відхилила. Перевіряти кожне фото руками довго.
Відкритий бриф від OpenCV і AWS ставив дві умови: OpenCV 5 має робити суттєвий аналіз картинки, а помітна частина рішення має жити на AWS. Новизна не вимагалася. Окремі номінації були за агентний зір (Agentic Vision: результат OpenCV має змінювати наступний крок агента, потрібна траса рішень, оцінка успіхів і провалів, людина в контурі) і за COOL, збірку OpenCV під процесори Graviton. Ми подавалися в загальний залік і на обидві номінації.
Навіщо і яка ідея
Звичайний автофільтр «знайшов дефект, застосував правку» часто робить гірше: освітлив фото і випалив білий товар, вирізав фон і з’їв половину предмета. На нашому відкладеному наборі в такого «відкритого» конвеєра 255 з 1 032 «виправлених» фото не проходять повторну перевірку.
Ідея: агент не вірить своїй правці. Після кожного виправлення він вимірює фото заново і відкочує те, що не допомогло або внесло новий дефект. На кожне фото один з чотирьох висновків: фото годиться як є; виправлено і перевірено, можна завантажити виправлену версію; треба перезняти, з конкретною причиною (наприклад, змаз під час зйомки); віддати людині. Під результатом видно трасу: що агент знайшов, що спробував, що залишив і що відкотив.
Ми свідомо трималися однієї ролі: фільтр якості з перевірюваною автономією. Нових функцій не додавали, планувальник на Bedrock не вмикали, а користь перевірки доводили цифрами, а не словами.
Хід роботи
| Коли | Що відбувалося |
|---|---|
| День 1, ранок | Правила брифу прочитані з першоджерела, ідея затверджена: агент перевірки фото товарів. План з перевірюваними критеріями і розрахунком витрат. Локально вже стояв OpenCV 5.0.0 |
| День 1 | Відкритий набір Amazon Berkeley Objects (CC BY 4.0): 358 фото, 184 типи товарів. Зібрано набір оцінки 3 276 фото (252 базових x 13 варіантів дефекту), dev 1 508 / test 1 768. Ядро агента, на dev 74,7 % -> 91,4 %, pytest 8/8 |
| День 1, ~13:30 | Створено акаунт AWS. Виявилося, що план платний і кредитів 0 $ замість обіцяних 100 $, кожна витрата йде з картки. Одразу поставлено бюджет-алерт 1 $ |
| День 1, ~14:10 | Умова «тільки безкоштовно»: відмовилися від EC2 цілодобово і виклали сервіс на Lambda arm64 у вічно безкоштовних квотах. Метрики на Lambda збіглися з Маком до 4 знака |
| День 1, ~14:20-15:05 | Замір COOL проти звичайного OpenCV на Graviton4, рішення агента ідентичні. Сервери видалені, підписка COOL скасована. Додано «захист сцени» після того, як на 40 інтер’єрних фото агент 10 разів «виправив» фото вирізанням сцени (після правки 1 з 40) |
| День 1, ~17:10 | Один прогін на відкладеному test: 89,7 %. Чернетка відео 3:09 і тексту для Devpost |
| День 1, ~17:40 | Консиліум з 5 радників: триматися однієї ролі, Nova не вмикати, нових функцій не робити, довести користь перевірки цифрами |
| День 1, ~18:10 | Абляція (агент проти того ж конвеєра без перемірювання), ручна розмітка 106 реальних фото, переписані README і звіт, перемонтаж відео до 3:37, повторний прогін COOL з профілем по стадіях |
| День 1, ~21:25 | Подано на Devpost, відмічені обидві номінації |
| День 6 | Другий консиліум з даними інших учасників. Зроблено: вимикач із самовідновленням і порогом 1 000 запитів на годину, статистика з довірчими інтервалами і тестом McNemar, карта меж (40 фото x 5 дефектів x 7 рівнів сили) |
| День 7 | Нова шапка на Devpost: шлях судді на 2 хвилини, цифри простими словами, карта меж у галереї |
| День 12 | Тест на 24 фото з телефону за наперед зафіксованим протоколом. Результат невдалий, опубліковано як є. На Devpost додано блок «як зняти фото, яке приймуть» з умовами з порогів коду |
| День 13 | Скан усієї історії репозиторію на секрети і особисті дані, репозиторій публічний, тег v1.1-judging. Lambda оновлена і заморожена. Вичитана вся сторінка Devpost, виправлені розбіжності в цифрах |
| День 15 | Рядок про ціну строгості (з 73 хороших фото 30 проходять самі, 31 до людини, 12 на перезйомку), замір часу відповіді з Києва, ліцензія MIT, GitHub Release зі звітом і архівом |
| День 17 | Правки на Devpost закриті |
| День 21 | Консиліум «суддів», оцінка за рубрикою брифу. У подачі нічого не змінювали. В опис відео на YouTube додано шлях судді |
Чим робили
Цикл агента з чотирьох кроків. Perceive: OpenCV 5 вимірює різкість, експозицію, шум, фон за LAB-маскою, кадрування і pHash для дублікатів. Decide: правила вибирають допустимі дії. Act: 6 інструментів, обрізка, баланс білого, експозиція, заміна фону GrabCut, шумодав NLM, різкість. Verify: перемірювання і рішення, залишити правку чи відкотити. Ліміт 6 кроків, захист кольору товару. Перевірка правки це 5 воріт, а не одне правило: сама політика, збіг маски GrabCut (IoU), чи не внесла правка новий дефект, чи виправила те, що мала, і бюджет зміни кольору dE.
Планувальник за замовчуванням на правилах. Є опціональний на Amazon Bedrock (Nova) з перевіркою допустимої дії, він покритий тестами, але в живому контурі вимкнений: Bedrock платний.
Крутиться на AWS Lambda arm64 (Graviton), Python 3.12, 2 048 МБ, Function URL по HTTPS. Залежності закріплені: opencv-python-headless 5.0.0.93, numpy 2.2.6. Фото обробляються в пам’яті і не зберігаються. Захист грошей: бюджет-алерт 1 $ на місяць з листом, тривога CloudWatch при перевищенні порогу викликів за годину, окрема лямбда-вимикач ставить concurrency 0, і сайт відповідає 429. Вимикач сам вмикається назад по «відбою», але після 3 спрацювань за добу лишається вимкненим до ручного ввімкнення. Довгоживучих ключів немає, збірка і деплой з AWS CloudShell скриптами deploy/*.sh. Близько 965 рядків Python у ядрі агента і Lambda, 8 unit-тестів, 29 комітів.
COOL міряли окремо на EC2 c8g.large (Graviton4) з образу Marketplace «Cloud Optimized OpenCV 3.1», поруч звичайний pip-OpenCV на тому ж сервері. Сервери самі видалялися після прогону.
Відео: вступ знято на телефон, англійські субтитри, озвучка сцен Gemini TTS, перевірка мови Whisper, збірка скриптом на Python.
Результат
Одна веб-сторінка на AWS Lambda, без входу. Шість готових зразків можна перевірити в один клік, можна завантажити своє фото, зокрема з камери телефону. Шлях судді, який ми прописали на Devpost і в описі відео: зразок «colour cast» виправляється сам, у трасі видно, що баланс білого залишений після перемірювання; зразок «motion blur» іде на перезйомку з підказкою; зразок «lifestyle» (близько 5 с) показує весь цикл, агент пробує почистити фон, вимірює, відкочує свою ж правку і віддає фото людині.
Відкладений набір 1 768 фото, пороги на ньому не налаштовували, прогін один. Агент: 1 584 вірних рішень, 89,6 % (95 % інтервал 88,1-90,9 %). Ті самі правила й інструменти без перемірювання: 1 507, 85,2 % (83,5-86,8 %). Попарно агент правий, а відкритий конвеєр ні, на 97 фото, зворотна ситуація на 20 (McNemar p = 2,6e-13). На 371 фото, де агент відкотив свою ж правку, він правий у 94,6 % проти 73,9 %. За типами дефекту: сильне розмиття, низька роздільність, темрява і строкатий фон 100 %, чисті фото прийняті в 97 %, змаз 85 %, пересвіт лише 33 %, це найслабше місце.
На 106 реальних каталожних фото, розмічених до прогону (33 з проблемою, 73 хороших), агент зупинив 27 з 33 проблемних проти 11 з 33 у відкритого конвеєра. Ціна цієї строгості: 31 з 73 хороших фото іде до людини.
COOL на Graviton4, два повних прогони, 12 запусків, рішення ідентичні: box blur x2,87, Otsu x1,94, CLAHE x1,40, але adaptiveThreshold x0,77 і Canny x0,90. Агент цілком лише x1,03 (344,5 проти 356,1 мс на фото): близько 80 % сприйняття в нас написано на NumPy, туди COOL не дотягується.
Час відповіді живого сайту з Києва: lifestyle 5,42-5,47 с, решта зразків 0,90-2,70 с. AWS за все коштував близько 0,13 $, це EC2 приблизно на 50 хвилин для замірів COOL. Lambda, CloudWatch і SNS живуть у вічно безкоштовних квотах. За нашим розрахунком сервіс коштує до 0,05 $ за 1 000 фото, близько 160 тис. фото на місяць укладаються в безкоштовну квоту.
Чого ми поки не знаємо: підсумки оголосять 10.11. Наш власний консиліум «суддів» (це симуляція, не справжнє журі) дав 6,6 з 10: найсильніша документація (8,4), найслабша реальна користь (5,7). Допишемо, коли прийдуть підсумки.
Помилки і що винесли





