Fley's flow
121 subscribers
31 photos
1 video
32 links
In this channel I share my experience in CV/ML and what to do and not to do to be successful in the profession

Middle CV/ML Engineer

Contacts:

Telegram: t.me/fleyderer
Github: github.com/fleyderer
LinkedIn: linkedin.com/in/fleyderer/
Download Telegram
👁Большой брат для ритейла: введение

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

Собственно, задача:

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

Какие сложности возникли сразу же до решения задачи:

Заказчик сказал "отвечаю, у нас жилетки такого-то цвета". В тот же день я зашел в магазин неподалеку от офиса — там жилетки другого-то цвета, а когда прислали видосы с камер, выяснилось — жилетки вообще третьего-то цвета.
Спереди жилетки крайне непримечательные – даже глазами, не зная контекста, не удастся отличить работника от покупателя. Сзади куда ни шло, но тоже спорно.

Пайплайн решения пришел в голову практически сразу: с помощью YOLOv8m-pose находить в кадре людей, выделять кейпоинты их тел, брать 4 точки, относящиеся к торсу, и проецировать (любимый cv2.warpPerspective) на плоскость размера 112х112. В силу отсутствия информации на нижней половине туловища, я остановился на верхней – и информации больше удается сохранить, и соотношение сторон у половины спины куда ближе к 1х1, чем у всей, имеющей форму прямоугольника, а не квадрата. Полученное изображение подаем в легковесную CNN-модель бинарной классификации "не работник/работник" и отдаем ответ.

Таким образом, задача свелась к тому, чтобы взять откуда-то данные и обучить классификационную модель. Далее по пунктам.

#cases
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👁Большой брат для ритейла: решение

Первый этап


Я в быстром режиме отсмотрел первые 1.5 часа видео, отметив моменты входа и выхода работников из кадра. После этого пробежался описанным выше алгоритмом по видосу, и если кадр принадлежал очередному временному отрезку, когда работник был в кадре, вырезанные торсы летели в папочку с работниками, а если вне отрезков — в папочку с покупателями. Итого получилось 5400 кадров с покупателями, 200 кадров с работниками (как вам дисбаланс классов? ☠️). Также я пролистал 200 кадров и перекинул к покупателям лишние изображения (такое происходило, например, когда работник и покупатель были в кадре одновременно и оба торса летели к работникам). Итого какие факты о собранных данных есть:

1️⃣ Очень большой дисбаланс между покупателями и работниками
2️⃣ В разметке точно нет False Positives (когда покупателя отнесли к работникам). Насчет False Negatives (когда работника сочли покупателем) — хз. Наверняка есть, а сколько их, неясно.
3️⃣ Данных мало для полноценного решения задачи, да и test-сета нет, чтобы потом утверждать, что мы хорошо справились с задачей.

Исходя из этого, признаём неидеальность мира, и решаем проблемы по порядку.1️⃣: Выбираем целевую метрику – и это точно не Accuracy, потому что дисбаланс. Нас волнует количество FP и FN – что то, что другое мы хотим максимально сократить, поэтому возьмем F1-score и будем уменьшать learning rate каждый раз, когда F1 для валидационной части будет стопориться. В качестве Loss я взял взвешенную кросс-энтропию, потому что она мне наиболее понятна, есть готовая реализация прямо в торче, ну и проблему с дисбалансом удаётся решить. Хотя, конечно, есть Focal Loss, но я пока его не изучил 🤓. 2️⃣: Выбрав метрики, обучим нашу модель, чтобы поближе рассмотреть ошибочные предсказания и переразметить данные.

Первое обучение – значения метрик около 0.92-0.94. Вроде неплохо, но качество низковато. Смотрим на ошибки модели – она плохо реагирует на то, что логотип оказывается в нестандартных местах: по углам или совсем снизу/сверху, или же что у него нестандартный масштаб в силу небольших ошибок модели детектора-кейпоинтов. Данных мало, а проблему решить нужно, как поступим? Разумеется, аугментации. Сперва с помощью cv2.Canny на всех изображениях с работниками найдем логотипы, сохраним их боксы, а затем реализуем аугментацию, которая будет вырезать этот логотип по боксу и кидать его в случайное место изображения, таким образом подготовив модель к любому возможному случаю. Помимо этого докинем RandomPerspective и RandomRotation, чтобы жизнь медом не казалась.

На практике после 2-3 итераций удалось добиться значений метрики 1.000 и на train, и на val. С одной стороны — вау, круто, а с другой – подозрительно. 3️⃣: Я полагаю, что внимательный читатель уже понял, для чего нам все это было нужно – полученной моделью мы разметим оставшиеся 6.5 часов видеозаписи, чтобы подготовить основную часть датасета.

#cases
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
👁Большой брат для ритейла: решение и демонстрация

Второй
этап

Разметив моделью оставшиеся данные, получаем 65000 покупателей и 1300 работников. В принципе, быстро прошерстить 1300 изображений проблем не составит, поэтому подчистим FP-кейсы и на этом перейдем к обучению модели на ее же размеченных данных, причем здесь уже сделаем ход конем — поделим авторазметку на Train и Val, а в качестве Test возьмем, логично, ручную разметку🧠. Это данные, в разметке которых мы уже уверены, модель их не увидит в рамках обучения, следовательно, на их основе можно делать выводы о том, как хорошо модель справляется с задачей.

Приступим к обучению и... упремся в RAM OOM. Сколько раз уже об эти грабли бьюсь, но не устану, пожалуй, никогда. Раньше все 5600 картинок влезали одним тензором в RAM, а 66000 — уже нет. Что ж, перепишем быстренько датасет под ленивую загрузку изображений в момент обращения, с помощью Dataloader и пары worker'ов чуть-чуть ускорим их загрузку, но с учетом выросшего количества данных и прилично замедлившейся скорости чтения, процесс совсем уж не быстрый — ждем 💬.

После обучения выяснилось, что на тестовой части модель допускает 4 FP, 2 FN ошибки, причем все FP — это на самом деле работники, но изображения достаточно сложные, поэтому я их изначально убирал к покупателям, чтобы модель не начала галлюцинировать, условно, на любом светлом пятне. Короче говоря, имеем всего 2 действительные ошибки на 5600 кадров, причем сами ошибки из разряда "мы не увидели работника на этом кадре, но увидели сразу же на следующем", что на суть работы не влияет. Для демо-версии задачи результат прямо-таки хороший, поэтому обучение заканчиваем, хотя и можно было бы произвести пару итераций, как в первом этапе, чтобы подчистить ошибки.

Третий
этап

После того, как мы разобрались с обучением, нужно сделать итоговое демо-видео для заказчика. Есть один важный нюанс, который я обозначил в самом начале — спереди жилетки невозможно нормально определить. Следовательно, если работник заходит в кадр лицом, ходит-ходит, а потом поворачивается спиной, мы хотим в этот момент его зафиксировать 😂. Однако, мы не хотим при этом терять всю историю его перемещений в кадре, поэтому помечаем не единичный детект в текущем кадре, а весь трек человека — его боксы, которые трекер посчитал одним набором. Таким образом, и модель работает в реалтайме, и весь путь работника сохранен. Можно считать, что мы будем хранить небольшой кэш до момента исчезновения человека из кадра.

Дальше дело техники: будем отрисовывать на каждом кадре видео боксы людей с подписями "employee" или "customer", помечая желтым цветом боксы покупателей, зеленым — боксы работников, которых мы на текущий момент не определили, но это произойдет через несколько кадров, а синим — работников, когда модель видит, что это работники. Конечно, за один проход такое видео отрисовать не получится, потому что для этого нужно посмотреть в будущее, и не каждый лишь может это делать, но ничто не мешает нам в один проход собрать все треки, а во второй — отрисовать их.

На выходе имеем рабочую классификационную модель и видеозапись с 8-9 мини-нарезками с камер наблюдения общей длительностью в полторы минуты. Суммарно затрачено 8 рабочих дней, 15 мини-баунти и 2 коробки печенья. Заказчик доволен, программисты сыты, а дальнейшая судьба задачи пока обсуждается, потому что внедрение — это вам не разноцветные рамочки рисовать.

#cases
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Поделюсь с вами наглядным примером того, почему нужно переразмечать данные. 🔄

Как видно на изображении выше, предикт модели — синий цвет, а "правильный" — коричневый.

В первую секунду возникает вопрос, каким образом это произошло, а во вторую ты видишь надпись TonyBrownChevrolet 😨

Лично по своему текущему опыту вывел примерно такой принцип переразметки:
1️⃣ Обучаем модель буквально первые несколько эпох, пока она не успела переобучиться
2️⃣ Этой моделью пробегаем по Train, Val, Test, переразмечаем данные и отправляем на повторный круг.

Самое неприятное здесь еще и то, что можно провести хоть 2-3-4 итерации, а потом увидеть то, что я отправил выше... Поэтому останавливаемся лишь когда метрики на каждой части датасета сходятся примерно к одинаковым значениям.

#cases #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Без лишних слов похвастаюсь – стал сегодня наконец магистром по профильному направлению 🥂

#progress #path
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡13👍3🎉3
Всем привет!

Почти все лето не было постов – то одолевала лень что-либо писать, то события поглощали и не оставалось времени. Постараюсь вкратце описать это лето по рабочим и личным аспектам.

Работа:

1) Решал задачу с классификацией автомобилей по цветам. Решил, расскажу детали, было любопытно.

2) Приступил к задаче Car Detection – у нас, оказывается, был предобученный детектор YOLOv8, который часто выдавал кривые типы автомобилей (грузовик превращался в автобус или иное). Там для большей точности потребовались данные в нашем домене (российский транспорт), я их собрал и попробовал заказать разметку со стороны – ждем вместе с тимлидом теперь ответ директора, сверху согласовывают...

3) Сейчас решаю задачу Person Re-identification. Это, пожалуй, первая действительно серьезная задача, буквально неделю ей занимаюсь, расскажу впоследствии во всех подробностях.

Жизнь:

1) Первый раз побывал в двухнедельном отпуске. Появилось ясное понимание, что студенчества и каникул больше не будет – дальше только работа, семья и следующие итерации жизненного цикла.

2) Переехал в СПб. Вероятно, на какое-то время, но не менее года. Работаю на удаленке, уже обустроился, веду насколько это возможно активную социальную жизнь, даже (тьфу-тьфу) нашел потенциальную команду на ближайший волейбольный сезон. А кто будет в Питере – обязательно пишите, пообщаемся и по работе, и в целом)

Суммируя вышесказанное – все медленно, но верно идет к лучшему, о чем и постараюсь рассказывать в ближайшее время. Пока есть идеи лишь для 2-3 постов, и если будут какие-нибудь пожелания, обязательно предлагайте либо здесь, либо в личку

#self #progress
👍7
😁 квалифицированный алгоритмист*

*По версии Яндекс.Практикума.

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

Если вообще захочется лезть в курсы, важно понимать, какой у тебя бэкграунд. У меня на тот момент уже были за спиной 6 лет вышки + полгода опыта работы. С алгоритмами я был знаком из вузовских курсов, где мы писали условные рекурсии на плюсах, ну и ещё где-то как-то между делом.

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

Кто-то на этом моменте облегченно выдохнет, а я наоборот озабоченно вдохнул, потому что хотелось погрузиться в эту тему с головой, раз уж надо будет уделять курсу время. Но там даже не дали определение функции О "большое" (или Big O notation 🤓). Кому надо – смотрите сами, а мы объяснять не станем. И так в целом можно описать весь курс, снабженный скорее какими-то интуитивными понятиями, примерами на пальцах без возможности открыть доказательства и почитать более подробно, не отходя от кассы.

Если же кайф реально погрузиться в тему – книжку в руки и вперед, а если запутался, можно спросить у ChatGPT или, кстати, у Mistral, который полностью в открытом доступе и терпимо справляется с кодом.

Ну а я в результате курса убедился, что практически все концепции и без того знал, дополнительно попрактиковался в некоторых задачах – были и классные, которые я когда-то давно считал загадочной магией, типа расстояния Левенштейна – и получил на выходе удостоверение о повышении квалификации, футболку и значок – прикольно, что его можно под настроение перевешивать 😠

#progress #hard #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🗜 Полезные инструменты для работы

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

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

1) CLI Fuzzy finder

Если дословно, то это "Нечеткий искатель" (А с ним Циклопы, Вулверин, Бандит, Гроза, Зверь и Юбилей).

Он хорошо и, что важно, очень быстро справляется с поиском файлов и ранее выполненных команд в терминале по их примерным названиям. Я лично использую почти всегда именно для команд, поскольку бывает – подключился ты к какому-то очередному серваку или запустил скрипт, там куча параметров, это запомнить просто невозможно, проходит какое-то время и тебе нужно повторить это действие, а искать, где, когда и как – просто мучительно. А если есть fzf – открыл терминал, Ctrl + R, ввел кусочек команды (название скрипта или одного параметра, который помнишь) и сразу нашел её в истории. И вместо нескольких минут прописывания команд или их поиска у себя в сохраненках, за пару секунд удается найти все, что нужно.

2) Code assistants

Будь то бесплатный Codeium, платный Copilot, целая IDE типа Cursor или какое-либо другое решение – помощники в написании кода на основе ИИ – это огромный буст к скорости работы. Причем да, порой косячит, но даже в бесплатном виде как инструмент для дописывания следующих одной-двух строк кода или написания документации – это вещь незаменимая. Кто еще не пробовал, настоятельно советую.

3) LLM

В наше время, особенно программистам, грешно не пользоваться халявным джуном в чатике. Разумеется, лидерами здесь пока являются OpenAI с их моделями, однако есть полностью доступный и бесплатный Mistral, который по моему опыту в кодинге лучше того же ChatGPT 4o.

Эта штука действительно заменяет привычный пока StackOverFlow, поскольку сразу помогает с нужной тебе задачей, являясь end-to-end решением без необходимости в самостоятельном допиливании результата (почти). И что еще важно — она порой закидывает прикольные best practices, которые ты бы сам мог и не встретить никогда.

4) Питон и все сопутствующее

Это уже только для питонистов и только для начинающих, которые, как и я в начале пути, нейросетки делают в jupyter, прости господи. Все просто: вместо ноутбуков – скрипты + argparse. Для работы с путями и директориями вместо os.path – pathlib. Остальное, начиная от timeit, tqdm, pyyaml, заканчивая numpy, pandas, torch, lightning, kornia, jax в отдельном пояснении не нуждаются, потому что их очень много и каждый здесь найдет что-то свое и более подходящее под конкретную задачу, благо выбор есть.

Напоследок скажу, что в зависимостях мне помогает разобраться conda и установленный туда pip. При публикации проекта и conda environment есть, и pip requirements для тех, кому conda неудобна. Но вообще, конечно, в планах потрогать poetry, а docker, возможно, начать применять не только для окончательной сборки проекта. Однако по соотношению минимум гемора / максимум результата в целом пока хватает.

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

#hard #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Сказано – сделано

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

Вывод: нельзя закидывать программистам идеи, к осуществлению которых ты можешь быть не готов...✍️

#offtopic
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁81
Итоги года 🥴

Ну че, потихоньку переваливаемся в 2025-й (ой, как не хочется – ничего хорошего нас там не ждет...), пора подвести итоги уходящего года.

Как и всегда, что-то получалось, а что-то пошло не по плану, но если пройтись по ключевым событиям в порядке убывания значимости:

1️⃣ Закончил магистратуру

2️⃣ Вырос по грейду фактически, дважды – успел до нг, однако, можно засчитать и в следующий год

3️⃣ Прошел курс по алгоритмам

4️⃣ Переехал между городами с разницей в 1800 км

5️⃣ Закрыл кучу интересных задач по работе, писал о них, хотя и редко

6️⃣ Взял в руки гитару и учусь с преподавателем

7️⃣ Присел с 120 кг (при весе в 75)

8️⃣ Поиграл в любительской суперлиге по волейболу

9️⃣ Освоил сноуборд

🔟 Начал полноценно контрибьютить в опенсорс

Когда я начинал писать этот пост, возникла мысль: "Да год как год, пункта 3 наберется небось". А потом я прокрутил эти и другие события, которые произошли за 2024-й, и понял, что это самый насыщенный год в моей жизни. Очень большое количество изменений, новых навыков, новых людей, событий и мест. Однако, много и трудностей, через которые пришлось пройти, и важнее всего то, что результаты оправдывают этот труд.

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

Поэтому, если вдруг какие-то ваши ожидания не оправдались, если грандиозный понедельник для спортзала так и не наступил, помните – скоро у всех нас будет еще 365 дней, которые можно просрать 😐

С наступающим Новым годом! 🎄

#progress
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾7👍21👏1
📈Глобальная оптимизация

Давно я ничего не писал – всё не видел достойных поводов для постов, однако сейчас такой появился.

Я сделаю небольшую серию публикаций на тему глобальной оптимизации:

1️⃣ Что это за задача
2️⃣ Семейства алгоритмов оптимизации и их представители
3️⃣ Библиотека Ray
4️⃣ Опыт собственной реализации алгоритма на основе статьи

Пример

Представьте, что у вас есть какая-то бизнес- или математическая задача. Например — купить мясо и напитки к столу на фиксированный бюджет. Цель — потратить минимум времени. Зададим переменные и ограничим их диапазон, чтобы совсем с ума не сходить:

x1: Сколько людей мы отправим: от 1 до 4
x2: Каких именно людей мы отправим: пускай будет выборка из 6 человек.
x3: День недели: пятница или суббота
x4: В какое время суток отправлять: с 8 до 16 часов
x5: На какой рынок отправиться: пускай будет 3 варианта наиболее удачных рынков в городе.

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

x1 — количество людей: оптимально – двое. Один может быстро закупиться, но вдвоем есть дополнительная пара рук как для тяжестей, так и для иных задач. Если 3 или 4 человека, то вместо одного канала коммуникаций у нас будет уже 3 и 6 каналов. Если по-русски — много времени начнет уходить на обсуждения.
х2 — кого отправим: здесь нужны люди пунктуальные и желательно с большим опытом в организации таких мероприятий.
х3 — день недели: лучше в пятницу, чем в субботу, очевидно.
х4 — время суток: я бы выбрал 10 утра, потому что в это время уже все, кому надо, на работе, и отправленные на рынок люди уже проснулись и бодрствуют, тормозить не будут.
х5 — рынок: здесь не буду предполагать, но можно учесть местоположение людей, которых отправляем, и взять тот рынок, который по среднему расстоянию будет ближе всего.


Разумеется, это достаточно простая жизненная задача, однако к 20-25 годам у нас уже есть набор знаний и опыта, который позволяет оценить поведение этой функции в зависимости от переменных, и выбрать некоторую субоптимальную комбинацию параметров. Но как, очутившись в мире, где есть только люди, рынки и мясо для шашлыка, такой опыт можно получить и каким образом достичь цели быстрее всего? Перепробовать все комбинации — точно сработает, но долго. Попробовать случайные 5-6 — а достаточно ли это хороший подход?

Задача

Теперь с опорой на пример сформулируем общую задачу: есть функция многих переменных, f(x1, x2, ..., x_n), для которой мы предполагаем существование глобального минимума или максимума — нужно его найти.

Оптимизация гиперпараметров

С помощью примера выше мы показали, что в жизни таких задач очень много — практически каждый процесс можно сформулировать как задачу оптимизации, в том числе и эволюционный (это важное замечание). И раз уж я не владелец кафе а-ля Шашлычный Мир, а CV/ML-инженер, расскажу про реальную задачу, где нам нужна глобальная оптимизация.

Обучаем мы нейросеть, задаем различные гиперпараметры, начиная с оптимизатора, learning rate и batch size, заканчивая аугментациями и регуляризациями и смотрим на точность после обучения. Важно отметить, что в силу невозможности продифференцировать такую функцию, мы имеем более общую задачу и медленную сходимость. Как будем подбирать самую хорошую комбинацию? Жизненный опыт — это хорошо, но его долго получать, нет гарантий, что он верный и сработает как нам надо, а также его не так легко обосновать.

Люди, которые касались этой задачи, сразу же вспомнят про GridSearch – поиск по сетке, где мы задаем для каждого параметра набор значений, которые нужно перебрать каждый с каждым. Однако есть высокая вероятность не попасть даже в хороший локальный максимум. Ну и вспомним RandomSearch – поиск по случайным наборам параметров. Любопытно, что у него даже теоретически доказанная сходимость заметно лучше, чем у поиска по сетке, но он тоже не вызывает чувство спокойствия по поводу обоснованности сделанного выбора.

Как раз о таких методах, которые помогут спать спокойно, в следующих постах и пойдет речь.

#learn #hard #cases
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3
Я тут наконтрибьютил за прошлую неделю на релиз 11.0.9 -> 12.0.0 в библиотеке boxmot для Multi-object Tracking 🤓

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

#progress #results #code
Please open Telegram to view this post
VIEW IN TELEGRAM
😁32
На днях окажусь на IML в СПб, послушаю, что там умные люди сделали за прошедший год

Пишите, буду рад пообщаться на мероприятии 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉3
Я выступлю на DataFest 2025 👨‍💻

Пару месяцев назад я говорил о том, что плотно занялся задачей трекинга и получил классные результаты, так вот:

Я добавлял независимую ре-идентификацию в трекер, придумал интересную универсальную добавочку, не требующую никакого дообучения моделей, которая почти сразу дала SOTA-1 результат по метрике HOTA на датасете MOT17. Расскажу в подробностях, как это было сделано, через что пришлось пройти, покажу подробные метрики. Ну и наверное это хорошая отсечка, чтобы сказать, что я-таки стал норррмальным Middle CV-инженером. 👨‍💻

📆Выступление 27 мая в 18:00 по московскому времени, это онлайн-секция, в этот день фест будет в Белграде.

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

#path #recommend #soft #hard #results #progress
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤‍🔥3🆒1
Как и обещал, ссылочка на сегодняшний DataFest с моим выступлением: https://ods.ai/events/df2025-27-may-online

Кто сможет и захочет, смотрите в онлайне сегодня в 18:00 по мск, а кто захочет, но не сможет – будет запись, впоследствии тоже выложу
🔥5🆒1
Log & roll

Попробую сегодня новый формат постов, который мне предложили коллеги.

Изначальная проблема в том, что мне особо нечего рассказывать, потому что работа состоит из двух фаз:

1️⃣ 99.99% времени ресерчить, страдать, дебажить
2️⃣ 0.01% времени все работает – ура, но надо работать дальше 👍

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

Другие каналы в основном превратились в Release notes для LLM, поэтому атмосферу все равно разбавлю.

Суть формата: я попробую рассказывать, что я делал этим летом на неделе и что из этого вышло. Если это какая-то шляпа и неинтересно, говорите, я учту (или не учту).

Ну и соответствующий хештег — #lognroll
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤‍🔥1🆒1
Log & roll первой недели июня

🔫 Занимался разметкой данных

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

Важный вывод: не полагайтесь на чужой профессионализм, если можно не полагаться. Не в смысле "сделай все сам", а в смысле "создай условия, чтобы результат был наиболее предсказуемым и управляемым". Потому что спустя год я столкнулся с тем, что вообще не доверяю разметке данных, и у меня нет идей, как поменять эту ситуацию, т.к. это затрагивает весь процесс, а не только мою зону ответственности.

✍️ Начал писать статью на Хабр

Мы решили из доклада на DataFest сделать статью, она будет по сути дублировать доклад + больше визуализаций, анимаций, деталей и замечаний. Пока накидываю основной скелет, может, скоро будет, что показать.

🧑‍💻 Оформил свой профиль на GitHub.

Сделал вот такую штуку. Года два назад хотел, но руки не доходили. Дошли.
Узнал, что по рейтингу гитхаба у меня уровень C+ (Top 87.5%) — ну что ж, спасибо и на этом, теперь надеюсь однажды добраться хотя бы до медианы...

👨‍💻 Сел за капитальный рефакторинг BoxMOT

Это, пожалуй, самое приятное за неделю. На текущий момент библиотекой можно пользоваться только в режиме CLI, и в общем-то это хорошо, но не юзер-френдли:

С одной стороны, начинающие зачастую не умеют в запуск скриптов — они пишут всё в IDE и нажимают "запустить".
С другой стороны, продолжающие/заканчивающие могут встраивать отдельные части проекта к себе, и удобнее не выдирать куски кода и оборачивать, а импортировать уже готовый кусок из либы и возможно накидывать пару патчей.

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

Пока что основная задача в том, чтобы подбить одинаковые сущности в общую структуру. Приведу пример: модели детекции сейчас существуют через пайплайн Ultralytics с приколачиванием к нему гвоздями preprocess/postprocess и замены модели на YOLOX, когда нужно. А модели ReID — через класс ReIDAutoBackend, где автоматически выбирается бэкенд (pytorch, tflite, tensorrt и тд), и внутри сложно разобраться, где заканчивается препроцессинг, где начинается постпроцессинг и так далее.

Я подумал-подумал и придумал: сделаем базовый класс Backend с методами load, preprocess, process, postprocess, а оттуда уже пусть наследуются все другие бэкенды типа PyTorchBackend и переопределяют нужные функции. И только затем появляются классы Detector, ReID, которые НЕ наследуются от бэкендов, потому что по смыслу это НЕ бэкенды, а то, что должно их дергать внутри. Ну и пускай они существуют как базовые классы, внутри которых будет self.backend, куда они смогут отправлять данные и получать ответ. И разумеется, у них будет свой preprocess, process, postprocess. Таким образом, можно легко изменить чужой детектор/ReID или сделать свой, приделать туда препроцессинг-постпроцессинг, если надо, и пользоваться в любом из поддерживаемых бэкендов, а если надо, то и там переприсвоить функции на свои. В общем, делайте че хотите — вот вам универсальный масштабируемый пайплайн. Звучит вроде логично, а на практике посмотрим.

Кстати, отдельно отмечу, что с этапом описания архитектуры и взаимосвязей ChatGPT не справился, причем совсем. Все его идеи на первый взгляд были нормальными, но второй и третий взгляды выявляли полную несостоятельность этого бреда. Зато с отдельными функциями он справился хорошо.

🗃 В общем-то, на этом все. Подобную сводку я думаю делать раз в неделю-две, обратная связь приветствуется 🙂

#lognroll
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Log & roll №2

🏖 Отпуск

На этот раз я всю неделю провел в отпуске, и мне есть, чем поделиться.

Благодаря семье, за первые 20 лет жизни я побывал в разных городах и странах – не слишком много, но все же получилось увидеть. В силу текущих обстоятельств, да и вообще интереса к разным уголкам нашей страны, важным гештальтом для меня стал Калининград (или Königsberg).

1️⃣ Калининград

Интересным образом история этого анклава переплетается с историей нашей страны сквозь века. Я считал, что Калининград исторически и культурно был оторван от России, а сейчас выяснил, что он единожды уже входил в состав Российской империи, хоть и на каких-то три года.

Сам Калининград практически не создает впечатление европейского города – по крайней мере, относительно моих ожиданий. Редкие старые домики и разрушенные форты, небрежно разбросанные по всему городу, и за парой исключений на этом все. В то же время, туристический потенциал у города огромный, и видно, что сейчас на это наконец обратили внимание.

Наибольший интерес представляет остров в центре города – ныне он носит имя Имманиула Канта (прожившего практически всю жизнь в Кёнигсберге), а ранее носивший имя Кнайпхоф. Некогда целый город, сейчас – одно-единственное здание кафедрального собора, уцелевшее во время ВОВ. Внутри собора установлен самый большой в России органный комплекс, и концерт оставляет сильные впечатления даже у тех, кто далек от музыки – просто сходите, если будет возможность. Отдельно отмечу, что формат мини-концерта мне понравился, потому что с непривычки больше часа можно и не выдержать.

Не меньшее впечатление оставил музей Канта, а если точнее, история и образ жизни философа. Такие вещи сложно описывать словами, но если в общих чертах – это про переоценку ценностей. А еще теперь у меня есть хорошее оправдание для тех, кто не успел взять ипотеку: Иммануил Кант впервые обзавелся собственным жильем в 59 лет.

В остальном же город оставляет скорее печальное напоминание о том, что здесь когда-то был крупный международный экономический хаб с сопутствующими этому статусу инфраструктурой и культурой. Надеюсь, что со временем это изменится, или что такие впечатления остались только у меня.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
2️⃣ Зеленоградск

Сложно описать, насколько велик контраст между Калининградом и Зеленоградском, несмотря на то, что между ними 30 минут на электричке. Если первый в ходе войны практически сровняли с землёй, то второй остался нетронутым, и будучи курортом-лечебницей для состоятельных граждан, сохранил и свой курортный вид до сегодняшнего дня. И вот здесь-то сделали все по уму.

Первое, что вводит в ступор при входе в город с вокзала – это выложенные плиткой улицы, дороги, пешеходные переходы, а полоса у тротуара и вовсе подсвечивается цветом светофора – вероятно, для удобства тех, кто живет в смартфоне.

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

Больше всего этому способствует то, что это город кошек. По всему городку можно встретить кошачьи домики-копии старых особняков, самих кошек на улицах, скамейках и в заведениях; граффити с ними на домах, статуэтки на пешеходном проспекте, нетрудно найти их на люках и столбиках – есть даже кошачий светофор. И музей кошек, разумеется.

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

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

Еще один интересный новый опыт – сёрфинг. Большим удивлением для меня стало то, что такое вообще у нас есть, особенно для простых людей. По ощущениям это совсем не было похоже на сноуборд, хотя у всех, кто смог встать на ноги, включая меня, был опыт катания, поэтому какая-то корреляция, похоже, имеет место быть. Не могу и не стану рассказывать подробнее, потому что это надо пробовать и оценивать самостоятельно, но если сравнивать, для меня все-таки сноубординг >> сёрфинг.

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

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

Теперь же пора возвращаться к трудовым будням, ближайший месяц обещает быть интересным🔥

#lognroll
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥86