Обновить

Как за один вечер разгрести 36 000 фотографий и почту с 2005 года, руками AI-агента и локальных моделей

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели22K
Всего голосов 36: ↑35 и ↓1+41
Комментарии55

Комментарии 55

у меня 1.7тб фото/видео со всех моих фотоаппаратов и телефонов, что есть порядка 75000 файлов что ли... часть по папочкам лежит (изначально), часть пробовал вручную отсортировать, но в итоге забил. было бы, наверное, хорошо разложить по папкам (дата - событие), но пока лень)

О, вот эта «лень» и есть главный враг, ровно её агент и снимает: рутину делает он, ты только принимаешь решения. Тот же конвейер «дата, событие» спокойно тянет 75к файлов, у меня архив сопоставимый по размеру. Так что это как раз случай, когда стоит один раз настроить и разгрести то, к чему годами не подходишь. Если что-то не понятно из статьи - спрашивай.

У меня в сумме фото + видео занимают около 90гб, и все хранится в icloud.

Однажды нашел старые фотки в дропбоксе и где-то еще, и за пару часов вручную проставил им всем правильные даты: где-то дата была в exif, где-то в названии файла, в целом я все фотки помнил, так что было несложно.

Ну а потом закрыли возможность оплачивать сервисы apple со счета оператора связи, и пришлось резко найти альтернативу - выгрузил все в желтое облако, где пока безлимитное хранилище.

Самое главное для меня было разобраться с датами, чтобы фото/видео были отсортированы в хронологическом порядке. Персоны обычно определяются в телефоне, либо в облаке.

Да, даты это процентов 90 задачи, у меня было так же. Поэтому и вывел правило «имя папки важнее EXIF»: как раз против скан-дат и сбитых часов камер, когда внутри файла дата неверная. Персоны через телефон или облако отлично работают, если живёшь в одной экосистеме. А у меня архив был размазан по OneDrive, почте и кучам папок, так что лица пришлось делать отдельным проходом, чтобы метки потом ехали вместе с файлами куда угодно. Плюс теперь у меня свой независимый ни от кого набор "слепков" и логики по альбомам. Могу при необходимости откуда угодно куда угодно мигрировать, хоть в селфхостед Призм или Иммич.

В чем проблема оплаты эпл? Разве через авито не работает?

Разгребал похожее полгода назад, правда с кодовой базой а не фотоархивом, около 180К файлов с историей на 8 лет. Главный вывод совпадает: AI-агент хорошо справляется с задачами где есть объём и понятный критерий «готово», но человек давно бы сдался от монотонности. Интересно что вы дали агенту доступ к Gmail API напрямую, я обычно осторожнее и даю только чтение на первом проходе, потом отдельно подтверждаю действия. Для фотоархива разумный риск, но для рабочей почты добавил бы промежуточный шаг с превью что агент собирается сделать.

Согласен, осторожность правильная. Тут страховкой был сам scope (это настройки АПИ в консли Гугла): давал не полный доступ, а gmail.modify, то есть чтение и перемещение в Корзину, без безвозвратного удаления. Плюс перед массовыми действиями был предпросмотр, драйран с подтверждением и бэкапом (канантином локально), и именно он спас: в «спам» чуть не уехала рассылка живого магазина, вернул одной командой из Корзины. То есть ваш «сначала только чтение, потом подтверждаю» у меня свёлся к «всё обратимо плюс подтверждение перед удалением». Для рабочей почты ваш промежуточный preview-шаг и правда не лишний.

Хороший разбор, gmail.modify плюс корзина вместо удаления это по сути и есть обратимость, согласен что так даже надёжнее моего «сначала только чтение». Драйран который ловит улетевшую в спам рассылку магазина прям показательно, без него такие вещи всплывают через неделю когда уже поздно. Беру связку scope плюс предпросмотр на заметку для своих сценариев с почтой.

Утащил в закладки, спасибо. Зацепило, что лучше доверять названию папки, а не дате внутри файла — у меня та же беда со старыми сканами: дата стоит та, когда отсканировал, а не когда снято, и я каждый раз правил руками. А как нейросеть отделяла документы и скриншоты от обычных фоток? У меня именно этот мусор всегда мешает больше всего — она сама всё ловила или часть пришлось пересматривать глазами?

Это делал CLIP (open_clip, ViT-B-32) в режиме zero-shot: у каждого фото берутся ближайшие метки из словаря, где среди прочих есть «отсканированный документ/страница текста» и «скриншот экрана». Если топ-метка такая и уверенность выше порога, файл помечается как не-фото и в общий поток памяти не идёт. Ловило само почти всё, глазами пришлось пересмотреть только пограничное: фотографии документов (где и бумага, и сцена) и дизайнерские мудборды из интернета. Скриншоты и явные сканы отсекались чисто.

Это делал CLIP (open_clip, ViT-B-32) в режиме zero-shot: у каждого фото берутся ближайшие метки из словаря, где среди прочих есть «отсканированный документ/страница текста» и «скриншот экрана». Если топ-метка такая и уверенность выше порога, файл помечается как не-фото и в общий поток памяти не идёт. Ловило само почти всё, глазами пришлось пересмотреть только пограничное: фотографии документов (где и бумага, и сцена) и дизайнерские мудборды из интернета. Скриншоты и явные сканы отсекались чисто.

Не хватает информации о том, как зовут агента, сколько он денег за работу взял и т.п.

НЛО прилетело и опубликовало эту надпись здесь

В начале статьи. Это был клод опус, но работа не сложная справится совершенно любая ЛЛМ, возможно собственного зрения контроля качества каким-то младшим моделям может не хватить, но как описано в другой моей статье разница с фронтиром для таких задач не критична.

По лимитам, совсем не много (точно не замерял, позже попробую посмотреть), в рамках стандартной подписки все. Основная работа локально, склеить точечно глянуть - не супер дорого и сложно

Прикинул по итогу. Точных биллинговых цифр под рукой нет, но порядок такой: вся переписка с агентом за весь проект это около миллиона токенов контекста, из них собственно генерации агента примерно 100-150к. И ключевой момент: это только оркестрация. Вся тяжёлая работа (около 40к фото через CLIP, 74к лиц через InsightFace, 1754 видео) крутилась на локальных моделях, там токенов ноль. По фронтиру уложился в обычную подписку, в лимиты не упирался.

Муж подруги моей жены выполнил аналогичную работу при помощи ИИ. И вот какая статистика у него получилась - на 88% фотографий с 2005 по 2019 год имеется один и тот же человек, первая (бывшая) жена.

У меня тоже были интересные дискаери :)

Вангую, ты ей сказал про процент и поэтому она теперь бывшая)). Ой, то есть, он сказал)))

Надо сразу разбирать и сортировать, если не каждый день, то раз в неделю. При этом удалять ненужное, чтобы потом в потоке "в этот день" приятно было взглянуть и вспомнить. Уловно вчера из 50 снимков цапель, которые сделал по дороге, оставил 4 разных (взаимодействие 2х пар и take off/go around при попытке приземлится рядом). Просто архивы за 25 лет разобранные уже показываются, и много фотографий не смотришь. Разобранная и отсортированная большая куча фотографий все равно будет просто большой кучей, в которой что-то попроще найти, но тем не менее это все равно большая куча

Удивило то,что не использовались тэги, которые проставляет сам Onedrive.

Загруженная вчера фотография сегодня уже выглядит в onedrive так. Тэги - подарок от облака

Оно, правда, сейчас поспокойнее к распознаванию подходит. В конце 201x фото асфальта распознавалось как манускрипт на санскрите.

Позже попробую проверить интеллектуальную часть вандрайва. В самом приложении мобильном очень плохо и неуклюже оно у меня работало по какой-то причине. Находило все что угодно кроме того что искал ;)

Или берем immich просто, настраиваем ML с лицами, контекстом фото, умным поиском и прочим. Настраиваем автоматическую загрузку туда, забываем :)

После невозможности оплатить Google photos пересел на immich, запущенный на домашнем однопалатнике. Работает прекрасно и закрывает все вопросы структуризации фото.

ml на одноплатнике работает или без него?

На нём же, штатным docker compose файлом запускаю, в котором все сервисы прописаны, в том числе и ml. Распознавание не шустро работает, конечно, но я этого не замечаю. Просто все ядра под 100% загружаются на некоторое время, когда много фотографий синхронизируется, но на работе это никак не сказывается.

У меня Orange Pi 3b.

Immich смотрел и даже поднимал у себя, чтобы пощупать (и PhotoPrism тоже гонял). Инструменты отличные, спору нет. Мы с агентом их подробно обсудили и он же меня с ними познакомил и дал пощупать. Решили, что в моём случае это было бы из пушки по воробьям. Мне не нужна была полноценная селфхост-галерея, в которой потом жить, задача была ровно обратная: остаться в рамках текущих обвязок (OneDrive плюс Apple Photos) и просто разгрести в них бардак, а не переезжать в новый сервис и тащить туда 36к неразобранных файлов. Immich, PhotoPrism и подобные комбайны для этого избыточны, у меня болело «разобрать и разложить прямо там, где уже лежит». Плюс лишний сервер, который надо поднимать, кормить и бэкапить.

ух ты. я тут думаю как соседний десктоп с gpu приспособить для мл immich, а оно вона как...

Когда такое просишь кроме бекапов нужно еще просить записывать все действия в файл и финальный шаг добавлять перепроверку... иначе может быть печальная грусть.

Полностью согласен, именно так и делал. Каждое перемещение писалось в undo-лог, отдельный файл со всеми действиями, поэтому любой шаг откатывается одной командой, а удаления почты шли только в Корзину и локальный карантин (папку), без стирания насовсем. И финальная перепроверка была не одна: сортировку сначала гонял пилотом на одном годе и смотрел результат глазами, манифесты строил в режиме dry-run с предпросмотром перед реальными перемещениями, а в самом конце прошёл отдельным дедуп-проходом уже по разложенному. Без этой обвязки на 36к файлов реально легко словить ту самую печальную грусть, согласен на все сто.

Гитхаб имеется? Лень разбираться, подсуну агенту как темплейт

Репозитория и не нужно. Достаточно скормить эту статью любому агенту: в ней весь стек и вся логика по шагам, так что он всё поймёт и воспроизведёт уже под ваши данные и ваши структуру папок и сервисов. Скрипты всё равно выходят одноразовые, под конкретный архив, поэтому статья как «темплейт» работает даже лучше готового кода: агент адаптирует подход, в этом прелесть ИИ, как раз, безграничная и практически бесплатная кастомизация всего под все.

Осталось дело за малым, отправить в ИИ эту статью, чтобы всё это настроить и начать процесс 😀

Совершенно верно.

Когда появится устанавливаемый рабочий инструмент который делает всё перечисленное в полуавтоматическом режиме.

Я уверен что только за процедуру сортировки, пометки, удалении документов и фотографий - найдутся плательщики.

Этот инструмент и есть ИИ-агент. Инструкция под проблему описана выше, статья на самом деле агенту даже полезнее чем людям. Экономически такой проект отдельный обречен, проще заплатить за подписку (а можно использовать бесплатный тир на опенроутере том же) и сделать все бесплатно.

Знакомая боль, и подход правильный. Локальные модели на своей видяхе тут и есть разблокировка, и по деньгам, и по приватности.

Мы недавно крутили похожее, только под коммерцию. Надо было собрать базу фоток БУ-устройств и телефонов для интернет-магазина. Картинки тянули из публичных источников через Serper, закинули около 50 долларов и получили тысячи запросов, этого хватило на приличную базу. Дальше всё перемалывали локально на одной 4070Ti, несколько разных моделей под свои шаги. Вышло на удивление бодро.

Что совпало с вашим опытом. Самой моделью дело не решается, узкое место это дедуп и матчинг грязных входов. У вас EXIF врёт и имена IMG_4348, у нас почти то же на товарных фото. Соберу отдельную статью про этот пайплайн, там интереснее всего как раз матчинг. А дубликаты вы как ловили, по хешу, по эмбеддингам или смешанно?

Дубликаты ловил перцептивным хэшем, не точным хэшем и не эмбеддингами. Гонял czkawka: она считает хэш по содержимому картинки с регулируемым порогом похожести, поэтому берёт и пересохранения, и ресайзы, и почти одинаковые кадры серии. Эмбеддинги у меня шли отдельно и только на лица (InsightFace), для дедупа целых картинок хватило перцептивного хэша, и это быстро и полностью локально. В каждой группе оставлял лучший по разрешению, остальное в обратимый карантин, и делал это до всего остального. Под ваш кейс с товарными фото, кстати, скорее пригодятся именно эмбеддинги (CLIP): там не «почти дубликат», а «тот же товар с другого ракурса», это уже хэш не ловит, нужен матч по смыслу. Статью про матчинг подожду, звучит как самое интересное. Будет классно если сделаете референт на меня, получится что и для коммерции и для личных целей годное.

Есть способ лучше: CTRL+A, CTRL+D

Думаю вы и не заметите того что удалили …. А жить станет проще и объем хранения уменьшится.

Рука не поднялась. Пока фотки сортировали понял почему. Накидал в домашние чаты столько всякой разной ми-ми-шности из старых неразобранных. Семья рыдала от умиления и спрашивала где взял. Еще отправил другу фотографию его маленькой дочки, которой у него не было, а я оказывается сфотал на детском празднике почти 10 лет назад. Еще нашел 3 фотографии ушедшего из жизни знакомого с его маленькой дочерью на руках. Этих кадров тоже ни у кого не оказалось. Отправил их его вдове. Поэтому каждому свое.

Пока читал статью, все время крутилась мысль: "А кто это все смотреть будет?". ИИ? Свои полтерабайта за 25+лет разобрал неспешно глазами, примерно за месяц, по вечерам. Получил удовольствие.

Неспешно.

Глазами.

По альбомам, датам и местам разбирал в Immich вручную. По лицам он раскидывает хорошо и бесплатно сам.
ИИ использовал только для улучшения пленочных сканов.

Я тоже получил удовольствие. Весь архив просматривать сложно сесть, а вот в процессе корректировки работы агента очень даже кайф. И посмотрел и порядок навел и кучу всяких редких кадров родне и знакомым накидал.

Верно понимаю, что по логике работы у Вас не было защиты от раскрытия содержимого почты облачному LLM-провайдеру (если только отдельно не делали редактирование/маскирование, но в статье этого не видно)? Я к тому, что в 90% писем не то что секрета нет, а просто бытовые вещи типа "ок" или "у нас скидка", но 10% - там и чувствительные вещи, и подробности юридического характера, которые не хочется отдавать модели для чтения/изучения.

Изначально все данные с которыми работал в данном кейсе уже были в облаке Майкрософта Гугла или Эпла. Если есть задача не отдавать в облако данные она тоже тут может решаться легко, агент пишет только код, который можно запускать в изолированной среде куда у агента доступа нет и там уже «молотить» локальными инструментами.

Как понял, локальные модели у Вас на маке работали. А что за параметры железа (проц, память)? Несколько тысяч фоток кластеризовать за вечер — это быстро как то.

MacBook Air M5, 32GB, локальная модель была Qwen 2.5 7B на MLX, не Ollama поэтому существенно быстрее, ну и мак свежий.

Агент сам почему-то про MLX не предложил и упорно пихал оламу пока не заставил его

Кликбейтный заголовок, хоть бы сроки пореальнее указать. "За вечер" это такое себе. У меня только емейлов 200K уже третий день разбирает в 2 потока. Gmail API нужно запрашивать с паузами, а ollama на qwen3:8b еще медленнее, тратит на 1 емейл около 3-х секунд. Примерно неделю будет работать. Фотки на 5TB даже загадывать не берусь сколько займет все разобрать.

Я считал свои трудозатраты. Машино-часы считать смысла нет, по-моему мнению. У всех разный объем, требования к гранулярности и разные возможности по компьюту.

пожалуйста укажите это в статье, а то я в шоке от скоростей, сижу пытаюсь понять как вы так быстро с изображениями разобрались, мои собственные потуги очень не быстрые.

Сделал

попроси плиз своего робта сделать md file c псевдокодом этой системы и кинь нам :). Спасибо

спасибо, добрый человек :)

Сделал такую штуку на Zennoposter + LMstudio. Модель распознает фото, и делает его описание в БД, затем сохраняет по папкам - Животные, Люди, Природа и т.д.

Супер!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации