Ситуация и цель
3 ноября 2026 года основатель прислал шесть роликов, где «Claude разбирает мои фото после поездки»: сотни миниатюр разлетаются по подписанным папкам, бегут счётчики. У лучшего было 2,65 млн просмотров и 18 103 комментария. Ни один из авторов не выпустил инструмент: у каждого это была локальная HTML-страница, написанная ассистентом, или промпт.
Мы встроили такой инструмент в Mellow Hub под именем Cerebro с одним правилом с самого начала: ничего не загружается на сервер. Hub для Mac читает всю медиатеку «Фото», включая iCloud, через PhotoKit и Vision от Apple. Браузер медиатеку прочитать не может, поэтому в браузере Cerebro разбирает папку, которую человек выбрал сам, на его же компьютере. Этот кейс — про браузерную половину: какая модель, какие веса и насколько точно получилось.
Что мы сделали, по шагам
1. Модель, которая влезет в веб-страницу
Мы взяли MobileCLIP-S0 — маленькую модель CLIP от Apple (Apple Sample Code License, экспорт в ONNX от Xenova) — и отдаём только её половину для изображений. Она работает на onnxruntime-web 1.30.0 поверх WebAssembly в одном потоке: для нескольких потоков нужна страница с cross-origin isolation, а кабинет Hub не такой. Все файлы отдаются с нашего сайта, обе лицензии лежат рядом с весами.
Папки — это слова, а для слов нужен текстовый кодировщик, который мы не хотели тащить в браузер. Поэтому текстовые векторы папок посчитали один раз заранее и сохранили небольшим JSON с векторами из 512 чисел. Вектор картинки уходит в ближайшую папку, а если даже лучшее совпадение ниже 0,1 — в «Другое».
Папок для фото десять (Селфи, Люди, Образы, Еда и кафе, Путешествия, Природа, Места и интерьеры, Питомцы, Спорт, Документы и чеки) плюс «Другое». Видео уходит в «Видео с лицом» или в «Видео» — по двум векторам на одном из его кадров.

2. Что решает не модель
- Скриншоты и записи экрана определяются по файлу: имя вроде «Снимок экрана» на языках, на которых читают Hub, или PNG, который хотя бы в 1,9 раза выше, чем шире. Модель путала пейзажи с экранами приложений.
- Дубликаты — по 64-битному разностному хешу: если хеши двух картинок различаются не больше чем в 3 битах, это одна картинка; ищем через индекс по четвертям, а не сравнением каждой пары.
- HEIC с iPhone декодируется через libheif, если браузер сам его не открывает. Наш бесплатный конвертер HEIC в JPG тоже работает в браузере и ничего не загружает.
3. Выбор весов: 8 бит или полная точность
С моделью идут и 8-битные веса, они меньше, и обычно в браузер отдают именно такие. Мы проверили оба варианта на своих размеченных картинках до выпуска. 8-битные веса отправили в верную папку 24 из 451 картинки, около 5%. Полноточные веса fp32 угадали 342 из 425 фото (80%) и 19 из 22 видео (86%).
Мы отдаём только fp32. Веса — около 45,5 МБ, разрезанные на два файла по 22,8 МБ, потому что статический файл на нашем хостинге может быть не больше 25 МиБ. В коде записано: к 8-битному файлу не возвращаться.
4. Прочь из потока страницы
Первая версия декодировала, распознавала и сравнивала картинки прямо на странице, и большая папка основателя заморозила вкладку. Теперь работу делают два-три Web Worker (три при 8 и больше ядрах, два при 4, один, если устройство сообщает меньше 4 ГБ памяти), у каждого своя копия модели; картинка декодируется в ширину 512 пикселей, в очереди у воркера по две. Воркер, который молчит 60 секунд, заменяется, а его картинка уходит другому.
Результаты
| Проверка (2026) | Результат |
|---|---|
| Размеченный набор, 8 бит | 24 из 451 верно, около 5% |
| Размеченный набор, fp32, фото | 342 из 425 верно, 80% |
| Размеченный набор, fp32, видео | 19 из 22 верно, 86% |
| Chrome основателя, рабочий сайт, 3 нояб | 14 файлов за 18 с, 8 папок, найдены дубликат и скриншот |
| Тестовая папка, воркеры, 3 нояб | 1 821 файл, 657 МБ, 115 с, ни одного кадра дольше 100 мс |
Chromium и WebKit дали одинаковые метки одним и тем же картинкам. В Chrome и Edge разобранные копии можно записать в папки «Mellow · папка» туда, куда выберет человек, — через выбор папки, который есть не в каждом браузере; Safari и Firefox разбирают, но писать папки не умеют, и страница так и говорит. Оригиналы никогда не перемещаются и не меняются.
На стороне Mac фреймворк Apple Vision выдавал около 158 анализов в секунду на M4 при шести одновременно, и больше параллельных задач не помогало. 5 ноября MacBook основателя читал его медиатеку из 65 588 объектов со скоростью около 64 в секунду — примерно 17 минут. Как выпускается и обновляется сам Hub для Mac — в отдельном кейсе.

Что не сработало
- 8-битные веса. Почему они ломаются, мы так и не выяснили. Знаем только, что на наших картинках — с огромным отрывом.
- Примерно каждая пятая картинка уходит не в ту папку. Однажды цветок попал в «Питомцы». Это честный уровень маленькой общей модели с десятью папками и без обучения на фото самого человека.
- Страница замерзала, пока работа не переехала в воркеры.
- Совпадение имён повесило первый HEIC. В нашем воркере была своя функция libheif, которая перекрыла одноимённую глобальную переменную библиотеки, и первый HEIC ждал вечно. Теперь всё в воркере живёт внутри одной функции, а тест проверяет, что глобальных имён он не оставляет.
- Safari тормозил на видео. Кадр после перемотки по одним метаданным блокировал страницу Safari на 1 004 мс на каждое видео и возвращал чёрный кадр. Если дождаться первых загруженных данных видео, выходит 6 мс и настоящая картинка.
- Сюрприз с типом файла. Некоторые серверы отдают файл .mjs как загрузку, поэтому модули среды выполнения лежат как .js.
- Не измерено: точность на настоящей личной медиатеке в браузере. Наш размеченный набор — наш собственный и небольшой, и 80% относятся именно к нему.
Как сделать это у себя
- Возьмите маленький кодировщик изображений CLIP в ONNX, например MobileCLIP-S0, и проверьте каждый набор весов, квантованный и полный, на своих размеченных картинках до выпуска.
- Посчитайте текстовые векторы категорий заранее и отдавайте только кодировщик изображений.
- Держите среду выполнения и веса на своём сайте и режьте веса под лимит хостинга на файл.
- Распознавайте в Web Worker, декодируйте в небольшую ширину через createImageBitmap, HEIC — внутри воркера.
- Скриншоты и дубликаты оставьте правилам о файле, а не модели.
- Пишите разобранные копии через File System Access API там, где браузер его поддерживает, и никогда не трогайте оригиналы.
- Для всей медиатеки «Фото» или iCloud нужно приложение. В Mellow Hub это Cerebro в Hub для Mac, который использует Apple Vision прямо на Mac.



